Обработчик остановки драйвера miniport
Драйвер мини-порта NDIS должен предоставить функцию MiniportHaltExв NdisMRegisterMiniportDriver.
MiniportHaltEx должен отменить все, что сделал MiniportInitializeEx . Например, драйвер мини-порта NDIS может:
Бесплатные порты. (Дополнительные сведения см. в разделе Освобождение порта NDIS.)
Отпустите все аппаратные ресурсы, запрошенные MiniportInitializeEx .
Бесплатные ресурсы прерывания путем вызова NdisMDeregisterInterruptEx.
Освободите любую память, выделенную MiniportInitializeEx .
Остановите сетевой адаптер, если только функция MiniportShutdownEx не восстановила NIC в исходное состояние.
На следующей схеме показана выгрузка драйвера мини-порта.
MiniportHaltEx должен завершить операции, необходимые для выгрузки драйвера перед возвратом. Если драйвер мини-порта имеет какие-либо незавершенные признаки получения (то есть полученные сетевые данные, которые он указал до NDIS, но которые NDIS еще не вернул), MiniportHaltEx не должен возвращать, пока такие данные не будут возвращены в функцию MiniportReturnNetBufferLists драйвера мини-порта.
На предыдущем рисунке показан набор вызовов, которые могут выполняться функцией MiniportHaltEx . Эти вызовы являются лишь подмножеством вызовов, которые можно выполнить. Фактический набор вызовов зависит от предыдущих действий драйвера мини-порта. Драйвер мини-порта может выполнять те же вызовы в MiniportInitializeEx , если ему не удается успешно инициализировать сетевой адаптер из-за проблем с оборудованием или из-за того, что ему не удается получить необходимый ресурс. В этом случае MiniportInitializeEx должен выгрузить драйвер, отменив его предыдущие действия. В противном случае MiniportHaltEx отменит действия MiniportInitializeEx.
В следующем списке описаны вызовы, необходимые для отмены определенных действий, которые может предпринять драйвер мини-порта:
Если драйвер мини-порта зарегистрировал прерывание, он должен вызвать NdisMDeregisterInterruptEx.
Если драйвер мини-порта настроит таймер или таймеры, он должен вызывать NdisCancelTimerObject для каждого созданного таймера. Если вызов NdisCancelTimerObject завершается сбоем, возможно, таймер уже сработал. В этом случае драйвер мини-порта должен дождаться завершения обработчика таймера перед возвратом из MiniportHaltEx.
Если драйвер мини-порта выделил любую память с помощью NdisAllocateMemoryWithTagPriority, он должен вызвать NdisFreeMemory , чтобы освободить ее.
Если драйвер мини-порта выделил любую память с помощью NdisMAllocateSharedMemory или NdisMAllocateSharedMemoryAsyncEx, он должен вызвать NdisMFreeSharedMemory , чтобы освободить ее.
Если драйвер мини-порта выделил и инициализировал хранилище для пула дескрипторов пакетов с NdisAllocateNetBufferPool, он должен вызвать NdisFreeNetBufferPool , чтобы освободить это хранилище.
Если драйвер мини-порта выделил или зарезервировал какие-либо аппаратные ресурсы, они должны быть возвращены. Например, если драйвер мини-порта сопоставил диапазон портов ввода-вывода с сетевой картой, он должен освободить порты, вызвав NdisMDeregisterIoPortRange.
Связанные темы
Состояния адаптера драйвера miniport