共用方式為


管理 NDIS 選擇性暫停的 IRP 資源

如果迷你埠驅動程式支援並啟用 NDIS 選擇性暫停,NDIS 會呼叫 MiniportIdleNotification ,以在網路介面卡變成非使用中狀態時對驅動程式發出閒置通知。 當迷你埠驅動程式處理此通知時,可能需要發出 I/O 要求封包, (IRP) 基礎匯流排驅動程式。 這些 IRP 會通知匯流排驅動程式介面卡的閒置狀態,並要求確認介面卡可以轉換為低電源狀態。

迷你埠驅動程式所發出的 IRP 是匯流排專用的。 例如,當 NDIS 呼叫 MiniportIdleNotification時,USB 迷你埠會發出 USB 閒置要求 (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) IRP 到基礎 USB 匯流排驅動程式。

NDIS 可能會在驅動程式初始化之後多次發出閒置通知給迷你埠驅動程式。 因此,我們建議驅動程式在呼叫驅動程式 MiniportInitializeEx 函 式的內容中配置 USB 閒置要求 IRP 的資源。

下列範例示範迷你埠驅動程式如何配置 IRP 資源。

//
// MiniportInitializeEx()
//
// In the miniport's initialization routine, the miniport should allocate
// an IRP.  It can also set up the USB_IDLE_CALLBACK_INFO structure that
// will be used with each successive USB idle request.
//
NDIS_STATUS MiniportInitializeEx(
    _In_ NDIS_HANDLE MiniportAdapterHandle,
    _In_ NDIS_HANDLE MiniportDriverContext,
    _In_ PNDIS_MINIPORT_INIT_PARAMETERS MiniportInitParameters
    )
    {
    PIRP UsbSsIrp;
    USB_IDLE_CALLBACK_INFO UsbSsCallback;
    ...

    UsbSsIrp = IoAllocateIrp(Adapter->Fdo->StackSize, FALSE);
    if (!UsbSsIrp)
       {
       // Handle failure
       return NDIS_STATUS_RESOURCES;
       }

    UsbSsCallback.IdleCallback = MiniportUsbIdleRequestCallback;
    UsbSsCallback.IdleContext = Adapter;

    // Save these in the adapter structure for later use
    Adapter->UsbSsIrp = UsbSsIrp;
    Adapter->UsbSsCallback = UsbSsCallback;
    ...
    }

如果迷你埠驅動程式在呼叫 MiniportInitializeEx期間配置 IRP 資源,則驅動程式必須在呼叫 MiniportHaltEx期間釋放這些資源。

下列範例示範迷你埠驅動程式如何釋放 IRP 資源。

//
// MiniportHaltEx
//
// During halt (or when the miniport performs its cleanup from 
// MiniportInitializeEx) the miniport should free the IRP allocated 
// earlier.
//
VOID MiniportHaltEx(
     _In_  NDIS_HANDLE MiniportAdapterContext,
     _In_  NDIS_HALT_ACTION HaltAction
    )
    {
    ...
    if (Adapter->UsbSsIrp)
        {
        IoFreeIrp(Adapter->UsbSsIrp);
        Adapter->UsbSsIrp = NULL;
        }
    ...
    }