Нужен аналог QueueUserWorkItem или PostThreadMessage в ring - 0. Тоесть код в удаленном потоке должен работать на PASSIVE_LEVEL , а поток который вызывает QueueUserWorkItem/PostThreadMessage на АРС_LEVEL Есть вариант реализовать такое через APC + смена IRQL но насколько это безопасно ? Нужно это все для того что нужно получить имя процесса на IRQL APC_LEVEL(нотификация загрузки модуля). Там менять IRQL как то не хорошо наверно... Вот и возникла идея получать имена процессов в другом потоке.
0x6b65 Код (Text): retLen = 0; irql = KeGetCurrentIrql(); #ifdef DBG DbgPrint("CurrentIrq: %d\n", irql); #endif KeLowerIrql(PASSIVE_LEVEL); #ifdef DBG DbgPrint("LowerIrql. From %d to %d \n",irql,PASSIVE_LEVEL); #endif status = ZwQueryInformationProcess(hnd,//получаем длину имени процесса (PROCESSINFOCLASS)ProcessImageFileName, str, 0, &retLen); len=retLen; str=(PWCHAR)ExAllocatePool(PagedPool,len); status = ZwQueryInformationProcess(hnd,//получаем имя процесса (PROCESSINFOCLASS)ProcessImageFileName, str, len, &retLen); #ifdef DBG DbgPrint("RaiseIrql From %d to %d \n",PASSIVE_LEVEL,irql); #endif KeRaiseIrql(irql,&irql); Нашол интересную функ: ZwQueueApcThread жаль не документированая она (
Ну так стандартный WorkItem http://msdn.microsoft.com/en-us/library/ff540216(VS.85).aspx вам в помощь Не понимаю сути проблемы, почему не использовать стандартный механизм WorkItem'ов, если необходимо исполнение кода на PASSIVE_LEVEL?
Возникло несколько вопросов 1. Можно сразу после IoQueueWorkItem вызвать IoFreeWorkItem ? 2. IoQueueWorkItem когда возвращает управление? можно рассчитывать что она вернет управление после выполнения WorkerRoutine ? 3. Где находяться IoInitializeWorkItem / IoUninitializeWorkItem линковщик их не видет (подключен к проекту ntddk.h + wdk.h) ?
1 Не правильная идея в корне, у вас инвалид использование. 2 Сразу, нельзя на это расчитыватью. вообщем читать http://msdn.microsoft.com/en-us/library/ff564587%28v=vs.85%29.aspx. 3 Какой окружения юзайешь ? случайно не XP ? так как : Available in Windows Vista and later versions of Windows.
по 1 вам уже сказали 2. Вообще неправильный подход. Это асинхронный вызов, в принципе можно передать ивент и ждать на нем (либо создать свой системный поток PsCreateSystemThread и ждать на хэндле), но это тоже неправильно. Лучше сделать полностью асинхронную обработку -> ставить задания системному потоку, ктр выгрустал бы задачи из списка, получал бы имена и добавлял их в собственный список процессов. Это для коммерческого софта, документированное решение. Ещё есть возможность прямо получать имя процесса в нотифае через EPROCESS, но тогда вам придеться хардкодить смещения или получать их из отладочной инфы с помощбю парсера, поэтому это решение менее предпочтительно. 3. Для xp нужно вызывать IoAllocateWorkItem. IoInitializeWorkItem только если сами выделяете ворк итем и если >= висты. Вообщем ссылку вам выше уже дали =)