다음을 통해 공유


DEVICE_OBJECT 구조체(wdm.h)

DEVICE_OBJECT 구조는 운영 체제에서 디바이스 개체를 나타내는 데 사용됩니다. 디바이스 개체는 드라이버가 I/O 요청을 처리하는 논리적, 가상 또는 물리적 디바이스를 나타냅니다.

구문

typedef struct _DEVICE_OBJECT {
  CSHORT                   Type;
  USHORT                   Size;
  LONG                     ReferenceCount;
  struct _DRIVER_OBJECT    *DriverObject;
  struct _DEVICE_OBJECT    *NextDevice;
  struct _DEVICE_OBJECT    *AttachedDevice;
  struct _IRP              *CurrentIrp;
  PIO_TIMER                Timer;
  ULONG                    Flags;
  ULONG                    Characteristics;
  __volatile PVPB          Vpb;
  PVOID                    DeviceExtension;
  DEVICE_TYPE              DeviceType;
  CCHAR                    StackSize;
  union {
    LIST_ENTRY         ListEntry;
    WAIT_CONTEXT_BLOCK Wcb;
  } Queue;
  ULONG                    AlignmentRequirement;
  KDEVICE_QUEUE            DeviceQueue;
  KDPC                     Dpc;
  ULONG                    ActiveThreadCount;
  PSECURITY_DESCRIPTOR     SecurityDescriptor;
  KEVENT                   DeviceLock;
  USHORT                   SectorSize;
  USHORT                   Spare1;
  struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
  PVOID                    Reserved;
} DEVICE_OBJECT, *PDEVICE_OBJECT;

멤버

Type

운영 체제에서 개체가 디바이스 개체임을 나타내는 데 사용됩니다. 디바이스 개체의 경우 이 멤버의 값은 3입니다. 읽기 전용 멤버입니다.

Size

디바이스 개체의 크기(바이트)를 지정합니다. 이 크기에는 DeviceExtension 멤버가 가리키는 드라이버 지정 디바이스 확장이 포함되지만 DeviceObjectExtension 멤버가 가리키는 불투명 디바이스 개체 확장은 포함되지 않습니다. 크기 는 읽기 전용 멤버입니다.

ReferenceCount

I/O 관리자가 디바이스 개체와 연결된 디바이스의 열린 핸들 수를 추적하는 데 사용됩니다. 이렇게 하면 I/O 관리자가 드라이버의 디바이스에 대한 미해결 핸들이 있을 때 드라이버의 언로드를 방지할 수 있습니다. 읽기 전용 멤버입니다.

DriverObject

DriverEntryAddDevice 루틴에 입력된 드라이버의 로드된 이미지를 나타내는 드라이버 개체(DRIVER_OBJECT)에 대한 포인터입니다. 이 멤버는 I/O 관리자가 IoCreateDevice 또는 IoCreateDeviceSecure를 성공적으로 호출할 때 설정됩니다. 읽기 전용 멤버입니다.

NextDevice

동일한 드라이버에서 만든 다음 디바이스 개체(있는 경우)에 대한 포인터입니다. I/O 관리자는 IoCreateDevice 또는 IoCreateDeviceSecure 를 성공적으로 호출할 때마다 이 목록을 업데이트 합니다.

언로드되는 PnP(비 플러그 앤 플레이) 드라이버는 디바이스 개체 목록을 트래버스("walk")하고 삭제해야 합니다. PnP 드라이버는 이 디바이스 개체 목록을 걸을 필요가 없습니다. 대신 PnP 드라이버는 디바이스 제거 PnP 작업(IRP_MN_REMOVE_DEVICE) 중에 정리를 수행합니다.

디바이스 개체를 동적으로 다시 만드는 드라이버도 이 멤버를 사용합니다. 읽기/쓰기 멤버입니다.

AttachedDevice

연결된 디바이스 개체에 대한 포인터입니다. 연결된 디바이스 개체가 없는 경우 이 멤버는 NULL입니다. AttachedDevice 멤버가 가리키는 디바이스 개체는 일반적으로 원래 디바이스 개체가 나타내는 디바이스를 대상으로 하는 I/O 요청을 가로채는 필터 드라이버의 디바이스 개체입니다. 자세한 내용은 IoAttachDeviceIoAttachDeviceByPointer topics 참조하세요. 불투명 멤버입니다.

