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

2021. 4. 25. 18:06·SW개발/Windows Device Driver
목차
  1. 디바이스 드라이버 구조체
  2. 간단한 샘플 드라이버 코드
  3. DRIVER_OBJECT 구조체
  4. 실습
  5. 참고
반응형

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 함수가 호출된 것을 볼 수 있다.

참고

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

'SW개발 > Windows Device Driver' 카테고리의 다른 글

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
  1. 디바이스 드라이버 구조체
  2. 간단한 샘플 드라이버 코드
  3. DRIVER_OBJECT 구조체
  4. 실습
  5. 참고
'SW개발/Windows Device Driver' 카테고리의 다른 글
  • 06. 프로그램 실행 제어
  • 4. 프로세스 강제 종료 방지 연습
  • 3. 간단한 드라이버와 디버깅
  • 2. 윈도우 디버거 환경을 준비하자
Caniro
Caniro
  • Caniro
    Minimalism
    Caniro
  • 전체
    오늘
    어제
    • 전체보기 (319)
      • SW개발 (268)
        • Java Spring (6)
        • C++ (186)
        • Python (21)
        • Linux (16)
        • 알고리즘 (13)
        • Git (4)
        • Embedded (1)
        • Raspberrypi (9)
        • React (3)
        • Web (2)
        • Windows Device Driver (6)
      • IT(개발아님) (46)
        • Windows (26)
        • MacOS (7)
        • Utility (11)
      • 챗봇 짬통 (0)
      • 일상 (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.