다음을 통해 공유


콜아웃 드라이버 언로드

콜아웃 드라이버를 언로드하기 위해 운영 체제는 콜아웃 드라이버의 언로드 함수를 호출합니다. 설명선 드라이버의 언로드 함수를 지정하는 방법에 대한 자세한 내용은 언로드 함수 지정을 참조하세요.

설명선 드라이버의 언로드 함수는 설명선 드라이버가 시스템 메모리에서 언로드되기 전에 설명선 드라이버의 설명선이 필터 엔진에서 등록 취소되도록 보장합니다. 설명선 드라이버는 FwpsCalloutUnregisterById0 함수 또는 FwpsCalloutUnregisterByKey0 함수를 호출하여 필터 엔진에서 설명선 등록을 취소합니다. 설명선 드라이버는 필터 엔진에서 모든 설명선의 등록을 성공적으로 취소할 때까지 언로드 함수에서 반환해서는 안 됩니다.

설명선 드라이버가 필터 엔진에서 모든 설명선의 등록을 취소한 후에는 원래 설명선이 등록되기 전에 만든 디바이스 개체를 삭제해야 합니다. WDM(Windows 드라이버 모델)을 기반으로 하는 설명선 드라이버는 IoDeleteDevice 함수를 호출하여 디바이스 개체를 삭제합니다. WDF(Windows 드라이버 프레임워크)를 기반으로 하는 설명선 드라이버는 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
    );

  ...
}