DriverEntry

http://source.winehq.org/source/include/ddk/wdm.h


이제 윈도우 커널 공부라... 아는게 미비하다...
앞으로 하나씩 알아갈때마다... 하나씩... 채워나가보자!!!

extern NTSTATUS WINAPI DriverEntry(
                                                      struct _DRIVER_OBJECT *obj, 
                                         UNICODE_STRING *path  );
 

173 typedef struct _DRIVER_OBJECT {
174   CSHORT  Type;
175   CSHORT  Size;
176   PDEVICE_OBJECT  DeviceObject;
177   ULONG  Flags;
178   PVOID  DriverStart;
179   ULONG  DriverSize;
180   PVOID  DriverSection;
181   PDRIVER_EXTENSION  DriverExtension;
182   UNICODE_STRING  DriverName;
183   PUNICODE_STRING  HardwareDatabase;
184   PVOID  FastIoDispatch;
185   PDRIVER_INITIALIZE DriverInit;
186   PDRIVER_STARTIO    DriverStartIo;
187   PDRIVER_UNLOAD     DriverUnload; //언로드 루틴 지정
188   PDRIVER_DISPATCH   MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
                                                      //131#define IRP_MJ_MAXIMUM_FUNCTION           0x1b //27개
    // - IRP_MJ_PNP : 논리객체 생성후, 드라이버가 실제 동작할 때의 모든 일을 담당하나. 디바이스 제거시 드라이버에서 사용한 자원 처리도 여기서 한다. 여러개의 마이너 코드를 갖고 있으며 WDM 드라이버의 핵심 코드도 이곳에 있다.
    // - IRP_MJ_DEVICE_CONTROL : 애플리케이션과 드라이버 간의 블럭 데이터 통신을 위해 사용된다. 드라이버 개발자가 통신 코드를 직접 정의 옵션한다.
    // - IRP_MJ_CREATE : 애플리케이션에서 드라이버로 연결하는 통로. Win32 API인 CreateFile()과 옵션 연결괸다.
    // - IRP_MJ_CLOSE : 애플리케이션이 드라이버와 연결을 끊을 때 사용한다. Win32 API의 CloseFile()
    // - IRP_MJ_POWER : 디바이스에 관련된 전원 처리 마이너 코드를 처리한다.
    // - 이밖에 IRP_MY_READ, _WRITE, _DEVICE_CONTROL 등이 있다.
    // - 좀더 자세한 내용은 : http://lsleez.tistory.com/23

189 } DRIVER_OBJECT;
190 typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;

134 typedef struct _DEVICE_OBJECT {
135   CSHORT  Type;
136   USHORT  Size;
137   LONG  ReferenceCount;
138   struct _DRIVER_OBJECT  *DriverObject;
139   struct _DEVICE_OBJECT  *NextDevice;
140   struct _DEVICE_OBJECT  *AttachedDevice;
141   struct _IRP  *CurrentIrp;
142   PIO_TIMER  Timer;
143   ULONG  Flags;
144   ULONG  Characteristics;
145   PVPB  Vpb;
146   PVOID  DeviceExtension;
147   DEVICE_TYPE  DeviceType;
148   CCHAR  StackSize;
149   union {
150     LIST_ENTRY  ListEntry;
151     WAIT_CONTEXT_BLOCK  Wcb;
152   } Queue;
153   ULONG  AlignmentRequirement;
154   KDEVICE_QUEUE  DeviceQueue;
155   KDPC  Dpc;
156   ULONG  ActiveThreadCount;
157   PSECURITY_DESCRIPTOR  SecurityDescriptor;
158   KEVENT  DeviceLock;
159   USHORT  SectorSize;
160   USHORT  Spare1;
161   struct _DEVOBJ_EXTENSION  *DeviceObjectExtension;
162   PVOID  Reserved;
163 } DEVICE_OBJECT;
164 typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;

이 커널 서비스들은 레지스트리의 일정 영역에 자신의 존재를 기록하고 메모리에 로딩되게 되는데... 이 소프트웨어 레지스트리키 값에 대한 경로가 바로 두번 째 인자로 넘겨진게 된다.

typedef struct _UNICODE_STRING {
 USHORT Length;
 USHORT MaximumLength;
 PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

 

DriverObject , DeviceObject


처음 보는 개발자들은 좀 혼동이 될 수 있다. 이름이 비슷하니까~... 쉽게 이해하는 방법은 예를 들어 의미를 되새겨 보는 것이다. 예를 들자면 USB 마우스를 PC에 두개 꽂아서 구동을 시킬 때 이 마우스 두개를 동작시키는 드라이버는 하나이다. 한개의 드라이버로 두개의 디바이스를 동작시킬 수 있도록 한다. 이 때 이 드라이버를 어떠한 추상적인 형태로 표현한것이 바로 드라이버 객체이고 각각의 마우스 디바이스를 추상화시킨 것이 디바이스 객체라는 의미이다.
따라서 드라이버 객체 하나당 디바이스 객체 두개가 생긴것. 또 하나의 예를 들어 시리얼 COM 포트 COM1, COM2 가 있다면 COM1과 COM2 를 핸들링하는 드라이버 객체 하나에 COM1, COM2 디바이스 객체가 존재하는 것이다.
물론 디바이스 객체는 다수개가 존재할 수 있으며, 드라이버 객체의 구조체 필드

코드:
typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size;
... 
DEVICE_OBJECT* DeviceObject; // <- 요녀셕.
...
 } DRIVER_OBJECT, *PDRIVER_OBJECT;


와 같은 형태로 참조 된다. 그리고 디바이스 객체의 구조체를 다시 보면

코드:
typedef struct _DEVICE_OBJECT {
... 
DRIVER_OBJECT* DriverObject;
DEVICE_OBJECT* NextDevice;
...
 } DEVICE_OBJECT, *PDEVICE_OBJECT;


와 같은 형태로 되어 있어서 드라이버 객체를 상호 참조 하고 있으며 NextDevice 필드를 통해 연결리스트 형태로 다수개의 디바이스 객체들이 참조되는 것을 알 수 있다.

정리를 해 보면 드라이버 객체의 포인터를 알 고 있다면 드라이버에서 관리하는 각각의 디바이스를 참조할 수 있으며 관리해 낼 수 있다는 뜻이되겠다.

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by 이지 | 2008/03/26 23:28 | 02 윈도우 커널 | 트랙백 | 덧글(0)

트랙백 주소 : http://egnala.egloos.com/tb/185980
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