Framework 개체 수명 주기

프레임워크 개체의 "수명 주기"는 개체가 만들어진 시점부터 삭제되는 시점까지의 시간을 포괄합니다. 개체의 참조 횟수는 삭제될 시기를 제어합니다.

Framework 개체 만들기

대부분의 프레임워크 개체는 드라이버가 개체의 생성 메서드를 호출하여 만듭니다. 예를 들어 각 프레임워크 드라이버는 WdfDriverCreate 를 호출하여 프레임워크 드라이버 개체를 만들어야 합니다.

다른 프레임워크 개체는 프레임워크에서 만듭니다. 예를 들어 사용자 애플리케이션이 읽기 또는 쓰기 작업을 위해 디바이스를 열면 프레임워크는 프레임워크 파일 개체를 만들고 드라이버의 EvtDeviceFileCreate 콜백 함수에 전달합니다.

프레임워크 또는 드라이버에서 몇 가지 프레임워크 개체를 만들 수 있습니다. 예를 들어 I/O 관리자가 드라이버에 I/O 요청을 전달하는 경우 프레임워크는 프레임워크 요청 개체를 만들고 일반적으로 드라이버의 요청 처리기 중 하나를 호출하여 드라이버에 전달합니다. 드라이버는 프레임워크 요청 개체를 만들고 다른 드라이버에 전달할 수도 있습니다.

참조 개수 사용

프레임워크는 각 개체에 대한 참조 횟수를 유지 관리합니다. 개체를 만들 때 프레임워크는 해당 참조 수를 1로 설정합니다. 참조 수가 0이 되면 프레임워크는 개체를 삭제합니다.

드라이버는 WdfObjectReference 를 호출하여 참조 수를 증분하거나 WdfObjectDereference 를 호출하여 참조 수를 감소시켜 개체의 참조 수를 수정할 수 있습니다. (드라이버는 이전에 WdfObjectReference 를 호출한 경우에만 WdfObjectDereference를 호출할 수 있습니다.)

대부분의 경우 드라이버는 개체의 참조 횟수를 증가하거나 감소할 필요가 없습니다. 프레임워크는 개체의 핸들을 드라이버에 전달하기 전에 개수를 증가시키고 드라이버에 개체가 더 이상 필요하지 않을 때 수를 감소합니다.

드라이버는 WdfObjectReference 를 호출하여 드라이버 사용을 완료하기 전에 개체가 삭제되지 않도록 합니다(프레임워크 또는 드라이버 스레드에서). 드라이버가 WdfObjectReference 및 WdfObjectDereference를 호출해야 하는 예제 상황은 보낸 요청 취소 동기화를 참조하세요.

Framework 개체 삭제

드라이버가 WdfObjectDelete 를 호출하거나 프레임워크가 내부 삭제 루틴을 호출하기 때문에 개체가 삭제되지만 참조 수가 0인 경우에만 개체가 삭제됩니다. 드라이버 또는 프레임워크가 개체를 삭제하려고 시도한 후에는 참조 수가 0이 될 때까지 개체의 핸들이 유효한 상태로 유지됩니다. 드라이버는 단순히 WdfObjectDereference를 호출하여 개체의 참조 수를 0으로 감소시켜서 개체를 삭제할 수 없습니다. 드라이버는 WdfObjectDelete도 호출해야 합니다.

프레임워크 개체가 부모의 자식 개체이고 부모가 삭제되는 경우 프레임워크는 부모 개체를 삭제하기 전에 자식 개체를 삭제하려고 시도합니다. 개체 삭제는 부모에서 가장 먼 개체에서 시작하여 루트를 향해 개체 계층 구조를 작동합니다.

드라이버는 드라이버 또는 프레임워크가 개체를 삭제할 때 프레임워크에서 호출하는 다음 두 콜백 함수를 등록할 수 있습니다.

이러한 콜백 함수 중 하나는 개체를 만들 때 드라이버가 할당한 개체별 리소스의 할당을 취소해야 합니다.

프레임워크는 항상 일부 프레임워크 개체의 삭제를 처리하며 드라이버는 이러한 개체를 삭제하려고 시도해서는 안 됩니다. 드라이버에서 삭제할 수 없는 프레임워크 개체 목록은 WdfObjectDelete를 참조하세요.