Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Aby wyładować sterownik typu callout, system operacyjny wywołuje funkcję zwalniania tego sterownika. Aby uzyskać więcej informacji na temat określania funkcji wyładunku sterownika callout, zobacz Określanie funkcji wyładunku.
Funkcja zwalniania sterownika objaśnień gwarantuje, że objaśnienia sterownika objaśnień są wyrejestrowane z aparatu filtrującego przed zwolnieniem sterownika objaśnień z pamięci systemowej. Sterownik callout wywołuje funkcję FwpsCalloutUnregisterById0 lub FwpsCalloutUnregisterByKey0, aby wyrejestrować callout z silnika filtrowania. Sterownik callout nie może powrócić z funkcji zwalniania do momentu pomyślnego wyrejestrowania wszystkich calloutów z aparatu filtrującego.
Po wyrejestrowaniu wszystkich swoich wywołań z silnika filtrującego, sterownik musi usunąć obiekt urządzenia, który utworzył przed pierwotną rejestracją wywołań. Sterownik wywołania zwrotnego oparty na modelu WDM wywołuje funkcję IoDeleteDevice w celu usunięcia obiektu urządzenia. Sterownik wywoławczy oparty na strukturze sterowników systemu Windows (WDF) wywołuje funkcję WdfObjectDelete w celu usunięcia obiektu urządzenia struktury.
Sterownik callout musi również zniszczyć każde dojście do iniekcji pakietów, które wcześniej utworzył, wywołując funkcję FwpsInjectionHandleDestroy0, zanim powróci z funkcji zwolnienia.
Na przykład:
// 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
...
}
}
W poprzednim przykładzie przyjęto założenie, że jest to sterownik WDM z calloutem. W przypadku sterownika wywołania zwrotnego opartego na WDF jedyną różnicą jest parametr przekazywany do funkcji wyładowania sterownika wywołania zwrotnego oraz sposób, w jaki sterownik wywołania zwrotnego usuwa obiekt urządzenia struktury frameworku.
WDFDEVICE wdfDevice;
VOID
Unload(
IN WDFDRIVER Driver;
)
{
...
// Delete the framework device object
WdfObjectDelete(
wdfDevice
);
...
}