看了《寒江独钓——windows内核安全编程》后仿照书上串口过滤那一章写的代码,目的也是过滤串口,只不过编译有几行错误看不懂是什么原因,还有那个拷贝重要标志位那一段没看懂,希望各位前辈帮忙解答一下
#include <wdm.h>
#include <ntddk.h>
#include <ntstrsafe.h>
#define DeviceMath 32
ULONG WriteLong=NULL; //写请求数据长度
PUCHAR WriteData=NULL; //写请求数据
PUCHAR ReadData=NULL; //读请求数据
DEVICE_OBJECT MyDevice[DeviceMath]={NULL}; //定义一个设备数据类型数组,用于保存过滤设备
DEVICE_OBJECT Device[DeviceMath]={NULL}; //定义一个设备数据类型数组,用于保存目标设备
NTSTATUS AttachDevice(PDRIVER_OBJECT Driver,PDEVICE_OBJECT MyDevice,PUNICODE_STRING DeviceName,PDEVICE_OBJECT Device) //绑定设备函数,Driver为该驱动对象,MyDevice为过滤设备,DeviceName为设备ID,Device为输出参数,输出目标设备对象
{
NTSTATUS NameBack=NULL; //IoGetDeviceObjectPointer函数返回值
NTSTATUS CreateBack=NULL; //IoCreateDevice函数返回值
NTSTATUS AttachBack=NULL; //IoAttachDeviceToDeviceStack函数返回值
PFILE_OBJECT FileObject=NULL; //用于放置IoGetDeviceObjectPointer函数输出的文件对象
NameBack=IoGetDeviceObjectPointer(DeviceName,FILE_ALL_ACCESS,&FileObject,&Device); //通过设备ID获取设备对象
if(NameBack==STATUS_SUCCESS) //判断IoGetDeviceObjectPointer函数返回值,是否执行成功
{
ObDereferenceObject(&FileObject); //如果执行成功,文件对象解除引用
}
else
{
return 1; //IoGetDeviceObjectPointer函数执行失败返回1
}
CreateBack=IoCreateDevice(Driver,0,NULL,Device->DeviceType,0,FALSE,&MyDevice); //调用IoCreateDevice函数生成过滤设备
if(CreateBack!=STATUS_SUCCESS) //判断IoCreateDevice函数返回值,如果返回值不为STATUS_SUCCESS则失败
{
return 2; //IoCreateDevice函数执行失败返回2
}
AttachBack=IoAttachDeviceToDeviceStack(MyDevice,Device); //调用IoAttachDeviceToDeviceStack函数绑定设备
if(AttachBack==NULL) //判断IoAttachDeviceToDeviceStack函数返回值,如果为NULL则失败
{
return 3; //IoAttachDeviceToDeviceStack函数执行失败返回3
}
return 0; //执行完成返回0
}
NTSTATUS MyDispatch(PDEVICE_OBJECT device,PIRP irp) //自定义普通分发函数
{
PIO_STACK_LOCATION MyIrp=IoGetCurrentIrpStackLocation(irp); //调用IoGetCurrentIrpStackLocation函数获取当前IRP栈空间
PDEVICE_OBJECT PMyDevice=NULL; //定义一个指向过滤设备的指针
ULONG i; //设置for循环条件
for(i=0;i<DeviceMath;i++) //了解IRP请求发向哪个设备
{
PMyDevice=&MyDevice; //将MyDevice转换成指针,用于判断
if(PMyDevice==device) //判断IRP请求在哪个设备
{
if(MyIrp->MajorFunction==IRP_MJ_POWER) //查询主功能号,如果是电源操作则不作处理
{
PoStartNextPowerIrp(irp);
IoSkipCurrentIrpStackLocation(irp);
return PoCallDriver(&Device[i],irp);
}
if(MyIrp->MajorFunction==IRP_MJ_WRITE) //过滤写请求,数据保存在WriteData中
{
WriteLong=MyIrp->Parameters.Write.Length; //获取写请求数据长度,数据保存在WriteLong中
if(irp->MdlAddress!=NULL) //判断MdlAddress是否为空
{
WriteData=(PUCHAR)MmGetSystemAddressForMdlSafe(irp->MdlAddress); //尝试通过MdlAddress获取写请求数据
}
else if(WriteData==NULL) //判断是否从MdlAddress获取数据
{
WriteData=(PUCHAR)irp->AssociatedIrp.SystemBuffer; //如果无法从MdlAddress读取数据则尝试从SystemBuffer获取
}
else if(WriteData==NULL) //判断是否从SystemBuffer获取数据
{
WriteData=(PUCHAR)irp->UserBuffer; //如果无法从SystemBuffer读取数据则尝试从UserBuffer获取
}
}
if(MyIrp->MajorFunction==IRP_MJ_READ) //过滤读请求,数据保存在ReadData中
{
if(irp->MdlAddress!=NULL) //判断MdlAddress是否为空
{
ReadData=(PUCHAR)MmGetSystemAddressForMdlSafe(irp->MdlAddress); ////尝试通过MdlAddress获取读请求数据
}
else if(ReadData==NULL) //判断是否从MdlAddress获取数据
{
ReadData=(PUCHAR)irp->AssociatedIrp.SystemBuffer; //如果无法从MdlAddress读取数据则尝试从SystemBuffer获取
}
else if(ReadData==NULL) //判断是否从SystemBuffer获取数据
{
ReadData=(PUCHAR)irp->UserBuffer; //如果无法从SystemBuffer读取数据则尝试从UserBuffer获取
}
}
IoSkipCurrentIrpStackLocation(irp); //过滤完成,对数据不做修改并正常返回
return PoCallDriver(&Device[i],irp);
}
}
return STATUS_SUCCESS;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path) //驱动入口函数
{
NTSTATUS Back=NULL; //用于接收AttachDevice函数返回值
UNICODE_STRING Name_Str; //用于保存设备ID的UNICODE_STRING数据结构
WCHAR Name[32]={NULL}; //用于处理设备ID字符串
memset(Name,0,sizeof(WCHAR)*32);
ULONG j;