首先需要安裝DDK,這里我選擇Microsoft Windows Server 2003 SP1 DDK
Windows驅動(dòng)分成兩類(lèi),一類(lèi)是不支持即插即用的NT式驅動(dòng),一類(lèi)是支持即插即用的WDM驅動(dòng)。
首先來(lái)看一個(gè)最簡(jiǎn)單的NT式驅動(dòng)。
#pragma once
#ifdef __cplusplus
extern "C"
{
#endif
#include <NTDDK.h>
#ifdef __cplusplus
}
#endif
#define PAGEDCODE code_seg("PAGE")
#define LOCKEDCODE code_seg()
#define INITCODE code_seg("INIT")
#define PAGEDDATA data_seg("PAGE")
#define LOCKEDDATA data_seg()
#define INITDATA data_seg("INIT")
#define arraysize(p) (sizeof(p)/sizeof((p)[0]))
typedef struct _DEVICE_EXTENSION {
PDEVICE_OBJECT pDevice;
UNICODE_STRING ustrDeviceName; //設備名稱(chēng)
UNICODE_STRING ustrSymLinkName; //符號鏈接名
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
// 驅動(dòng)函數聲明
NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject);
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp);
Driver.h頭文件中包含了開(kāi)發(fā)NT式驅動(dòng)所需要的NTDDK.h,此外還定義了幾個(gè)標志來(lái)指明函數和變量分配在分頁(yè)內存還是非分頁(yè)內存中。Windows驅動(dòng)程序的入口函數是DriverEntry函數,
#include "Driver.h"
/************************************************************************
* 函數名稱(chēng):DriverEntry
* 功能描述:初始化驅動(dòng)程序,定位和申請硬件資源,創(chuàng )建內核對象
* 參數列表:
pDriverObject:從I/O管理器中傳進(jìn)來(lái)的驅動(dòng)對象
pRegistryPath:驅動(dòng)程序在注冊表的中的路徑
* 返回 值:返回初始化驅動(dòng)狀態(tài)
*************************************************************************/
#pragma INITCODE
extern "C" NTSTATUS DriverEntry (
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath )
{
NTSTATUS status;
KdPrint(("Enter DriverEntry\n"));
//注冊其他驅動(dòng)調用函數入口
pDriverObject->DriverUnload = HelloDDKUnload;
pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;
//創(chuàng )建驅動(dòng)設備對象
status = CreateDevice(pDriverObject);
KdPrint(("DriverEntry end\n"));
return status;
}
/************************************************************************
* 函數名稱(chēng):CreateDevice
* 功能描述:初始化設備對象
* 參數列表:
pDriverObject:從I/O管理器中傳進(jìn)來(lái)的驅動(dòng)對象
* 返回 值:返回初始化狀態(tài)
*************************************************************************/
#pragma INITCODE //指明此函數加載到INIT內存區域(即只在加載的時(shí)候需要載入內存,加載成功后可以從內存中卸載掉)
NTSTATUS CreateDevice (
IN PDRIVER_OBJECT pDriverObject)
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;
PDEVICE_EXTENSION pDevExt;
//創(chuàng )建設備名稱(chēng)
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L" //創(chuàng )建設備 status = IoCreateDevice( pDriverObject, sizeof(DEVICE_EXTENSION), &(UNICODE_STRING)devName, FILE_DEVICE_UNKNOWN,//此種設備為獨占設備 0, TRUE, &pDevObj ); if (!NT_SUCCESS(status)) return status; pDevObj->Flags |= DO_BUFFERED_IO; pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension; pDevExt->pDevice = pDevObj; pDevExt->ustrDeviceName = devName; //創(chuàng )建符號鏈接 UNICODE_STRING symLinkName; RtlInitUnicodeString(&symLinkName,L" pDevExt->ustrSymLinkName = symLinkName; status = IoCreateSymbolicLink( &symLinkName,&devName ); if (!NT_SUCCESS(status)) { IoDeleteDevice( pDevObj ); return status; } return STATUS_SUCCESS; } /************************************************************************ * 函數名稱(chēng):HelloDDKUnload * 功能描述:負責驅動(dòng)程序的卸載操作
聯(lián)系客服