#author("2023-10-07T15:22:17+09:00","default:irrp","irrp")
#author("2023-10-07T15:24:39+09:00","default:irrp","irrp")
→WindowsAPI関連

#contents


*一般 [#fb27ac99]
-http://www.dll-files.com/


*Dependncy Walker [#mc4485b5]
-[[覚書 : Dependency Walkerはもう古い! Windows 10ならDependenciesを使え! | FRONTL1NE (フロントライン)>https://frontl1ne.net/2018/12/dependency-walker-is-too-old-use-dependencies/]] 2018
--[[lucasg/Dependencies: A rewrite of the old legacy software "depends.exe" in C# for Windows devs to troubleshoot dll load dependencies issues.>https://github.com/lucasg/Dependencies]]
--Dependencies is a rewrite of the legacy software Dependency Walker which was shipped along Windows SDKs, but whose development stopped around 2006. Dependencies can help Windows developers troubleshooting their dll load dependencies issues.

-http://www.dependencywalker.com/ 2023
--[[help>http://www.dependencywalker.com/help/html/contents.htm]]


*DLLの関数一覧を得る [#gf789935]
-プログラムで取得するには(プログラムのヘッダ情報から取得)
--http://d.hatena.ne.jp/kaorun55/20080429/p1

-[[コマンドで取得するには(dumpbinを使う)>http://d.hatena.ne.jp/kaorun55/20080429/p1]]
 dumpbin /exports XXXX.dll > hoge.txt
--export以外も含め全部出す場合は、リンカのオプションに/MAPを付ける。
--そうすると出力先ディレクトリに*.mapファイルが生成される。
--C++の場合、コンパイラが付けた修飾名で関数が出力される。
--C++の関数でDEFファイルを作るときに手助けになるはず。


*DLLの関数差し替え [#ibc0b27d]
-参考資料:http://www.users.gr.jp/blogs/hidori/archive/2005/07/25/14423.aspx
 BOOL ReplaceDllProc(
  LPCTSTR lpSourceModuleName,  // 置換対象の DLL 関数が格納されているモジュールの名前
  LPVOID lpCurProc,                       // 置換対象の DLL 関数のアドレス
  LPVOID lpNewProc,                     // 新しい DLL 関数のアドレス
  HMODULE hNewProcModule      // 新しい DLL 関数が格納されているモジュールのハンドル
 )
 {
  ULONG ulSize = 0;
 
  PIMAGE_IMPORT_DESCRIPTOR pImportDesc = 
  (PIMAGE_IMPORT_DESCRIPTOR) 
  ::ImageDirectoryEntryToData(hNewProcModule, TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);
 
  if (!pImportDesc)
  {
    return FALSE;
  }
 
  for (; pImportDesc->Name; pImportDesc++)
  {
    LPCTSTR lpModName = (LPCTSTR) ((PBYTE) hNewProcModule + pImportDesc->Name);
    if (!_tcsicmp (lpModName, lpSourceModuleName))
    {
      break;
    }
  }
  if (!pImportDesc->Name)
  {
    return FALSE;
  }
  PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA) ((PBYTE) hNewProcModule + pImportDesc->FirstThunk);
  for (; pThunk->u1.Function; pThunk++)
  {
    LPVOID* ppfn = (LPVOID*) &(pThunk->u1.Function);
    BOOL fFound = (*ppfn == lpCurProc);
    if (fFound)
    {
      ::WriteProcessMemory (::GetCurrentProcess(), ppfn, &lpNewProc, sizeof(lpNewProc), 0);
      return TRUE;
    }
  }
  return FALSE;
 }

*DLLの共有セグメント(C++) [#u6efc7c4]
DLL のソースコードに
 #pragma comment(linker,"/section:SHARED,rws")
 #pragma data_seg("SHARED")
   HWND  hwndOwner = 0;
   HHOOK hhk = 0;
 #pragma data_seg()
のように記述。 
#pragma data_seg は、#pragma data_seg で括られた区間がデータセグメントであること、セクション名が "SHARED" であることを示し
#pragma comment ディレクティブは、リンカに対する指示で、"SHARED" と名前付けられたセクションが「読み書き可能、共有」の属性を持つことを指定

この2つの記述により、変数 hwndOwner と hhk は、この DLL をロードしたプロセス間で共有される。

なお、共有する変数は
 HWND hwndOwner = 0;
のように必ず初期化すること。
これを忘れると、変数が共有されません。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS