📄 ndisoid.c
字号:
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 + -