📄 wdmvnicoids.cpp
字号:
// This OID specifies a three-byte IEEE-registered vendor code.
ETHERNET_ADDRESS addr = m_PermanentAddress;
ULONG id = addr; // get 1st 4 bytes
* (PUCHAR(&id)+3) = 0; // my "NIC" id
return id;
}
_inline_ ULONG WdmVNICAdapter::getOID_GEN_VENDOR_DRIVER_VERSION()
{
return (WDMVNIC_VERSION_MAJOR<<8) | WDMVNIC_VERSION_MINOR;
}
_inline_ ULONG WdmVNICAdapter::getOID_GEN_RECEIVE_BLOCK_SIZE(void)
{
return WDMVNIC_RECEIVE_BLOCK;
}
_inline_ ULONG WdmVNICAdapter::getOID_GEN_TRANSMIT_BLOCK_SIZE(void)
{
return WDMVNIC_TRANSMIT_BLOCK;
}
_inline_ ULONG WdmVNICAdapter::getOID_GEN_RECEIVE_BUFFER_SPACE(void)
{
return WDMVNIC_RX_BUFFER_SPACE;
}
_inline_ ULONG WdmVNICAdapter::getOID_GEN_TRANSMIT_BUFFER_SPACE(void)
{
return WDMVNIC_TX_BUFFER_SPACE;
}
_inline_ ULONG WdmVNICAdapter::getOID_GEN_LINK_SPEED(void)
{
return WDMVNIC_MAX_LINKSPEED/100;
}
_inline_ ULONG WdmVNICAdapter::getOID_GEN_MAXIMUM_FRAME_SIZE(void)
{
return WDMVNIC_MAX_FRAMESIZE;
}
_inline_ ULONG WdmVNICAdapter::getOID_GEN_MAXIMUM_LOOKAHEAD(void)
{
return WDMVNIC_MAX_LOOKAHEAD;
}
NDIS_STATUS WdmVNICAdapter::getOID_GEN_MEDIA_SUPPORTED
(NDIS_MEDIUM* pMedium, PULONG ByteCount, OUT PULONG BytesNeeded)
{
// supported medium
static NDIS_MEDIUM medium[] = { WDMVNIC_MEDIUM_TYPE };
if ( (*BytesNeeded = sizeof(medium)) > *ByteCount) {
*ByteCount = 0;
return NDIS_STATUS_BUFFER_TOO_SHORT;
}
NdisMoveMemory(pMedium, medium, (*ByteCount = sizeof(medium)));
return NDIS_STATUS_SUCCESS;
}
NDIS_STATUS WdmVNICAdapter::getOID_GEN_MEDIA_IN_USE
(NDIS_MEDIUM* pMedium, PULONG ByteCount, OUT PULONG BytesNeeded)
{
if ( (*BytesNeeded = sizeof(NDIS_MEDIUM)) > *ByteCount) {
*ByteCount = 0;
return NDIS_STATUS_BUFFER_TOO_SHORT;
}
*pMedium = WDMVNIC_MEDIUM_TYPE;
*ByteCount = sizeof(NDIS_MEDIUM);
return NDIS_STATUS_SUCCESS;
}
/////////////////////////////////////////////////////////////////
// OID Set Handlers
NDIS_STATUS WdmVNICAdapter::setOID_GEN_PROTOCOL_OPTIONS(PULONG Param)
{
m_uMacOptions = *Param;
return NDIS_STATUS_SUCCESS; // ignore for now
}
NDIS_STATUS WdmVNICAdapter::setOID_GEN_CURRENT_PACKET_FILTER(PULONG Param)
{
m_uPacketFilter = *Param;
return NDIS_STATUS_SUCCESS; // ignore for now
}
NDIS_STATUS WdmVNICAdapter::setOID_GEN_CURRENT_LOOKAHEAD(PULONG pLookahead)
{
// TODO: If the driver uses partial rcv indications save the value and
// honor it when indicating. Drivers indicating full packets shouldn't care.
if (*pLookahead > WDMVNIC_MAX_LOOKAHEAD)
return NDIS_STATUS_INVALID_LENGTH;
// m_uMaxLookahead = *pLookahead;
return NDIS_STATUS_SUCCESS;
}
////////////////////////////////////////////////////////
// Medium specific handlers
//
// 802_3 specific queries
_inline_ ULONG WdmVNICAdapter::getOID_802_3_XMIT_ONE_COLLISION(void)
{
return m_MediumStats->xmit_one_collision;
}
_inline_ ULONG WdmVNICAdapter::getOID_802_3_XMIT_MORE_COLLISIONS(void)
{
return m_MediumStats->xmit_more_collision;
}
_inline_ ULONG WdmVNICAdapter::getOID_802_3_RCV_ERROR_ALIGNMENT(void)
{
return m_MediumStats->rcv_err_align;
}
NDIS_STATUS WdmVNICAdapter::getOID_802_3_MULTICAST_LIST
(ETHERNET_ADDRESS *, IN OUT PULONG ByteCount, OUT PULONG BytesNeeded)
{
// TODO: Read the mulicast list from the card
*ByteCount = 0;
// make sure the list is well-formated and do not exceed capacity
if (*ByteCount % sizeof(ETHERNET_ADDRESS)) {
return NDIS_STATUS_INVALID_DATA;
}
return NDIS_STATUS_NOT_SUPPORTED;
}
_inline_ ULONG WdmVNICAdapter::getOID_802_3_MAXIMUM_LIST_SIZE(void)
{
return WDMVNIC_802_3_MAX_LIST_SIZE;
}
_inline_ ETHERNET_ADDRESS WdmVNICAdapter::getOID_802_3_CURRENT_ADDRESS(void)
{
return m_CurrentAddress;
}
_inline_ ETHERNET_ADDRESS WdmVNICAdapter::getOID_802_3_PERMANENT_ADDRESS(void)
{
return m_PermanentAddress;
}
// 802_3 specific set
NDIS_STATUS WdmVNICAdapter::setOID_802_3_MULTICAST_LIST
(ETHERNET_ADDRESS *pAddress, PULONG ByteCount, OUT PULONG BytesNeeded)
{
// TODO: program the list into the NIC
UNREFERENCED_PARAMETER(pAddress);
if (ByteCount == NULL || BytesNeeded == NULL)
return NDIS_STATUS_INVALID_DATA;
ULONG nAddr = *ByteCount/sizeof(ETHERNET_ADDRESS); // # of addresses
if (*ByteCount%sizeof(ETHERNET_ADDRESS)) {
*ByteCount = 0;
*BytesNeeded = nAddr*sizeof(ETHERNET_ADDRESS);
return NDIS_STATUS_INVALID_LENGTH;
}
return NDIS_STATUS_SUCCESS;
}
///////////////////////////////////////////////////////////////
// PnP Hanlders
#if (KNDIS_PNP_AWARE)
NDIS_STATUS WdmVNICAdapter::getOID_PNP_QUERY_POWER(PNDIS_DEVICE_POWER_STATE DesiredState)
{
// TODO: Check if it is safe to switch to the specified lower-power state.
// On successful return, NDIS will immediately call OID_PNP_SET_POWER
UNREFERENCED_PARAMETER(DesiredState);
return NDIS_STATUS_SUCCESS;
}
NDIS_STATUS WdmVNICAdapter::setOID_PNP_SET_POWER(PNDIS_DEVICE_POWER_STATE DesiredState)
{
// TODO: Do switch to the specified lower-power state. Can't fail.
m_Power = *DesiredState;
return NDIS_STATUS_SUCCESS;
}
NDIS_STATUS WdmVNICAdapter::setOID_PNP_ADD_WAKE_UP_PATTERN(PNDIS_PM_PACKET_PATTERN Pattern)
{
// TODO: Program the pattern into the NIC. NOTE that this handler can never be
// called unless we had specified the "wake-up" support in our
// KNdisPnpMode<WdmVNICAdapter> policies.
KNdisPmPacketPattern pattern(Pattern);
STRING mask, data;
pattern.GetMask(mask);
pattern.GetData(data);
// ...
return NDIS_STATUS_SUCCESS;
}
NDIS_STATUS WdmVNICAdapter::setOID_PNP_REMOVE_WAKE_UP_PATTERN(PNDIS_PM_PACKET_PATTERN Pattern)
{
// TODO: Remove the pattern from the NIC. NOTE that this handler can never be
// called unless we had specified the "wake-up" support in our
// KNdisPnpMode<WdmVNICAdapter> policies.
KNdisPmPacketPattern pattern(Pattern);
STRING mask, data;
pattern.GetMask(mask);
pattern.GetData(data);
// ...
return NDIS_STATUS_SUCCESS;
}
ULONG WdmVNICAdapter::getOID_PNP_ENABLE_WAKE_UP()
{
// TODO: Return those wake up methods (a mask) that are safe to turn on now.
// NDIS will select one of those in a following set request. Those
// should be a subset of flags retrieved from the m_Power member.
ULONG uMask = m_Power.GetCurrentWakeUpEnableMask();
return uMask;
}
NDIS_STATUS WdmVNICAdapter::setOID_PNP_ENABLE_WAKE_UP(PULONG uMask)
{
// TODO: Enable wake/disable methods specified in the uMask.
// Note that NDIS would never set all 3 simultaneously.
// "Magic Packet": a packet that contains 16 contiguous copies of the receiving
// NIC's Phys address
if (*uMask & NDIS_PNP_WAKE_UP_MAGIC_PACKET) { // enable
} else { // disable
}
// "Pattern Match": signal on receipt of a packet that contains a pattern
// specified by the protocol with setOID_PNP_ADD_WAKE_UP_PATTERN
if (*uMask & NDIS_PNP_WAKE_UP_PATTERN_MATCH) { // enable
} else { // disable
}
// "Link Change": signal in response to the connection or disconnection of
// the NIC's network cable.
if (*uMask & NDIS_PNP_WAKE_UP_LINK_CHANGE) { // enable
} else { // disable
}
return NDIS_STATUS_SUCCESS;
}
#endif // KNDIS_PNP_AWARE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -