windows driver의 Device Object를 생성하고 어플리케이션 레벨에서 연결하기 위해서는 CreateFile을 호출하여 Handle을 얻어야 한다. Symbol Name을 어떻게 생성하고 생성된 Symbol을 WinObj로 확인하는 과정을 실습해 보았다.
NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pRegistryPath) {
PDEVICE_OBJECT DeviceObject = NULL;
NTSTATUS ntStatus;
UNICODE_STRING DeviceName;
UNICODE_STRING SymbolicLinkName;
pRegistryPath = pRegistryPath;
pDrvObj->DriverUnload = SampleDriverUnload;
// DeviceObject 생성
RtlInitUnicodeString(&DeviceName, L"\\Device\\SAMPLE"); // 대소문자 상관없음
ntStatus = IoCreateDevice(
pDrvObj,
0,
&DeviceName,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&DeviceObject
);
RtlInitUnicodeString(&SymbolicLinkName, L"\\DosDevices\\MYSAMPLE");
IoCreateSymbolicLink(&SymbolicLinkName, &DeviceName); // 유저 모드에서 접근할 수 있도록 설정해주는 것이다.
return STATUS_SUCCESS;
}
VOID SampleDriverUnload(PDRIVER_OBJECT pDriverObj) {
UNICODE_STRING SymbolicLinkName;
KdPrint(("SampleDriveUnload"));
pDriverObj = pDriverObj;
// device symbol link 삭제
RtlInitUnicodeString(&SymbolicLinkName, L"\\DosDevices\\MYSAMPLE");
IoDeleteSymbolicLink(&SymbolicLinkName);
// device object 삭제
IoDeleteDevice(pDriverObj->DeviceObject);
}

WinObj는 링크 에서 다운로드 할 수 있음.

등록한 MYSAMPLE을 확인할 수 있다.

WinObj에서 MYSAMPLE을 찾을 수 없다.
어플리케이션을 개발할 때 CreateFile에 symbol을 넣어 핸들을 얻어와 사용한 적이 있다. 실제로 어떻게 내부적으로 심볼을 생성하는지 알 수 있었다.