如何在c#中为已经运行的进程重定向输出

时间:2013-11-06 05:47:02

标签: c# redirect process output

我正在使用用c ++编写的自定义DLL从C#中的服务(管理权限)启动一个新进程,它基本上修改了安全性和权限以减少它。 这是因为当通过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#app的输出。

0 个答案:

没有答案