ul_reason_for_call の呼ばれるタイミング

 L77F8567D:
  push [ebp+08h]
  push DLL_PROCESS_ATTACH(00000001h)
  push [esi+18h] //HInstance
  push edi //Entry Point
  call SUB_L77F88058
         :

 L77F8AA58:
  push 00000000h
  push DLL_THREAD_ATTACH(00000003h)
  push [esi+18h] //HInstance
  push [ebp-20h] //Entry Point
  call SUB_L77F88058
  jmp L77F8AA09

 L77F8AB19:
  cmp byte ptr [L77FCF030],00h
  jnz L77F8AB2F
  push 00000000h
  push DLL_THREAD_DETACH(00000002h)
  push [esi+10h] //HInstance
  push ebx //Entry Point
  call SUB_L77F88058

 L77F8A971:
  push 00000001h
  push DLL_PROCESS_DETACH(00000000h)
  push [esi+18h] //HInstance
  push [ebp-20h] //Entry Point
  call SUB_L77F88058
  jmp L77F8A92B 

NTDLL内に該当の処理があって、そこでDLLを一つロードするたびにこの関数が呼び出される様です。
なので、この関数が処理される前にTls を初期化するのが必要という訳ですね ・ω・

ちなみに、 DllMain呼び出しの第3パラメータは、Tls Callback 周りの処理に使われるみたいです

DLL_PROCESS_ATTACHのコールスタック

NTDLL! 77f88058()

NTDLL! 77f8568b()
NTDLL! 77f8449a() <-proc load
NTDLL! 77f83a01()

NTDLL! 77f91b93()
NTDLL! 77f88058()
NTDLL! 77f8568b()
NTDLL! 77f8d483()<-dll load

NTDLL! 77f85b43()

KERNEL32! 77e7034b

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です