Выгрузка драйвера выноски
Чтобы выгрузить драйвер выноски, операционная система вызывает функцию выгрузки драйвера выноски. Дополнительные сведения о том, как указать функцию выгрузки драйвера выноски, см. в разделе Указание функции выгрузки.
Функция выгрузки драйвера выноски гарантирует отмену регистрации выносок в подсистеме фильтрации до выгрузки драйвера выноски из системной памяти. Драйвер выноски вызывает функцию FwpsCalloutUnregisterById0 или функцию FwpsCalloutUnregisterByKey0 , чтобы отменить регистрацию выноски из подсистемы фильтров. Драйвер выноски не должен возвращаться из функции выгрузки до тех пор, пока не будет успешно отменена регистрация всех выносок из подсистемы фильтрации.
После отмены регистрации всех выносок в подсистеме фильтрации драйвер выносок должен удалить созданный объект устройства до первоначальной регистрации выносок. Драйвер выноски, основанный на модели windows Driver Model (WDM), вызывает функцию IoDeleteDevice для удаления объекта устройства. Драйвер выноски, основанный на платформах Windows Driver Framework (WDF), вызывает функцию WdfObjectDelete для удаления объекта устройства платформы.
Драйвер выноски также должен уничтожить любой дескриптор внедрения пакетов, созданный ранее путем вызова функции FwpsInjectionHandleDeким0 , прежде чем он возвращается из своей функции выгрузки.
Пример:
// Device object
PDEVICE_OBJECT deviceObject;
// Variable for the run-time callout identifier
UINT32 CalloutId;
// Injection handle
HANDLE injectionHandle;
// Unload function
VOID
Unload(
IN PDRIVER_OBJECT DriverObject
)
{
NTSTATUS status;
// Unregister the callout
status =
FwpsCalloutUnregisterById0(
CalloutId
);
// Check result
if (status == STATUS_DEVICE_BUSY)
{
// For each data flow that is being processed by the
// callout that has an associated context, clean up
// the context and then call FwpsFlowRemoveContext0
// to remove the context from the data flow.
...
// Finish unregistering the callout
status =
FwpsCalloutUnregisterById0(
CalloutId
);
}
// Check status
if (status != STATUS_SUCCESS)
{
// Handle error
...
}
// Delete the device object
IoDeleteDevice(
deviceObject
);
// Destroy the injection handle
status =
FwpsInjectionHandleDestroy0(
injectionHandle
);
// Check status
if (status != STATUS_SUCCESS)
{
// Handle error
...
}
}
В предыдущем примере предполагается драйвер выноски на основе WDM. Для драйвера выноски на основе WDF единственное различие заключается в параметре, передаваемом функции выгрузки драйвера выноски, и в том, как драйвер выноски удаляет объект устройства платформы.
WDFDEVICE wdfDevice;
VOID
Unload(
IN WDFDRIVER Driver;
)
{
...
// Delete the framework device object
WdfObjectDelete(
wdfDevice
);
...
}