Framework 개체 컨텍스트 공간

개체 컨텍스트 공간 은 드라이버가 개체에 할당하고 할당할 수 있는 추가 메모리 공간입니다. 각 프레임워크 기반 드라이버는 드라이버가 수신하거나 만드는 모든 프레임워크 개체에 대해 하나 이상의 개체별 컨텍스트 공간을 만들 수 있습니다.

프레임워크 기반 드라이버는 데이터가 속한 개체의 컨텍스트 공간 내에 값 또는 포인터별로 모든 개체별 데이터를 저장해야 합니다.

예를 들어 USB 디바이스용 드라이버는 프레임워크 디바이스 개체에 대한 컨텍스트 공간을 만들 수 있습니다. 컨텍스트 공간에서 드라이버는 디바이스의 USB_DEVICE_DESCRIPTORUSB_CONFIGURATION_DESCRIPTOR 구조와 같은 디바이스 관련 정보와 디바이스 인터페이스의 파이프를 나타내는 컬렉션 개체 에 대한 핸들을 저장할 수 있습니다.

프레임워크는 프레임워크 개체를 한 드라이버에서 다른 드라이버로 전달하지 않으므로 개체의 컨텍스트 공간을 사용하여 두 드라이버 간에 데이터를 전달할 수 없습니다.

개체의 컨텍스트 공간을 정의하려면 하나 이상의 구조를 만들어야 합니다. 각 구조체는 별도의 컨텍스트 공간을 나타냅니다. 드라이버는 각 구조체 멤버를 사용하여 개체별 정보를 저장합니다. 또한 드라이버는 프레임워크에 각 구조체에 대한 접근자 메서드 를 생성하도록 요청해야 합니다. 이 접근자 메서드는 개체 핸들을 입력으로 수락하고 개체의 컨텍스트 공간 주소를 반환합니다.

드라이버가 WdfDeviceCreate와 같은 개체 만들기 메서드를 호출할 때마다 메서드는 필요에 따라 컨텍스트 공간을 할당합니다. 모든 개체 만들기 메서드는 선택적 WDF_OBJECT_ATTRIBUTES 구조를 입력으로 허용합니다. 이 구조체는 프레임워크가 개체에 할당할 컨텍스트 공간을 설명합니다.

드라이버가 개체의 생성 메서드를 호출한 후 개체에 컨텍스트 공간을 더 추가하기 위해 드라이버는 WdfObjectAllocateContext 메서드를 호출할 수 있습니다. 이 메서드는 개체 생성 메서드와 마찬가지로 WDF_OBJECT_ATTRIBUTES 구조를 입력으로 허용합니다.

프레임워크가 개체에 대한 컨텍스트 공간을 할당하면 컨텍스트 공간도 0으로 초기화됩니다.

프레임워크 또는 드라이버가 프레임워크 개체를 삭제하면 프레임워크는 개체의 컨텍스트 공간을 모두 삭제합니다.

드라이버가 컨텍스트 공간을 사용하여 개체를 만들 때 드라이버가 할당하는 버퍼에 대한 포인터를 저장하는 경우 드라이버는 개체가 삭제될 때 버퍼의 할당을 취소하는 EvtCleanupCallback 함수를 제공해야 합니다.

드라이버에서 만드는 개체에 대한 개체의 컨텍스트 공간 구조 및 접근자 메서드를 정의하려면 드라이버에서 다음 단계를 사용해야 합니다.

  1. 저장하려는 데이터를 설명하는 구조를 정의합니다. 예를 들어 드라이버의 디바이스 개체에 대한 컨텍스트 데이터를 만들려는 경우 드라이버는 MY_DEVICE_CONTEXT 라는 구조를 정의할 수 있습니다.

  2. WDF_DECLARE_CONTEXT_TYPE 매크로 또는 WDF_DECLARE_CONTEXT_TYPE_WITH_NAME 매크로를 사용합니다. 이러한 매크로는 모두 다음을 수행합니다.

    • WDF_OBJECT_CONTEXT_TYPE_INFO 구조를 만들고 초기화합니다.
    • 드라이버가 나중에 개체의 컨텍스트 공간에 액세스하는 데 사용할 접근자 메서드를 정의합니다. 접근자 메서드의 반환 값은 개체의 컨텍스트 공간에 대한 포인터입니다.

    WDF_DECLARE_CONTEXT_TYPE 매크로는 구조체 이름에서 접근자 메서드의 이름을 만듭니다. 예를 들어 컨텍스트 구조체의 이름이 MY_DEVICE_CONTEXT 경우 매크로는 WdfObjectGet_MY_DEVICE_CONTEXT 라는 접근자 메서드를 만듭니다.

    WDF_DECLARE_CONTEXT_TYPE_WITH_NAME 매크로를 사용하면 접근자 메서드의 이름을 지정할 수 있습니다. 예를 들어 GetMyDeviceContext 를 디바이스 개체에 대한 컨텍스트 접근자 메서드의 이름으로 지정할 수 있습니다.

  3. WDF_OBJECT_ATTRIBUTES_INIT 호출하여 개체의 WDF_OBJECT_ATTRIBUTES 구조를 초기화합니다.

  4. WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE 매크로를 사용하여 WDF_OBJECT_ATTRIBUTES 구조체의 ContextTypeInfo 멤버를 WDF_OBJECT_CONTEXT_TYPE_INFO 구조체의 주소로 설정합니다.

  5. WdfDeviceCreate와 같은 개체 만들기 메서드를 호출합니다.

드라이버가 개체를 만든 후 드라이버는 언제든지 WdfObjectAllocateContext 를 호출하여 개체에 컨텍스트 공간을 추가할 수 있습니다.

1단계와 2단계는 전역 데이터 구조를 정의하고 드라이버 호출 가능 루틴을 만들기 때문에 드라이버는 전역 데이터(일반적으로 헤더 파일)를 선언하는 드라이버 영역에서 이러한 단계를 완료해야 합니다. 이러한 단계는 드라이버 루틴 내에서 완료되어서는 안 됩니다.

드라이버는 WdfDeviceCreate를 호출하는 EvtDriverDeviceAdd 콜백 함수와 같은 개체를 만드는 드라이버 루틴 내에서 3, 4 및 5단계를 완료해야 합니다.

프레임워크는 드라이버를 대신하여 프레임워크 요청 개체와 프레임워크 파일 개체라는 두 가지 유형의 개체를 만들 수 있습니다. 드라이버는 각각 WdfDeviceInitSetRequestAttributesWdfDeviceInitSetFileObjectConfig를 호출하여 이러한 개체에 대한 컨텍스트 공간을 등록할 수 있습니다. 또한 드라이버는 WdfObjectAllocateContext 를 호출하여 이러한 개체에 대한 컨텍스트 공간을 할당할 수 있습니다.

개체를 만든 후 드라이버는 다음 기술 중 하나를 사용하여 개체의 컨텍스트 공간에 대한 포인터를 가져올 수 있습니다.

드라이버에 컨텍스트 공간 포인터가 있는 경우 WdfObjectContextGetObject를 호출하여 컨텍스트 공간이 속한 개체를 찾을 수 있습니다.