DO_DEVICE_INITIALIZING이 무슨 소용이 있냐고.
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.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제한된 크기의 디렉토리를 만드는 방법오늘 저는 장치에 공간이 없을 때 백업 중에 응용 프로그램이 어떻게 작동하는지 테스트(및 수정)하는 작업이 있습니다. 결과적으로 "남은 공간 없음"오류로 백업이 실패하면 새 파일이 없어야 합니다. 지금까지 문제를 재...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.