自前でDLLをプロセスへマッピングするには?

解決


ハヤテ  2016-07-06 17:50:44  No: 73911  IP: [192.*.*.*]

先般は暗号関係の事でご助言して頂きありがとうございました。
度々で申し訳ないですが今回もご助言をお願い致したいです。
自前でDLLをプロセスへマッピングする為に
http://ruffnex.oc.to/kenji/text/load_dll/
を参考にプログラムしたのですがWin7で正常に動作しなくて困っています。

【症状1】RunDLLMain関数の
return pMain((HMODULE)pImageBase, DLL_PROCESS_ATTACH, NULL);
の部分で下記の例外が発生して終了してしまいます。
0x1000120E で例外がスローされました (ConsoleApplication.exe 内): 
0xC0000005: 場所 0x1000120E の実行中にアクセス違反が発生しました

【開発環境・実行環境】
Windows7SP1(データ実行防止:OFF、UAC実行:requireAdministrator)  
VisualC++ 2015 Community Win32コンソール

【変更点1】全てのPTCHARをTCHAR*に変更

【変更点2】MapDLLFromImage関数の
PTCHAR secMemAddr=(PTCHAR) ((PTCHAR)pMemoryImage+psh->VirtualAddress);
PTCHAR secFileAddr=(PTCHAR) ((PTCHAR)pDLLFileImage+psh->PointerToRawData);
        を下記に変更
LPVOID secMemAddr=LPVOID ((LPBYTE)pMemoryImage+psh->VirtualAddress);
LPVOID secFileAddr=LPVOID ((LPBYTE)pDLLFileImage+psh->PointerToRawData);

【変更点3】PrepareDLLImage関数の
PTCHAR svDllName=(PTCHAR)
RVATOVA(pMemoryImage,pid->Name);
HMODULE hDll=GetModuleHandle(svDllName);
if(hDll==NULL){if((hDll=LoadLibrary(svDllName))==NULL) return FALSE;}
        を下記に変更
LPSTR svDllName=(LPSTR) RVATOVA(pMemoryImage,pid->Name);
wchar_t work[300];
CharToWchar(svDllName,work,300);//char*をwchar_t*へ変更する自作関数
HMODULE hDll=GetModuleHandle(work);
if(hDll==NULL){if((hDll=LoadLibrary(work))==NULL) return FALSE;}

【確認点1】
http://ruffnex.oc.to/kenji/text/load_dll/ で紹介されているコードを少し変更(上記の3個の変更点とは異なる)すれば
WindowsXPsp3(データ実行防止OFF)  VisualC++2003Pro Win32コンソールの環境で正常に構築・実行できる。

【確認点2】
確認点1で構築した実行ファイルを上記のWindows7SP1の環境でも正常に実行できる。

【確認点3】
確認点1のコードを上記のVisualC++ 2015 Community Win32コンソールで構築し、
その実行ファイルを上記のWindows7SP1で実行しても症状1が生じてしまう。

編集 削除
ハヤテ  2016-07-07 06:13:03  No: 73912  IP: [192.*.*.*]

自己解決できました。
お騒がせして申し訳ありませんでした。

編集 削除