고흐의 연구실/OS

[디바이스 드라이버] 1. 개발환경 구축 및 Hello World 출력

전고흐 2020. 8. 23. 04:01
728x90

 

1. visual studio 2019 communication 다운로드

   - 반드시 visual c++이 설치되어야 한다.

 

2. WDK 10 다운로드

   - https://developer.microsoft.com/ko-kr/windows/hardware/windows-driver-kit

   - 윈도우 드라이버 킷(windows Driver Kit, WDK 10)

   - 드라이버를 빌드하는데 사용하는 부가적인 헤더파일, 라이브러리, 샘플 드라이버, 커널디버거(WinDBG)를 제공함

   - 반드시 VS2019가 다운로드 된 후에 설치해야함.

 

3. 디버그 메시지 출력기 다운로드

   - https://technet.microsoft.com/en-us/sysinternals/debugview.aspx

   - 커널디버거를 사용할 필요 없이, 간단하게 내가 작성한 드라이버가 정확히 동작하고 있는지를 확인하기 위해서

디버거 메세지를 코드상에 삽입을 하고, 그 삽입한 문장을 통해 출력되는 디버그 메세지를 사용자가 눈으로 확인할 때 필요한 툴

   - MS의 DBGVIEW 설치

 

 

 

?? 드라이버 코드는 어떻게 작성하나요?(커널레벨 드라이버)

 1) 헤더 파일 선언

     #include <ntddk.h>     

        // NT Legacy Style 드라이버(디바이스 스택을 사용하지 않는 드라이버를 개발하려는 경우)

        // 커널레벨에서 동작하는 어플리케이션?

     #include <wdm.h>

        // WDM Style 드라이버(윈도우즈 디바이스 스택을 사용하는 드라이버를 작성하려는 경우)

        // 보다 세련된, 실제로 하드웨어와 연동되는 드라이버를 제작하는 경우 주로 포함

 2) 함수 구현

 

#C STYLE

NTSTATUS DriveEntry(    // 드라이버코드 시작(main)

    IN PDRIVER_OBJECT      DriverObject,

    IN PUNICODE_STRING   RegistryPath

    )

{

    UNREFERENCED_PARAMETER(DriverObject);
    UNREFERENCED_PARAMETER(RegistryPath);

    // 전달받은 파라미터를 소스내에서 사용하지 않음 : 컴파일 에러

    // 사용하지 않는 파라미터를 매크로 코드에 넣음

 

    DbgPrintEx(DPFLTR_IHVDRIVER_ID, 0, "Hello World\n");

     // 디버그메시지(Hello World)를 DBGView 프로그램으로 출력

    return STATUS_UNSUCCESSFUL;   

     // 드라이버가 메모리에 상주하지 않도록 설정

     // 드라이버가 메모리에 올라갔다가, 에러값으로 인해 메모리에서 내려옴(의도된 바)

}

 

#C++ STYLE

extern "C" NTSTATUS DriveEntry(

 // extern "C" : c++언어의 맹글링(mangling)을 피하기 위해 반드시 사용해야함, C처럼 사용하겠다 라는 뜻

    IN PDRIVER_OBJECT      DriverObject,

    IN PUNICODE_STRING   RegistryPath

    )

{

    return STATUS_UNSUCCESSFUL;   

}

 

**DriveEntry 함수 이름은 정해진 이름이기 때문에 컴파일이후에도 같은 이름의 함수로 만들어져야함.

   (그렇지 않으면, c++ 언어는 함수의 이름을 바꿔버림)

 

 

 3) 드라이버 빌드

  - "Empty WDM Driver" 템플릿을 선택

     * 간단한 드라이버는 NT Legacy Style을 사용하지만, VS가 특별히 이런 사항을 구분하지 않기 때문

       >> NT Legacy Style 템플릿이 없음(vs2015기준) / 나중에 속성, 세부정보를 NT Legacy style에서만 필요로 하는 내용이 되도록 수정을 해야함

  - 속성값 변경

   가) Target OS Version을 Windows 7로 변경 : Windows는 하휘호환성 특징을 가지기 때문

   나) 프로젝트 솔루션탐색기 항목을 수정 : .inf 파일 제거

      *NT Legacy System : 설치파일이 필요X, 서비스 형식으로 로딩해서 쓰는 드라이버

   - 새로운 소스파일 작성

 

 4) 드라이버 설치

 

 

 

 

 

 

 

출처 : https://www.youtube.com/watch?v=jsXHLMDIokM&t=533s

728x90