프레임워크 파일 개체

애플리케이션 또는 드라이버가 일반적으로 파일을 만들거나 열어 디바이스에 액세스하려고 하면 운영 체제는 드라이버 스택에 파일 만들기 요청을 보냅니다. 애플리케이션 또는 드라이버가 디바이스 사용을 마치면 시스템은 파일 정리 및 닫기 요청을 드라이버 스택에 보냅니다. 이러한 세 요청의 요청 유형 은 각각 WdfRequestTypeCreate, WdfRequestTypeCleanupWdfRequestTypeClose입니다.

일반적으로 드라이버가 WdfDeviceInitSetExclusive를 호출하지 않는 한 드라이버는 파일 만들기, 정리 및 닫기 요청을 받을 때 파일별 또는 기타 액세스 관련 작업을 수행해야 합니다. 여러 파일을 동시에 열거나 여러 애플리케이션이 동시에 디바이스에 액세스할 수 있기 때문입니다. 따라서 드라이버는 각 파일 또는 애플리케이션과 연결된 I/O 요청을 추적해야 합니다.

프레임워크는 파일, 디렉터리, 볼륨, 메일 슬롯, 명명된 파이프 또는 전체 디바이스와 같은 디바이스에 액세스하기 위한 애플리케이션 또는 드라이버의 수단을 나타내는 프레임워크 파일 개체를 정의합니다. 파일 이름은 파일 개체와 연결할 수 있지만 파일 이름의 의미는 드라이버에 따라 다릅니다. 파일 이름에 대한 자세한 내용은 디바이스 네임스페이스 액세스 제어를 참조하세요.

드라이버가 파일 작업을 처리해야 하는 경우 EvtDriverDeviceAdd 콜백 함수 내에서 WdfDeviceInitSetFileObjectConfig를 호출해야 합니다. WdfDeviceInitSetFileObjectConfig 메서드는 WDF_FILEOBJECT_CONFIG 구조를 입력으로 받습니다. 드라이버는 이 구조를 사용하여 EvtDeviceFileCreate, EvtFileCleanupEvtFileClose 콜백 함수를 등록하고, 필요에 따라 드라이버가 파일 생성 요청을 받을 때마다 프레임워크 파일 개체를 만들어야 하는지 여부를 나타냅니다.

파일 작업을 처리하는 대부분의 드라이버는 프레임워크 파일 개체의 컨텍스트 공간에 파일 관련 정보를 저장합니다. 드라이버가 파일 작업을 처리하지만 파일 개체의 컨텍스트 공간에 정보를 저장할 필요가 없는 경우 프레임워크는 드라이버에 대한 프레임워크 파일 개체를 만들 필요가 없습니다.

파일 만들기 또는 열기

프레임워크가 함수 드라이버에 대한 파일 만들기 요청을 받으면 다음을 수행합니다.

  1. 드라이버가 이전에 프레임워크 파일 개체를 사용할 필요가 없다고 표시하지 않는 한 파일을 나타내는 프레임워크 파일 개체를 만듭니다.

  2. 드라이버가 콜백 함수를 등록한 경우 드라이버의 EvtDeviceFileCreate 콜백 함수를 호출합니다.

EvtDeviceFileCreate 콜백 함수는 일반적으로 이름 및 파일 개체 플래그와 같은 파일에 대한 정보를 가져옵니다. 드라이버는 일반적으로 프레임워크 파일 개체의 컨텍스트 공간에 이 정보를 저장합니다.

드라이버는 EvtDeviceFileCreate 콜백 함수를 제공하는 대신 WdfDeviceConfigureRequestDispatching을 호출하여 모든 파일 만들기 요청(WdfRequestTypeCreate 요청 형식)을 수신하도록 I/O 큐를 설정할 수 있습니다. 이후에 드라이버는 큐의 EvtIoDefault 요청 처리기에서 파일 만들기 요청을 받습니다. (큐의 WDF_IO_QUEUE_CONFIG 구조의 DefaultQueue 멤버가 TRUE로 설정된 경우 I/O 큐는 파일 만들기 요청을 받을 수 없습니다.)

드라이버가 EvtDeviceFileCreate 콜백 함수를 제공하지 않고 WdfRequestTypeCreate 형식 I/O 요청을 처리하도록 I/O 큐를 설정하지 않은 경우 프레임워크는 다음과 같습니다.

  • 드라이버가 함수 드라이버인 경우 상태 값이 STATUS_SUCCESS 드라이버에 대한 모든 파일 만들기 요청을 완료합니다.

  • 드라이버가 필터 드라이버인 경우 모든 파일 만들기 요청을 다음 하위 드라이버로 전달합니다.

이 동작을 변경하는 방법을 보려면 WDF_FILEOBJECT_CONFIG 구조체의 AutoForwardCleanupClose 멤버를 참조하세요.

참고 함수 드라이버가 애플리케이션이 드라이버의 디바이스에 액세스하는 데 사용할 수 있는 디바이스 인터페이스를 제공하지 않는 경우 드라이버는 NT_SUCCESS(상태)가 FALSE인 상태 값으로 모든 파일 만들기 요청을 완료하는 EvtDeviceFileCreate 콜백 함수를 제공해야 합니다. 그렇지 않으면 악의적인 애플리케이션이 디바이스의 PDO(물리적 디바이스 개체)의 이름을 사용하여 디바이스에 액세스하려고 시도할 수 있습니다. (모든 PDO에는 이름이 있습니다.)

