~学海无涯~ 2022-07-05 10:59 采纳率: 33.3%
浏览 32
已结题

服务中调用CreatProcessAsUser创建进程失败返回错误码6

服务中调用CreatProcessAsUser创建进程失败返回错误码6,无效的handle,请问这个问题怎么解决
PROCESSENTRY32 pe;
// explorer.exe的进程ID
DWORD pid = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hSnapshot, &pe))
return 0;

do
{
    pe.dwSize = sizeof(PROCESSENTRY32);
    if (Process32Next(hSnapshot, &pe) == FALSE)
        break;
    if (wcscmp(pe.szExeFile, L"cmd.exe") == 0)
    {
        pid = pe.th32ProcessID;
        break;
    }

} while (1);

CloseHandle(hSnapshot);

/* 以全部权限打开explorer.exe 进程 */
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

/* 创建启动信息结构体 */
STARTUPINFOEXA si;

/* 初始化结构体 */
ZeroMemory(&si, sizeof(si));

/* 设置结构体成员 */
si.StartupInfo.cb = sizeof(si);

SIZE_T lpsize = 0;

/* 用微软规定的特定的函数初始化结构体 */
InitializeProcThreadAttributeList(NULL, 1, 0, &lpsize);//首先要获取到需要初始化的大小

char * temp = new char[lpsize];

/* 转换指针到正确类型 */
LPPROC_THREAD_ATTRIBUTE_LIST AttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)temp;

/* 真正为结构体初始化属性参数 */
InitializeProcThreadAttributeList(AttributeList, 1, 0, &lpsize);//设置AttributeList结构体属性个数以及初始化它的大小

/* 用已构造的属性结构体更新属性表 */
if (!UpdateProcThreadAttribute(AttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &handle, sizeof(HANDLE), NULL, NULL))
{
    //更新AttrubuteList 属性,添加PROC_THREAD_ATTRIBUTE_PARENT_PROCESS属性
    printf("UpdateProcThreadAttribute failed ! (%d).\n", GetLastError());
}

/* 移交指针,这里已更换了父进程的属性表是 explorer.exe */
si.lpAttributeList = AttributeList;

PROCESS_INFORMATION pi;

ZeroMemory(&pi, sizeof(pi));
//当调用下面的api 且createFlags的参数是EXTENDED_STARTUPINFO_PRESENT时,lpStartupInfo就需要有扩展的信息,也就是这条属性:PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList;
if (CreateProcessAsUserA(NULL, 0, "C:\\Users\\Administrator\\Desktop\\Play.exe", 0, 0, 0, EXTENDED_STARTUPINFO_PRESENT, 0, 0, (LPSTARTUPINFOA)&si, &pi))
{
    printf("CreateProcessAsUserA success !  \n");
}
else
{
    printf("CreateProcessAsUserA failed ! (%d). \n ", GetLastError());
}

/* 处理后事 */
DeleteProcThreadAttributeList(AttributeList);

delete tmp;

CloseHandle(handle);

  • 写回答

1条回答 默认 最新

  • flower980323 2022-07-05 11:13
    关注

    不是CreatProcessAsUser的问题,而是调用OpenProcess的时候就已经是返回的空指针了
    有两种方式,一种是将if (wcscmp(pe.szExeFile, L"cmd.exe") == 0)改为if (wcscmp(pe.szExeFile, L"explorer.exe") == 0)即可
    另一种是启动一个cmd进程,按下win+R输入cmd回车,然后再运行程序也可以
    如有帮助,请采纳,谢谢。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月13日
  • 已采纳回答 7月5日
  • 创建了问题 7月5日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号