05. 5편 구조체분석1 (DRIVER_OBJECT, UNICODE_STRING)

2021. 4. 25. 18:06·Windows/DeviceDriver

05. 5편 구조체분석1 (DRIVER_OBJECT, UNICODE_STRING)

  • WDK 도움말에 구조체 이름을 검색하여 참고하면 좋다.

디바이스 드라이버 구조체

간단한 샘플 드라이버 코드

#include <ntddk.h>

NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pRegPath)
{
  return STATUS_UNSUCCESSFUL;
}
  • DriverEntry 함수의 인자는 다음과 같다.

    • pDrvObj : 샘플 드라이버를 설명하는 DRIVER_OBJECT 구조체의 주소

    • pRegPath : 샘플 드라이버가 등록된 시스템 레지스트리의 키 이름 정보가 보관된 메모리를 설명하는 UNICODE_STRING 구조체의 주소


DRIVER_OBJECT 구조체

  • DriverInit : 디바이스 드라이버를 올리는 IO Manager가 DriverEntry의 주소를 저장한다.

  • DriverUnload : 드라이버가 내려갈 때 실행되는 콜백 함수

    • 기본 값은 NULL이며, 프로그래머가 저장해야 한다.

실습

  • 정상적으로 드라이버를 올렸다가 내리는 작업을 WinDbg로 확인할 것이다.

    • 코드를 빌드한 뒤 .sys 드라이버 파일은 가상 머신으로 옮기고, .pdb 심볼 파일은 WinDbg에서 설정한 경로로 옮긴다.

      #include <ntddk.h>
      
      void SampleDriverUnload(PDRIVER_OBJECT pDrvObj)
      {
        pDrvObj = pDrvObj;
      }
      
      NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pRegPath)
      {
        pRegPath = pRegPath;
      
        pDrvObj->DriverUnload = SampleDriverUnload;
      
        return STATUS_SUCCESS;
      }
  • 가상 머신과 WinDbg 프로그램을 실행한다.

    • WinDbg에서 가상 머신을 멈춘 뒤 브레이크 포인트를 설정한다.

      bp sample!DriverEntry
      bp sample!SampleDriverUnload
    • 가상 머신에서 관리자 권한으로 CMD를 열어서 드라이버를 올린다.

      sc start sample
    • 올리는 순간 가상 머신이 멈추고 WinDbg에 소스 코드가 나오고 디버깅을 시작한다.

      • 소스 코드가 뜨지 않으면 WinDbg가 소스 코드의 경로를 찾지 못한 것이다.

        • 이럴 경우 직접 소스 코드를 불러와야 볼 수 있다는 것 같다.
    • Go를 눌러 디버깅을 마친 뒤에 드라이버를 메모리에서 내린다.

      sc stop sample
    • 내린 순간 다시 가상 머신이 멈추고 디버깅을 시작한다.

      • pDrvObj->DriverUnload에 등록된 SampleDriverUnload 함수가 호출된 것을 볼 수 있다.

참고

  • 하제소프트 대표이사 이봉석님의 윈도우 드라이버 연대기
저작자표시 (새창열림)

'Windows > DeviceDriver' 카테고리의 다른 글

06. 프로그램 실행 제어  (0) 2021.04.25
4. 프로세스 강제 종료 방지 연습  (0) 2021.04.20
3. 간단한 드라이버와 디버깅  (0) 2021.04.20
2. 윈도우 디버거 환경을 준비하자  (0) 2021.04.20
1. 윈도우 드라이버 개발 환경 준비  (0) 2021.04.20
'Windows/DeviceDriver' 카테고리의 다른 글
  • 06. 프로그램 실행 제어
  • 4. 프로세스 강제 종료 방지 연습
  • 3. 간단한 드라이버와 디버깅
  • 2. 윈도우 디버거 환경을 준비하자
Caniro
Caniro
  • Caniro
    Minimalism
    Caniro
  • 전체
    오늘
    어제
    • 분류 전체보기 (317)
      • Algorithm (13)
        • 알기 쉬운 알고리즘 (10)
        • Search (1)
        • Sort (2)
      • Arduino (0)
      • C++ (185)
        • Class (46)
        • Exception (6)
        • Library (51)
        • Overloading (10)
        • SmartPointer (5)
        • Syntax (33)
        • TBC++ (23)
        • Templates (9)
        • VisualStudio (2)
      • Embedded (1)
      • Git (4)
      • Java (5)
      • Linux (16)
        • Error (1)
        • Linux Structure (11)
      • MacOS (7)
      • OS (1)
        • Concurrency (1)
      • Python (21)
        • Class (1)
        • Function (2)
        • Syntax (17)
      • Raspberrypi (9)
      • Review (1)
      • Utility (12)
        • VSCode (5)
        • VirtualBox (3)
      • Web (8)
        • Nginx (1)
        • React (3)
        • Django (1)
      • Windows (20)
        • Registry (3)
        • WSL (1)
        • DeviceDriver (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    윈도우 명령어
    java
    windows
    Workspace
    백기선
    MacOS
    스프링 프레임워크 핵심 기술
    제외
    SFC
    citrix workspace
    맥북 카카오톡 알림 안뜸
    spring
    스프링
    Solaris 10
    EXCLUDE
    unix
    SunOS 5.1
    mspaint
    vscode
    logi options
    그림판
    Windows 11
    로지텍 마우스 제스처
    알림
    시스템 복구
    윈도우
    dism
    KakaoTalk
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Caniro
05. 5편 구조체분석1 (DRIVER_OBJECT, UNICODE_STRING)
상단으로

티스토리툴바