>当我调用函数CreateProcessAsUser()
时,它返回失败。
然后调用 GetLastError()
检查发生错误的原因将返回值 0x16f。
我无法找出错误应该意味着什么。
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商店沙盒,正如哈利约翰斯顿如何猜测?