Народ вот хотел сделать маленький сниффер входещиго и исходящего трафа и столкнулся с проблемкой одной. Дрова писать не буду =) Даж не предлагайте, ненене =) Вот и решил сделать LSP дллку чтобы снифать траф. Смылс то я понимаю, нужно просто сделать обработчик функции той с которой мы хотим играться и поместить этот обработчик в таблицу WSPPROC_TABLE и сделать WSPStartup. Но вот какая проблема то. Я делал по всякому и в DllMain вызывал WSPStartup и компилил сорцы которые находил в инете и ничерта не работает. Я абсолютно не понимаю принцип построяния дллки,а доков очень мало а примеры из MSDN не просто лажовые а очень лажовые =( Доков в MSDN тоже очень мало на тему Winsock SPI и LSP. Во всех найденных сорцах я наблюдал примерно одинаковый код: Код (Text): BOOL WINAPI DllMain(HINSTANCE hmodule, DWORD reason, LPVOID lpreserved) { TCHAR processname[MAX_PATH]; TCHAR showmessage[MAX_PATH+25]; if(reason==DLL_PROCESS_ATTACH) { GetModuleFileName(NULL,processname,MAX_PATH); wcscpy_s(showmessage,processname); wcscpy_s(showmessage,_T(" Loading DisneyLANDFilter ...")); OutputDebugString(showmessage); } return TRUE; } И DllMain завершит работу, а WSPStartup с таблицей вызовоd идет всегда нижею Ни один из сорцов не работал у меня или я не правильно регистрировал дллку просто. Не могу понять принцип построения как правильно сделать дллку и правильно её зарегистрировать как LSP именно так чтобы все работало потому, что тупо во всех примерах WSPStartup идет внизу DllMain и даже если в DllMain создается тред то в функции для которой создается тред нету WSPStartup =( Короче народ тот кто сталкивался с проблемой разработки LSP или уже тестировал готовые сорцы ну или у кого получится сделать так чтобы сорцы работали то просто расскажите тогда как регать дллку правильно и как вообще вы все делали. Сижу уже 3-ий день и абсолютно не могу понять как сделать. Доков перечитал все что находил и всезде пишут практически одно и тоже. Короче не наставил они меня на путь истинный =)
perdimonokl Я абсолютно не понимаю принцип построяния дллки Читай Рихтера "Создание эффективных Win32-приложений ...", про динамические библиотеки часть IV. DllMain завершит работу, а WSPStartup с таблицей вызовоd идет всегда ниже ... и даже если в DllMain создается тред то в функции для которой создается тред нету WSPStartup Afaik, то, что ты смотрел - это код собственно провайдера. кто ... тестировал готовые сорцы Примерно год назад я смотрел lspSample.zip. Там есть проект, который умеет регистрировать/удалять dll'ку провайдера. Помню, что для компиляции в vc2005express, пришлось что-то править.
Уфф да знаю я как дллки строить я имел ввиду что не понимаю как построить её именно для LSP. Тот lspSample я видел и не раз. Тоже самое в нем вот прям отрывок оттуда: Код (Text): BOOL WINAPI DllMain( IN HINSTANCE hinstDll, IN DWORD dwReason, LPVOID lpvReserved ) { UNREFERENCED_PARAMETER( hinstDll ); UNREFERENCED_PARAMETER( lpvReserved ); switch (dwReason) { case DLL_PROCESS_ATTACH: // // Initialize some critical section objects // __try { InitializeCriticalSection( &gCriticalSection ); InitializeCriticalSection( &gDebugCritSec ); } __except( EXCEPTION_EXECUTE_HANDLER ) { goto cleanup; } break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: gDetached = TRUE; EnterCriticalSection( &gCriticalSection ); if ( NULL != gLayerInfo ) { int Error; // Free LSP structures if still present as well as call WSPCleanup // for all providers this LSP loaded FreeLspProviders( gLayerInfo, gLayerCount, &Error ); gLayerInfo = NULL; gLayerCount = 0; } LeaveCriticalSection( &gCriticalSection ); DeleteCriticalSection( &gCriticalSection ); DeleteCriticalSection( &gDebugCritSec ); break; } return TRUE; cleanup: return FALSE; } И опять WSPStartup за пределами DllMain. В чем прикол то может кто то расскажет уже я не могу найти как строить дллки правильно для LSP. =\
perdimonokl И опять WSPStartup за пределами DllMain ...вот прям отрывок оттуда Повторяю еще раз: "то, что ты смотрел - это код собственно провайдера". Тот lspSample я видел и не раз. А "проект, который умеет регистрировать/удалять dll'ку провайдера" видел? чем прикол то В том, что там три проекта, два провайдера и инсталлер/анинсталлер.
To q_q: Что значит собственного провайдера o0 Какая разница будет он как ты говоришь собственный или нет. В dllmain то ничего все равно нет ну возьму я другой код или еще третий какой то, там тоже самое и везде WSPStartup за пределами DllMain. Да и все эти бинарники которые дллки регистрируют я собирал и ими ставил, просто дллка не понимаю как должна правильно тогда работать. Может я и туплю но я не могу просто понять почему везде WSPStartup за DllMain. Если так и должно быть то покажить хоть рабочий пример. Может и те которые я смотрел были рабочие просто я не правльно или не там смотрел =(
perdimonokl почему везде WSPStartup за DllMain Провайдер - это dll'ка, которую грузит (LoadLibrary) и инициализирует (pWSPStartup = GetProcAddres(..., "WSPStartup") ... pWSPStartup(...)) либо ws2_32.dll, либо другой провайдер в зависимости от позиции твоей dll'ки в цепОчке провайдеров. покажить хоть рабочий пример Мне надо вспомнить, что было год назад, поэтому пример будет гораздо позже. [offtop] Что значит собственного провайдера o0 Какая разница будет он как ты говоришь собственный или нет Я использовал слово "собственно", как частицу. Его значение, согласно толкового словаря - "в буквальном смысле слова, непосредственно, именно, только", т.е. моя фраза означает "то, что ты смотрел - это код только провайдера". [/offtop]