Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Если минипорт-драйвер поддерживает и включает выборочную приостановку NDIS, NDIS вызывает MiniportIdleNotification, чтобы выдать драйверу уведомление об простое, если сетевой адаптер становится неактивным. Когда драйвер минипорта обрабатывает это уведомление, может потребоваться выдавать пакеты запросов ввода-вывода (IRPs) базовому драйверу шины. Эти IRP уведомляют водителя шины о состоянии простоя адаптера и запрашивают подтверждение того, что адаптер может перейти в режим низкого энергопотребления.
IRP, выдаваемые драйвером мини-порта, являются специфическими для шины. Например, когда NDIS вызывает MiniportIdleNotification, минипорт USB отправляет запрос на состояние простоя USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) IRP базовому драйверу USB-шины.
NDIS может выдавать неактивное уведомление мини-драйверу много раз после инициализации драйвера. Поэтому мы рекомендуем драйверу выделить ресурсы для IRP-запроса на бездействие USB в контексте вызова функции драйвера MiniportInitializeEx.
В следующем примере показано, как драйвер минипорта выделяет ресурсы 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;
...
}
Если драйвер минипорта выделяет ресурсы IRP во время вызова MiniportInitializeEx, он должен освободить эти ресурсы во время вызова 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;
}
...
}