드라이버 개발 입문 winnt
The Windows NT Device Driver Book: A Guide for Programmers 및 Windows NT Device Driver Kit(DDK)에 포함된 문서입니다.
PREREQUISITES TO WRITING NT DEVICE DRIVERS
Windows NT 커널 모드 드라이버 개발 환경을 설정하려면 다음 도구 소프트웨어를 설치해야 합니다.
Windows NT Device Driver Kit(DDK) from Microsoft는 장치 구동 개발을 위해 DDK를 설치해야 합니다.DDK에는 장치 구동을 개발하는 데 필요한 헤더 파일, 라이브러리 및 도구가 들어 있습니다.
32-bit compiler는 장치 드라이브를 컴파일하려면 32비트의 컴파일러가 필요합니다.우리는 마이크로소프트의 컴파일러를 사용하여 이 책의 예를 구축하는 것을 강력히 추천한다.
Win32 소프트웨어 Development Kit (SDK) 는 이 책의 예시를 컴파일하는 데 필요하지 않지만, 최신 버전의 Win32 SDK를 설치하는 것을 추천합니다.그리고 DDK 도구로 장치 구동을 구축할 때 환경 변수인 MSTOOLS를 Win32 SDK가 설치된 위치로 설정해야 한다.Win32 SDK가 설치되어 있지 않으면 컨트롤 패널의 '시스템' 프로그램에 이 환경 변수를 추가해서 시스템이 설치되어 있는 줄 알 수 있습니다.
DRIVER BUILD PROCEDURE
Windows NT 4.0 Device Driver Kit 설치 후 시작 메뉴에는 Free Build Environment, Checked Build Environment, DDK Help, Getting Started 등 네 가지 바로 가기가 추가되었습니다.Free Build Environment와 Checked Build Environment 단축키는 모두 SETENV를 가리킨다.BAT의 배치 파일이지만 명령행 매개변수가 다릅니다.DDK가 디렉토리 E:/DDK40에 설치된 경우 Free Build Environment 바로 가기에 다음 명령이 사용됩니다.
%SystemRoot%/System32/cmd.exe/k E:/DDK40/bin/setenv.bat E:/DDK40 free
Checked Build Environment 바로 가기에는 다음 명령이 사용됩니다.
%SystemRoot%/System32/cmd.exe/k E:/DDK40/bin/setenv.bat E:/DDK40 checked
두 가지 바로 가기가 모두 CMD를 시작합니다.EXE를 적절한 매개변수로 SETENV를 실행합니다.BAT 파일./k 스위치가 있으므로 명령 실행 후 CMD.EXE는 계속 실행 중입니다.SETENV.BAT는 CMD에 추가된 환경 변수를 설정합니다.EXE 프로세스의 환경 변수 목록에 있습니다.DDK의 도구는 모두 CMD에 의존합니다.EXE가 실행되므로 이러한 환경 변수를 사용할 수 있습니다.SETENV.BAT에서 설정한 환경 변수는 다음과 같습니다. BUILDDEFAULT、BUILD_DEFAULT_TARGETS、BUILD_MAKE_PROGRAM 및 DDKBUILDENV
드라이버는 DDK에서 제공하는 BUILD라고 합니다.EXE의 도구 프로그램이 컴파일한 것입니다.이 프로그램은 SOURCES라는 파일을 입력으로 사용합니다.SOURCES 파일에는 대상 실행 파일의 파일 이름, 대상 실행 파일의 유형(예: DRIVER 또는 PROGRAM)과 생성할 실행 파일의 경로가 들어 있습니다.
DDK 자체 샘플 장치 드라이버에 makefile이 있습니다.그러나 그것은 샘플 구동의 진정한makefile이 아니다.샘플 구동의makefile는 모두 공유된makefile,MAKEFILE만 포함됩니다.DEF.이거 메이크필름.DEF는 DDK 설치 디렉토리의 INC 디렉토리에 저장됩니다.
DDK makefile:
#
# DO NOT EDIT THIS FILE!!! Edit ./sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#
!INCLUDE $(NTMAKEENV)/makefile.def
이 책의 일부 드라이버 예제에는 어셈블리 언어 파일(.ASM 파일)이 들어 있습니다.SOURCES 파일에 직접 지정합니다.ASM 파일은 사용할 수 없습니다. I386이라는 디렉토리 저장 소스 파일을 만들어야 합니다.소유ASM 파일은 모두 I386 디렉토리에 있어야 합니다.BUILD.EXE는 이러한 내용을 ML.EXE로 자동으로 컴파일합니다.ASM 파일.
SOURCES 파일에서 지정한 설정 및 플랫폼 관련 환경 변수에 따라 BUILD.EXE는 드라이버나 애플리케이션을 생성합니다.구축 과정에서 오류가 발생하면 BUILD라고 기록합니다.ERR 파일에경고가 있으면 BUILD에 기록합니다.WRN 파일에BUILD는 또 하나의 BUILD를 생성합니다.BUILD에서 사용한 명령 목록과 명령이 반환되는 정보를 기록하는 LOG 파일입니다.
STRUCTURE OF A DEVICE DRIVER
모든 Win32 응용 프로그램에 하나의 입구점(main/WinMain)이 있는 것처럼, 모든 핵 모드 드라이브에도 입구점이 있는데, 이를 드라이브 Entry라고 부른다.SYSTEM이라는 특수 프로세스가 드라이브를 로드합니다.시스템에서 모든 드라이버는 하나의 장치 이름으로 대표됩니다. 그러면 모든 드라이버는 장치에 장치 이름을 만들어야 합니다.이 작업은 IoCreateDevice 함수에 의해 수행됩니다.Win32 함수에서 장치 제어 핸들을 열어야 한다면, 드라이브는DosDevices 대상 디렉터리에서 장치에 대한 기호 링크를 만들어야 합니다.이것은 또 IoCreateSymbolicLink 함수를 호출해서 완성한 것이다.일반적으로 드라이버의 드라이브 엔트리 함수에서 장치에 장치 대상과 기호 링크 대상을 만들고 드라이버나 드라이버와 관련된 초기화를 합니다.
이 책의 대다수 설비 구동 사례는 위조 설비 구동이다.이러한 드라이버는 물리적 장치를 제어하지 않고 장치만 구동할 수 있는 작업을 수행하는 데 사용됩니다(프로세서의 최고 우선순위 모드인 Intel 프로세서의 링 0).또한 드라이브 엔트리는 OPEN, CLOSE, DEVICEIOCONTROL 등 다른 함수의 입구점을 제공합니다.입구점을 제공하는 것은 device object의 일부 영역에 함수 포인터를 추가하는 것이고 device object는 드라이브Entry에 전달되는 매개 변수입니다.
이 책의 대다수 장치 구동 예는 위조 장치 구동이기 때문에 드라이브 엔트리 함수는 모두 같다.드라이버와 관련된 초기화만 다르다.우리는 모든 구동 사례에서 같은 코드를 반복하지 않고 매크로를 사용했다.이것 괜찮아요?
MYDRIVERENTRY:
#define MYDRIVERENTRY(DriverName, DeviceId, DriverSpecificInit) /
PDEVICE_OBJECT deviceObject = NULL; /
NTSTATUS ntStatus; /
WCHAR deviceNameBuffer[] = L"//Device//"##DriverName; /
UNICODE_STRING deviceNameUnicodeString; /
WCHAR deviceLinkBuffer[] = L"//DosDevices//"##DriverName; /
UNICODE_STRING deviceLinkUnicodeString; /
/
RtlInitUnicodeString (&deviceNameUnicodeString, deviceNameBuffer); /
ntStatus = IoCreateDevice (DriverObject, /
0, /
&deviceNameUnicodeString, /
##DeviceId, /
0, /
FALSE, /
&deviceObject /
); /
/
if (NT_SUCCESS(ntStatus)) { /
RtlInitUnicodeString (&deviceLinkUnicodeString, deviceLinkBuffer);/
ntStatus = IoCreateSymbolicLink (&deviceLinkUnicodeString, /
&deviceNameUnicodeString);/
if (!NT_SUCCESS(ntStatus)) {/
IoDeleteDevice (deviceObject); /
return ntStatus; /
} /
/
ntStatus=##DriverSpecificInit; /
/
if (!NT_SUCCESS(ntStatus)) {/
IoDeleteDevice (deviceObject); /
IoDeleteSymbolicLink(&deviceLinkUnicodeString); /
return ntStatus; /
} /
/
/
DriverObject->MajorFunction[IRP_MJ_CREATE] = /
DriverObject->MajorFunction[IRP_MJ_CLOSE] = /
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverDispatch; /
DriverObject->DriverUnload = DriverUnload; /
return STATUS_SUCCESS; /
} else { /
return ntStatus; /
};
이 매크로는 다음 세 가지 매개변수를 사용합니다.
. 첫 번째 매개변수는 장치 이름과 기호 링크 이름을 만드는 데 사용되는 드라이버 이름입니다.두 번째 매개 변수는 디바이스를 고유하게 식별하는 디바이스 ID입니다.세 번째 매개 변수는 함수 이름으로 구동과 관련된 초기화를 포함한다.
이 매크로가 확장되면 IoCreate Device와 IoCreate SymbolicLink 같은 필요한 함수를 호출합니다.성공하면 드라이버는 세 번째 파라미터가 지정한 드라이버와 관련된 초기화 함수를 호출합니다.이 매크로는 드라이브에서 제공하는 다른 함수에 대한 포인터를 DriverObject에 입력합니다.DriverEntry에서 이 매크로를 사용하면 매크로가 이러한 함수를 참조하기 때문에 DriverDispatch와 DriverUnload 함수를 작성해야 합니다.
이 매크로는 어셈블리 CD의 UNDOCNT에 정의됩니다.H에서 찾았어.
드라이버에 대한 모든 요청은 I/O Request packet(IRP) 형식으로 전송됩니다.드라이버는 드라이버 엔트리에 입력된 함수 포인터를 통해 모든 드라이버 요청에 해당하는 드라이버 함수를 호출하기를 원합니다.앞으로의 토론에서 우리는 모든 드라이버 함수 바늘이 드라이브디스패치 함수를 가리킨다고 가정한다.
응용 프로그램이 device driver 핸들을 CreateFile API로 열 때 DriverDispatch 함수를 호출하는 데 사용되는 매개 변수 IRP는 IRP 를 포함합니다MJ_CREATE의 명령 코드입니다.프로그램이 CloseHandle API 함수를 호출하여 device driver 핸들을 닫으면 이 IRP에는 IRP 가 포함됩니다.MJ_CLOSE 명령 코드.이 IRP는 응용 프로그램이 DeviceIoControl API 함수를 호출하여 장치와 데이터를 교환할 때 IRP 를 포함합니다.MJ_DEVICE_CONTROL 명령 코드입니다.여러 프로세스에서 드라이버를 사용하는 경우 CREATE 및 CLOSE 엔트리 포인트를 사용하여 프로세스 각각의 초기화를 완료할 수 있습니다.
모든 IRP는 드라이브 디스패치를 거쳐야 하기 때문에 실제 요청한 함수를 구분하는 방법이 필요하다.I/O Request Packet(IRP)을 통한 Major Function 도메인이 바로 이 작업을 하는 것입니다.request packet에는 요청을 완료하는 데 필요한 함수 대명사와 기타 매개 변수가 있습니다.시스템에서 드라이브를 제거하면 DriverUnload 함수가 호출됩니다.드라이브 언로드와 마찬가지로 드라이브 언로드 함수도 SYSTEM 프로세스 컨텍스트에서 호출됩니다.일반적으로 드라이버Unload 함수에서 드라이버는 드라이버Entry에서 만든 기호 링크와 장치 이름을 삭제하고 드라이버와 관련된 초기화를 완성합니다.
SUMMARY
이 장에서 우리는 Windows NT 장치 드라이버를 구축하는 소프트웨어 요구, 드라이버를 구축하는 과정과 전형적인 드라이버 구조를 설명했다.이후에 우리는 간단한 매크로를 설명했는데, 이 매크로는 일반 구동을 위한 입구 코드를 생성할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제한된 크기의 디렉토리를 만드는 방법오늘 저는 장치에 공간이 없을 때 백업 중에 응용 프로그램이 어떻게 작동하는지 테스트(및 수정)하는 작업이 있습니다. 결과적으로 "남은 공간 없음"오류로 백업이 실패하면 새 파일이 없어야 합니다. 지금까지 문제를 재...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.