⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ndisoid.c

📁 MICREL 网卡驱动 FOR CE 5.0
💻 C
📖 第 1 页 / 共 3 页
字号:
            pMoveSource = ( PVOID ) &pAdapter->PNP_Capabilities;
            break;
        }
        case OID_PNP_QUERY_POWER:
        {
            NDIS_DEVICE_POWER_STATE PowerState =
                *(( PNDIS_DEVICE_POWER_STATE ) pBuffer );

#if DBG
DBG_PRINT( "query power: %d"NEWLINE, PowerState );
#endif
            switch ( PowerState )
            {
                case NdisDeviceStateUnspecified:
                    break;
                case NdisDeviceStateD0:
                    break;
                case NdisDeviceStateD1:
                    break;
                case NdisDeviceStateD2:
                    break;
                case NdisDeviceStateD3:
                    break;
            }
            uiMoveBytes = 0;
            break;
        }
        case OID_PNP_ENABLE_WAKE_UP:
            ulGeneric = pAdapter->m_ulWakeUpEnable;
            break;
        case OID_PNP_WAKE_UP_OK:
            ulGeneric = pAdapter->m_ulWakeUpOk;
            break;
        case OID_PNP_WAKE_UP_ERROR:
            ulGeneric = pAdapter->m_ulWakeUpError;
            break;
#endif

        case OID_TCP_TASK_OFFLOAD:
            return QueryTaskOffload( pAdapter, ulBufferLength,
                ( PNDIS_TASK_OFFLOAD_HEADER ) pBuffer, pulBytesNeeded,
                pulBytesWritten );

#if 0
        case OID_TCP_TASK_IPSEC_ADD_SA:
            nsStatus = NDIS_STATUS_FAILURE;
            break;

        case OID_TCP_TASK_IPSEC_DELETE_SA:
            nsStatus = NDIS_STATUS_FAILURE;
            break;
#endif

        case OID_FFP_SUPPORT:

#if DBG
            DBG_PRINT( "Fast Forward Packet"NEWLINE );
#endif
            nsStatus = NDIS_STATUS_NOT_SUPPORTED;
            break;

        case OID_GEN_SUPPORTED_GUIDS:
            uiMoveBytes = 0;
            break;

        case OID_DEVICE_MODE:
            nsStatus = GetDeviceMode( pAdapter, Oid, pBuffer, ulBufferLength,
                pulBytesWritten, pulBytesNeeded );
            uiMoveBytes = 0;
            break;

        default:

#ifdef DBG
            DBG_PRINT( "query oid: %08x"NEWLINE, Oid );
#endif
            return NDIS_STATUS_FAILURE;
    }

    if ( NDIS_STATUS_SUCCESS == nsStatus )
    {
        if ( uiMoveBytes > ulBufferLength )
        {
            // Not enough room in pBuffer. Punt
            *pulBytesNeeded = uiMoveBytes;
            nsStatus = NDIS_STATUS_INVALID_LENGTH;
        }
        else
        {
            // Store result.
            NdisMoveMemory( pBuffer, pMoveSource, uiMoveBytes );
            *pulBytesWritten += uiMoveBytes;
        }
    }
    return( nsStatus );
}  // MiniportQueryInformation

/* -------------------------------------------------------------------------- */

/*
    CheckInputBufferSize

    Description:
        This helper function checks the size of the buffer is big enough to
        be processed.

    Parameters:
        ULONG ulBufferLength
            The length of buffer.

        ULONG ulBufferSize
            The size of the buffer needed.

        PULONG pulBytesNeeded
            Buffer to store the number of bytes needed for the buffer.

    Return (NDIS_STATUS):
        NDIS_STATUS_SUCCESS         Buffer is okay
        NDIS_STATUS_INVALID_LENGTH  Invalid input buffer data length
*/

