【问题标题】:What's the meaning of the error value 0x16f returned by the GetLastError() functionGetLastError()函数返回的错误值0x16f是什么意思
【发布时间】:2017-06-10 08:36:06
【问题描述】:

当我调用函数CreateProcessAsUser() 时,它返回一个失败。
然后调用GetLastError()检查错误发生的原因返回值0x16f。

我无法找出错误的含义。

【问题讨论】:

  • 错误码的第一站是net helpmsg。在这种情况下,net helpmsg 367 返回“进程创建已被阻止”。不幸的是,不是很清楚,而且谷歌搜索也很少出现。可能是由于防病毒软件确定您的子进程是恶意的?或者您的进程被分配给一个作业对象,限制阻止您启动子进程?或者可能与 Windows 应用商店沙盒有关? (如果您能解释错误发生的情况,我们可能会提供更多帮助。)
  • 一些突出显示、一些拼写修复和一些语法改进(我希望)。

标签: windows winapi createprocess createprocessasuser getlasterror


【解决方案1】:

ERROR_CHILD_PROCESS_BLOCKED 转换为 NTSTATUS - STATUS_CHILD_PROCESS_BLOCKED (0xC000049D) - 我在 ntoskrnl.exe 中搜索,发现此代码仅在调用 NtCreateUserProcess 时从 2 个地方引用 - 从 SeSubProcessToken 和日志错误:

NtCreateUserProcess
  PspAllocateProcess
    PspInitializeProcessSecurity
      SeSubProcessToken
        if (!SeTokenIsNoChildProcessRestricted(Token))
        {
            status = STATUS_CHILD_PROCESS_BLOCKED;
        }


  if (PspAllocateProcess() == STATUS_CHILD_PROCESS_BLOCKED)
  {
    EtwTraceDeniedTokenCreation();
  }

所以当SeTokenIsNoChildProcessRestricted(Token) 返回FALSE 时,您可以从CreateProcess 获得ERROR_CHILD_PROCESS_BLOCKED

这是新的api,只存在于win10的1607版本

#if (NTDDI_VERSION >= NTDDI_WIN10_RS1)
NTKERNELAPI
BOOLEAN
SeTokenIsNoChildProcessRestricted(
    _In_ PACCESS_TOKEN Token
    );// return (Token->TokenFlags & 0x80000) != 0;
#endif

ntifs.h 中声明但未记录在案。

因此,调用CreateProcessAsUser 失败的进程在某种程度上受到了限制。 Windows Store 沙盒,Harry Johnston 是怎么猜的?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多