📄 miniport.c
字号:
}
}
//
// If we bailed out above, fail any unprocessed sends.
//
while (i < NumberOfPackets)
{
NdisMSendComplete(pVElan->MiniportAdapterHandle,
PacketArray[i],
NDIS_STATUS_RESOURCES);
i++;
}
}
NDIS_STATUS
MPQueryInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded
)
/*++
Routine Description:
Entry point called by NDIS to query for the value of the specified OID.
All OID values are responded to right here, since this is a virtual
device (not pass-through).
Arguments:
MiniportAdapterContext Pointer to the adapter structure
Oid Oid for this query
InformationBuffer Buffer for information
InformationBufferLength Size of this buffer
BytesWritten Specifies how much info is written
BytesNeeded In case the buffer is smaller than
what we need, tell them how much is needed
Return Value:
Return code from the NdisRequest below.
--*/
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
PVELAN pVElan;
NDIS_HARDWARE_STATUS HardwareStatus = NdisHardwareStatusReady;
NDIS_MEDIUM Medium = VELAN_MEDIA_TYPE;
UCHAR VendorDesc[] = VELAN_VENDOR_DESC;
ULONG ulInfo;
ULONG64 ulInfo64;
USHORT usInfo;
PVOID pInfo = (PVOID) &ulInfo;
ULONG ulInfoLen = sizeof(ulInfo);
// Should we forward the request to the miniport below?
BOOLEAN bForwardRequest = FALSE;
pVElan = (PVELAN) MiniportAdapterContext;
// Initialize the result
*BytesWritten = 0;
*BytesNeeded = 0;
switch (Oid)
{
case OID_GEN_SUPPORTED_LIST:
pInfo = (PVOID) VElanSupportedOids;
ulInfoLen = sizeof(VElanSupportedOids);
break;
case OID_GEN_SUPPORTED_GUIDS:
//
// Do NOT forward this down, otherwise we will
// end up with spurious instances of private WMI
// classes supported by the lower driver(s).
//
Status = NDIS_STATUS_NOT_SUPPORTED;
break;
case OID_GEN_HARDWARE_STATUS:
pInfo = (PVOID) &HardwareStatus;
ulInfoLen = sizeof(NDIS_HARDWARE_STATUS);
break;
case OID_GEN_MEDIA_SUPPORTED:
case OID_GEN_MEDIA_IN_USE:
pInfo = (PVOID) &Medium;
ulInfoLen = sizeof(NDIS_MEDIUM);
break;
case OID_GEN_CURRENT_LOOKAHEAD:
case OID_GEN_MAXIMUM_LOOKAHEAD:
ulInfo = pVElan->LookAhead - ETH_HEADER_SIZE;
break;
case OID_GEN_MAXIMUM_FRAME_SIZE:
ulInfo = ETH_MAX_PACKET_SIZE - ETH_HEADER_SIZE;
#if IEEE_VLAN_SUPPORT
ulInfo -= VLAN_TAG_HEADER_SIZE;
#endif
break;
case OID_GEN_MAXIMUM_TOTAL_SIZE:
case OID_GEN_TRANSMIT_BLOCK_SIZE:
case OID_GEN_RECEIVE_BLOCK_SIZE:
ulInfo = (ULONG) ETH_MAX_PACKET_SIZE;
#if IEEE_VLAN_SUPPORT
ulInfo -= VLAN_TAG_HEADER_SIZE;
#endif
break;
case OID_GEN_MAC_OPTIONS:
ulInfo = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA |
NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |
NDIS_MAC_OPTION_NO_LOOPBACK;
#if IEEE_VLAN_SUPPORT
ulInfo |= (NDIS_MAC_OPTION_8021P_PRIORITY |
NDIS_MAC_OPTION_8021Q_VLAN);
#endif
break;
case OID_GEN_LINK_SPEED:
bForwardRequest = TRUE;
break;
case OID_GEN_TRANSMIT_BUFFER_SPACE:
ulInfo = ETH_MAX_PACKET_SIZE * pVElan->MaxBusySends;
#if IEEE_VLAN_SUPPORT
ulInfo -= VLAN_TAG_HEADER_SIZE * pVElan->MaxBusySends;
#endif
break;
case OID_GEN_RECEIVE_BUFFER_SPACE:
ulInfo = ETH_MAX_PACKET_SIZE * pVElan->MaxBusyRecvs;
#if IEEE_VLAN_SUPPORT
ulInfo -= VLAN_TAG_HEADER_SIZE * pVElan->MaxBusyRecvs;
#endif
break;
case OID_GEN_VENDOR_ID:
ulInfo = VELAN_VENDOR_ID;
break;
case OID_GEN_VENDOR_DESCRIPTION:
pInfo = VendorDesc;
ulInfoLen = sizeof(VendorDesc);
break;
case OID_GEN_VENDOR_DRIVER_VERSION:
ulInfo = VELAN_VENDOR_ID;
break;
case OID_GEN_DRIVER_VERSION:
usInfo = (USHORT) VELAN_DRIVER_VERSION;
pInfo = (PVOID) &usInfo;
ulInfoLen = sizeof(USHORT);
break;
case OID_802_3_PERMANENT_ADDRESS:
pInfo = pVElan->PermanentAddress;
ulInfoLen = ETH_LENGTH_OF_ADDRESS;
break;
case OID_802_3_CURRENT_ADDRESS:
pInfo = pVElan->CurrentAddress;
ulInfoLen = ETH_LENGTH_OF_ADDRESS;
break;
case OID_802_3_MAXIMUM_LIST_SIZE:
ulInfo = VELAN_MAX_MCAST_LIST;
break;
case OID_GEN_MAXIMUM_SEND_PACKETS:
ulInfo = VELAN_MAX_SEND_PKTS;
break;
case OID_GEN_MEDIA_CONNECT_STATUS:
//
// Get this from the adapter below.
//
bForwardRequest = TRUE;
break;
case OID_PNP_QUERY_POWER:
// simply succeed this.
ulInfoLen = 0;
break;
case OID_PNP_CAPABILITIES:
case OID_PNP_WAKE_UP_PATTERN_LIST:
//
// Pass down these power management/PNP OIDs.
//
bForwardRequest = TRUE;
break;
case OID_GEN_XMIT_OK:
ulInfo64 = pVElan->GoodTransmits;
pInfo = &ulInfo64;
if (InformationBufferLength >= sizeof(ULONG64) ||
InformationBufferLength == 0)
{
ulInfoLen = sizeof(ULONG64);
}
else
{
ulInfoLen = sizeof(ULONG);
}
break;
case OID_GEN_RCV_OK:
ulInfo64 = pVElan->GoodReceives;
pInfo = &ulInfo64;
if (InformationBufferLength >= sizeof(ULONG64) ||
InformationBufferLength == 0)
{
ulInfoLen = sizeof(ULONG64);
}
else
{
ulInfoLen = sizeof(ULONG);
}
break;
case OID_GEN_XMIT_ERROR:
ulInfo = pVElan->TxAbortExcessCollisions +
pVElan->TxDmaUnderrun +
pVElan->TxLostCRS +
pVElan->TxLateCollisions+
pVElan->TransmitFailuresOther;
break;
case OID_GEN_RCV_ERROR:
ulInfo = pVElan->RcvCrcErrors +
pVElan->RcvAlignmentErrors +
pVElan->RcvResourceErrors +
pVElan->RcvDmaOverrunErrors +
pVElan->RcvRuntErrors;
#if IEEE_VLAN_SUPPORT
ulInfo +=
(pVElan->RcvVlanIdErrors +
pVElan->RcvFormatErrors);
#endif
break;
case OID_GEN_RCV_NO_BUFFER:
ulInfo = pVElan->RcvResourceErrors;
break;
case OID_GEN_RCV_CRC_ERROR:
ulInfo = pVElan->RcvCrcErrors;
break;
case OID_GEN_TRANSMIT_QUEUE_LENGTH:
ulInfo = pVElan->RegNumTcb;
break;
case OID_802_3_RCV_ERROR_ALIGNMENT:
ulInfo = pVElan->RcvAlignmentErrors;
break;
case OID_802_3_XMIT_ONE_COLLISION:
ulInfo = pVElan->OneRetry;
break;
case OID_802_3_XMIT_MORE_COLLISIONS:
ulInfo = pVElan->MoreThanOneRetry;
break;
case OID_802_3_XMIT_DEFERRED:
ulInfo = pVElan->TxOKButDeferred;
break;
case OID_802_3_XMIT_MAX_COLLISIONS:
ulInfo = pVElan->TxAbortExcessCollisions;
break;
case OID_802_3_RCV_OVERRUN:
ulInfo = pVElan->RcvDmaOverrunErrors;
break;
case OID_802_3_XMIT_UNDERRUN:
ulInfo = pVElan->TxDmaUnderrun;
break;
case OID_802_3_XMIT_HEARTBEAT_FAILURE:
ulInfo = pVElan->TxLostCRS;
break;
case OID_802_3_XMIT_TIMES_CRS_LOST:
ulInfo = pVElan->TxLostCRS;
break;
case OID_802_3_XMIT_LATE_COLLISIONS:
ulInfo = pVElan->TxLateCollisions;
break;
#if IEEE_VLAN_SUPPORT
case OID_GEN_VLAN_ID:
ulInfo = pVElan->VlanId;
break;
#endif
default:
Status = NDIS_STATUS_INVALID_OID;
break;
}
if (bForwardRequest == FALSE)
{
//
// No need to forward this request down.
//
if (Status == NDIS_STATUS_SUCCESS)
{
if (ulInfoLen <= InformationBufferLength)
{
// Copy result into InformationBuffer
*BytesWritten = ulInfoLen;
if(ulInfoLen)
{
NdisMoveMemory(InformationBuffer, pInfo, ulInfoLen);
}
}
else
{
// too short
*BytesNeeded = ulInfoLen;
Status = NDIS_STATUS_BUFFER_TOO_SHORT;
}
}
}
else
{
//
// Send this request to the binding below.
//
Status = MPForwardRequest(pVElan,
NdisRequestQueryInformation,
Oid,
InformationBuffer,
InformationBufferLength,
BytesWritten,
BytesNeeded);
}
if ((Status != NDIS_STATUS_SUCCESS) &&
(Status != NDIS_STATUS_PENDING))
{
DBGPRINT(MUX_WARN, ("MPQueryInformation VELAN %p, OID 0x%08x, Status = 0x%08x\n",
pVElan, Oid, Status));
}
return(Status);
}
NDIS_STATUS
MPSetInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded
)
/*++
Routine Description:
This is the handler for an OID set operation. Relevant
OIDs are forwarded down to the lower miniport for handling.
Arguments:
MiniportAdapterContext Pointer to the adapter structure
Oid Oid for this query
InformationBuffer Buffer for information
InformationBufferLength Size of this buffer
BytesRead 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:
Return code from the NdisRequest below.
--*/
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
PVELAN pVElan = (PVELAN) MiniportAdapterContext;
ULONG PacketFilter;
NDIS_DEVICE_POWER_STATE NewDeviceState;
// Should we forward the request to the miniport below?
BOOLEAN bForwardRequest = FALSE;
*BytesRead = 0;
*BytesNeeded = 0;
switch (Oid)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -