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 포함)

참고 항목

DriverEntry

IoCreateDevice

IoDeleteDevice

StartIo

언로드