我正在通过使用用 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# 应用程序可以采取适当的操作。我也可以:
- 使用进程 ID 重定向/捕获现有进程的输出?
- 如何将回调函数从 c# 传递到 dll 以使用上述函数注册该输出处理程序,以便我可以捕获 c# 应用程序的输出。