NDIS_STATUS
MiniportQueryInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded
);
MiniportQueryInformation is a required function that returns information about the capabilities and status of the driver and/or its NIC.
MiniportQueryInformation can return one of the following:
NDIS calls the MiniportQueryInformation function either on its own behalf, such as to determine which options the driver supports or to manage binding-specific information for the miniport, or when a bound protocol driver calls NdisRequest.
NDIS makes one or more calls to MiniportQueryInformation just after a driver’s MiniportInitialize function returns NDIS_STATUS_SUCCESS. NDIS supplies the following OIDs in its initialization-time calls to the driver’s MiniportQueryInformation function:
Even if a driver supports multipacket receives and, therefore, will indicate
an array of pointers to fully set up packets, MiniportQueryInformation must
supply this information. Such a driver should return the maximum packet size
it can indicate.
For example, a NIC driver always sets the NDIS_MAC_OPTION_NO_LOOPBACK flag if its NIC has no internal hardware support for loopback. This tells NDIS to manage loopback for the driver, which cannot provide software loopback code as efficient as the NDIS library’s because NDIS manages all binding-specific information for miniports. Any miniport that tries to provide software loopback must check the destination address of every send packet against the currently set filter addresses to determine whether to loop back each packet. WAN NIC drivers must set this flag.
If the NIC driver sets the NDIS_MAC_OPTION_FULL_DUPLEX flag, the NDIS library serializes calls to the MiniportSendPackets or Miniport(Wan)Send function separately from its serialized calls to other MiniportXxx functions in SMP machines. However, NDIS returns incoming send packets to protocols while such a driver’s MiniportReset function is executing: that is, NDIS never calls a full-duplex miniport to transmit a packet until its reset operation is completed. The designer of any full-duplex driver can expect that driver to achieve significantly higher performance in SMP machines, but the driver must synchronize its accesses to shared resources carefully to prevent race conditions or deadlocks from occurring. NDIS assumes that all intermediate drivers are full-duplex drivers.
Depending on the NdisMediumXxx that MiniportInitialize selected, NDIS submits additional intialization-time requests to MiniportQueryInformation, such as the following:
If possible, MiniportQueryInformation should not return NDIS_STATUS_PENDING for initialization-time requests. Until NDIS has sufficient information to set up bindings to the miniport, such requests should be handled synchronously.
Subsequently, the NDIS library intercepts all protocol-initiated queries on certain OIDs, such as the following:
OID_GEN_CURRENT_PACKET_FILTER
OID_GEN_PROTOCOL_OPTIONS
OID_802_5_CURRENT_FUNCTIONAL
OID_802_3_MULTICAST_LIST
OID_FDDI_LONG_MULTICAST_LIST
OID_FDDI_SHORT_MULTICAST_LIST
For more information about the system-defined OIDs, see Chapter 5.
If MiniportQueryInformation does not complete a request synchronously and returns NDIS_STATUS_PENDING, the driver must complete the request later with a call to NdisMQueryInformationComplete. Until it completes any such request, the miniport can safely access the memory at InformationBuffer, BytesWritten, and BytesNeeded. After the miniport completes any query, ownership of these variables and the buffer reverts to NDIS or the caller of NdisRequest, whichever allocated the memory.
After a call to MiniportQueryInformation, NDIS submits no other requests to the driver until it has completed the current request, either synchronously or asynchronously. Instead, NDIS holds requests queued until the current query is completed.
MiniportQueryInformation can be pre-empted by an interrupt.
By default, MiniportQueryInformation runs at IRQL DISPATCH_LEVEL.
MiniportInitialize, MiniportSetInformation, NdisMQueryInformationComplete, NdisRequest, NDIS_REQUEST