윈도우즈 드라이버

WinDbg 기본 명령어

Basic Commands The help file that comes with the WinDbg installation documents commands well, but the following basic commands should get you started: Feature Command What Does it Do Example / Comments See Also Related Commands           Stack trace K, KB x Displays stack trace of current thread (x frames). Kb […]

WinDbg 기본 명령어 더 읽기"

디바이스 드라이버의 소개 및 응용 분야

요즘에 PC 를 구입하게 되면 사용자들은 특별한 작업 없이 바로 컴퓨터를 사용할 수 있다 . 예전에 필자가 처음 조립식 IBM PC 를 구매했던 시절에는 PC 와 주변 기기 ( 모뎀 , 사운드 카드 , VGA 카드 등등 ) 를 사면 처음에 꼭 해야 할 일이 있었다 . 주변 장치 별로 같이 포함되어 오는 플로피 디스크

디바이스 드라이버의 소개 및 응용 분야 더 읽기"

윈도우 디바이스 드라이버의 개발 방법

디바이스 드라이버 개발을 처음 시작하시는 분들이 가장 많이 하시게 되는 질문은 ” 디바이스 드라이버를 개발하려면 무엇을 어떻게 공부해야 하나요 ? ” 라는 것이다 . 일반 애플리케이션 프로그램 개발을 시작하는 경우에는 자료도 많고 , 주변에 개발자들도 많아서 공부 방법이나 자료들을 쉽게 접할 수 있는데 , 디바이스 드라이버 분야는 개발자들이 많이 하는 분야도 아니고 , 자료도 쉽게

윈도우 디바이스 드라이버의 개발 방법 더 읽기"

디바이스 드라이버 개발환경 구축

지난 2 회에 걸친 컬럼 에서는 디바이스 드라이버 초보자들도 쉽게 드라이버에 접근 할 수 있도록 전반적인 디바이스 드라이버 개념 및 개발 방법에 대한 내용을 다뤄봤다 . 하지만 , 필자 개인적으로 생각해 볼 때 , 디바이스 드라이버가 처음이신 분들이라면 , 아직 개념 및 용어 이해에 어려움이 있었을 것으로 본다 . 그것은 아마도 실제 개발을 해보지 않은

디바이스 드라이버 개발환경 구축 더 읽기"

[Device Driver] 개발 시작

