2008년 03월 26일
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)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]