|
阅读:1524回复: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
|
|