基本的にセキュリティと権限を変更してそれを減らすC++で記述されたカスタムDLLを使用して、C#のサービス(管理者権限)から新しいプロセスを起動しています。これは、新しいプロセスが Windows 7 のリング 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# アプリからの出力をキャプチャできるようにするにはどうすればよいですか。