11#include " files.h"
22#include " config.h"
33#include " fastdl.h"
4+ #include " hooks.h"
45
56#include < windows.h>
67#include < MinHook.h>
@@ -301,7 +302,9 @@ static HMODULE WINAPI HookLoadLibraryW(LPCWSTR lpLibFileName)
301302 else
302303 LogFileAccess (L" DLL LOAD" , path.c_str ());
303304
304- return g_origLoadLibraryW (redirected.c_str ());
305+ HMODULE hMod = g_origLoadLibraryW (redirected.c_str ());
306+ OnLibraryLoaded (hMod);
307+ return hMod;
305308}
306309
307310static HMODULE WINAPI HookLoadLibraryA (LPCSTR lpLibFileName)
@@ -318,15 +321,20 @@ static HMODULE WINAPI HookLoadLibraryA(LPCSTR lpLibFileName)
318321
319322 std::wstring redirected = ApplyFileRedirects (widePath);
320323
324+ HMODULE hMod;
321325 if (redirected != widePath)
322326 {
323327 LogFileAccess (L" FILE REDIRECT" , widePath.c_str (), redirected.c_str ());
324328 // Use the W trampoline since we already have a wide redirected path
325- return g_origLoadLibraryW (redirected.c_str ());
329+ hMod = g_origLoadLibraryW (redirected.c_str ());
326330 }
327-
328- LogFileAccess (L" DLL LOAD" , widePath.c_str ());
329- return g_origLoadLibraryA (lpLibFileName);
331+ else
332+ {
333+ LogFileAccess (L" DLL LOAD" , widePath.c_str ());
334+ hMod = g_origLoadLibraryA (lpLibFileName);
335+ }
336+ OnLibraryLoaded (hMod);
337+ return hMod;
330338}
331339
332340static HMODULE WINAPI HookLoadLibraryExW (LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
@@ -342,7 +350,13 @@ static HMODULE WINAPI HookLoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DW
342350 else
343351 LogFileAccess (L" DLL LOAD" , path.c_str ());
344352
345- return g_origLoadLibraryExW (redirected.c_str (), hFile, dwFlags);
353+ HMODULE hMod = g_origLoadLibraryExW (redirected.c_str (), hFile, dwFlags);
354+ constexpr DWORD dataFlags = LOAD_LIBRARY_AS_DATAFILE
355+ | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE
356+ | LOAD_LIBRARY_AS_IMAGE_RESOURCE ;
357+ if (!(dwFlags & dataFlags))
358+ OnLibraryLoaded (hMod);
359+ return hMod;
346360}
347361
348362static HMODULE WINAPI HookLoadLibraryExA (LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
@@ -359,58 +373,77 @@ static HMODULE WINAPI HookLoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWO
359373
360374 std::wstring redirected = ApplyFileRedirects (widePath);
361375
376+ HMODULE hMod;
362377 if (redirected != widePath)
363378 {
364379 LogFileAccess (L" FILE REDIRECT" , widePath.c_str (), redirected.c_str ());
365- return g_origLoadLibraryExW (redirected.c_str (), hFile, dwFlags);
380+ hMod = g_origLoadLibraryExW (redirected.c_str (), hFile, dwFlags);
366381 }
367-
368- LogFileAccess (L" DLL LOAD" , widePath.c_str ());
369- return g_origLoadLibraryExA (lpLibFileName, hFile, dwFlags);
382+ else
383+ {
384+ LogFileAccess (L" DLL LOAD" , widePath.c_str ());
385+ hMod = g_origLoadLibraryExA (lpLibFileName, hFile, dwFlags);
386+ }
387+ constexpr DWORD dataFlags = LOAD_LIBRARY_AS_DATAFILE
388+ | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE
389+ | LOAD_LIBRARY_AS_IMAGE_RESOURCE ;
390+ if (!(dwFlags & dataFlags))
391+ OnLibraryLoaded (hMod);
392+ return hMod;
370393}
371394
372395// ---------------------------------------------------------------------------
373396// Public API
374397// ---------------------------------------------------------------------------
375398void InstallFileHooks ()
376399{
377- MH_CreateHookApi (L" kernel32" , " CreateFileW" ,
378- reinterpret_cast <LPVOID >(HookCreateFileW),
379- reinterpret_cast <LPVOID *>(&g_origCreateFileW));
380-
381- MH_CreateHookApi (L" kernel32" , " CreateFileA" ,
382- reinterpret_cast <LPVOID >(HookCreateFileA),
383- reinterpret_cast <LPVOID *>(&g_origCreateFileA));
384-
385- MH_CreateHookApi (L" kernel32" , " GetFileAttributesW" ,
386- reinterpret_cast <LPVOID >(HookGetFileAttributesW),
387- reinterpret_cast <LPVOID *>(&g_origGetFileAttributesW));
388-
389- MH_CreateHookApi (L" kernel32" , " GetFileAttributesA" ,
390- reinterpret_cast <LPVOID >(HookGetFileAttributesA),
391- reinterpret_cast <LPVOID *>(&g_origGetFileAttributesA));
392-
393- MH_CreateHookApi (L" kernel32" , " FindFirstFileW" ,
394- reinterpret_cast <LPVOID >(HookFindFirstFileW),
395- reinterpret_cast <LPVOID *>(&g_origFindFirstFileW));
396-
397- MH_CreateHookApi (L" kernel32" , " FindFirstFileA" ,
398- reinterpret_cast <LPVOID >(HookFindFirstFileA),
399- reinterpret_cast <LPVOID *>(&g_origFindFirstFileA));
400-
401- MH_CreateHookApi (L" kernel32" , " LoadLibraryW" ,
402- reinterpret_cast <LPVOID >(HookLoadLibraryW),
403- reinterpret_cast <LPVOID *>(&g_origLoadLibraryW));
404-
405- MH_CreateHookApi (L" kernel32" , " LoadLibraryA" ,
406- reinterpret_cast <LPVOID >(HookLoadLibraryA),
407- reinterpret_cast <LPVOID *>(&g_origLoadLibraryA));
408-
409- MH_CreateHookApi (L" kernel32" , " LoadLibraryExW" ,
410- reinterpret_cast <LPVOID >(HookLoadLibraryExW),
411- reinterpret_cast <LPVOID *>(&g_origLoadLibraryExW));
412-
413- MH_CreateHookApi (L" kernel32" , " LoadLibraryExA" ,
414- reinterpret_cast <LPVOID >(HookLoadLibraryExA),
415- reinterpret_cast <LPVOID *>(&g_origLoadLibraryExA));
400+ LogHookInit (L" kernel32" , " CreateFileW" ,
401+ MH_CreateHookApi (L" kernel32" , " CreateFileW" ,
402+ reinterpret_cast <LPVOID >(HookCreateFileW),
403+ reinterpret_cast <LPVOID *>(&g_origCreateFileW)));
404+
405+ LogHookInit (L" kernel32" , " CreateFileA" ,
406+ MH_CreateHookApi (L" kernel32" , " CreateFileA" ,
407+ reinterpret_cast <LPVOID >(HookCreateFileA),
408+ reinterpret_cast <LPVOID *>(&g_origCreateFileA)));
409+
410+ LogHookInit (L" kernel32" , " GetFileAttributesW" ,
411+ MH_CreateHookApi (L" kernel32" , " GetFileAttributesW" ,
412+ reinterpret_cast <LPVOID >(HookGetFileAttributesW),
413+ reinterpret_cast <LPVOID *>(&g_origGetFileAttributesW)));
414+
415+ LogHookInit (L" kernel32" , " GetFileAttributesA" ,
416+ MH_CreateHookApi (L" kernel32" , " GetFileAttributesA" ,
417+ reinterpret_cast <LPVOID >(HookGetFileAttributesA),
418+ reinterpret_cast <LPVOID *>(&g_origGetFileAttributesA)));
419+
420+ LogHookInit (L" kernel32" , " FindFirstFileW" ,
421+ MH_CreateHookApi (L" kernel32" , " FindFirstFileW" ,
422+ reinterpret_cast <LPVOID >(HookFindFirstFileW),
423+ reinterpret_cast <LPVOID *>(&g_origFindFirstFileW)));
424+
425+ LogHookInit (L" kernel32" , " FindFirstFileA" ,
426+ MH_CreateHookApi (L" kernel32" , " FindFirstFileA" ,
427+ reinterpret_cast <LPVOID >(HookFindFirstFileA),
428+ reinterpret_cast <LPVOID *>(&g_origFindFirstFileA)));
429+
430+ LogHookInit (L" kernel32" , " LoadLibraryW" ,
431+ MH_CreateHookApi (L" kernel32" , " LoadLibraryW" ,
432+ reinterpret_cast <LPVOID >(HookLoadLibraryW),
433+ reinterpret_cast <LPVOID *>(&g_origLoadLibraryW)));
434+
435+ LogHookInit (L" kernel32" , " LoadLibraryA" ,
436+ MH_CreateHookApi (L" kernel32" , " LoadLibraryA" ,
437+ reinterpret_cast <LPVOID >(HookLoadLibraryA),
438+ reinterpret_cast <LPVOID *>(&g_origLoadLibraryA)));
439+
440+ LogHookInit (L" kernel32" , " LoadLibraryExW" ,
441+ MH_CreateHookApi (L" kernel32" , " LoadLibraryExW" ,
442+ reinterpret_cast <LPVOID >(HookLoadLibraryExW),
443+ reinterpret_cast <LPVOID *>(&g_origLoadLibraryExW)));
444+
445+ LogHookInit (L" kernel32" , " LoadLibraryExA" ,
446+ MH_CreateHookApi (L" kernel32" , " LoadLibraryExA" ,
447+ reinterpret_cast <LPVOID >(HookLoadLibraryExA),
448+ reinterpret_cast <LPVOID *>(&g_origLoadLibraryExA)));
416449}
0 commit comments