CurrentIrp

드라이버에 진입점이 드라이버 개체에 설정된 StartIo 루틴이 있고 드라이버가 현재 IRP를 처리하는 경우 현재 IRP에 대한 포인터입니다. 그렇지 않으면 이 멤버가 NULL입니다. 자세한 내용은 IoStartPacketIoStartNextPacket topics 참조하세요. 읽기 전용 멤버입니다.

Timer

타이머 개체에 대한 포인터입니다. 이렇게 하면 I/O 관리자가 1초마다 드라이버 제공 타이머 루틴을 호출할 수 있습니다. 자세한 내용은 IoInitializeTimer를 참조하세요. 읽기/쓰기 멤버입니다.

Flags

디바이스 드라이버는 다음 시스템 정의 값 중 하나 이상을 사용하여 새로 만든 디바이스 개체에서 이 멤버를 사용하여 비트 OR 작업을 수행합니다.

Flags 멤버를 설정하는 방법에 대한 자세한 내용은 디바이스 개체 초기화를 참조하세요.

의미
DO_VERIFY_VOLUME(0x00000002) 이동식 미디어 드라이버는 전송 요청을 처리하는 동안 이 플래그를 설정합니다. 또한 이러한 드라이버는 데이터를 전송하기 전에 전송 요청에 대한 대상에서 이 플래그에 대해 검사 합니다. 자세한 내용은 이동식 미디어 지원 항목을 참조하세요.
DO_BUFFERED_IO(0x00000004) 디바이스 스택으로 전송되는 I/O 요청에 대해 I/O 관리자가 사용하는 버퍼링 유형을 지정합니다. 상위 수준 드라이버 또는 스택의 다음 하위 드라이버와 동일한 값을 가진 이 멤버입니다(최상위 드라이버의 경우 제외).
DO_EXCLUSIVE(0x00000008) 드라이버가 비디오, 직렬, 병렬 또는 사운드 디바이스와 같은 전용 디바이스를 서비스한다는 것을 나타냅니다. WDM 드라이버는 이 플래그를 설정해서는 안됩니다. 자세한 내용은 디바이스 개체에 대한 단독 액세스 지정 항목을 참조하세요.
DO_DIRECT_IO(0x00000010) DO_BUFFERED_IO 참조하세요.
DO_MAP_IO_BUFFER(0x00000020) 이 플래그는 더 이상 사용되지 않습니다. 드라이버는 이 플래그를 설정해서는 안 됩니다.
DO_DEVICE_INITIALIZING(0x00000080) I/O 관리자는 디바이스 개체를 만들 때 이 플래그를 설정합니다. 디바이스 함수 드라이버 또는 필터 드라이버는 AddDevice 루틴에서 플래그를 지웁니다. (1) 디바이스 개체를 디바이스 스택에 연결합니다. (2) 디바이스 전원 상태를 설정합니다. (3) 전원 플래그 중 하나를 사용하여 멤버에 대해 비트 OR 연산을 수행합니다(필요한 경우). 플러그 앤 플레이(PnP) 관리자는 AddDevice 루틴이 반환된 후 플래그가 명확한지 확인합니다.
DO_SHUTDOWN_REGISTERED(0x00000800) I/O 관리자가 드라이버가 종료 알림을 위해 디바이스 개체를 등록했음을 나타내는 데 사용됩니다. 드라이버에서 이 플래그를 사용하면 안 됩니다.
DO_BUS_ENUMERATED_DEVICE(0x00001000) 운영 체제는 각 PDO(물리적 디바이스 개체)에서 이 플래그를 설정합니다. 드라이버는 이 플래그를 수정해서는 안 합니다.
DO_POWER_PAGABLE(0x00002000) Microsoft Windows 2000 이상 버전의 Windows와 호환되는 페이징 가능 드라이버는 페이징 경로의 일부가 아니며, inrush 전류가 필요하지 않으면 이 플래그를 설정해야 합니다. 시스템은 IRQL = PASSIVE_LEVEL 이러한 드라이버를 호출합니다. 드라이버는 이 플래그와 DO_POWER_INRUSH 둘 다 설정할 수 없습니다. WDM, Microsoft Windows 98 및 Windows Millennium Edition의 모든 드라이버는 DO_POWER_PAGABLE 설정해야 합니다.
DO_POWER_INRUSH(0x00004000) 디바이스가 켜져 있을 때 현재 인러시브가 필요한 디바이스의 드라이버는 이 플래그를 설정해야 합니다. 드라이버는 이 플래그와 DO_POWER_PAGABLE 둘 다 설정할 수 없습니다.
DO_DEVICE_TO_BE_RESET(0x04000000) I/O 관리자는 이 플래그를 버스 드라이버가 디바이스를 다시 설정하는 신호로 설정합니다. 다른 드라이버는 이 플래그를 사용하면 안 됩니다.
DO_DAX_VOLUME(0x10000000) 볼륨이 DAX 볼륨임을 나타냅니다.

