DRIVER_OBJECT 구조체(wdm.h)
각 드라이버 개체는 로드된 커널 모드 드라이버의 이미지를 나타냅니다. 드라이버 개체에 대한 포인터는 드라이버의 DriverEntry, AddDevice 및 선택적 루틴 다시 초기화 및 언로드 루틴(있는 경우)에 대한 입력 매개 변수입니다.
드라이버 개체가 부분적으로 불투명합니다. 드라이버 작성기는 드라이버를 초기화하고 드라이버를 언로드할 수 있는 경우 언로드하기 위해 드라이버 개체의 특정 멤버에 대해 알고 있어야 합니다. 드라이버 개체의 다음 멤버는 드라이버에 액세스할 수 있습니다.
구문
typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension;
UNICODE_STRING DriverName;
PUNICODE_STRING HardwareDatabase;
PFAST_IO_DISPATCH FastIoDispatch;
PDRIVER_INITIALIZE DriverInit;
PDRIVER_STARTIO DriverStartIo;
PDRIVER_UNLOAD DriverUnload;
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT, *PDRIVER_OBJECT;
구성원
Type
Size
DeviceObject
드라이버에서 만든 디바이스 개체에 대한 포인터입니다. 드라이버에서 IoCreateDevice 를 성공적으로 호출하면 이 멤버가 자동으로 업데이트됩니다. 드라이버는 이 멤버와 DEVICE_OBJECT NextDevice 멤버를 사용하여 드라이버가 만든 모든 디바이스 개체 목록을 단계별로 실행할 수 있습니다.
Flags
DriverStart
DriverSize
DriverSection
DriverExtension
드라이버 확장에 대한 포인터입니다. 드라이버 확장의 액세스 가능한 유일한 멤버는 드라이버의 DriverEntry 루틴이 드라이버의 AddDevice 루틴을 저장하는 DriverExtension->AddDevice입니다.
DriverName
HardwareDatabase
레지스트리의 하드웨어 구성 정보에 대한 \Registry\Machine\Hardware 경로에 대한 포인터입니다.
FastIoDispatch
드라이버의 빠른 I/O 진입점을 정의하는 구조체에 대한 포인터입니다. 이 멤버는 FSD 및 네트워크 전송 드라이버에서만 사용됩니다.
DriverInit
I/O 관리자가 설정하는 DriverEntry 루틴의 진입점입니다.
DriverStartIo
드라이버가 초기화할 때 DriverEntry 루틴에 의해 설정되는 드라이버의 StartIo 루틴(있는 경우)에 대한 진입점입니다. 드라이버에 StartIo 루틴이 없는 경우 이 멤버는 NULL입니다.
DriverUnload
드라이버가 초기화할 때 DriverEntry 루틴에 의해 설정되는 드라이버의 언로드 루틴(있는 경우)에 대한 진입점입니다. 드라이버에 언로드 루틴이 없는 경우 이 멤버는 NULL입니다.
MajorFunction
드라이버의 DispatchXxx 루틴에 대한 진입점 배열로 구성된 디스패치 테이블입니다. 배열의 인덱스 값은 각 IRP 주 함수 코드를 나타내는 IRP_MJ_XXX 값입니다. 각 드라이버는 드라이버가 처리하는 IRP_MJ_XXX 요청에 대해 이 배열의 진입점을 설정해야 합니다. 자세한 내용은 디스패치 루틴 작성을 참조하세요.
드라이버, SDV(정적 드라이버 검증 도구) 및 기타 확인 도구에 대한 Code Analysis 수 있도록 각 DispatchXxx 루틴은 이 코드 예제와 같이 DRIVER_DISPATCH 형식을 사용하여 선언됩니다.
DRIVER_DISPATCH DispatchXxx;
그런 다음 콜백 루틴은 다음과 같이 구현됩니다.
_Use_decl_annotations_
NTSTATUS
DispatchXxx(
struct _DEVICE_OBJECT *DeviceObject,
struct _IRP *Irp
)
{
// Function body
}
DRIVER_DISPATCH 함수 형식은 Wdm.h 헤더 파일에 정의되어 있습니다. 코드 분석 도구를 실행할 때 오류를 보다 정확하게 식별하려면 함수 정의에 Use_decl_annotations 주석을 추가해야 합니다. Use_decl_annotations 주석은 헤더 파일의 DRIVER_DISPATCH 함수 형식에 적용되는 주석이 사용되는지 확인합니다. 함수 선언에 대한 요구 사항에 대한 자세한 내용은 WDM 드라이버에 함수 역할 형식을 사용하여 함수 선언을 참조하세요. Use_decl_annotations 대한 자세한 내용은 함수 동작에 주석을 추가하세요.
설명
시스템이 드라이버를 자동으로 로드할 수 있도록 각 커널 모드 드라이버의 초기화 루틴의 이름을 DriverEntry 로 지정해야 합니다. 이 루틴의 이름이 다른 경우 드라이버 작성기는 링커에 대한 초기화 루틴의 이름을 정의해야 합니다. 그렇지 않으면 시스템 로더 또는 I/O 관리자가 드라이버의 전송 주소를 찾을 수 없습니다. 다른 표준 드라이버 루틴의 이름은 드라이버 작성기의 재량에 따라 선택할 수 있습니다.
드라이버는 드라이버가 로드될 때 DriverEntry 루틴에 전달되는 드라이버 개체에서 DispatchXxx 진입점을 설정해야 합니다. 디바이스 드라이버는 동일한 유형의 디바이스 드라이버가 처리해야 하는 IRP_MJ_XXX에 대해 하나 이상의 DispatchXxx 진입점을 설정해야 합니다. 상위 수준 드라이버는 기본 디바이스 드라이버에 전달해야 하는 모든 IRP_MJ_XXX에 대해 하나 이상의 DispatchXxx 진입점을 설정해야 합니다. 그렇지 않으면 드라이버 개체에서 DispatchXxx 루틴을 설정하지 않은 IRP_MJ_XXX에 대한 IRP가 전송되지 않습니다. 다양한 유형의 기본 디바이스에 대한 드라이버가 처리해야 하는 IRP_MJ_XXX 집합에 대한 자세한 내용은 IRP 주 함수 코드를 참조하세요.
DriverEntry 루틴은 드라이버 개체에 드라이버의 AddDevice, StartIo 및/또는 언로드 진입점(있는 경우)도 설정합니다.
HardwareDatabase 문자열은 드라이버가 로드될 때 디바이스 드라이버에서 레지스트리에서 하드웨어 구성 정보를 가져오는 데 사용할 수 있습니다. 드라이버에 이 문자열에 대한 읽기 전용 액세스 권한이 부여됩니다.
DriverEntry 루틴에 대한 RegistryPath 입력은 드라이버 이름 값 항목이 드라이버를 식별하는 \Registry\Machine\System\CurrentControlSet\ServicesDriverName\ 키를 가리킵니 다. 입력 드라이버 개체의 HardwareDatabase 에 관해서는 드라이버에 이 문자열에 대한 읽기 전용 액세스 권한이 제공됩니다.
드라이버 개체 내에서 문서화되지 않은 멤버는 액세스할 수 없는 것으로 간주되어야 합니다. 개체 멤버 위치에 대한 종속성 또는 문서화되지 않은 멤버에 대한 액세스 권한이 있는 드라이버는 시간이 지남에 따라 다른 드라이버와 이식 가능하고 상호 운용 가능한 상태로 유지되지 않을 수 있습니다.
요구 사항
| 헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |
참고 항목
피드백
다음에 대한 사용자 의견 제출 및 보기