유저 모드와 커널 모드 사이에 의사소통을 하려면 드라이버는 디바이스를
생성해야 합니다. 디바이스를 생성할때 IoCreateDevice 함수를 사용하는데
인자중에 UNICODE_STRING 구조체를 요구합니다. 이 구조체를 만드는데는
RtlInitUnicodeString 함수가 사용되며 인자로 디바이스 이름을 Unicode String 형태로
전달해야 합니다.
[ 코드 해석 ]
5 디바이스 이름을 MyDevice 로 정하고 앞에 붙은 L 은 Unicode String 을 의미
6 IoCreateDevice 함수가 생성해주는 디바이스 객체를 담을 변수
13 NTSTATUS 타입의 ntStatus 변수 선언
14 UNICODE_STRING 타입의 deviceNameUnicodeString 변수 선언
16~17 RtlInitUnicodeString 함수를 호출하여 UNICODE_STRING 구조체를 만듭니다.
19 IoCreateDevice 함수를 호출하여 디바이스 객체를 생성합니다.
MSDN 을 참조해보면;
NTSTATUS IoCreateDevice( IN PDRIVER_OBJECT DriverObject,
IN ULONG DeviceExtensionSize,
IN PUNICODE_STRING DeviceName OPTIONAL,
IN DEVICE_TYPE DeviceType,
IN ULONG DeviceCharacteristics,
IN BOOLEAN Exclusive,
OUT PDEVICE_OBJECT *DeviceObject );
총 7 개의 인자가 있고 중요한 것들만 살펴보면;
19 myDriver <- 드라이버 객체
21 &deviceNameUnicodeString <- 디바이스 이름을 갖고 있는 UNICODE_STRING 구조체
22 FILE_DEVICE_UNKNOWN <- 디바이스 타잎
24 TRUE <- 디바이스 핸들을 하나만 오픈
25 &pMyDevice <- 생성된 디바이스 객체
27~30 디바이스 생성이 실패한 경우 디버깅메시지를 출력합니다.
NT_SUCCESS 함수는 ntStatus 값이 성공인 경우 참
34 STATUS_SUCCESS 대신 ntStatus 변수명 사용
댓글