오후 11:25 2001-11-07
조경민 bro@shinbiro.com
NT Kernel Driver
==========================================================

------------------------------------------------------
드라이버 컴파일 환경 만들기 2000 DDK를 예로 든다.
------------------------------------------------------

www.microsoft.com/ddk에서 최신 NT DDK를 받는다.

설치한 후, 시작/프로그램/Development Kits/안에 있는
Free Build Environment    : Release로 컴파일하려 할때
Checked Build Environment : Debug로 컴파일하려 할때

아니면 콘솔에서
c:\ddk\bin>setenv checked
를 한다.
그후 ddk안의 소스에서
build -cZ 하면 왠만해선 죄다 컴파일된다.

그러나 VisualC++에서 컴파일 하게 할 수도 있다.
Windows DriverModel 책의 부록인 WDM 프로젝트 위자드 파일로
WDM 프로젝트 환경을 만든 후 프로젝트 세팅 부의 C++과 링크
부분을 살짝 바꿔 주면 된다.
C++부분에 밑에 ...include\ddk\wdm 인걸 그냥 include\ddk까지
인틀루드 하게 하며
Link부의 wdm.lib를 hal.lib ntoskrnl.lib로 바꿔주면 된다.


-----------------------------------------------------------
NT 커널모드 드라이버 프로그래밍 기본
-----------------------------------------------------------

NT용 커널모드에서 실행되는 드라이버를 제작하는 프로그래밍 분야.
하나의 SYS 파일은 하나의 드라이버를 담고 있다.
드라이버에 대한 오브젝으로 DRIVER_OBJECT로 드라이버의 메인엔트리
인 DriverEntry 함수의 인자로 들어오게 된다.

#include <ntddk.h>    // hal.lib ntoskrnl.lib 가 링크되야함

NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject,
                      IN PUNICODE_STRING RegistryPath )
{
            :    
     return STATUS_SUCCESS;
}

드라이버는 하나이상의 디바이스 객체와 연관될 수 있다. 드라이버에
대해 IoCreateDevice함수를 이용하여 디바이스 객체를 생성시킬 수 있다.
이때 생성된 디바이스 객체에게 제공되는 기능 수행을 위한 IRP Dispatch
함수는 하나의 드라이버에 의해 제공된다.

============================================================
DriverEntry 함수내에서 유효
------------------------------------------------------------
NTSTATUS nStatus;
PDEVICE_OBJECT DeviceObject;
ULONG nDeviceId = 0x00008500; // 임의로 정한 디바이스의 성격 또는 구분자
UNICODE_STRING usDeviceName;
RtlInitUnicodeString( &usDeviceName, L"\\Device\\TestDevice" );

nStatus = IoCreateDevice( DriverObj, 0,
     usDeviceName, nDeviceId, 0, TRUE, DeviceObject);

for( int i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++ )
     DriverObj->MajorFunction[i] = MyDispatchFunction;
============================================================

디바이스의 이름만 주게 되면 커널모드의 다른 디바이스가 호출할때는
문제가 없으나, 실제 유저모드에서 드라이버 로드후 해당 디바이스를
제어하기 위해 부르려면 디바이스 이름으로는 할 수가 없다.
IoCreateSymbolicLink 함수를 이용하여 디바이스이름과 유저모드에서
부를수 있는 별칭이름을 정해줄 수 있다.

디바이스가 활성화되어 어떤 IRP들이 Device에 도착하게 되면 드라이버에
의해 제공되는 Dispatch Function 함수가 호출된다.

NTSTATUS MyDispatchFunction( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
    // 해당 DeviceObject이 Irp를 처리한다.
    IoCompleteRequest( Irp, IO_NO_INCREMENT ); // 해당 IRP에 대해 정상적으로
                                               // 처리 했다고 알린다.
    return STATUS_SUCCESS;
}

'KB > MFC/Win32' 카테고리의 다른 글

[ddk] NT커널 모드 드라이버 in C++  (0) 2004.03.19
NT 커널 드라이버 Visual C++에서 컴파일하기  (0) 2004.03.19
[ddk] 드라이버에서 파일명 바꾸기  (0) 2004.03.19
Essential COM #2 Interface  (0) 2004.03.19
COM 디버그  (0) 2004.03.19

+ Recent posts