심볼릭 링크 사용 이유

Windows의 커널 드라이버에서는 심볼릭 링크를 통해 사용자 모드 애플리케이션이 커널 모드 드라이버에 쉽게 접근할 수 있게 준다.

예를 들어:

이것이 심볼릭 링크의 역할이다. 즉, 사용자 모드와 커널 모드 사이의 경로를 연결하는 가상 링크라고 보면 된다.

드라이버에서 다음과 같이 심볼릭 링크를 생성하면

    if (NT_SUCCESS(status)) {
        // 심볼릭 링크 생성
        status = IoCreateSymbolicLink(&symbolicLink, &deviceName);
    }

유저 모드 프로세스에서

	HANDLE hDevice = CreateFileW(L"\\\\.\\ExternalStartDriver",
		GENERIC_READ | GENERIC_WRITE,
		0, NULL, OPEN_EXISTING, 0, NULL);

다음과 같이 심볼릭 링크를 통해 핸들을 요청 할 수 있다. 물론 이 핸들을 통해 IOCTL을 하는 것

디바이스 객체가 필요한 이유

DeviceIoControl 또는 ioctl 을 통해 사용자 모드 애플리케이션과 커널 드라이버가 통신하려면 디바이스 객체를 반드시 생성해야 한다.