DO_DEVICE_INITIALIZING은 도대체 무슨 소용이 있습니까?

3039 단어

IoCreateDevice를 호출하여 장치 드라이버가 장치 객체를 작성하면 I/O 관리자가 DEVICEOBJECT 구조의 Flags 필드에서 DO 설정DEVICE_INITIALIZING.DO_DEVICE_INITIALIZING의 목적은 드라이버가 장치 객체 초기화를 완료하기 전에 다른 구성 요소가 장치에 입출력을 보내지 않도록 하는 것입니다.
장치의 핸들을 열 때마다, 드라이버가 장치 스택에 추가하려고 할 때마다(스택 상단의 장치 대상을 검사하는 이 표시) I/O 관리자가 DODEVICE_INITIALIZING.DO 설정DEVICE_INITIALIZING, I/O 관리자는CreateFile, OpenFile, IoGetDeviceObjectPointer 같은 함수를 사용하여 장치를 열 수 없습니다.DO_DEVICE_INITIALIZING은 플러그인 또는 스택의 상위 드라이버로부터 드라이버의 요청을 수신하는 것을 막지 않으며 어셈블리가 장치를 여는 것만 방지합니다.
드라이버가 DriverEntry 루틴에서 생성한 장치 개체에 대해 I/O 관리자가 DO 지우기DEVICE_INITIALIZING.DriverEntry를 제외한 모든 절차에서 생성된 장치 객체에 대해 드라이버가 DO 지우기DEVICE_INITIALIZING.
기존 드라이버(예: Windows NT 4에 대해 작성된 비플러그 앤 플레이 드라이버)는 DriverEntry에서 장치 객체를 만듭니다.플러그 앤 플레이 드라이버는 일반적으로 AddDevice에서 장치 대상을 만들지만, 플러그 앤 플레이 드라이버는 드라이버 Entry에서 제어 장치 대상을 만들 수 있습니다. 예를 들어 장치 인터페이스를 공개하거나 프로그램이 열 수 있는 단독 창고의 장치를 지원합니다.드라이버는 플러그 앤 플레이 또는 장치 스택에 제어 장치 객체를 보고하지 않습니다.
드라이버는 디바이스 객체를 생성하는 동안 루틴이 반환되기 전에 입출력 요청을 받을 준비를 합니다.서로 다른 유형의 드라이버에 대해 관련된 절차가 다르다.플러그 앤 플레이 드라이버의 경우 일반적으로 장치의 PDO 포인터를 장치 확장에 저장하고 플래그를 정의하여 장치의 플러그 앤 플레이 상태를 추적하고 전원 관리 플래그를 설정하며 드라이버가 장치의 이벤트와 자물쇠를 관리하는 데 사용하는 소프트웨어 자원을 만들거나 초기화하는 것을 포함한다.드라이버는 장치 인터페이스를 등록하거나 장치에 대한 기호 링크를 하나 이상 만들 수 있습니다.
DriverEntry에서 생성된 장치 객체의 경우 I/O 관리자에서 DriverEntry가 반환되는 대로 장치를 열 수 있습니다.플러그 앤 플레이 드라이버의 경우 드라이버 스택은 I/O 관리자가 장치를 열 수 있도록 허용하기 전에 시작 요청(IRP MN START DEVICE)을 성공적으로 완료해야 합니다.플러그 앤 플레이 드라이버는 AddDevice와 시작 요청 사이에 스택에 있는 다른 드라이버로부터 요청을 처리해야 할 수도 있습니다(예: SRB FUNCTION CLAIM DEVICE는 이 시간 간격으로 처리해야 함). 그러나 드라이버는 SRB FUNCTION CLAIM DEVICE가 시작되기 전에 생성 요청이나 파일 객체 기반 입출력 요청을 받지 않습니다.드라이버에서 플래그를 지우고 플러그 앤 플레이 관리자로 장치를 시작하는 시간까지 드라이버는 IRPMJ_CREATE 또는 파일 핸들에 의한 입출력 요청이 동기화됩니다.
다음 코드는 단순화된 AddDevice 루틴의 예(Windows DDK의 Toaster 예 기반)입니다.(이 예에서 오류 검사와 장치 확장을 초기화한 코드를 삭제했습니다. 전체 코드는% winddk%/src/general/toaster/func/featured 1/의 Toaster 기능 드라이버 예시를 참고하십시오.)
NTSTATUS ToasterAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject ) { NTSTATUS                status = STATUS_SUCCESS; PDEVICE_OBJECT          deviceObject = NULL; PFDO_DATA               fdoData; POWER_STATE             powerState;

PAGED_CODE();

// Create a function device object. status = IoCreateDevice (DriverObject, sizeof (FDO_DATA), NULL,  // No Name FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &deviceObject);

// Code to initialize the device extension.

// Attach driver to the device stack. fdoData->NextLowerDriver = IoAttachDeviceToDeviceStack (deviceObject, PhysicalDeviceObject);

// Clear the DO_DEVICE_INITIALIZING flag.// Note:Do not clear this flag until the driver has set the // device power state and the power DO flags. //

deviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

return status; }
			
			

무엇을 해야 합니까?

드라이버가 드라이버의 AddDevice 루틴을 제외한 드라이버에서 만든 장치 객체의 DO 를 지웁니다.DEVICE_INITIALIZING 플래그입니다.

장치 객체를 초기화한 후 루틴에서 반환하기 전에 DO 지우기DEVICE_INITIALIZING.

좋은 웹페이지 즐겨찾기