NDIS_STATUS CheckInputBufferSize (
    ULONG  ulBufferLength,
    ULONG  ulBufferSize,
    PULONG pulBytesNeeded )
{
    NDIS_STATUS nsStatus = NDIS_STATUS_SUCCESS;

    if ( ulBufferLength != ulBufferSize )
    {
        nsStatus = NDIS_STATUS_INVALID_LENGTH;
        *pulBytesNeeded = ulBufferSize;
    }
    return( nsStatus );
}  // CheckInputBufferSize


/*
    MiniportSetInformation

    Description:
        This function is used by NDIS to set adapter information by
        pre-defined NDIS_OIDs.

    Parameters:
        NDIS_HANDLE hAdapaterContext
            Handle to adapter context containing adapter information.

        NDIS_OID Oid
            The NDIS_OID to be set.

        PVOID pBuffer
            Pointer to NdisRequest->InformationBuffer which holds the data to
            be set.

        ULONG ulBufferLength
            The number of bytes in pBuffer.

        PULONG pulBytesRead
            Buffer to store the number of bytes read from pBuffer if the call
            is successful.

        PULONG pulBytesNeeded
            Buffer to store the number of bytes needed to complete the request
            if the specified buffer is not big enough.

    Return (NDIS_STATUS):
        NDIS_STATUS_SUCCESS         Set Information was successful
        NDIS_STATUS_INVALID_LENGTH  Invalid input buffer data length
        NDIS_STATUS_INVALID_OID     Invalid OID
        NDIS_STATUS_NOT_SUPPORTED   Valid OID, operation not currently
                                    supported
        NDIS_STATUS_INVALID_DATA    Invalid data in the input buffer
*/

