共用方式為


卸載圖說文字驅動程式

若要卸載圖說文字驅動程式,作業系統會呼叫圖說文字驅動程式的 unload 函式。 如需如何指定圖說文字驅動程式卸載函式的詳細資訊,請參閱 指定 Unload 函式

圖說文字驅動程式的卸載函式可確保圖說文字驅動程式的圖說文字從篩選引擎取消註冊,再從系統記憶體卸載圖說文字驅動程式。 圖說文字驅動程式會呼叫 FwpsCalloutUnregisterById0 函式或 FwpsCalloutUnregisterByKey0 函式,以從篩選引擎取消註冊圖說文字。 圖說文字驅動程式必須等到成功從篩選引擎取消註冊其所有注標之後,才從其卸載函式傳回。

在圖說文字驅動程式從篩選引擎取消註冊其所有注標之後,它必須先刪除它最初註冊其圖說文字之前所建立的裝置物件。 以 Windows 驅動程式模型為基礎的注標驅動程式 (WDM) 會呼叫 IoDeleteDevice 函式來刪除裝置物件。 以 Windows 驅動程式架構為基礎的注標驅動程式 (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
    );

  ...
}