【问题标题】:CreateProcess succeeds, but GetLastError() returns access deniedCreateProcess 成功,但 GetLastError() 返回拒绝访问
【发布时间】:2012-06-18 19:38:23
【问题描述】:

由于CreateProcess()GetLastError() 的返回值冲突,我有点困惑。当我以类似于下面的方式使用CreateProcess() 时,它成功并且似乎完成了它所需的任务。然而,GetLastError() 仍然返回 Access is Denied。

如果访问被拒绝,为什么它似乎完成了任务。相反,如果CreateProcess() 成功,为什么GetLastError() 返回访问被拒绝?

或者我对GetLastError() 的使用不正确?我只应该在CreateProcess() 返回失败值时使用它吗? (我对以下行为的理由是我认为安全总比抱歉好)

    SetLastError(0);
    hello = CreateProcess(_T("C:\\Windows\\System32\\cmd.exe"), 
        _T("C:\\Windows\\System32\\cmd.exe /C ant debug"),
        NULL,NULL,false,0,NULL,
        _T("C:\\My\\Directory"),&siStartupInfo, &piProcessInfo);
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ALLOCATE_BUFFER 
        |FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(), 
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
        (LPTSTR)&errorText, 0, NULL); 
    AfxMessageBox(errorText);

这种行为正常吗?在CreateProcess() 文档中,它提到当CreateProcess() 失败时使用GetLastError(),但没有提到相反的情况。不批评文档,只是想澄清一下。

无论CreateProcess() 中的第二个参数是否为NULL,都会发生这种情况。也许它与cmd.exe 权限有关?如果是这样,CreateProcess() 不应该失败吗?谢谢。

【问题讨论】:

  • 是的,您对GetLastError 的使用不正确。你应该只在CreateProcess 失败时使用它。 CreateProcess 可能(并且确实)使用可以设置最后一个错误的 API,并且没有义务将其重置为 0,因为它返回一个指示成功的值。
  • 感谢您的回复。我只是将它重置为零以表明它不能来自 CreateProcess() 之前的函数

标签: c++ access-denied createprocess getlasterror


【解决方案1】:

来自GetLastError的文档

每个设置最后一个错误代码的函数的文档的返回值部分说明了该函数设置最后一个错误代码的条件。大多数设置线程最后错误代码的函数在失败时都会设置它。但是,某些函数在成功时也会设置最后一个错误代码。 [强调我的]

我认为您会得到经验丰富的结果,因为一旦成功,CreateProcess 不会设置错误值 GetLastError 返回。相反,您对 GetLastError 的调用会返回由之前调用的另一个函数设置的错误

【讨论】:

  • 谢谢。如果我在调用 CreateProcess 之前SetLastError(0),它不应该返回 0 而不是 5?
  • @JHowzer - 这取决于CreateProcess 的实现方式。如果它调用其他函数,那些也可以设置错误值
【解决方案2】:

GetLastError 仅在文档​​说明它有意义时才有意义。

GetLastError 返回使用SetLastError 设置的 Win32 线程最后一个错误。由于函数只应该在记录时设置或清除最后一个错误,如果没有发生,最后一个错误很可能包含一个不相关的早期错误。

据记载,CreateProcess 将在失败时设置最后一个错误,而不是在成功时设置。所以你应该忽略它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 2020-12-12
    • 1970-01-01
    • 2012-12-20
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多