NT式驱动模版

    前段时间把自己写的驱动程序整理了一下,改写出这么一个模版来,虽然是NT式驱动的,但WDM式驱动只需在此基础上增加一些函数就可以了。
 
头文件:
///
//  Test.h
//
//自定义I/O控制代码
#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"
#define DEVICE_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);
//
// 驱动程序加载时调用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;
}
//
//  函数名: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;
}
/
//  函数名: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值