~学海无涯~ 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 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