Faild on获取ImageFileName表单PsSetCreateProcessNotifyRoutineEx

时间:2014-09-08 11:58:48

标签: c callback kernel createprocess

我正在开发一个简单的驱动程序来将进程创建通知给用户模式! 我搜索了一个很好的例子,但那只显示结果" dbgView" !

我的问题是从ImageFileName检索并发送:CommandLinePPS_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);
....}

这段代码工作得很好,我在用户模式下得到[b] Pinfo [/ b]结构,但Pinfo->ImageFileNamePinfo->CommandLine不包含任何字符串! (Pinfo-> ProcessId和Pinfo->按真实数据创建填充)

我哪里错了?

{哦,如果我的英语不好,请原谅我}

1 个答案:

答案 0 :(得分:0)

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

这些是PUNICODE_STRING类型变量。并从文档页面

  

PS_CREATE_NOTIFY_INFO结构及其指向的结构保证仅在回调期间有效。如果驱动程序在回调后需要访问这些结构中的任何信息,CreateProcessNotifyEx例程应该复制此信息。

它建议您为Pinfo->ImageFileNamePinfo->CommandLine分配新内存,然后将unicode字符串复制到其中。

否则,您尝试访问的内存可能无效,并且在回调存在后可能不包含相同的信息。

此外,请勿忘记在使用结束后释放内存。