Выполнить код в PASSIVE_LEVEL.
От: Аноним  
Дата: 26.01.07 06:40
Оценка:
День добрый!

Описываю ситуацию.

Есть в 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 нельзя? Как же поступить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.