Characteristics

드라이버의 디바이스에 대한 추가 정보를 제공하는 비트 OR 작업과 결합된 하나 이상의 시스템 정의 상수를 지정합니다. 이러한 상수에는 다음이 포함됩니다.

의미
FILE_AUTOGENERATED_DEVICE_NAME 이 루틴을 호출할 때 DeviceName 을 지정하는 호출자 대신 I/O 관리자에게 디바이스의 이름을 생성하도록 지시합니다. I/O 관리자는 이름이 고유한지 확인합니다. 이 특성은 일반적으로 PnP 버스 드라이버가 동일한 버스의 자식 디바이스에 대한 PDO(물리적 디바이스 개체)의 이름을 생성하도록 지정합니다.
FILE_CHARACTERISTIC_PNP_DEVICE 디바이스 개체가 PnP(플러그 앤 플레이) 스택의 일부임을 나타냅니다. 이 특성은 버스 드라이버(또는 버스 필터 드라이버)가 아직 IRP_MN_START_DEVICE 요청을 받지 못한 디바이스 개체에 대한 WMI 지원을 등록하는 경우에 필요합니다. 함수 또는 필터 드라이버가 디바이스 스택에 연결 하기 전에 WMI에 등록하는 경우에도 FILE_CHARACTERISTIC_PNP_DEVICE 필요합니다.
FILE_CHARACTERISTIC_TS_DEVICE 디바이스 개체가 터미널 서비스 디바이스 스택의 일부임을 나타냅니다. 드라이버는 이 특성을 설정해서는 안 됩니다.
FILE_CHARACTERISTIC_WEBDAV_DEVICE 웹 기반 WebDAV(분산 제작 및 버전 관리) 파일 시스템이 디바이스에 탑재되었음을 나타냅니다. 드라이버는 이 특성을 설정해서는 안 됩니다.
FILE_DEVICE_IS_MOUNTED 파일 시스템이 디바이스에 탑재되었음을 나타냅니다. 드라이버는 이 특성을 설정해서는 안 됩니다.
FILE_DEVICE_SECURE_OPEN I/O 관리자에게 디바이스 개체의 보안 설명자를 상대 열기에 적용하도록 지시하고 디바이스의 후행 파일 이름이 열립니다. 자세한 내용은 디바이스 네임스페이스 액세스 제어 항목을 참조하세요.
FILE_FLOPPY_DISKETTE 디바이스가 플로피 디스크 디바이스임을 나타냅니다.
FILE_READ_ONLY_DEVICE 디바이스를 쓸 수 없음을 나타냅니다.
FILE_REMOTE_DEVICE 디바이스가 원격임을 나타냅니다.
FILE_REMOVABLE_MEDIA 스토리지 디바이스가 이동식 미디어를 지원한다는 것을 나타냅니다. 이 특성은 이동식 디바이스가 아니라 이동식 미디어를 나타냅니다. 예를 들어 JAZ 드라이브 디바이스용 드라이버는 이 특성을 지정해야 하지만 PCMCIA 플래시 디스크용 드라이버는 지정하지 않아야 합니다.
FILE_VIRTUAL_VOLUME 볼륨이 가상임을 나타냅니다. 드라이버는 이 특성을 설정해서는 안 됩니다.
FILE_WRITE_ONCE_MEDIA 디바이스가 쓰기-한 번 미디어를 지원한다는 것을 나타냅니다. 드라이버는 이 멤버를 직접 설정하지 않습니다. 디바이스 특성을 설정하는 방법에 대한 자세한 내용은 디바이스 특성 지정 항목을 참조하세요.
FILE_CHARACTERISTIC_CSV 디바이스가 CSV(클러스터 공유 볼륨)임을 나타냅니다.
FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL IO 관리자는 일반적으로 클라이언트가 앱 컨테이너일 때 열려 있는 모든 파일에 대한 액세스를 트래버스하기 위해 전체 보안 검사 수행합니다. 이 플래그를 설정하면 클라이언트 토큰에 이미 트래버스 권한이 있는 경우 이 강제 트래버스 액세스 검사 무시됩니다.
FILE_PORTABLE_DEVICE 기본 스택이 디바이스를 이식 가능한 것으로 간주한다는 것을 나타냅니다. 이는 스토리지 스택에서 사용되며 디바이스가 로컬 머신 컨테이너에 없으며 고정 버스 유형에 있지 않음을 의미합니다.