VMWare 상에 Windows XP sp2 를 올리고 거기 Visual Studio 6.0 을 설치한뒤, 거기다가 Device 개발 환경을 구축하였다. 간단한 인크루드 디렉터리와 라이브러리 디렉터리를 보자. 정말 사소한 실수들이 많았다. NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath){      …      RtlInitUnicodeString( &DeviceName, L”\\Device\\HELLODRV” );       …            if(

[Device Driver] 개발 시작 더 읽기"

[DDK] Device Driver 개발 시 참조할만한 사이트 목록

[ USB Speciation v1.1, v2.0 ] USB ORG – USB 개발자라면 한번씩 가보고 관련자료를 찾아볼수 있음. http://www.usb.org USB 스펙 영문 사이트 – OTG나 유용한 자료가 많이 있으니 함 가보세요. http://www.beyondlogic.org USB 스펙 한글 사이트 http://www.surym.pe.kr/swiki/wiki.php/USBSPEC   [ USB 관련 개발자 및 회사 사이트 ] 한국 시스템 프로그래머 사이트라고 합니다. – 디바이스 드라이버 관련 세미나를 합니다.

[DDK] Device Driver 개발 시 참조할만한 사이트 목록 더 읽기"

[DDK] Undocument 함수를 이용한 Driver Object Pointer 구하기

드라이버를 작성하다보면, 드라이버 이름을 가지고 DriverObject를 얻고 싶을 때가 있습니다.DeviceObject의 경우에는 Document된 함수를 이용하면 되지만, DriverObject를 이름을 이용하여얻어오는 함수는 Document되어 있지 않죠… ObReferenceObjectByName 함수를 이용하면, DriverObject도 이름으로 얻어올수 있죠.. 아래와 같이 함수를 만들어 놓으면 좋습니다. [function prototype] NTSTATUSObReferenceObjectByName(IN PUNICODE_STRING ObjectName,IN ULONG Attributes,IN PACCESS_STATE PassedAccessState OPTIONAL,IN ACCESS_MASK DesiredAccess OPTIONAL,IN POBJECT_TYPE ObjectType,IN KPROCESSOR_MODE AccessMode,IN OUT PVOID ParseContext

[DDK] Undocument 함수를 이용한 Driver Object Pointer 구하기 더 읽기"

[DDK] WinDBG로 VMWARE 가상머신을 원격 디버깅 설정

WinDBG를 설치하는 방법을 알아보자, 드라이버 개발에 있어서 디버깅은 중요한 위치를 차지한다. 다운로드 경로 http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.9.3.113.msi 자동 실행하게 되면, 알아서 설치가 잘 될것이다. 그리고 원격 디버깅을 하기 위해는 2대의 PC가 필요하다, 하나는 Debugger 이고 하나는 Debuggee 이다. 일단, VMWARE를 사용해서 하게 되면 하나의 컴퓨터로도 두개를 사용하는 효과를 만들게 된다. 그러기 위해서는 Vmware 셋팅을 해주어야한다. VMware 를 Shut

[DDK] WinDBG로 VMWARE 가상머신을 원격 디버깅 설정 더 읽기"

[Computer Architecture] Floating-point notation

컴퓨터는 숫자를 저장할때 우리들이 사용하는 10진수(decimal)을 사용하지 않는다. true- false의 반복인 0 1 0 1 1 1 1 0 1 1 1 0 0 이런식으로 저장을 한다. Binary , 즉, 2진수이다. 그렇다면 9.6875라는 수는 어떻게 저장할까? 일단 보면, 정규 표현(normalized form)이 존재한다. 32비트 중에 가장 최상위 왼쪽 비트(MSB)는 부호 비트이다. 1로 세트 되어 있으면 음수이고,

[Computer Architecture] Floating-point notation 더 읽기"

[DDK] 가장 간단한 커널 드라이버 코드 작성

디바이스 드라이버를 공부하면서 가장 어려운 것이 있다. “왜 이런 구조이지? 왜 기존의 프로그램 구조랑 다르지?” 제약도 많이 존재한다. BSOD의 압박, 기본적인 드라이버를 작성할때 조건이 몇가지 있다. 일단은 DriverEntry() 가 존재해야한다. DriverEntry()는 Main() 함수랑 같다. DriverEntry() 안에서 Dispatch 루틴을 작성해야한다. 그리고 Unload() 루틴도 작성해야한다. 등록을 했으면 리소스를 반납해야한다. 그리고 MAKEFILE과 SOURCES 파일이 필요하다. 이렇게 알았으면 코드를

[DDK] 가장 간단한 커널 드라이버 코드 작성 더 읽기"

[DDK] IRP가 비동기적으로 처리되어야 할때

요즘 각종 번역서들이 마음에 안들어서 DDK와 WDK 문서를 보면서 공부를 하고 있다. 영어긴 한데, 거부감없이 보니까 영 거리가 멀진 않은것 같다. 익숙해지면 영어도 늘고 좋겠지,, – _-; 일단 정리해보면, Queuing을 한다. 왜냐? 비동기적으로 처리해야하면 큐에 쌓아놓았다가 처리해야한다. 그러기위해서 Queuing을 해야하는데, 일단 내용을 보면 이렇다. Force Pending I/O Requests The Force Pending I/O Requests option randomly

[DDK] IRP가 비동기적으로 처리되어야 할때 더 읽기"

[DDK] IoStartPacket(), KeAcquireSpinLock() 함수 사용법

앞서 말한 동기화 문제 와 StartPacket() 함수 처리 방법을 알아보자, 일단 함수 이름을 보면 디바이스 함수들이 무엇을 하는지 알 수 있다. 간단하게 잘라서 보면, Io 로 시작하는것은 I/O Manager가 관리하는 함수이다. 그리고 Ke 는 Kernel Execute 이다. 이렇게 보면 함수 이름은 어절 그대로 해석하면, 정확한 답을 얻을 수 있다. 동기화 문제가 디바이스 커널 단에서는 더욱

[DDK] IoStartPacket(), KeAcquireSpinLock() 함수 사용법 더 읽기"

[DDK] File System Driver를 연구하기 시작하다!!

이때까지 WDM 드라이버만 공부하다가 갑자기 legacy 드라이버쪽으로 방향을 틀었습니다. 이유인 즉슨, WDM은 Filesystem Driver와 그다지 큰 상관이 없다는것, 젠장입니다. 아무튼 파일시스템 책을 뒤져가면서 공부를 하고 있는데,, 일단 FAT에 대해서 알아보면, FAT는 File Allocation Table로서 리눅스에서 사용하고 있습니다. 윈도우즈는 NTFS죠, FAT12는 12비트 클러스터 식별자를 사용하여 한 파티션은 최대 212(4,096)개의 클러스터를 가질 수 있습니다. Windows 2000은 512바이트에서

[DDK] File System Driver를 연구하기 시작하다!! 더 읽기"

[DDK] Using rules of SpinLock

스핀 락은 참 오묘한 문제이다. 하지만 알고 보면 간단한 로직으로 해결할 수 있다!!  일단 동기화 문제에 직면하게 되면, ( 멀티 프로세서 ) 우리가 익히 알고 있는 세마포어(Semaphore)같은 방법을 사용해서 락킹(Locking)을 해야한다. 이것을 제대로 해주지 않는다면 데드락(DeadLock)에 빠지게된다.  데드락은 운영체제때 들었을 것이다. 여러 스레드가 임계영역(Critical Section)에 들어가기 위해서, 경쟁을 할 것이다.  하나의 스레드가 스핀락을 사용하고 있을

[DDK] Using rules of SpinLock 더 읽기"

[DDK] DRIVER_OBJECT 구조체를 알아보자!!

DRIVER_OBJECT와 DEVICE_OBJECT 구조체는 중요하다. 두개가 헷갈려 하는 경우도 많은데, 일단 DRIVER_OBJECT는 함수포인터로 구성되어 있다. 나머지 필드는 직접 수정을 하면 안되는 부분도 있다. typedef struct _DRIVER_OBJECT   {      CSHORT Type;      CSHORT Size;      PDEVICE_OBJECT DeviceObject;      ULONG Flags;      PVOID DriverStart;      ULONG DriverSize;      PVOID DriverSection;      PDRIVER_EXTENSION DriverExtension;    

[DDK] DRIVER_OBJECT 구조체를 알아보자!! 더 읽기"

[DDK] APC가 대체 뭘까?!?

리소스 오브젝트 공부를 하다 보면, APC란게 많이 나온다. 일단 APC_LEVEL이라고, PASSIVE_LEVEL과 DISPATCH_LEVEL 사이에 존재하는 상수값 2의 APC가 존재한다.  그렇다면 APC란게 정확하게 무엇인지 알아보자!!@! APC( Asynchronous Procedure Call )  APC는 스레드를 위한 제어 흐름에 영향을 미칠 수 있는 방법으로, 특정 스레드를 목표로 해야한다. 모든 디바이스 컨텍스트는 실행이 될때 어느 스레드에서 실행이 될지 모른다, 스레드가 생성하고 그

[DDK] APC가 대체 뭘까?!? 더 읽기"

[DDK] DriverExtension 과 DeviceExtension의 차이점

일단 DriverExtension에 대해서 알아보면, typedef struct _DRIVER_EXTENSION   {        PDRIVER_OBJECT DriverObject;        LONG * AddDevice;        ULONG Count;        UNICODE_STRING ServiceKeyName;        PIO_CLIENT_EXTENSION ClientDriverExtension;        PFS_FILTER_CALLBACKS FsFilterCallbacks;   } DRIVER_EXTENSION, *PDRIVER_EXTENSION;   <TEXTAREA class=”cpp” style=”DISPLAY: none” name=code rows=10 cols=60>typedef struct _DRIVER_EXTENSION { PDRIVER_OBJECT DriverObject; LONG *

[DDK] DriverExtension 과 DeviceExtension의 차이점 더 읽기"

[DDK] DISPATCH_LEVEL 에서 Paging 이 불가능한 이유

제일 처음에 책을 읽으면서, 왜 DISPATCH_LEVEL에서 페이징이 불가능할까? 책에서는 모두 당연하다는 듯이 non-paged 메모리에 있어야 한다고 했다. 그리고는 전역변수에 동기화 객체를 선언했다. 참 알쏭달쏭했다. 전역변수 영역이 왜 페이징이 안되는가, 그리고 왜 DISPATCH_LEVEL에서는 페이징이 허용 안되는가? 이제 궁금증이 풀린 것 같다. 다음 코드를 보자. 이병오씨의 “윈도우 파일 시스템” 책에 있는 코드이다. view plaincopy to clipboardprint? //스핀

[DDK] DISPATCH_LEVEL 에서 Paging 이 불가능한 이유 더 읽기"

[Kernel] Windows의 메모리 관리

요즘 영어 공부가 더 재밌는,, 아아,, ㅠ_ㅠ  각설하고,,  C/ C++ 프로그래머나 Device Driver 작성을 하는 프로그래머에게 있어서 운영체제의 메모리 관리는 아주 중요한 부분이다.  뭐 비주얼 베이직이나 C#같은 걸 하는 사람들은 몰라도 상관없다, 충분한 메모리가 확보되면 아무런 문제도 일어나지 않기 때문이다.  그중 Windows 환경에서 프로그래밍을 하는 프로그래머들은 Windows 메모리 관리의 핵심인 가상 메모리와 페이징에 대해서 잘

[Kernel] Windows의 메모리 관리 더 읽기"

[DDK] Lookaside List 란?

내가 왜 Lookaside List를 찾고 공부하고 있는 지는 모르겠지만,, 스케쥴표에 할일을 보니, Lookaside List 공부? 라는게 적혀있었다.  흐음, 그제나 저제나 한번 알아볼까나,   일단 Zone 영역을 알아보자, Zone 영역은 Windows NT 3.51 이전 버전에서 고정된 크기의 메모리 할당과 해제를 효율적으로 관리하기 위해서 Windows NT 실행부가 지원하는 구조체 이다.  요약하면, Lookaside List나 Zone 영역은 Microsoft가 메모리

[DDK] Lookaside List 란? 더 읽기"

위로 스크롤