사용자가 디바이스를 분리합니다.

시스템이 실행되는 동안 사용자는 두 가지 방법 중 하나로 디바이스를 제거할 수 있습니다. 즉, 순서대로 제거하면 디바이스가 제거될 예정임을 시스템에 알릴 수 있습니다(예: 플러그 뽑기 또는 하드웨어 제거 프로그램 사용). 또는 기습 제거로 인해 사용자가 시스템에 알리지 않고 디바이스를 분리합니다. 버스가 서프라이즈 제거(예: USB)를 지원하는 경우 디바이스의 드라이버는 디바이스의 갑작스러운 실종을 처리할 수 있어야 합니다.

순서대로 제거

사용자는 시스템의 플러그 뽑기 또는 하드웨어 꺼내기 프로그램을 사용하거나, 디바이스 관리자 사용하여 디바이스를 사용하지 않도록 설정하거나, 꺼내기 가능한 디바이스의 꺼내기 단추를 눌러 제거를 요청합니다. 프레임워크를 사용하면 드라이버에 다음이 없는 한 디바이스를 제거하거나 사용하지 않도록 설정할 수 있습니다.

디바이스를 지원하는 각 함수 및 필터 드라이버에 대해 프레임워크는 드라이버 스택에서 가장 높은 드라이버부터 시작하여 한 번에 하나의 드라이버를 순서대로 수행합니다.

  1. 드라이버가 자체 관리형 I/O를 사용하는 경우 프레임워크는 드라이버의 EvtDeviceSelfManagedIoSuspend 콜백 함수를 호출합니다.

  2. 프레임워크는 드라이버의 전원 관리형 I/O 큐를 모두 중지합니다.

  3. 하드웨어 및 드라이버가 DMA를 지원하는 경우 프레임워크는 생성된 각 DMA 채널에 대해 드라이버의 EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlushEvtDmaEnablerDisable 콜백 함수(있는 경우)를 호출합니다.

  4. 프레임워크는 드라이버의 EvtDeviceD0ExitPreInterruptsDisabled 콜백 함수(있는 경우)를 호출한 다음, 드라이버가 디바이스 인터럽트를 사용하지 않도록 설정할 수 있도록 각 인터럽트에 대해 드라이버의 EvtInterruptDisable 콜백 함수(있는 경우)를 호출합니다.

  5. 프레임워크는 드라이버의 EvtDeviceD0Exit 콜백 함수(있는 경우)를 호출합니다.

  6. 프레임워크는 드라이버의 EvtDeviceReleaseHardware 콜백 함수(있는 경우)를 호출하여 PnP 관리자가 디바이스에 할당한 하드웨어 리소스 목록을 전달합니다.

  7. 드라이버가 자체 관리형 I/O를 사용하는 경우 프레임워크는 드라이버의 EvtDeviceSelfManagedIoFlush 콜백 함수를 호출합니다.

  8. 드라이버가 자체 관리형 I/O를 사용하는 경우 프레임워크는 드라이버의 EvtDeviceSelfManagedIoCleanup 콜백 함수를 호출합니다.

버스 드라이버는 마지막으로 호출되는 스택의 드라이버입니다. 프레임워크가 버스 드라이버의 EvtDeviceD0Exit 콜백 함수를 호출하면 콜백 함수는 디바이스(버스의 자식 디바이스)의 전원 상태를 D3으로 설정합니다. 버스 드라이버는 프레임워크가 WdfDeviceInitSetReleaseHardwareOrderOnFailure를 호출하여 EvtDeviceReleaseHardware 콜백 함수를 호출하는 시기를 제어할 수 있습니다.

서프라이즈 제거

사용자가 예기치 않게 디바이스를 분리합니다. 디바이스 버스의 버스 드라이버는 디바이스가 누락된 것을 검색하고 WdfChildListUpdateChildDescriptionAsMissing을 호출합니다.

디바이스를 지원하는 각 함수 및 필터 드라이버에 대해 프레임워크는 드라이버 스택에서 가장 높은 드라이버부터 시작하여 한 번에 하나의 드라이버를 순서대로 수행합니다.

  1. 프레임워크는 드라이버의 EvtDeviceSurpriseRemoval 콜백 함수(있는 경우)를 호출합니다.
  2. 디바이스가 분리되었을 때 작동 중인(D0) 상태인 경우:
    1. 프레임워크는 드라이버의 전원 관리형 I/O 큐를 모두 중지합니다.
    2. 드라이버가 자체 관리형 I/O를 사용하는 경우 프레임워크는 드라이버의 EvtDeviceSelfManagedIoSuspend 콜백 함수를 호출합니다.
    3. 하드웨어 및 드라이버가 DMA를 지원하는 경우 프레임워크는 생성된 각 DMA 채널에 대해 드라이버의 EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlushEvtDmaEnablerDisable 콜백 함수(있는 경우)를 호출합니다.
    4. 프레임워크는 드라이버가 디바이스 인터럽트를 사용하지 않도록 설정할 수 있도록 드라이버의 EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisable 콜백 함수(있는 경우)를 호출합니다.
    5. 프레임워크는 드라이버의 EvtDeviceD0Exit 콜백 함수(있는 경우)를 호출합니다.
  3. 프레임워크는 드라이버의 EvtDeviceReleaseHardware 콜백 함수(있는 경우)를 호출하여 PnP 관리자가 디바이스에 할당한 하드웨어 리소스 목록을 전달합니다.
  4. 드라이버가 자체 관리형 I/O를 사용하는 경우 프레임워크는 드라이버의 EvtDeviceSelfManagedIoFlush 콜백 함수를 호출합니다.
  5. 드라이버가 자체 관리형 I/O를 사용하는 경우 프레임워크는 드라이버의 EvtDeviceSelfManagedIoCleanup 콜백 함수를 호출합니다.

언제든지 디바이스를 예기치 않게 제거할 수 있습니다. 따라서 프레임워크는 이전 단계에 표시된 것과 다른 시간에 드라이버의 EvtDeviceSurpriseRemoval 콜백 함수를 호출할 수 있습니다. 예를 들어 사용자가 저전력 상태로 들어가는 동안 디바이스를 예기치 않게 분리하는 경우 프레임워크는 EvtDeviceReleaseHardware 콜백 함수를 호출한 후 EvtDeviceSurpriseRemoval 콜백 함수를 호출할 수 있습니다. EvtDeviceSurpriseRemoval 콜백 함수와 다른 콜백 함수가 특정 시퀀스에서 호출된다고 가정하는 방식으로 코딩해서는 안 됩니다.

또한 프레임워크는 디바이스의 EvtDeviceSurpriseRemoval 콜백 함수를 해당 디바이스의 이전 단계에 나열된 콜백 함수와 동기화하지 않습니다. 따라서 이전에 나열된 다른 콜백 함수도 실행되는 동안 EvtDeviceSurpriseRemoval 콜백 함수가 실행될 수 있습니다.