드라이버가 I/O 대상에 만들기 요청을 전달하는 경우 드라이버가 I/O 대상에서 오류 상태 값을 받지 않는 한 이후에 실패 상태 값으로 요청을 완료해서는 안 됩니다. 그렇지 않으면 하위 드라이버에 만들기 요청이 실패했음을 알리지 않고 파일이 열려 있는 것처럼 작동하려고 시도할 수 있습니다.

드라이버가 만들기 요청을 I/O 대상에 전달하는 경우 프레임워크가 생성 요청에 대한 프레임워크 파일 개체를 만든 경우 드라이버는 WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET 플래그를 설정할 수 없습니다. 따라서 드라이버가 WdfFileObjectNotRequired 플래그를 설정하지 않는 한 드라이버가 만들기 요청에 대한 WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET 플래그를 설정할 수 없습니다. 드라이버가 스택의 하위 드라이버가 생성 요청에 실패할 경우 WDFFILEOBJECT를 클린 수 없습니다. 대신 드라이버는 다른 보내기 옵션을 사용할 수 있습니다. 예를 들어 완료 루틴을 사용하여 비동기적으로 보내거나 동기적으로 보낼 수 있습니다. 두 경우 모두 드라이버는 제어권을 다시 얻을 때 WdfRequestComplete 를 호출해야 합니다.

드라이버가 오류 상태 사용하여 만들기 요청을 완료하는 경우 프레임워크는 프레임워크 파일 개체를 삭제하지만 드라이버의 EvtFileCleanup 또는 EvtFileClose 콜백 함수를 호출하지는 않습니다. 따라서 드라이버가 파일 개체의 컨텍스트 공간 외부에 추가 개체별 메모리를 할당하는 경우 할당된 메모리를 삭제하는 EvtCleanupCallback 또는 EvtDestroyCallback 콜백 함수를 제공해야 합니다.

Windows Vista 이상의 경우 파일 만들기 요청을 취소할 수 있습니다. 이전 버전의 Windows 운영 체제는 파일 만들기 요청 취소를 지원하지 않습니다.

시스템은 항상 사용자 애플리케이션에서 가져온 각 만들기 요청에 대해 WDM(Windows 드라이버 모델) 파일 개체를 만듭니다. 드라이버가 만들기 요청을 보내는 경우 요청에 대한 WDM 파일 개체를 만들지 않을 수 있습니다. 일반적으로 WDM 파일 개체가 없는 경우 프레임워크는 프레임워크 파일 개체를 만들지 않습니다. 그러나 드라이버가 WdfDeviceInitSetExclusive를 호출하고 드라이버가 WDF_FILEOBJECT_CONFIG 구조체의 FileObjectClass 멤버에서 WdfFileObjectWdfCannotUseFsContexts를 설정한 경우 프레임워크는 WDM 파일 개체가 없는 경우에도 프레임워크 파일 개체를 만듭니다.

파일 정보 가져오기

드라이버의 EvtDeviceFileCreate 콜백 함수는 다음 개체 메서드 중 하나 이상을 호출하여 애플리케이션 또는 드라이버의 디바이스 액세스에 대한 정보를 가져올 수 있습니다.

WdfFileObjectGetFileName
프레임워크 파일 개체에 포함된 파일 이름을 반환합니다.

WdfFileObjectGetFlags
프레임워크 파일 개체 내에 포함된 플래그를 반환합니다.

WdfFileObjectWdmGetFileObject
프레임워크 파일 개체와 연결된 WDM 파일 개체를 반환합니다.

WdfRequestGetParameters
프레임워크 요청 개체와 연결된 매개 변수를 검색합니다. 요청 형식WdfRequestTypeCreate이면 WDF_REQUEST_PARAMETERS 구조체의 Parameters.Create 멤버에 파일 만들기 요청에 대한 정보가 포함됩니다.

일반적으로 드라이버는 프레임워크 파일 개체의 컨텍스트 공간에 파일 정보를 저장합니다. 드라이버가 I/O 큐인 경우 I/O 요청을 가져올 때 드라이버는 WdfRequestGetFileObject 를 호출하여 요청과 연결된 프레임워크 파일 개체에 대한 핸들을 가져올 수 있습니다. 그런 다음 드라이버는 프레임워크 파일 개체의 컨텍스트 공간에 저장된 파일 정보를 검색할 수 있습니다.

드라이버는 WdfIoQueueRetrieveRequestByFileObject를 호출하여 특정 파일과 연결된 요청에 대한 I/O 큐를 검색할 수 있습니다.

드라이버에 WDM DEVICE_OBJECT 구조체에 대한 포인터가 있는 경우 드라이버는 WdfDeviceGetFileObject 를 호출하여 WDM 디바이스 개체와 연결된 프레임워크 파일 개체에 대한 핸들을 가져올 수 있습니다.

파일 닫기

애플리케이션 또는 다른 드라이버가 파일을 닫으면 프레임워크는 드라이버에 대한 정리 요청 및 닫기 요청을 받습니다. 프레임워크:

  1. 드라이버가 이러한 콜백 함수를 등록한 경우 드라이버의 EvtFileCleanupEvtFileClose 콜백 함수를 호출합니다.

  2. 파일을 나타내는 프레임워크 파일 개체를 삭제합니다.

드라이버의 EvtFileCleanupEvtFileClose 콜백 함수는 프레임워크 파일 개체에 대한 핸들을 받습니다. 드라이버는 WdfFileObjectGetDevice 를 호출하여 프레임워크 파일 개체와 연결된 프레임워크 디바이스 개체를 확인할 수 있습니다.