共用方式為


卸載呼叫驅動程式

若要卸載呼叫端驅動程式,作業系統會呼叫驅動程式的卸載函式。 如需有關指定標註驅動程式的卸除函式的詳細資訊,請參閱 指定 Unload 函式

呼叫驅動程式的卸載函式確保,在呼叫驅動程式從系統記憶體卸載之前,其呼叫程序已經從篩選引擎取消註冊。 呼叫驅動程式會呼叫 FwpsCalloutUnregisterById0 函式或呼叫 FwpsCalloutUnregisterByKey0 函式,從篩選引擎中取消註冊一個回呼。 在成功從過濾引擎取消註冊其所有標註之前,標註驅動程式不得從其卸載函式返回。

在呼叫器驅動程式從篩選引擎取消註冊其所有呼叫器後,它必須刪除原先在註冊呼叫器之前所建立的裝置物件。 以 Windows 驅動程式模型 (WDM) 為基礎的驅動程式會呼叫 IoDeleteDevice 函式以刪除裝置物件。 以 Windows Driver Frameworks (WDF) 為基礎的插入驅動程式會呼叫 WdfObjectDelete 函式來刪除架構裝置物件。

回叫驅動程式在從卸載函式返回之前,必須透過呼叫 FwpsInjectionHandleDestroy0 函式來銷毀先前建立的任何封包插入句柄。

例如:

// 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
    );

  ...
}