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
CSHORT 멤버 형식을 정의합니다.
Size
CSHORT 멤버 크기를 정의합니다.
DeviceObject
드라이버에서 만든 디바이스 개체에 대한 포인터입니다. 드라이버가 IoCreateDevice 를 성공적으로 호출하면 이 멤버가 자동으로 업데이트됩니다. 드라이버는 이 멤버와 DEVICE_OBJECTNextDevice 멤버를 사용하여 드라이버가 만든 모든 디바이스 개체 목록을 단계별로 실행할 수 있습니다.
Flags
ULONG 멤버 플래그를 정의합니다.
DriverStart
PVOID 멤버 DriverStart를 정의합니다.
DriverSize
ULONG 멤버 DriverSize를 정의합니다.
DriverSection
PVOID 멤버 DriverSection을 정의합니다.
DriverExtension
드라이버 확장에 대한 포인터입니다. 드라이버 확장의 액세스 가능한 유일한 멤버는 드라이버의 DriverEntry 루틴이 드라이버의 AddDevice 루틴을 저장하는 DriverExtension-AddDevice>입니다.
DriverName
UNICODE_STRING 멤버 DriverName을 정의합니다.
HardwareDatabase
레지스트리의 하드웨어 구성 정보에 대한 \Registry\Machine\Hardware 경로에 대한 포인터입니다.
FastIoDispatch
드라이버의 빠른 I/O 진입점을 정의하는 구조체에 대한 포인터입니다. 이 멤버는 FSD 및 네트워크 전송 드라이버에서만 사용됩니다.
DriverInit
I/O 관리자가 설정하는 DriverEntry 루틴의 진입점입니다.
DriverStartIo
드라이버가 초기화할 때 DriverEntry 루틴에 의해 설정되는 드라이버의 StartIo 루틴(있는 경우)에 대한 진입점입니다. 드라이버에 StartIo 루틴이 없는 경우 이 멤버는 NULL입니다.
DriverUnload
드라이버가 초기화할 때 DriverEntry 루틴에 의해 설정되는 드라이버의 언로드 루틴(있는 경우)에 대한 진입점입니다. 드라이버에 언로드 루틴이 없는 경우 이 멤버는 NULL입니다.
MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]
드라이버의 DispatchXxx 루틴에 대한 진입점 배열로 구성된 디스패치 테이블입니다. 배열의 인덱스 값은 각 IRP 주요 함수 코드를 나타내는 IRP_MJ_XXX 값입니다. 각 드라이버는 드라이버가 처리하는 IRP_MJ_XXX 요청에 대해 이 배열의 진입점을 설정해야 합니다. 자세한 내용은 디스패치 루틴 작성을 참조하세요.
드라이버, SDV(정적 드라이버 검증 도구) 및 기타 확인 도구에 대한 코드 분석을 돕기 위해 각 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\Services\DriverName 키를 가리킵니다. 여기서 DriverName 값 항목은 드라이버를 식별합니다. 입력 드라이버 개체의 HardwareDatabase 에 관해서는 드라이버에 이 문자열에 대한 읽기 전용 액세스 권한이 부여됩니다.
드라이버 개체 내에서 문서화되지 않은 멤버는 액세스할 수 없는 것으로 간주되어야 합니다. 개체 멤버 위치에 대한 종속성 또는 문서화되지 않은 멤버에 대한 액세스 권한이 있는 드라이버는 시간이 지남에 따라 이식 가능하고 다른 드라이버와 상호 운용되지 않을 수 있습니다.
요구 사항
요구 사항 | 값 |
---|---|
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |