Здравствуйте. Пытаюсь написать свою библиотеку, которая будет получать нужные мне данные и вызвать оригинальные функции из оригинальной библиотеки. После замены HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Authentication Packages с msv1_0 на murzik msv1_0 и добавления murzik в список HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages Моя murzik.dll падает, вылезает окошко что lsa плохо, и что через миниту винда пойдет на перезагрузку. Возможно я в принципе не верно подошел к задаче, но: пишу длл на c, собираю mingw, написав маленький makefile all: gcc -c main.c -o murzik.o dllwrap -k --dllname murzik.dll --def main.def --output-lib murzik.lib murzik.o strip murzik.dll В самой либе: в DllMain загружаю родную либу hLib = LoadLibrary ("c:/windows/system32/msv1_0.dll"); Получаю адреса родных функций lacp = (LACP) GetProcAddress (hLib, "LsaApCallPackage"); lacpp = (LACPP) GetProcAddress (hLib, "LsaApCallPackagePassthrough"); lacpu = (LACPU) GetProcAddress (hLib, "LsaApCallPackageUntrusted"); lap = (LAP) GetProcAddress (hLib, "LsaApInitializePackage"); lalt = (LALT) GetProcAddress (hLib, "LsaApLogonTerminated"); lalue2 = (LALUE2) GetProcAddress (hLib, "LsaApLogonUserEx2"); И вызываю их из своих. Может быть кто подскажет хотя бы куда копать. Добавил запись в лог, и после перезагрузки с родной либой в своем логе вижу: DLL_PROCESS_ATTACH LoadLibrary 77c60000 LsaApInitializePackage 0 DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH LsaApCallPackage 0 DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_DETACH DLL_THREAD_DETACH DLL_THREAD_ATTACH DLL_THREAD_DETACH DLL_THREAD_DETACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_DETACH LsaApLogonTerminated DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_ATTACH DLL_THREAD_DETACH Т.е. LsaApInitializePackage вызвается и даже возвращает NTSTATUS == 0 Исходинк в аттаче. Пните в правильном направлении.
Посмотри здесь: http://net.mpei.ru/lang/rus/faqw2kxp/jsifaq/rh8674.htm Меня смущает фраза The data value of the Authentication Packages Value Name should be msv1_0 Похоже фигню написал...
Не в данном случае имя не имеет значения. Если переименовать родную либу, и поменять имя в реестре, все работает. Моя со стандартным именем не пашет. Думаю может что-то надо делать в DllMain. При создании/удалении треда/процесса. Может надо вызвать родной DllMain для каждого треда.
Смотрел В родной нет DllMain. А в msdn написано что надо реализовать в своей 6 функций и радоваться жизни. Только вот сделать заглушки пока не получается.
Эх был бы рабочий пример.... Сейчас просто попробую тупым способом, типа моя бибилотека грузит оригинальную, ищет адрес функци вызвает ее, выгружает либу. И так со всеми.
Daiver Дык, а сама msv1_0 разве рабочим примером не является? Для нее и pdb можно с мелкософта загрузить... Посмотрел на нее... Сплошной фарш. Тяжеловато воспринимается. А вот как выглядит ее стартапный код: Код (Text): int __stdcall start(HMODULE hLibModule, int Reason) { if (Reason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hLibModule); sub_77C648AE(); } return 1; } void __stdcall sub_77C648AE() { LARGE_INTEGER PerformanceCount; FILETIME SystemTimeAsFileTime; DWORD res; if (!dword_77C7D3C8 || dword_77C7D3C8 == 0xBB40) { GetSystemTimeAsFileTime(&SystemTimeAsFileTime); res = SystemTimeAsFileTime.dwHighDateTime ^ SystemTimeAsFileTime.dwLowDateTime; res ^= GetCurrentProcessId(); res ^= GetCurrentThreadId(); res ^= GetTickCount(); QueryPerformanceCounter(&PerformanceCount); res ^= PerformanceCount.LowDword; res ^= PerformanceCount.HighDword; res &= 0xFFFF; if (!res) res = 0xBB40; dword_77C7D3C8 = res; } dword_77C7D484 = !dword_77C7D3C8; }
Задача стоит как рез не трогать родную, не повротять ее реализацию. У меня есть ее сорцы. Задача как раз грузиться до, делать все что нужно, и если все должно идти своим чередом, отдавать управление родной, чтобы даже не зависеть от версии. Занимался другим. Завтра если времени хватит, добью хедер с внутренними кишками, да собиру и сообщу результаты.
Daiver Если я правильно понял - задача фильтровать даные при интерактивном входе, то можно так: 1. http://www.codeproject.com/w2k/LoginFilter.asp 2. Если фильтр для любого вида аутентификации - сплайсинг. Запиши переход на свои родымые функции, а после обработки - передавай вызов msv1_0.dll.