【问题标题】:Faild on get ImageFileName form PsSetCreateProcessNotifyRoutineEx获取 ImageFileName 表单 PsSetCreateProcessNotifyRoutineEx 失败
【发布时间】:2014-09-08 11:58:48
【问题描述】:

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

我的问题是从PPS_CREATE_NOTIFY_INFO CreateInfo 检索并发送:ImageFileNameCommandLine

这是我在 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->通过真实数据创建填充)

我哪里错了?

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

【问题讨论】:

  • 根据该 API 的文档,此信息可能无法通过该 api 获得。
  • @Rohan 不,我确定此信息可用,因为使用 dbgprint(" %ws",CreateInfo->ImageFileName) 时。在DebugView中写入CreateInfo->ImageFileName的值。

标签: c callback kernel createprocess


【解决方案1】:
Pinfo->ImageFileName= CreateInfo->ImageFileName;
Pinfo->CommandLine= CreateInfo->CommandLine;

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

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

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

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

另外,不要忘记在使用结束后释放内存。

【讨论】:

  • 不幸的是,我是驱动程序编程的新手,我不熟悉内核模式内存管理来分配缓冲区......如果可能的话,请给我一个简单的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 2019-07-23
  • 2021-11-17
  • 2012-08-08
  • 2022-06-14
  • 1970-01-01
相关资源
最近更新 更多