NDIS 會呼叫迷你埠驅動程式的 MiniportIdleNotification 處理程式函式,以便選擇性地暫停網路適配器。 當 NDIS 將網路介面卡轉換成低功率狀態時,適配器會暫停。
如果網路適配器仍在使用中,迷你埠驅動程式可以否決閑置通知。 驅動程式會從 MiniportIdleNotification 處理程式函式傳回 NDIS_STATUS_BUSY 來執行此動作。
注意 如果 MiniportIdleNotification 處理函式的 ForceIdle 參數設為 TRUE,迷你埠驅動程式無法否決閒置通知。
如果迷你埠驅動程式未否決閑置通知,則可能需要對基礎總線驅動程式發出總線特定的 I/O 要求封包(IRP)。 這些 IRP 會通知總線驅動程式適配卡的閑置狀態,並要求確認適配卡可以轉換為低功率狀態。
例如,呼叫 MiniportIdleNotification 時,USB 迷你埠驅動程式會準備 I/O 要求封包 (IRP) 以取得 USB 閑置要求 (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION)。 當迷你埠驅動程序準備 IRP 時,它必須指定回呼函式。 驅動程式也必須呼叫 IoSetCompletionRoutine 或 IoSetCompletionRoutineEx,以指定 IRP 的完成例程。 迷你埠驅動程序接著會呼叫 IoCallDriver,以向 USB 總線驅動程式發出 IRP。
注意 USB 總線驅動程式不會立即完成 IRP。 IRP 在進行低功率轉換時會處於擱置狀態。 只有在迷你埠驅動程式取消 IRP 或發生硬體事件時,總線驅動程式才會完成 IRP,例如從 USB 中樞中意外移除網路適配器。
以下是一個 USB 迷你埠驅動程式的 MiniportIdleNotification 處理程式函數範例。 此範例示範向基礎 USB 驅動程式發出 USB 閑置要求 IRP 的相關步驟。 此範例也會示範先前在 MiniportInitializeEx中配置的 IRP 資源如何可以重複使用給 IRP。
//
// MiniportIdleNotification()
//
// This routine is invoked by NDIS when it has detected that the miniport
// is idle. The miniport must prepare to issue its selective suspend IRP
// to the USB stack. The driver can return NDIS_STATUS_BUSY if it is
// unwilling to become idle at this moment; NDIS will then retry later.
// Otherwise, the miniport should return NDIS_STATUS_PENDING.
//
NDIS_STATUS MiniportIdleNotification(
_In_ NDIS_HANDLE MiniportAdapterContext,
_In_ BOOLEAN ForceIdle
)
{
PIO_STACK_LOCATION IoSp;
IoReuseIrp(Adapter->UsbSsIrp, STATUS_NOT_SUPPORTED);
IoSp = IoGetNextIrpStackLocation(Adapter->UsbSsIrp);
IoSp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
IoSp->Parameters.DeviceIoControl.IoControlCode
= IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION;
IoSp->Parameters.DeviceIoControl.InputBufferLength
= sizeof(Adapter->UsbSsCallback);
IoSp->Parameters.DeviceIoControl.Type3InputBuffer
= Adapter->UsbSsCallback;
IoSetCompletionRoutine(
Adapter->UsbSsIrp,
MiniportUsbIdleRequestCompletion,
Adapter,
TRUE,
TRUE,
TRUE);
NtStatus = IoCallDriver(Adapter->Fdo, Adapter->UsbSsIrp);
if (!NT_SUCCESS(NtStatus))
{
return NDIS_STATUS_FAILURE;
}
return NDIS_STATUS_PENDING;
}
如需實作 USB 閑置要求 IRP 回呼例程的指導方針,請參閱 實作 USB 閑置要求 IRP 回呼例程。