|
下面是设置过滤函数的程序,是书上的源程序,不知道为什么执行不成功,在客户程序中使用GetLastError()得到2,找不到指定文件,初次接触驱动程序,希望老虾们给看看
- NTSTATUS SetFilterFunction(PacketFilterExtensionPtr filterFun)
- {
- NTSTATUS status = STATUS_SUCCESS;
- // 取得IP过滤驱动设备对象。下面代码执行后,pDeviceObj变量将指向IP过滤驱动设备对象
- PDEVICE_OBJECT pDeviceObj;
- PFILE_OBJECT pFileObj;
- // 初始化IP过滤驱动的名称
- UNICODE_STRING ustrFilterDriver;
- RtlInitUnicodeString(&ustrFilterDriver, L"\\Device\\IpFilterDriver");
- // 取得设备对象指针
- status = IoGetDeviceObjectPointer(&ustrFilterDriver, FILE_ALL_ACCESS, &pFileObj, &pDeviceObj);
- if(!NT_SUCCESS(status))
- {
- return status;
- }
- // 使用到IP过滤驱动中设备对象的指针创建一个IRP
- // 填充PF_SET_EXTENSION_HOOK_INFO结构
- PF_SET_EXTENSION_HOOK_INFO filterData;
- filterData.ExtensionPointer = filterFun;
- // 我们需要初始化一个事件对象。
- // 构建IRP时需要使用这个事件内核对象,当IP过滤取得接受到此IRP,完成工作以后会将它置位
- KEVENT event;
- KeInitializeEvent(&event, NotificationEvent, FALSE);
- // 为设备控制请求申请和构建一个IRP
- PIRP pIrp;
- IO_STATUS_BLOCK ioStatus;
- pIrp = IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER, // io control code
- pDeviceObj,
- (PVOID) &filterData,
- sizeof(PF_SET_EXTENSION_HOOK_INFO),
- NULL,
- 0,
- FALSE,
- &event,
- &ioStatus);
- if(pIrp == NULL)
- {
- // 如果不能申请空间,返回对应的错误代码
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- // 请求安装钩子回调函数
- // 发送此IRP到IP过滤驱动
- status = IoCallDriver(pDeviceObj, pIrp);
- // 等待IP过滤驱动的通知
- if(status == STATUS_PENDING)
- {
- KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
- }
- status = ioStatus.Status;
- // 清除资源
- if(pFileObj != NULL)
- ObDereferenceObject(pFileObj);
- return status;
- }
复制代码
|
|