2

我正在通过使用用 C++ 编写的自定义 DLL 从 C# 中的服务(管理权限)启动一个新进程,该 DLL 基本上修改了安全性和权限以减少它。这是因为通过 Windows 7 的 Ring 0 运行的新进程不允许它访问 OpenCL 中的硬件编码器(Windows 驱动程序设计限制)。因此,我模拟了 Windows 资源管理器权限并使用此 DLL 启动它。

DLL文件的症结在于:

                                typedef BOOL (WINAPI *LPFN_CreateProcessWithTokenW)(
                                HANDLE hToken,
                                DWORD dwLogonFlags,
                                LPCWSTR lpApplicationName,
                                LPWSTR lpCommandLine,
                                DWORD dwCreationFlags,
                                LPVOID lpEnvironment,
                                LPCWSTR lpCurrentDirectory,
                                LPSTARTUPINFOW lpStartupInfo,
                                LPPROCESS_INFORMATION lpProcessInfo
                                );
                            LPFN_CreateProcessWithTokenW fnCreateProcessWithTokenW=NULL;
                            HINSTANCE hmodAdvApi32=LoadLibraryA("AdvApi32");
                            if(hmodAdvApi32)
                                fnCreateProcessWithTokenW=(LPFN_CreateProcessWithTokenW)GetProcAddress(hmodAdvApi32, "CreateProcessWithTokenW");
                            if(fnCreateProcessWithTokenW)
                            {
                                bRet=fnCreateProcessWithTokenW(hNewToken, 0, 
                                    szProcessName, szCmdLine, 
                                    0, NULL, NULL, &StartupInfo, &ProcInfo);
                                if(!bRet)
                                    hr=HRESULT_FROM_WIN32(GetLastError());
                            }

现在的问题是如何将这个进程的输出重定向到我的 C# 程序来监控输出?这很关键,因为我需要知道进程是如何进行或挂起的,以便 C# 应用程序可以采取适当的操作。我也可以:

  1. 使用进程 ID 重定向/捕获现有进程的输出?
  2. 如何将回调函数从 c# 传递到 dll 以使用上述函数注册该输出处理程序,以便我可以捕获 c# 应用程序的输出。
4

0 回答 0