Vpb

디바이스 개체와 연결된 VPB(볼륨 매개 변수 블록)에 대한 포인터입니다. 파일 시스템 드라이버의 경우 VPB는 탑재된 볼륨의 instance 나타내는 명명되지 않은 논리 디바이스 개체에 대한 연결을 제공할 수 있습니다. 불투명 멤버입니다.

DeviceExtension

디바이스 확장에 대한 포인터입니다. 디바이스 확장의 구조와 콘텐츠는 드라이버 정의입니다. 크기는 드라이버의 IoCreateDevice 또는 IoCreateDeviceSecure 호출에 지정된 드라이버로 결정됩니다. 디바이스 확장에 대한 자세한 내용은 디바이스 확장을 참조하세요. 읽기 전용 멤버입니다. 그러나 멤버가 가리키는 개체는 드라이버에서 수정할 수 있습니다.

DeviceType

해당 루틴의 DeviceType 매개 변수에 대해 지정된 값을 사용하여 IoCreateDeviceIoCreateDeviceSecure로 설정합니다. 자세한 내용은 디바이스 유형 지정 항목을 참조하세요.

StackSize

이 드라이버로 보낼 IRP의 최소 스택 위치 수를 지정합니다. IoCreateDeviceIoCreateDeviceSecure 는 새로 만든 디바이스 개체에서 이 멤버를 1로 설정합니다. 따라서 최하위 수준의 드라이버는 이 멤버를 무시할 수 있습니다. I/O 관리자는 드라이버가 IoAttachDevice 또는 IoAttachDeviceToDeviceStack을 호출하는 경우 상위 수준 드라이버의 디바이스 개체에 있는 StackSize 멤버를 적절한 값으로 자동으로 설정합니다. IoGetDeviceObjectPointer를 사용하여 다른 드라이버에 자신을 연결하는 상위 수준 드라이버만 자체 디바이스 개체의 StackSize 값을 명시적으로 1 + 다음으로 낮은 드라이버의 디바이스 개체의 StackSize 값으로 설정해야 합니다.

Queue

I/O 관리자가 디바이스 개체가 필요할 때 큐에 대기하는 데 내부적으로 사용됩니다. 불투명 멤버입니다.

Queue.ListEntry

이중으로 연결된 목록에 대한 정방향 및 뒤로 포인터를 포함하는 LIST_ENTRY 구조체입니다.

Queue.Wcb

I/O 관리자가 사용하는 디바이스 컨텍스트 정보입니다.

AlignmentRequirement

데이터 전송에 대한 디바이스의 주소 맞춤 요구 사항을 지정합니다. 값은 Wdm.h에 정의된 FILE_XXX_ALIGNMENT 값 중 하나여야 합니다. 자세한 내용은 Device 개체 초기화, GetDmaAlignmentZwQueryInformationFile topics 참조하세요.

DeviceQueue

디바이스 개체의 디바이스 큐 개체입니다. 디바이스 큐 개체에는 디바이스 개체와 연결된 드라이버에서 처리되기를 기다리는 모든 IRP가 포함됩니다. 자세한 내용은 드라이버 관리 IRP 큐 항목을 참조하세요. 불투명 멤버입니다.

