当前位置: 代码迷 >> 驱动开发 >> 代码编译异常
  详细解决方案

代码编译异常

热度:54   发布时间:2016-04-28 10:11:36.0
代码编译错误
本帖最后由 zx4219770 于 2014-05-04 02:27:20 编辑
看了《寒江独钓——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;
  相关解决方案