【问题标题】:Access Violation when duplicating token复制令牌时访问冲突
【发布时间】:2012-09-26 10:29:35
【问题描述】:

以下代码生成:

MyProgram1.exe 中 0x749ab763 处的未处理异常:0xC0000005:访问冲突写入位置 0x00d4eb38。

    SECURITY_ATTRIBUTES sa = {0};
    sa.nLength = sizeof(sa);
    STARTUPINFO si = {0};
    si.cb = sizeof(si);
    //si.cbReserved2 = sizeof(si);
    si.lpDesktop = L"winsta0\\default";

    CreateProcessAsUser(hUserTokenDup, NULL, L"Setup.exe", &sa, &sa, false, NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, NULL, NULL, &si, &procinfo);

代码有什么问题吗?请帮忙

【问题讨论】:

  • 您将一个 const 字符串传递给一个非常量参数(第三个参数是 inout)。
  • 感谢 avakar,它不再显示错误。但是进程 setup.exe 没有启动,没有窗口,并且任务管理器中的进程没有显示它。你知道为什么吗?
  • @JohnKenedy,GetLastError() 报告了什么?
  • 我检查它报告 5 访问被拒绝。然后我尝试使用 AdjustTokenPrivileges 设置调试特权,但它返回 1300,即 ERROR_NOT_ALL_ASSIGNED。然后我得到令牌信息,它返回 3 当前进程没有 TOKEN_ADJUST_PRIVILEGES 访问权限。我该如何解决这个问题?

标签: c++ winapi process


【解决方案1】:

来自CreateProcessAsUser(),指第三个参数:

此函数的 Unicode 版本 CreateProcessAsUserW 可以修改此字符串的内容。因此,此参数不能是指向只读内存的指针(如 const 变量或文字字符串)。如果此参数是一个常量字符串,该函数可能会导致访问冲突。

改为:

WCHAR exeName[] = L"Setup.exe";

并将exeName 作为第三个参数传递。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2019-10-24
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多