Dpc

디바이스 개체에 대한 DPC(지연 프로시저 호출) 개체입니다. 자세한 내용은 DPC 개체 소개 항목을 참조하세요. 불투명 멤버입니다.

ActiveThreadCount

다음에 사용하도록 예약됩니다. 불투명 멤버입니다.

SecurityDescriptor

디바이스 개체를 만들 때 디바이스 개체에 대한 보안 설명자(SECURITY_DESCRIPTOR)를 지정합니다. 이 멤버가 NULL인 경우 디바이스 개체는 기본 보안 설정을 받습니다. ZwSetSecurityObject 함수를 통해 멤버를 수정할 수 있지만 읽기 전용 멤버입니다.

DeviceLock

I/O 관리자가 할당한 동기화 이벤트 개체입니다. I/O 관리자는 탑재 또는 탑재 확인 요청을 파일 시스템 드라이버에 디스패치하기 전에 이벤트 개체를 가져옵니다. 불투명 멤버입니다.

SectorSize

디바이스 개체가 볼륨을 나타내지 않으면 이 멤버는 0으로 설정됩니다. 디바이스 개체가 볼륨을 나타내는 경우 이 멤버는 볼륨의 섹터 크기를 바이트 단위로 지정합니다. I/O 관리자는 이 멤버를 사용하여 중간 버퍼링을 사용하지 않도록 설정할 때 발급된 모든 읽기 작업, 쓰기 작업 및 파일 위치 설정 작업이 올바르게 정렬되도록 합니다. 기본 시스템 바이트-섹터별 값은 디바이스 개체를 만들 때 사용되지만 파일 시스템 드라이버는 입니다. 그리고 더 드물게 레거시 및 미니필터 드라이버는 탑재가 발생할 때 기본 볼륨 하드웨어의 기하 도형을 기반으로 하는 이 값을 업데이트할 수 있습니다. 다른 드라이버는 이 멤버를 수정해서는 안 됩니다.

Spare1

시스템에서 사용하도록 예약되었습니다. 불투명 멤버입니다.

DeviceObjectExtension

I/O 관리자 및 PnP 관리자가 디바이스 상태에 대한 정보를 저장하는 데 사용하는 디바이스 개체 확장에 대한 포인터입니다. 불투명 멤버입니다.

Reserved

시스템에서 사용하도록 예약되었습니다. 불투명 멤버입니다.

설명

운영 체제는 디바이스 개체별로 디바이스를 나타냅니다. 자세한 내용은 디바이스 개체 및 디바이스 스택 항목을 참조하세요.

드라이버는 IoCreateDevice 및 IoCreateDeviceSecure 루틴을 사용하여 디바이스 개체 만듭니다. 디바이스 개체를 만드는 방법에 대한 자세한 내용은 디바이스 개체 만들기를 참조하세요.

디바이스 개체가 부분적으로 불투명합니다. 드라이버는 달리 문서화되지 않는 한 디바이스 개체의 멤버를 직접 설정하지 않습니다. 드라이버에서 직접 수정할 수 있는 멤버에 대한 자세한 내용은 디바이스 개체 초기화를 참조하세요. 다른 디바이스 개체 속성에 대한 자세한 내용은 디바이스 개체의 속성을 참조하세요.

디바이스 개체 내의 불투명 멤버는 액세스할 수 없는 것으로 간주되어야 합니다. 개체 멤버 위치에 종속되거나 불투명 멤버에 대한 액세스 권한이 있는 드라이버는 시간이 지남에 따라 이식 가능하고 다른 드라이버와 상호 운용되지 않을 수 있습니다.

시스템에서 제공하는 비디오 포트 드라이버는 비디오 미니포트 드라이버를 대신하여 만드는 디바이스 개체의 필드를 설정합니다.

시스템에서 제공하는 SCSI 포트 드라이버는 SCSI 미니포트 드라이버를 대신하여 만드는 디바이스 개체의 필드를 설정합니다.

시스템에서 제공하는 NDIS 라이브러리는 NDIS 미니포트 드라이버를 대신하여 만드는 디바이스 개체의 필드를 설정합니다.

요구 사항

요구 사항
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h, Fltkernel.h 포함)

추가 정보