День добрый!
Описываю ситуацию.
Есть в Win-де такая штука как filter-hook driver,
которая может занимаеться фильтрацией IP-пакетов.
В драйвере регистрируется так называемая filter-hook callback function,
которая выглядит примерно так:
убедительная просьба использовать таги ccode & asm для соотв. кусков кода — модератор
PF_FORWARD_ACTION
hook_proc(
unsigned char *PacketHeader,
unsigned char *Packet,
unsigned int PacketLength,
unsigned int RecvInterfaceIndex,
unsigned int SendInterfaceIndex,
ULONG RecvLinkNextHop,
ULONG SendLinkNextHop)
{
PF_FORWARD_ACTION action;
KIRQL=c_irql;
c_irql=KeGetCurrentIrql();
KdPrint(("текущий IRQL %d\n",c_irql));
//smthcode
...
//end smthcode
action=PF_DROP;
//action=PF_FORWARD;
return action;
}
В промежутке
//begin smthcode
...
//end smthcode
вызываеются слдеующая группа функций
ZwDeviceIoControlFile
ZwOpenProcess
ZwQueryInformationProcess
ZwOpenProcessToken
ZwQueryInformationToken
ZwCreateFile
ZwDeviceIoControlFile
ZwWriteFile
ZwReadFile
ZwClose
которые работаю на уровне IRQL 0 (PASSIVE_LEVEL),
а KeGetCurrentIrql показывает что уровень IRQL есть 2 (DISPATCH_LEVEL)
и естественно получаю синий экран с IRQL_NOT_LESS_OR_EQUAL.
Как быть, как заставить выполится этому участку кода?
Дело в том, что значение action, то что должна вернуть filter-hook callback function,
зависит как раз от того, как обработаются данные из пакета в этом уастке кода.
На сколько я понимаю понизить IRQL в 0 перед //begin smthcode
а потом обратно повысить в 2 после //end smthcode нельзя? Как же поступить?