📄 request.c
字号:
if(InformationBufferLength != sizeof(ULONG))
{
*BytesNeeded = sizeof(ULONG);
Status = NDIS_STATUS_INVALID_LENGTH;
break;
}
*BytesRead = InformationBufferLength;
Status = NICSetPacketFilter(
Adapter,
*((PULONG)InformationBuffer));
break;
case OID_GEN_CURRENT_LOOKAHEAD:
//
// A protocol driver can set a suggested value for the number
// of bytes to be used in its binding; however, the underlying
// NIC driver is never required to limit its indications to
// the value set.
//
if(InformationBufferLength != sizeof(ULONG)){
*BytesNeeded = sizeof(ULONG);
Status = NDIS_STATUS_INVALID_LENGTH;
break;
}
Adapter->ulLookAhead = *(PULONG)InformationBuffer;
*BytesRead = sizeof(ULONG);
Status = NDIS_STATUS_SUCCESS;
break;
default:
Status = NDIS_STATUS_INVALID_OID;
break;
}
if(Status == NDIS_STATUS_SUCCESS)
{
*BytesRead = InformationBufferLength;
}
DEBUGP(MP_LOUD, ("<-- MPSetInformation Status = 0x%08x\n", Status));
return(Status);
}
ULONG NICGetMediaConnectStatus(
PMP_ADAPTER Adapter
)
/*++
Routine Description:
This routine will query the hardware and return
the media status.
Arguments:
IN PMP_ADAPTER Adapter - pointer to adapter block
Return Value:
NdisMediaStateDisconnected or
NdisMediaStateConnected
--*/
{
if(MP_TEST_FLAG(Adapter, fMP_DISCONNECTED))
{
return(NdisMediaStateDisconnected);
}
else
{
return(NdisMediaStateConnected);
}
}
NDIS_STATUS NICSetPacketFilter(
IN PMP_ADAPTER Adapter,
IN ULONG PacketFilter)
/*++
Routine Description:
This routine will set up the adapter so that it accepts packets
that match the specified packet filter. The only filter bits
that can truly be toggled are for broadcast and promiscuous
Arguments:
IN PMP_ADAPTER Adapter - pointer to adapter block
IN ULONG PacketFilter - the new packet filter
Return Value:
NDIS_STATUS_SUCCESS
NDIS_STATUS_NOT_SUPPORTED
--*/
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
DEBUGP(MP_TRACE, ("--> NICSetPacketFilter\n"));
// any bits not supported?
if(PacketFilter & ~NIC_SUPPORTED_FILTERS)
{
return(NDIS_STATUS_NOT_SUPPORTED);
}
// any filtering changes?
if(PacketFilter != Adapter->PacketFilter)
{
//
// Change the filtering modes on hardware
// TODO
// Save the new packet filter value
Adapter->PacketFilter = PacketFilter;
}
DEBUGP(MP_TRACE, ("<-- NICSetPacketFilter\n"));
return(Status);
}
NDIS_STATUS NICSetMulticastList(
IN PMP_ADAPTER Adapter,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG pBytesRead,
OUT PULONG pBytesNeeded
)
/*++
Routine Description:
This routine will set up the adapter for a specified multicast
address list.
Arguments:
IN PMP_ADAPTER Adapter - Pointer to adapter block
InformationBuffer - Buffer for information
InformationBufferLength Size of this buffer
pBytesRead Specifies how much info is read
BytesNeeded In case the buffer is smaller than
what we need, tell them how much is needed
Return Value:
NDIS_STATUS
--*/
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
ULONG index;
DEBUGP(MP_TRACE, ("--> NICSetMulticastList\n"));
//
// Initialize.
//
*pBytesNeeded = ETH_LENGTH_OF_ADDRESS;
*pBytesRead = InformationBufferLength;
do
{
if (InformationBufferLength % ETH_LENGTH_OF_ADDRESS)
{
Status = NDIS_STATUS_INVALID_LENGTH;
break;
}
if (InformationBufferLength > (NIC_MAX_MCAST_LIST * ETH_LENGTH_OF_ADDRESS))
{
Status = NDIS_STATUS_MULTICAST_FULL;
*pBytesNeeded = NIC_MAX_MCAST_LIST * ETH_LENGTH_OF_ADDRESS;
break;
}
//
// Protect the list update with a lock if it can be updated by
// another thread simultaneously.
//
NdisZeroMemory(Adapter->MCList,
NIC_MAX_MCAST_LIST * ETH_LENGTH_OF_ADDRESS);
NdisMoveMemory(Adapter->MCList,
InformationBuffer,
InformationBufferLength);
Adapter->ulMCListSize = InformationBufferLength / ETH_LENGTH_OF_ADDRESS;
#if DBG
// display the multicast list
for(index = 0; index < Adapter->ulMCListSize; index++)
{
DEBUGP(MP_LOUD, ("MC(%d) = %02x-%02x-%02x-%02x-%02x-%02x\n",
index,
Adapter->MCList[index][0],
Adapter->MCList[index][1],
Adapter->MCList[index][2],
Adapter->MCList[index][3],
Adapter->MCList[index][4],
Adapter->MCList[index][5]));
}
#endif
}
while (FALSE);
//
// Program the hardware to add suport for these muticast addresses
//
DEBUGP(MP_TRACE, ("<-- NICSetMulticastList\n"));
return(Status);
}
PUCHAR DbgGetOidName(ULONG oid)
{
PCHAR oidName;
switch (oid){
#undef MAKECASE
#define MAKECASE(oidx) case oidx: oidName = #oidx; break;
MAKECASE(OID_GEN_SUPPORTED_LIST)
MAKECASE(OID_GEN_HARDWARE_STATUS)
MAKECASE(OID_GEN_MEDIA_SUPPORTED)
MAKECASE(OID_GEN_MEDIA_IN_USE)
MAKECASE(OID_GEN_MAXIMUM_LOOKAHEAD)
MAKECASE(OID_GEN_MAXIMUM_FRAME_SIZE)
MAKECASE(OID_GEN_LINK_SPEED)
MAKECASE(OID_GEN_TRANSMIT_BUFFER_SPACE)
MAKECASE(OID_GEN_RECEIVE_BUFFER_SPACE)
MAKECASE(OID_GEN_TRANSMIT_BLOCK_SIZE)
MAKECASE(OID_GEN_RECEIVE_BLOCK_SIZE)
MAKECASE(OID_GEN_VENDOR_ID)
MAKECASE(OID_GEN_VENDOR_DESCRIPTION)
MAKECASE(OID_GEN_CURRENT_PACKET_FILTER)
MAKECASE(OID_GEN_CURRENT_LOOKAHEAD)
MAKECASE(OID_GEN_DRIVER_VERSION)
MAKECASE(OID_GEN_MAXIMUM_TOTAL_SIZE)
MAKECASE(OID_GEN_PROTOCOL_OPTIONS)
MAKECASE(OID_GEN_MAC_OPTIONS)
MAKECASE(OID_GEN_MEDIA_CONNECT_STATUS)
MAKECASE(OID_GEN_MAXIMUM_SEND_PACKETS)
MAKECASE(OID_GEN_VENDOR_DRIVER_VERSION)
MAKECASE(OID_GEN_SUPPORTED_GUIDS)
MAKECASE(OID_GEN_NETWORK_LAYER_ADDRESSES)
MAKECASE(OID_GEN_TRANSPORT_HEADER_OFFSET)
MAKECASE(OID_GEN_MEDIA_CAPABILITIES)
MAKECASE(OID_GEN_PHYSICAL_MEDIUM)
MAKECASE(OID_GEN_XMIT_OK)
MAKECASE(OID_GEN_RCV_OK)
MAKECASE(OID_GEN_XMIT_ERROR)
MAKECASE(OID_GEN_RCV_ERROR)
MAKECASE(OID_GEN_RCV_NO_BUFFER)
MAKECASE(OID_GEN_DIRECTED_BYTES_XMIT)
MAKECASE(OID_GEN_DIRECTED_FRAMES_XMIT)
MAKECASE(OID_GEN_MULTICAST_BYTES_XMIT)
MAKECASE(OID_GEN_MULTICAST_FRAMES_XMIT)
MAKECASE(OID_GEN_BROADCAST_BYTES_XMIT)
MAKECASE(OID_GEN_BROADCAST_FRAMES_XMIT)
MAKECASE(OID_GEN_DIRECTED_BYTES_RCV)
MAKECASE(OID_GEN_DIRECTED_FRAMES_RCV)
MAKECASE(OID_GEN_MULTICAST_BYTES_RCV)
MAKECASE(OID_GEN_MULTICAST_FRAMES_RCV)
MAKECASE(OID_GEN_BROADCAST_BYTES_RCV)
MAKECASE(OID_GEN_BROADCAST_FRAMES_RCV)
MAKECASE(OID_GEN_RCV_CRC_ERROR)
MAKECASE(OID_GEN_TRANSMIT_QUEUE_LENGTH)
MAKECASE(OID_GEN_GET_TIME_CAPS)
MAKECASE(OID_GEN_GET_NETCARD_TIME)
MAKECASE(OID_GEN_NETCARD_LOAD)
MAKECASE(OID_GEN_DEVICE_PROFILE)
MAKECASE(OID_GEN_INIT_TIME_MS)
MAKECASE(OID_GEN_RESET_COUNTS)
MAKECASE(OID_GEN_MEDIA_SENSE_COUNTS)
MAKECASE(OID_PNP_CAPABILITIES)
MAKECASE(OID_PNP_SET_POWER)
MAKECASE(OID_PNP_QUERY_POWER)
MAKECASE(OID_PNP_ADD_WAKE_UP_PATTERN)
MAKECASE(OID_PNP_REMOVE_WAKE_UP_PATTERN)
MAKECASE(OID_PNP_ENABLE_WAKE_UP)
MAKECASE(OID_802_3_PERMANENT_ADDRESS)
MAKECASE(OID_802_3_CURRENT_ADDRESS)
MAKECASE(OID_802_3_MULTICAST_LIST)
MAKECASE(OID_802_3_MAXIMUM_LIST_SIZE)
MAKECASE(OID_802_3_MAC_OPTIONS)
MAKECASE(OID_802_3_RCV_ERROR_ALIGNMENT)
MAKECASE(OID_802_3_XMIT_ONE_COLLISION)
MAKECASE(OID_802_3_XMIT_MORE_COLLISIONS)
MAKECASE(OID_802_3_XMIT_DEFERRED)
MAKECASE(OID_802_3_XMIT_MAX_COLLISIONS)
MAKECASE(OID_802_3_RCV_OVERRUN)
MAKECASE(OID_802_3_XMIT_UNDERRUN)
MAKECASE(OID_802_3_XMIT_HEARTBEAT_FAILURE)
MAKECASE(OID_802_3_XMIT_TIMES_CRS_LOST)
MAKECASE(OID_802_3_XMIT_LATE_COLLISIONS)
default:
oidName = "<** UNKNOWN OID **>";
break;
}
return oidName;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -