前段时间把自己写的驱动程序整理了一下,改写出这么一个模版来,虽然是NT式驱动的,但WDM式驱动只需在此基础上增加一些函数就可以了。
头文件:
///
// Test.h
//
// Test.h
//
//自定义I/O控制代码
#define IOCTL_XXX_XXX /
CTL_CODE(FILE_DEVICE_UNKNOWN,0x801,METHOD_BUFFERED,FILE_ANY_ACCESS)
//
#define IOCTL_XXX_XXX /
CTL_CODE(FILE_DEVICE_UNKNOWN,0x801,METHOD_BUFFERED,FILE_ANY_ACCESS)
//
源文件:
//
// Test.cpp
//
extern "C"
{
#include <ntddk.h>
}
#include <devioctl.h>
#include "Test.h"
{
#include <ntddk.h>
}
#include <devioctl.h>
#include "Test.h"
#define DEVICE_NAME L"//" //设备名称
#define LINK_NAME L"//" //符号连接名称
#define LINK_NAME L"//" //符号连接名称
//主要函数声明
NTSTATUS DispatchCreateClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);
void DriverUnload(PDRIVER_OBJECT pDriverObj);
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp);
//
NTSTATUS DispatchCreateClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);
void DriverUnload(PDRIVER_OBJECT pDriverObj);
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp);
//
// 驱动程序加载时调用DriverEntry例程
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
NTSTATUS status=STATUS_SUCCESS;
UNICODE_STRING ustrDevName; //设备名称
UNICODE_STRING ustrLinkName; //符号连接名称
//初始化派遣例程
pDriverObj->MajorFunction[IRP_MJ_CREATE]=DispatchCreateClose;
pDriverObj->MajorFunction[IRP_MJ_CLOSE]=DispatchCreateClose;
pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DispatchIoctl;
pDriverObj->DriverUnload=DriverUnload;
//初始化设备对象
RtlInitUnicodeString(&ustrDevName,DEVICE_NAME);
PDEVICE_OBJECT pDevObj; //创建设备对象
status=IoCreateDevice(pDriverObj,
0,
&ustrDevName,
FILE_DEVICE_UNKNOWN, //设备类型
0,
FALSE,
&pDevObj);
if(!NT_SUCCESS(status))
{
return status;
}
/
//创建符号连接///
RtlInitUnicodeString(&ustrLinkName,LINK_NAME);
status=IoCreateSymbolicLink(&ustrLinkName,&ustrDevName);//创建关联
if(!NT_SUCCESS(status))
{
IoDeleteDevice(pDevObj);
return status;
}
/
//返回DriverEntry例程执行结果
return STATUS_SUCCESS;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
NTSTATUS status=STATUS_SUCCESS;
UNICODE_STRING ustrDevName; //设备名称
UNICODE_STRING ustrLinkName; //符号连接名称
//初始化派遣例程
pDriverObj->MajorFunction[IRP_MJ_CREATE]=DispatchCreateClose;
pDriverObj->MajorFunction[IRP_MJ_CLOSE]=DispatchCreateClose;
pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DispatchIoctl;
pDriverObj->DriverUnload=DriverUnload;
//初始化设备对象
RtlInitUnicodeString(&ustrDevName,DEVICE_NAME);
PDEVICE_OBJECT pDevObj; //创建设备对象
status=IoCreateDevice(pDriverObj,
0,
&ustrDevName,
FILE_DEVICE_UNKNOWN, //设备类型
0,
FALSE,
&pDevObj);
if(!NT_SUCCESS(status))
{
return status;
}
/
//创建符号连接///
RtlInitUnicodeString(&ustrLinkName,LINK_NAME);
status=IoCreateSymbolicLink(&ustrLinkName,&ustrDevName);//创建关联
if(!NT_SUCCESS(status))
{
IoDeleteDevice(pDevObj);
return status;
}
/
//返回DriverEntry例程执行结果
return STATUS_SUCCESS;
}
//
// 函数名:DriverUnload
//
// 功 能:卸载设备
/
void DriverUnload(PDRIVER_OBJECT pDriverObj)
{
UNICODE_STRING ustrLinkName;
//删除符号连接///
RtlInitUnicodeString(&ustrLinkName, LINK_NAME);
IoDeleteSymbolicLink(&ustrLinkName);
/
//删除设备对象
IoDeleteDevice(pDriverObj->DeviceObject);
KdPrint(("DriverUnload/n"));
}
// 函数名:DriverUnload
//
// 功 能:卸载设备
/
void DriverUnload(PDRIVER_OBJECT pDriverObj)
{
UNICODE_STRING ustrLinkName;
//删除符号连接///
RtlInitUnicodeString(&ustrLinkName, LINK_NAME);
IoDeleteSymbolicLink(&ustrLinkName);
/
//删除设备对象
IoDeleteDevice(pDriverObj->DeviceObject);
KdPrint(("DriverUnload/n"));
}
/
// 函数名:DispatchCreateClose
//
// 功 能:处理IRP_MJ_CREATE、IRP_MJ_CLOSE
/
NTSTATUS DispatchCreateClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
pIrp->IoStatus.Status=STATUS_SUCCESS;
IoCompleteRequest(pIrp,IO_NO_INCREMENT); //完成请求
return STATUS_SUCCESS;
}
// 函数名:DispatchCreateClose
//
// 功 能:处理IRP_MJ_CREATE、IRP_MJ_CLOSE
/
NTSTATUS DispatchCreateClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
pIrp->IoStatus.Status=STATUS_SUCCESS;
IoCompleteRequest(pIrp,IO_NO_INCREMENT); //完成请求
return STATUS_SUCCESS;
}
/
// 函数名:DispatchIoctl
//
// 功 能:实现用户模式与内核模式的交互
/
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST; //假设失败
//获取IRP的I/O堆栈指针
PIO_STACK_LOCATION pIrpStack=IoGetCurrentIrpStackLocation(pIrp);
//获取I/O控制代码
ULONG uIoControlCode=pIrpStack->Parameters.DeviceIoControl.IoControlCode;
//获取I/O缓冲区指针//
PVOID pIoBuffer=pIrp->AssociatedIrp.SystemBuffer;
ULONG uInSize=pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
ULONG uOutSize=pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
/
switch(uIoControlCode)
{
case IOCTL_XXX_XXX:
{
//在此添加相应的功能代码///
///
}
break;
// 函数名:DispatchIoctl
//
// 功 能:实现用户模式与内核模式的交互
/
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST; //假设失败
//获取IRP的I/O堆栈指针
PIO_STACK_LOCATION pIrpStack=IoGetCurrentIrpStackLocation(pIrp);
//获取I/O控制代码
ULONG uIoControlCode=pIrpStack->Parameters.DeviceIoControl.IoControlCode;
//获取I/O缓冲区指针//
PVOID pIoBuffer=pIrp->AssociatedIrp.SystemBuffer;
ULONG uInSize=pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
ULONG uOutSize=pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
/
switch(uIoControlCode)
{
case IOCTL_XXX_XXX:
{
//在此添加相应的功能代码///
///
}
break;
default:break;
}
}
if(status == STATUS_SUCCESS)
{
pIrp->IoStatus.Information = uOutSize;
}
else
{
pIrp->IoStatus.Information = 0;
}
pIrp->IoStatus.Status = status;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return status;
}
{
pIrp->IoStatus.Information = uOutSize;
}
else
{
pIrp->IoStatus.Information = 0;
}
pIrp->IoStatus.Status = status;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return status;
}