// 本人实验的一个简单的网址过滤驱动程序, 其中用到 ipfltdrv.sys 驱动程序
// 运行在 XP下正常。但是在 win7 出了问题,在调用iocalldriver之后提示0xc000000d错误(参数无效),但是两个参数都有具体的值。
//具体请看下面主要代码:
//
//
NTSTATUS SetFilterFunction(PacketFilterExtensionPtr filterFunction)
{
NTSTATUS status = STATUS_SUCCESS, waitStatus=STATUS_SUCCESS;
UNICODE_STRING filterName;
PDEVICE_OBJECT ipDeviceObject=NULL;
PFILE_OBJECT ipFileObject=NULL;
PF_SET_EXTENSION_HOOK_INFO filterData;
KEVENT event;
IO_STATUS_BLOCK ioStatus;
PIRP irp;
RtlInitUnicodeString(&filterName, DD_IPFLTRDRVR_DEVICE_NAME);
status = IoGetDeviceObjectPointer(&filterName,STANDARD_RIGHTS_ALL, &ipFileObject, &ipDeviceObject);
if(NT_SUCCESS(status))
{
filterData.ExtensionPointer = filterFunction;
KeInitializeEvent(&event, NotificationEvent, FALSE);
// 经过跟踪,问题就处在下面这个 IoBuildDeviceIoControlRequest
// 在WIN/XP 下运行,很正常。 WIN7 就有问题。函数执行结果差别在
//
// XP 下: ioStatus.Status = 0
// win7 下 ioStatus.Status = 8 (不知道这代码啥意思?)
// 紧接着下面的 IoCallDriver 的返回也不一样,
// 应该是IoBuildDeviceIoControlRequest 有问题引起
// IoCallDriver 返回
// xp 下 status = 0
// win7 下 status = 0xc000000d ( 参数无效)
//
// 不知道win7 和 xp 有啥区别?该如何处理?
//
irp = IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER,
ipDeviceObject,
(PVOID) &filterData,
sizeof(PF_SET_EXTENSION_HOOK_INFO),
NULL,
0,
FALSE,
&event,
&ioStatus);
if(irp != NULL)
{
status = IoCallDriver(ipDeviceObject, irp);
//
// xp 下 status = 0
// win7 下 status = 0xc000000d
//
//
if (status == STATUS_PENDING)
waitStatus = KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
status = ioStatus.Status;
}
else
status = STATUS_INSUFFICIENT_RESOURCES;
if(ipFileObject != NULL)
ObDereferenceObject(ipFileObject);
ipFileObject = NULL;
ipDeviceObject = NULL;
}
return status;
}
[注意]看雪招聘,专注安全领域的专业人才平台!