NDIS_STATUS MiniportSetInformation (
    IN  NDIS_HANDLE hAdapterContext,
    IN  NDIS_OID    Oid,
    IN  PVOID       pBuffer,
    IN  ULONG       ulBufferLength,
    OUT PULONG      pulBytesRead,
    OUT PULONG      pulBytesNeeded )
{
    PNDIS_ADAPTER pAdapter = ( PNDIS_ADAPTER ) hAdapterContext;
    NDIS_STATUS   nsStatus = NDIS_STATUS_SUCCESS;
    PULONG        pUlong = ( PULONG ) pBuffer;

    *pulBytesNeeded = 0;
    *pulBytesRead = 0;
    switch ( Oid )
    {
        case OID_802_3_MULTICAST_LIST:
            if ( ( ulBufferLength % MAC_ADDRESS_LENGTH ) != 0 )
            {
                nsStatus = NDIS_STATUS_INVALID_LENGTH;
                break;
            }

            if ( ( ulBufferLength / MAC_ADDRESS_LENGTH ) > MAX_MULTICAST_LIST )
            {

#if 0
                nsStatus = NDIS_STATUS_MULTICAST_FULL;

#else
                if ( !AcquireAdapter( pAdapter, TRUE ) )
                {
                    nsStatus = NDIS_STATUS_FAILURE;
                    break;
                }
                if ( !HardwareSetMulticast( &pAdapter->m_Hardware, TRUE ) )
                {
                    nsStatus = NDIS_STATUS_FAILURE;
                }
                ReleaseAdapter( pAdapter );
                *pulBytesRead = ulBufferLength;
#endif
                break;
            }

            pAdapter->m_Hardware.m_bMulticastListSize = ( UCHAR )
                ( ulBufferLength / MAC_ADDRESS_LENGTH );
            NdisMoveMemory( pAdapter->m_Hardware.m_bMulticastList, pBuffer,
                ulBufferLength );
            if ( !AcquireAdapter( pAdapter, TRUE ) )
            {
                nsStatus = NDIS_STATUS_FAILURE;
                break;
            }
            if ( !HardwareSetGroupAddress( &pAdapter->m_Hardware ) )
            {
                nsStatus = NDIS_STATUS_FAILURE;
            }
            ReleaseAdapter( pAdapter );
            *pulBytesRead = ulBufferLength;
            break;

        case OID_GEN_CURRENT_PACKET_FILTER:
        {
            UCHAR bPromiscuous;

            if ( !NT_SUCCESS( nsStatus = CheckInputBufferSize( ulBufferLength,
                    sizeof( ULONG ), pulBytesNeeded )) )
            {
                break;
            }

#ifdef DBG
            DBG_PRINT( "set filter:%08x"NEWLINE, pUlong[ 0 ] );
#endif

            if ( pUlong[ 0 ] & pAdapter->m_ulPacketsNotAllowed )
            {
                nsStatus = NDIS_STATUS_NOT_SUPPORTED;
                break;
            }

            // Set the new alue on the adapter.

            pAdapter->m_ulPacketFilter = pUlong[ 0 ];
            if ( pAdapter->m_ulPacketFilter )
            {
                if ( !AcquireAdapter( pAdapter, TRUE ) )
                {
                    nsStatus = NDIS_STATUS_FAILURE;
                    break;
                }
                if ( ( pAdapter->m_ulPacketFilter &
                        NDIS_PACKET_TYPE_ALL_MULTICAST ) )
                    bPromiscuous = TRUE;
                else
                    bPromiscuous = FALSE;
                if ( !HardwareSetMulticast( &pAdapter->m_Hardware,
                        bPromiscuous ) )
                {
                    nsStatus = NDIS_STATUS_FAILURE;
                }
                if ( ( pAdapter->m_ulPacketFilter &
                        ( NDIS_PACKET_TYPE_PROMISCUOUS |
                        NDIS_PACKET_TYPE_ALL_LOCAL )) )
                    bPromiscuous = TRUE;
                else
                    bPromiscuous = FALSE;
                if ( !HardwareSetPromiscuous( &pAdapter->m_Hardware,
                        bPromiscuous ) )
                {
                    nsStatus = NDIS_STATUS_FAILURE;
                }
                ReleaseAdapter( pAdapter );

                // Now that the packet filter has been received, allow receive
                // packets to be indicated to the protocol stack.
                pAdapter->m_bPacketFilterSet = TRUE;
            }
            else
            {
                pAdapter->m_bPacketFilterSet = FALSE;
            }
            *pulBytesRead = sizeof( ULONG );
            break;
        }

        case OID_GEN_CURRENT_LOOKAHEAD:
            if ( !NT_SUCCESS( nsStatus = CheckInputBufferSize( ulBufferLength,
                    sizeof( ULONG ), pulBytesNeeded )) )
            {
                break;
            }

            if ( pUlong[ 0 ] > NDIS_MAX_LOOKAHEAD )
            {
                nsStatus = NDIS_STATUS_INVALID_DATA;
                break;
            }

#ifdef DBG
            DBG_PRINT( "set max lookahead: %u, %u"NEWLINE,
                pAdapter->m_ulMaxLookAhead, pUlong[ 0 ]);
#endif
            if ( pAdapter->m_ulMaxLookAhead < pUlong[ 0 ] )
                pAdapter->m_ulMaxLookAhead = pUlong[ 0 ];

            *pulBytesRead = sizeof( ULONG );
            break;

#ifdef NDIS51_MINIPORT
        case OID_GEN_MACHINE_NAME:
// Someday save this info off
// NdisMoveMemory( pAdapter->ucMachineName, &pUchar[0], MACHINE_NAME_LENGTH);

            *pulBytesRead = ulBufferLength;
            break;
#endif

        case OID_802_3_CURRENT_ADDRESS:
            if ( !NT_SUCCESS( nsStatus = CheckInputBufferSize( ulBufferLength,
                    MAC_ADDRESS_LENGTH, pulBytesNeeded )) )
            {
                break;
            }

            NdisMoveMemory( pAdapter->m_Hardware.m_bPermanentAddress, pBuffer,
                MAC_ADDRESS_LENGTH );
            *pulBytesRead = MAC_ADDRESS_LENGTH;
            break;

#if (NDISVER >= 50)  ||  defined( UNDER_CE )
        case OID_PNP_SET_POWER:
            if ( !NT_SUCCESS( nsStatus = CheckInputBufferSize( ulBufferLength,
                    sizeof( NDIS_DEVICE_POWER_STATE ), pulBytesNeeded )) )
            {
                break;
            }

            // D0 power state (full power) is the only state supported
            pAdapter->NextPowerState =
                *(( PNDIS_DEVICE_POWER_STATE ) pBuffer );

#if DBG
DBG_PRINT( "set power: %u, %u; %u, %u"NEWLINE, ulBufferLength,
    sizeof( NDIS_DEVICE_POWER_STATE ), pAdapter->CurrentPowerState,
    pAdapter->NextPowerState );
#endif
            if ( pAdapter->CurrentPowerState != pAdapter->NextPowerState )
            {
                pAdapter->CurrentPowerState = pAdapter->NextPowerState;
            }
            *pulBytesRead = ulBufferLength;
            break;

        case OID_PNP_ADD_WAKE_UP_PATTERN:

#if DBG
DBG_PRINT( "add wakeup: %u"NEWLINE, ulBufferLength );
#endif
            return( AddWakeUpPattern( pAdapter,
                ( PNDIS_PM_PACKET_PATTERN ) pBuffer, pulBytesRead ));

        case OID_PNP_REMOVE_WAKE_UP_PATTERN:

#if DBG
DBG_PRINT( "remove wakeup: %u"NEWLINE, ulBufferLength );
#endif
            return( RemoveWakeUpPattern( pAdapter,
                ( PNDIS_PM_PACKET_PATTERN ) pBuffer, pulBytesRead ));

        case OID_PNP_ENABLE_WAKE_UP:
            if ( !NT_SUCCESS( nsStatus = CheckInputBufferSize( ulBufferLength,
                    sizeof( ULONG ), pulBytesNeeded )) )
            {
                break;
            }

            pAdapter->m_ulWakeUpEnable = pUlong[ 0 ];

#if DBG
            if ( pAdapter->m_ulWakeUpEnable & NDIS_PNP_WAKE_UP_MAGIC_PACKET )
                DBG_PRINT( "NDIS_PNP_WAKE_UP_MAGIC_PNP"NEWLINE );
            if ( pAdapter->m_ulWakeUpEnable & NDIS_PNP_WAKE_UP_PATTERN_MATCH )
                DBG_PRINT( "NDIS_PNP_WAKE_UP_PATTERN_MATCH"NEWLINE );
            if ( pAdapter->m_ulWakeUpEnable & NDIS_PNP_WAKE_UP_LINK_CHANGE )
                DBG_PRINT( "NDIS_PNP_WAKE_UP_LINK_CHANGE"NEWLINE );
#endif
            *pulBytesRead = ulBufferLength;
            break;
#endif

        case OID_TCP_TASK_OFFLOAD:
            return SetTaskOffload( pAdapter,
                ( PNDIS_TASK_OFFLOAD_HEADER ) pBuffer, pulBytesRead );

        case OID_GEN_NETWORK_LAYER_ADDRESSES:
        case OID_GEN_TRANSPORT_HEADER_OFFSET:

#if DBG
            DBG_PRINT( "  set: %08x"NEWLINE, Oid );
#endif
            *pulBytesRead = ulBufferLength;
            nsStatus = NDIS_STATUS_FAILURE;
            break;

        case OID_DEVICE_MODE:
            nsStatus = SetDeviceMode( pAdapter, Oid, pBuffer, ulBufferLength,
                pulBytesRead, pulBytesNeeded );
            break;

        default:

#ifdef DBG
            DBG_PRINT( "set oid: %08x"NEWLINE, Oid );
#endif
            return NDIS_STATUS_FAILURE;
    }
    return( nsStatus );
}  // MiniportSetInformation

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -