2014-09-08 4 views
0

Я разрабатываю простой драйвер для уведомления о создании процесса в пользовательском режиме! Я искал найденный хороший пример, но это только результат шоу в «dbgView»!Faild on get ImageFileName form PsSetCreateProcessNotifyRoutineEx

Моя проблема заключается в получении и отправке: ImageFileName и CommandLine от PPS_CREATE_NOTIFY_INFO CreateInfo.

Это мой код в стороне CreateProcessNotifyEx обратного вызова:

VOID CreateProcessNotifyEx(
    __inout PEPROCESS Process, 
    __in  HANDLE ProcessId, 
    __in_opt PPS_CREATE_NOTIFY_INFO CreateInfo 

    ) 
{ ... 

      Pinfo->ParentId = CreateInfo->ParentProcessId; 
      Pinfo->ProcessId = ProcessId; 
      Pinfo->Create = CreateInfo->CreationStatus; 
      Pinfo->ImageFileName= CreateInfo->ImageFileName; 
        Pinfo->CommandLine= CreateInfo->CommandLine; 

.. 
      KeSetEvent(ProcessEvent, 0, FALSE); 
      KeClearEvent(ProcessEvent); 
....} 

Этот код работать отлично, и я получил [б] Pinfo [/ b] структура в пользовательском режиме, но Pinfo->ImageFileName и Pinfo->CommandLine не содержит любая строка! (Pinfo-> ProcessId и Pinfo-> Создать заполнение по достоверным данным)

Где моя ошибка?

{Оооо Извините, что я, если мой английский плохо}

+0

В соответствии с документацией этого API эта информация может быть недоступна через этот api. – Rohan

+0

@Rohan Нет. Я уверен, что эта информация доступна, потому что при использовании 'dbgprint ("% ws ", CreateInfo-> ImageFileName)'. Напишите значение 'CreateInfo-> ImageFileName' в * DebugView *. – Kamran

ответ

0
Pinfo->ImageFileName= CreateInfo->ImageFileName; 
Pinfo->CommandLine= CreateInfo->CommandLine; 

Это PUNICODE_STRING переменные типа. И с документальной страницы

Структура PS_CREATE_NOTIFY_INFO и структуры, на которые она указывает, гарантированы, что они действительны только на время обратного вызова. Если драйвер требует доступа к любой информации из этих структур после обратного вызова, процедура CreateProcessNotifyEx должна сделать копию этой информации.

Это говорит о том, что вы должны выделить новую память для Pinfo->ImageFileName и Pinfo->CommandLine, а затем скопировать строки Юникода в него.

В противном случае память, к которой вы пытаетесь получить доступ, может быть недействительной и не может содержать такую ​​же информацию после того, как существует обратный вызов.

Кроме того, не забудьте освободить память после ее использования.

+0

К сожалению, я новичок в программировании драйверов, и я не знаком с управлением памятью режима ядра, чтобы выделить буфер и ... Пожалуйста, если это возможно, покажите мне простой пример. – Kamran