본문 바로가기

드라이버개발8

Windbg 커널디버깅 설정하기 (Network 디버깅) Windbg 커널디버깅 KDNET 설정하기 (Network 디버깅) 커널 드라이버를 개발하면서 언젠가?는 마주치게 되는 커널디버깅. 과거 물리적인 디버깅 대상 PC의 시리얼포트를 통해 개발 PC와 연결하여 커널디버깅을 했었지만 요새는 가상머신의 시리얼포트에 named 파이프를 설정하여 디버깅을 한다. 하지만 이 방식에는 큰 문제가 있는데 바로 속도의 문제이다. 과거 방식인 물리적인 시리얼포트가 그대로 가상머신에 들어왔을 뿐 인터페이스는 어찌됬건 시리얼포트인 것이다. 디버깅을 지원하는 시리얼 포트의 최대 속도는 115200bps(baudrates). 디버깅을 하는데 못할 정도는 아니지만, 로컬에서 유저모드 애플리케이션을 VS로 붙여서 디버깅하는 만큼 속도도 안나올 뿐더러 커널디버깅 특성상 이벤트자체가 많아.. 2020. 7. 27.
UNICODE_STRING 동적할당 하기 / 드라이버개발 UNICODE_STRING 동적할당 하기 / 드라이버개발 드라이버 개발을 할때 주로 문자열은 UNICODE_STRING이라는 자료구조를 사용하게 된다. 하지만 익숙치 않은 구조때문인지 드라이버 개발 입문시 어려움을 겪는 부분이기도하다. 우선 UNICODE_STRING 구조체를 보겠다. typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING, *PUNICODE_STRING; 유저 모드 프로그램 개발시 char, wchar와 같이 단순 배열 형태가 아닌 것을 볼 수 있다. 첫번째 필드 Length는 문자열 버퍼의 길이를 바이트 단위로 나타낸다. 조심해야 한다. 문자의 갯수가 아니라 버.. 2020. 7. 24.
Windows 커널모드 메모리 할당과 페이지 단편화 -ExAllocatePoolWithTag Windows의 커널모드에서 메모리를 동적 할당을 할때 많이 쓰이는 함수가 바로 ExAllocatePoolWithTag이다. 커널 모드에서는 한정된 커널 메모리 자원을 사용하게 되는데 이때 메모리 할당에 대한 효율성을 따져야 한다. 보통 가상메모리 공간의 Page단위를 할당 받게 되는데 OS과목이나 시스템프로그래밍 과목에서 배운 메모리 단편화 문제가 생기게 된다. Windows WDK에 정의된 PAGE_SIZE는 32비트 기준 0x1000이다. #if defined(_X86_) // // i386 Specific portions of Mm component. // // Define the page size for the Intel 386 as 4096 (0x1000). // #define PAGE_SIZ.. 2020. 1. 14.
DeviceIoControl 버퍼 사용법 DeviceIoControl 사용시 버퍼 방식에 따른 버퍼 접근에 대한 정리이다. METHOD_BUFFERED Input과 Output 버퍼 모두 AssociatedIrp.SystemBuffer를 사용한다. 이때 버퍼의 사이즈는 사용자의 Input과 Output 버퍼사이즈의 최대 사이즈이다. Input과 Output 모두 같은 메모리를 사용하기 때문에 버퍼를 사용할때 Input 버퍼를 먼저 읽고 Output버퍼에 써야 한다. (안그럼 덮어 써진다.) METHOD_IN_DIRECT, METHOED_OUT_DIRECT Input Data는 Irp->AssoicatedIrp.SystemBuffer로 표현된다. Output Data는 MDL로 표현되며 Irp->MdlAddress에 들어간다. 읽기나 쓰기 버퍼의.. 2020. 1. 7.
드라이버와 통신하기 IRP_MJ_DEVICE_CONTROL 드라이버와 통신하기 IRP_MJ_DEVICE_CONTROL 장치 드라이버는 I/O Manager로 부터 File Object로 취급되며 File Operation을 수행 할 수 있다고 하였다. User Application에서 Create, Read, Write, Close Operation를 통해 드라이버와 통신 할 수 있다. 하지만 장치가 쓰기, 읽기 작업만 하지 않을 것 이다. 장치가 동작하는데 다양한 기능들을 수행하기 위해서는 이보다 더 많은 명령이 있어야 할 것이다. 때문에 I/O Control Code를 통해 다양한 명령을 정의하고 수행 할 수 있다. MSDN에 의하면 I/O Control 코드는 User Application과 드라이버간 통신을 가능하게 해준다. 또한 드라이버 사이에 통신을 .. 2020. 1. 7.
Zw함수의 접두사의 의미는? Zw함수의 접두사의 의미는? Kernel 모드 드라이버를 개발하다보면 Zw가 붙은 함수들을 호출 하게 된다. Kernel 모드 함수들의 접두어는 Zw 이외에도 여러가지 접두어들이 있다. 그 예는 아래와 같다. 접두사 커널 구성요소 루틴 예 Cm Configuration manager CmRegisterCallbackEx Ex Executive ExAllocatePool Hal Hardware abstraction layer HalGetAdapter Io I/O manager IoAllocateIrp Ke Kernel core KeSetEvent Mm Memory manager MmUnlockPages Ob Object manager ObReferenceObject Po Power manager PoSet.. 2020. 1. 3.
장치 드라이버와 파일의 관계? 장치는 파일로 취급 된다. 리눅스에서는 디바이스를 하나의 파일로 취급하여 파일처럼 엑세스 가능하다. 그렇기 때문에 디바이스를 컨트롤 하는 방법은 File Operation 인터페이스를 통해 컨트롤 할 수 있게 된다. 예를 들면 Open, Write, Read, Close 등.. 세상에. 그런데 윈도우도 마찬가지다. 윈도우에서도 장치를 File Object를 통해 관리 하고 접근 할 수 있다. 마치 파일처럼 CreateFile, WriteFile, ReadFile, CloseHandle 로 말이다. 밑으로 내려가면 거기서 거기이다. 왜 File Object 윈도우에서 파일객체는 장치를 나타내는 커널모드 자료구조체 이다. 왜 파일 객체로 장치를 표현할까? 두 개 이상의 유저모드 프로세스가 공유할 수 있는 시.. 2019. 12. 30.
드라이버란 무엇일까? 드라이버 드라이버는 ... 아주 오래?전 컴퓨터에 새로운 장치를 구입하여 사용하려면 무언가가 필요했었다. 구입한 새로운 장치의 박스에는 설명서, 보증서가 동봉 되어있고, 플로피 디스크나 CD롬이 들어 있었다. 플로피디스크나 CD를 컴퓨터에 넣어 무언가를 설치해야 장치를 사용할 수 있었다. 이것이 바로 장치 드라이버라는 프로그램이다. 장치 드라이버는 특정 장치를 컴퓨터에서 사용 가능하도록 만들어 준다. 드라이버(Driver)라는 말을 들었을 때 처음 떠오르는 것은 프로그램이 아니다. 나사 따위를 를 돌리는 그런 스크류 드라이버가 먼저 떠오른다. 정확히 우리나라말로 번역되지도 않는 컴퓨터 용어이다. 여기서 부터 우리를 혼란스럽게 한다. 책을 읽고 MDSN따위를 찾아가며 개념을 익히지만 가슴에 와 닿지 않는 .. 2019. 12. 27.