4146|7

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

书上源码防火墙程序出问题高手帮看看怎么回事 [复制链接]

下面是设置过滤函数的程序,是书上的源程序,不知道为什么执行不成功,在客户程序中使用GetLastError()得到2,找不到指定文件,初次接触驱动程序,希望老虾们给看看

  1. NTSTATUS SetFilterFunction(PacketFilterExtensionPtr filterFun)
  2. {       
  3.         NTSTATUS status = STATUS_SUCCESS;

  4.                 // 取得IP过滤驱动设备对象。下面代码执行后,pDeviceObj变量将指向IP过滤驱动设备对象
  5.         PDEVICE_OBJECT pDeviceObj;
  6.         PFILE_OBJECT pFileObj;
  7.         // 初始化IP过滤驱动的名称
  8.         UNICODE_STRING ustrFilterDriver;
  9.         RtlInitUnicodeString(&ustrFilterDriver, L"\\Device\\IpFilterDriver");
  10.         // 取得设备对象指针       
  11.         status = IoGetDeviceObjectPointer(&ustrFilterDriver, FILE_ALL_ACCESS, &pFileObj, &pDeviceObj);
  12.         if(!NT_SUCCESS(status))
  13.         {
  14.                 return status;
  15.         }

  16.                 // 使用到IP过滤驱动中设备对象的指针创建一个IRP       
  17.         // 填充PF_SET_EXTENSION_HOOK_INFO结构
  18.         PF_SET_EXTENSION_HOOK_INFO filterData;
  19.         filterData.ExtensionPointer = filterFun;

  20.         // 我们需要初始化一个事件对象。
  21.         // 构建IRP时需要使用这个事件内核对象,当IP过滤取得接受到此IRP,完成工作以后会将它置位
  22.         KEVENT event;
  23.         KeInitializeEvent(&event, NotificationEvent, FALSE);

  24.         // 为设备控制请求申请和构建一个IRP
  25.         PIRP pIrp;
  26.         IO_STATUS_BLOCK ioStatus;
  27.         pIrp = IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER,  // io control code
  28.                 pDeviceObj,
  29.                 (PVOID) &filterData,
  30.                 sizeof(PF_SET_EXTENSION_HOOK_INFO),
  31.                 NULL,
  32.                 0,
  33.                 FALSE,
  34.                 &event,
  35.                 &ioStatus);
  36.         if(pIrp == NULL)
  37.         {
  38.                 // 如果不能申请空间,返回对应的错误代码
  39.                 return STATUS_INSUFFICIENT_RESOURCES;
  40.         }
  41.        
  42.                 // 请求安装钩子回调函数
  43.         // 发送此IRP到IP过滤驱动
  44.         status = IoCallDriver(pDeviceObj, pIrp);
  45.         // 等待IP过滤驱动的通知
  46.         if(status == STATUS_PENDING)
  47.         {
  48.                 KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
  49.         }
  50.         status = ioStatus.Status;

  51.         // 清除资源
  52.         if(pFileObj != NULL)
  53.                 ObDereferenceObject(pFileObj);
  54.         return status;
  55. }
复制代码

最新回复

不明LZ在说什么  详情 回复 发表于 2008-4-30 15:24
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
  1. NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp)//处理IRP
  2. {
  3.         NTSTATUS status = STATUS_SUCCESS;

  4.         // 取得此IRP(pIrp)的I/O堆栈指针
  5.         PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);

  6.         // 取得I/O控制代码
  7.         ULONG uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
  8.         // 取得I/O缓冲区指针和它的长度
  9.         PVOID pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
  10.         ULONG uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
  11.        
  12.         // 响应用户的命令
  13.         switch(uIoControlCode)
  14.         {
  15.         case START_IP_HOOK:        // 开始过滤
  16.                 status = SetFilterFunction(FilterPackets);
  17.                 break;
  18.       
  19. ........
  20.         return status;
  21. }
复制代码

客户程序:

  1. if(m_pFilterDrv->IoControl(START_IP_HOOK, NULL, 0, NULL, 0) == -1)//m_pFilterDrv为IP过滤钩子驱动指针
  2.         {
  3.                 str.Format("%d",GetLastError());
  4.                 MessageBox(str,"error");
  5.                 return;
  6.         }
复制代码

 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
跪求了......
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
status = IoGetDeviceObjectPointer(&ustrFilterDriver, SYNCHRONIZE | GENERIC_READ | GENERIC_WRITE, &pFileObj, &pDeviceObj);

处理DeviceControl完成时要
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0;
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
看看你的代码!
monkeycd@163.com
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
还不行啊,cnzdgs 你要代码吗?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
taianmonkey  代码已经发送
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

8
 
不明LZ在说什么
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表