阅读:1440回复:10
书上源码防火墙程序出问题高手帮看看怎么回事
下面是设置过滤函数的程序,是书上的源程序,不知道为什么执行不成功,在客户程序中使用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; } NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp)//处理IRP { NTSTATUS status = STATUS_SUCCESS; // 取得此IRP(pIrp)的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; // 响应用户的命令 switch(uIoControlCode) { case START_IP_HOOK: // 开始过滤 status = SetFilterFunction(FilterPackets); break; ........ return status; } 客户程序: if(m_pFilterDrv->IoControl(START_IP_HOOK, NULL, 0, NULL, 0) == -1)//m_pFilterDrv为IP过滤钩子驱动指针 { str.Format("%d",GetLastError()); MessageBox(str,"error"); return; } 跪求大家了 |
|
沙发#
发布于:2008-01-19 10:23
if(m_pFilterDrv->IoControl(START_IP_HOOK, NULL, 0, NULL, 0) == -1)//m_pFilterDrv为IP过滤钩子驱动指针 { str.Format("%d",GetLastError()); MessageBox(str,"error"); return; } 这个if语句的判断总是真,安装过滤函数失败 |
|
板凳#
发布于:2008-01-20 14:34
这个是过时的东西了~
|
|
|
地板#
发布于:2008-01-21 15:16
找到你的 DeviceIoControl 的代码,
如果你的 DeviceIoControl 的倒数第二个参数传入 NULL, 那么修改这个为一个有效 dword pointer。 |
|
地下室#
发布于:2008-01-22 12:08
引用第2楼killvxk于2008-01-20 14:34发表的 : 我也是刚刚接触这个,能不能介绍一下别的方法? |
|
5楼#
发布于:2008-01-22 12:09
引用第3楼codez于2008-01-21 15:16发表的 : DWORD nBytesReturn; BOOL bRet = ::DeviceIoControl(m_hDriver, nCode, pInBuffer, nInCount, pOutBuffer, nOutCount, &nBytesReturn, NULL); 已经是有效 dword pointer了,还不行 |
|
6楼#
发布于:2008-01-22 13:08
要先加载ipfltdrv.sys
|
|
7楼#
发布于:2008-01-22 13:21
UNICODE_STRING ustrFilterDriver;
RtlInitUnicodeString(&ustrFilterDriver, L"\\Device\\IpFilterDriver"); // 取得设备对象指针 status = IoGetDeviceObjectPointer(&ustrFilterDriver, SYNCHRONIZE | GENERIC_READ | GENERIC_WRITE, &pFileObj, &pDeviceObj); if(!NT_SUCCESS(status)) { return status; } 有啊。可是还出错 |
|
8楼#
发布于:2008-01-23 01:59
ndis 6.0 的filter啊
window Filter Platform啊 NetXXX hook啊~ NmrXXX hook啊~ |
|
|
9楼#
发布于:2008-01-23 09:12
引用第7楼redberries于2008-01-22 13:21发表的 : 不懂什么叫加载驱动吗? |
|
10楼#
发布于:2008-01-23 09:13
net start IpFilterDriver
|
|