マネージド c# dll をネイティブ実行可能ファイルに挿入しようとしています。CLR をロードするために、次のコードを実行可能ファイルに挿入しています。
コードをcmd.exeに挿入すると正しく出力されるため、インジェクションが機能することはわかっています。CLRCreateInstance 、pMetaHost->GetRuntime、pRuntimeInfo->GetInterfaceはすべて S_OK を返しますが、pClrRuntimeHost->Start()は E_FAIL を返します。
これは、dll をリモート プロセスに挿入した場合にのみ発生します。自分のプロセスに dll をロードし、そこから Main を呼び出すと、すべての呼び出しが S_OK を返し、マネージ コードが正常に実行されます。
更新: notepad.exe や explorer.exe などの他のプロセスにコードを挿入しようとしました。それはそれらでうまくいきます。cmd.exe で実行されない理由についてはまだ興味がありますが、テスト目的でのみ使用したので、もう問題ではありません。
GetLastError が「存在しないトークンを参照しようとしました」を返す
#include "stdafx.h"
#include "Bootstrap.h"
#include <metahost.h>
#pragma comment(lib, "mscoree.lib")
using namespace std;
//Forward declarations
void StartTheDotNetRuntime();
DllExport HRESULT Main(_In_ LPCTSTR lpCommand)
{
cout << "Starting .NET runtime" << endl;
StartTheDotNetRuntime();
return 0;
}
void StartTheDotNetRuntime()
{
wprintf(L"Press enter to load the .net runtime...");
HRESULT hr;
ICLRMetaHost *pMetaHost = NULL;
ICLRRuntimeInfo *pRuntimeInfo = NULL;
ICLRRuntimeHost *pClrRuntimeHost = NULL;
// build runtime
hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_PPV_ARGS(&pMetaHost));
hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_PPV_ARGS(&pRuntimeInfo));
hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost,
IID_PPV_ARGS(&pClrRuntimeHost));
// start runtime
hr = pClrRuntimeHost->Start();
cout << "RESULT: " << hr << endl;
wprintf(L".Net runtime is loaded.");
// Okay, the CLR is up and running in this (previously native) process.
// Now call a method on our managed C# class library.
DWORD dwReturn = 0;
hr = pClrRuntimeHost->ExecuteInDefaultAppDomain(
L"F:\\Client.dll",
L"Client.Main", L"Start", L"MyParameter", &dwReturn);
cout << dwReturn << endl;
}