如何将应用程序作为新创建的资源管理器进程的子项启动?

时间:2015-06-03 08:30:22

标签: c++ winapi process

我正在处理类似于自助服务终端的应用程序。应用程序启动后,它会创建一个功能有限的新桌面。使用键组合我可以在桌面之间来回移动。为了告知用户当前正在使用的桌面,或者我创建的应用程序的任何其他信息,即显示气球消息的是系统托盘区域。

在新创建的桌面中,我使用CreateProcess函数启动 explorer.exe ,并通过STARTUPINFO结构提供新桌面,我就是这样在PROCESS_INFORMATION结构中返回进程的句柄。

使用相同的技术我尝试在新桌面中启动图标托盘应用程序,以STARTUPINFO结构提供新桌面。问题是,根据任务管理器,应用程序正在运行,但托盘图标不会显示。

我的直觉说,在新桌面中,图标未显示,因为它不是新 explorer.exe 进程的子代, procexp 来自live.systernals的应用程序显示了这两个进程,在树表示中处于同一级别。

有没有办法向CreateProcess提供参数,也许是资源管理器进程句柄,以便图标托盘应用程序作为此进程的子项启动?

L.E。:这是我用来创建启动 explorer.exe 图标托盘进程的代码:

STARTUPINFO sInfoNT; /// startupinfo for the explorer.exe
PROCESS_INFORMATION pInfoNT; /// process infromation for the explorer.exe
ZeroMemory(&sInfoNT, sizeof(sInfoNT));
sInfoNT.lpDesktop = L"threadDesktop"; /// setting the desktop for the process
pInfoNT = startProcess(sInfoNT, L"C:\\Windows\\explorer.exe"); /// starting the process 
if (!pInfoNT.hProcess)
    LOG(ERROR) << "Unable to start the new explorer process";
else
    LOG(INFO) << "Started the new explorer process";

STARTUPINFO sInfoTITD; /// doing the same thing for the tray icon application
PROCESS_INFORMATION pInfoTITD;
ZeroMemory(&sInfoTITD, sizeof(sInfoTITD));
sInfoTITD.lpDesktop = L"threadDesktop";
pInfoTITD = startProcess(sInfoTITD, L"DesktopTrayIcon.exe");
if (!pInfoTITD.hProcess)
    LOG(ERROR) << "Unable to start the tray icon for the new desktop";
else
    LOG(INFO) << "Started the tray icon for the new desktop";

这是startProcess函数:

PROCESS_INFORMATION KioskLauncher::startProcess(STARTUPINFO startUpInfo, LPCTSTR lpApplicationName)
{
    PROCESS_INFORMATION processInformation;
    ZeroMemory(&processInformation, sizeof(processInformation));

    if (!CreateProcess(lpApplicationName, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startUpInfo, &processInformation))
        MessageBox(0, L"Unable to start the process!\nThe path is broken!", L"Path Error!", MB_ICONERROR);

    return processInformation;
}

1 个答案:

答案 0 :(得分:1)

如果您真的想让新进程成为其他进程的子进程,则必须使用代码注入。搜索CreateRemoteThread将为您提供大量阅读材料。最大的问题是,您的流程必须与目标相同。有3种替代方法可供使用:

  • Dll注射(标准)
  • 注入实际shellcode:将自行解析所有依赖项的汇编程序代码。 (无法启用EMET)
  • 从您的应用程序中复制一段代码并修复导入(Tricky)