Аналог QueueUserWorkItem или PostThreadMessage

Тема в разделе "WASM.NT.KERNEL", создана пользователем XshStasX, 23 ноя 2010.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Нужен аналог QueueUserWorkItem или PostThreadMessage в ring - 0.
    Тоесть код в удаленном потоке должен работать на PASSIVE_LEVEL , а поток который вызывает QueueUserWorkItem/PostThreadMessage на АРС_LEVEL

    Есть вариант реализовать такое через APC + смена IRQL но насколько это безопасно ?

    Нужно это все для того что нужно получить имя процесса на IRQL APC_LEVEL(нотификация загрузки модуля).

    Там менять IRQL как то не хорошо наверно...
    Вот и возникла идея получать имена процессов в другом потоке.
     
  2. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    Каким именно методом будет реализовано получение "имени процесса"?
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    0x6b65
    Код (Text):
    1.         retLen = 0;
    2.         irql = KeGetCurrentIrql();
    3. #ifdef DBG
    4.         DbgPrint("CurrentIrq: %d\n", irql);
    5. #endif
    6.         KeLowerIrql(PASSIVE_LEVEL);
    7. #ifdef DBG
    8.         DbgPrint("LowerIrql. From %d to %d \n",irql,PASSIVE_LEVEL);
    9. #endif
    10.         status = ZwQueryInformationProcess(hnd,//получаем длину имени процесса
    11.                                             (PROCESSINFOCLASS)ProcessImageFileName,
    12.                                             str,
    13.                                             0,
    14.                                             &retLen);
    15.  
    16.         len=retLen;
    17.        
    18.         str=(PWCHAR)ExAllocatePool(PagedPool,len);
    19.        
    20.         status = ZwQueryInformationProcess(hnd,//получаем имя процесса
    21.                                             (PROCESSINFOCLASS)ProcessImageFileName,
    22.                                             str,
    23.                                             len,
    24.                                         &retLen);
    25. #ifdef DBG
    26.         DbgPrint("RaiseIrql From %d to %d \n",PASSIVE_LEVEL,irql);
    27. #endif
    28.         KeRaiseIrql(irql,&irql);
    Нашол интересную функ: ZwQueueApcThread жаль не документированая она (
     
  4. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    Ну так стандартный WorkItem http://msdn.microsoft.com/en-us/library/ff540216(VS.85).aspx вам в помощь :)
    Не понимаю сути проблемы, почему не использовать стандартный механизм WorkItem'ов, если необходимо исполнение кода на PASSIVE_LEVEL?
     
  5. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    0x6b65
    спс, не знал об такой функ.
     
  6. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Возникло несколько вопросов
    1. Можно сразу после IoQueueWorkItem вызвать IoFreeWorkItem ?
    2. IoQueueWorkItem когда возвращает управление? можно рассчитывать что она вернет управление после выполнения WorkerRoutine ?

    3. Где находяться IoInitializeWorkItem / IoUninitializeWorkItem линковщик их не видет (подключен к проекту ntddk.h + wdk.h) ?
     
  7. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    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.
     
  8. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    по 1 вам уже сказали

    2. Вообще неправильный подход. Это асинхронный вызов, в принципе можно передать ивент и ждать на нем (либо создать свой системный поток PsCreateSystemThread и ждать на хэндле), но это тоже неправильно. Лучше сделать полностью асинхронную обработку -> ставить задания системному потоку, ктр выгрустал бы задачи из списка, получал бы имена и добавлял их в собственный список процессов. Это для коммерческого софта, документированное решение. Ещё есть возможность прямо получать имя процесса в нотифае через EPROCESS, но тогда вам придеться хардкодить смещения или получать их из отладочной инфы с помощбю парсера, поэтому это решение менее предпочтительно.
    3. Для xp нужно вызывать IoAllocateWorkItem. IoInitializeWorkItem только если сами выделяете ворк итем и если >= висты. Вообщем ссылку вам выше уже дали =)