Доброго времени суток, уважаемые!
Пишу драйвер для фильтрации пакетов на основе
статьи.
Под ХП все прекрасно работает, на висте нет! Никаких синих экранов, просто невозможно установить фильтрующую функцию.
В коде пометил момент, после которого валится ошибка. Фаервол отключен, уже весь МСДН перерыл в поисках проблемы, может плохо рыл...
Помогите пожалуйста люди добрые
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;
DebugPrint(("Getting pointer to IpFilterDriver\n"));
//first of all, we have to get a pointer to IpFilterDriver Device
RtlInitUnicodeString(&filterName, DD_IPFLTRDRVR_DEVICE_NAME);
status = IoGetDeviceObjectPointer(&filterName,STANDARD_RIGHTS_ALL, &ipFileObject, &ipDeviceObject); //здесь все отрабатывает
if(NT_SUCCESS(status))
{
//initialize the struct with functions parameters
filterData.ExtensionPointer = filterFunction;
//we need initialize the event used later by the IpFilterDriver to signal us
//when it finished its work
KeInitializeEvent(&event, NotificationEvent, FALSE);
//we build the irp needed to establish fitler function
irp = IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER,
ipDeviceObject,
(PVOID) &filterData,
sizeof(PF_SET_EXTENSION_HOOK_INFO),
NULL,
0,
FALSE,
&event,
&ioStatus); //это тоже работает
if(irp != NULL)
{
// we send the IRP
status = IoCallDriver(ipDeviceObject, irp); //здесь возвращается 0
//and finally, we wait for "acknowledge" of IpDriverFilter
if (status == STATUS_PENDING)
{
waitStatus = KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
if (waitStatus != STATUS_SUCCESS )
DebugPrint(("Error waiting for IpFilterDriver response."));
}
status = ioStatus.Status;
if(!NT_SUCCESS(status))
DebugPrint(("Error, IO error with ipFilterDriver %d\n", status));
}
else
{
//if we cant allocate the space, we return the corresponding code error
status = STATUS_INSUFFICIENT_RESOURCES;
DebugPrint(("Error building IpFilterDriver IRP\n"));
}
if(ipFileObject != NULL)
ObDereferenceObject(ipFileObject);
ipFileObject = NULL;
ipDeviceObject = NULL;
}
else
DebugPrint(("Error while getting the pointer\n"));
return status;
}