장치 개체(DEVICE OBJECT)

DEVICE_OBJECT 구조체는 운영체제가 특정한 장치 대상을 나타내는 데 사용되며, 하나의 장치 대상은 논리적이거나 가상적이거나 물리적 장치의 구체적인 추상적이며, 구동은 장치 대상을 통해 입출력 요청을 처리한다.
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
장치 대상의 크기 (바이트 단위) 를 표시합니다. 이 바이트는 장치 확장 대상을 포함하지 않습니다. (있다면)그것은 읽기 전용 구성원이다.
 
ReferenceCount
I/O 관리자는 디바이스 객체와 연관된 디바이스가 열려 있는 핸들 수를 추적합니다.따라서 입출력 관리자는 드라이버에 대한 핸들이 처리되지 않은 상태에서 드라이버를 마운트 해제하는 것을 피할 수 있다.그것은 읽기 전용 구성원이다.
 
DriverObject
Driver Entry 및 AddDevice의 입력 매개 변수 중 하나인 Driver Entry 또는 IoCreateDeviceSecure를 호출하거나 IoCreateDeviceSecure를 성공적으로 호출한 후 입출력 관리자가 설정하는 드라이버 대상 포인터그것은 읽기 전용 구성원이다.
 
NextDevice
동일한 드라이버에서 만든 다음 장치 객체(있는 경우)를 가리키며, IoCreateDevice 또는 IoCreateDeviceSecure를 호출하면 I/O 관리자가 장치 목록을 자동으로 업데이트합니다.
플러그 앤 플레이 (non – PnP) 드라이버의 경우 드라이버가 마운트 해제될 때 장치 체인 테이블을 층층이 통과하여 장치를 삭제해야 하지만 플러그 앤 플레이 장치(PnP)는 그럴 필요가 없다. PnP 드라이버는 장치 제거 작업(IRP MN REMOVE DEVICE)을 할 때 닫힌 청소 작업만 하면 된다.
드라이버는 장치 개체를 다시 만들 때 자동으로 사용되며 읽기 및 쓰기 가능한 구성원입니다.
 
AttacheDevice
장치 마운트 포인터, 장치 개체에 장치가 마운트되지 않은 경우 이 구성원은 NULL입니다. AttachedDevice 구성원을 통해 지정된 장치 개체는 일반적으로 드라이버를 필터하는 장치 개체입니다. 필터는 장치 개체가 대표하는 장치에 대한 입출력 요청을 차단하는데 사용되며 이 구성원은 대외적으로 보이지 않습니다.
 
CurrentIrp
현재 IRP입니다.
 
Timer
타이머 포인터 - I/O 관리자가 1초 간격으로 드라이버에서 제공하는 타이머 루틴을 호출할 수 있습니다. 자세한 내용은 IoInitialize Timer를 참조하십시오.멤버는 읽기 및 쓰기가 가능합니다.
 
Flags
값은 다음과 같습니다.
DO_BUFFERED_입출력 또는 DODIRECT_IO
DO_BUS_ENUMERATED_DEVICE
DO_DEVICE_INITIALIZING
DO_EXCLUSIVE
DO_MAP_IO_BUFFER
DO_POWER_INRUSH
DO_POWER_PAGABLE
DO_SHUTDOWN_REGISTERED
DO_VERIFY_VOLUME
 
Vpb
디바이스 객체와 관련된 볼륨 매개변수 블록 포인터(VPB)시스템 파일 드라이브의 경우 VPB는 마운트된 볼륨을 나타내는 이름이 없는 논리 디바이스 객체를 연결하는 기능을 제공합니다.멤버가 표시되지 않습니다.
 
DeviceExtension
장치 확장 구조 포인터, 이 구조체와 그 내용은 구동에 의해 정의됩니다.크기도 드라이브에 의해 결정됩니다. 이 크기는 드라이브에서 IoCreateDevice나 IoCreatDeviceSecure 함수를 호출하는 데 지정됩니다.이 구성원은 읽기만 하는 구성원이지만, 그것이 가리키는 구조체는 수정을 구동할 수 있다.
 
DeviceType
IoCreateDevice 또는 IoCreatDeviceSecure 함수가 설정되고 구체적인 설정의 매개 변수는 역정에서 DeviceType 매개 변수에 의해 결정되며 장치 종류 설명표를 참고하십시오.
 
StackSize
이 드라이브에 보내는 IRP의 Stacklocation 크기(최소값)를 지정하고 IoCreate Device와 IoCreate Device Secure 함수를 새로 만든 장치 대상에서 이 값을 1로 설정합니다.최하층의 구동은 그 구성원을 무시할 수 있다.드라이버에서 IoAttachDevice를 호출하거나
IoAttachDeviceToDeviceStack 함수의 경우 I/O 관리자가 상위 제어 장치 객체에 적절한 값을 설정합니다.
 
QueueAlignmentRequirement
이 구성원은 데이터가 전송될 때 장치의 주소 정렬 요청을 지정합니다. 이 값은 Wdm에 정의되어야 합니다.h의 형태는 FILEXXX_ALIGNMENT의 값 중 하나입니다.
 
DeviceQueue
장치 개체의 대기열입니다.드라이버 대기열에는 드라이버 객체에 해당하는 드라이버 처리를 기다리는 IRP가 포함되어 있습니다.
 
Dpc
처리 호출을 지연하다.
 
ActiveThreadCount
예비품을 보류합니다. 이 구성원은 보이지 않습니다.
 
SecurityDescriptor
장치 객체가 작성될 때 보안 설명표(SECURITY DISCRIPTOR)를 지정하고 구성원이 비어 있으면 장치 객체가 기본 보안 설정으로 사용됩니다.이 구성원은 ZwSeturityObject 함수를 통해 수정할 수 있지만 읽기 전용입니다.
 
DeviceLock
입출력 관리자에서 생성한 동기화 이벤트 객체
 
SectorSize
장치 대상이 하나의 볼륨을 표시하지 않으면, 이 구성원은 0으로 설정하고, 하나의 볼륨을 표시하면, 이 구성원은 볼륨의 구역의 바이트 수를 표시합니다.
 
Spare1
해당 구성원이 표시되지 않도록 시스템을 위해 예약합니다.
 
DeviceObjectExtension
장치 개체 확장 포인터, I/O 관리자 및 PnP 관리자는 해당 개체를 사용하여 장치의 상태 정보를 저장합니다. 이 구성원은 표시되지 않습니다.
 
Reserved
시스템에서 사용할 수 있도록 보류합니다. 이 구성원은 보이지 않습니다.
 
참고:
운영 체제는 장치 대상을 통해 구체적인 장치를 추상화한다.드라이버는 IoCreateDevice 및 IoCreateDeviceSecure 루틴을 사용하여 장치 객체를 만듭니다.디바이스 개체는 반투명입니다.글에서 지적한 구성원을 제외하고 드라이버는 드라이버 대상의 구성원을 직접 설정해서는 안 된다.보이지 않는 구성원은 접근할 수 없습니다.
주: 이 글의 원문은 msdn에서 나온 것이다.

좋은 웹페이지 즐겨찾기