хорошая реализация)
только огорчает что все пытаются потоком поймать момент загрузки библиотеки
когда правильней было бы перехватить LdrLoadDll и уже после подгрузки библиотеки получать ее интерфейс
что-то вроде этого:
NTSTATUS NTAPI myLdrLoadDll(PWCHAR PathToFile, ULONG Flags, PUNICODE_STRING ModuleFileName, PHANDLE ModuleHandle)
{
NTSTATUS nResult = orgLdrLoadDll(PathToFile, Flags, ModuleFileName, ModuleHandle);
WCHAR LibPath[MAX_PATH*2] = L"";
GetModuleFileNameW((HMODULE)*ModuleHandle, LibPath, MAX_PATH*2);
_wcslwr(LibPath);
if(wcsstr(LibPath, L"client.dll"))
{
static BOOL bGetClient = FALSE;
if(!bGetClient)
{
orgCDLL_CreateInterface = (CreateInterfaceFn)GetProcAddress((HMODULE)*ModuleHandle, "CreateInterface");
clientdll = (IBaseClientDLL *)orgCDLL_CreateInterface(CLIENT_DLL_INTERFACE_VERSION, NULL);
...