Вопрос по LSP и Winsock2 SPI

Тема в разделе "WASM.WIN32", создана пользователем perdimonokl, 2 окт 2008.

  1. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Народ вот хотел сделать маленький сниффер входещиго и исходящего трафа и столкнулся с проблемкой одной. Дрова писать не буду =) Даж не предлагайте, ненене =)
    Вот и решил сделать LSP дллку чтобы снифать траф. Смылс то я понимаю, нужно просто сделать обработчик функции той с которой мы хотим играться и поместить этот обработчик в таблицу WSPPROC_TABLE и сделать WSPStartup.
    Но вот какая проблема то. Я делал по всякому и в DllMain вызывал WSPStartup и компилил сорцы которые находил в инете и ничерта не работает. Я абсолютно не понимаю принцип построяния дллки,а доков очень мало а примеры из MSDN не просто лажовые а очень лажовые =( Доков в MSDN тоже очень мало на тему Winsock SPI и LSP. Во всех найденных сорцах я наблюдал примерно одинаковый код:

    Код (Text):
    1. BOOL WINAPI DllMain(HINSTANCE hmodule,
    2.                                         DWORD reason,
    3.                                         LPVOID lpreserved)
    4. {
    5.         TCHAR processname[MAX_PATH];
    6.         TCHAR showmessage[MAX_PATH+25];
    7.  
    8.  
    9.         if(reason==DLL_PROCESS_ATTACH)
    10.         {
    11.                 GetModuleFileName(NULL,processname,MAX_PATH);
    12.                 wcscpy_s(showmessage,processname);
    13.                 wcscpy_s(showmessage,_T(" Loading DisneyLANDFilter ..."));
    14.                 OutputDebugString(showmessage);
    15.         }
    16.         return TRUE;
    17. }
    И DllMain завершит работу, а WSPStartup с таблицей вызовоd идет всегда нижею Ни один из сорцов не работал у меня или я не правильно регистрировал дллку просто. Не могу понять принцип построения как правильно сделать дллку и правильно её зарегистрировать как LSP именно так чтобы все работало потому, что тупо во всех примерах WSPStartup идет внизу DllMain и даже если в DllMain создается тред то в функции для которой создается тред нету WSPStartup =(

    Короче народ тот кто сталкивался с проблемой разработки LSP или уже тестировал готовые сорцы ну или у кого получится сделать так чтобы сорцы работали то просто расскажите тогда как регать дллку правильно и как вообще вы все делали. Сижу уже 3-ий день и абсолютно не могу понять как сделать. Доков перечитал все что находил и всезде пишут практически одно и тоже. Короче не наставил они меня на путь истинный =)
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    perdimonokl
    Я абсолютно не понимаю принцип построяния дллки
    Читай Рихтера "Создание эффективных Win32-приложений ...", про динамические библиотеки часть IV.

    DllMain завершит работу, а WSPStartup с таблицей вызовоd идет всегда ниже ... и даже если в DllMain создается тред то в функции для которой создается тред нету WSPStartup
    Afaik, то, что ты смотрел - это код собственно провайдера.

    кто ... тестировал готовые сорцы
    Примерно год назад я смотрел lspSample.zip. Там есть проект, который умеет регистрировать/удалять dll'ку провайдера. Помню, что для компиляции в vc2005express, пришлось что-то править.
     
  3. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
  4. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Уфф да знаю я как дллки строить я имел ввиду что не понимаю как построить её именно для LSP.

    Тот lspSample я видел и не раз. Тоже самое в нем вот прям отрывок оттуда:
    Код (Text):
    1. BOOL WINAPI
    2. DllMain(
    3.         IN HINSTANCE hinstDll,
    4.         IN DWORD dwReason,
    5.         LPVOID lpvReserved
    6.        )
    7. {
    8.     UNREFERENCED_PARAMETER( hinstDll );
    9.     UNREFERENCED_PARAMETER( lpvReserved );
    10.  
    11.     switch (dwReason)
    12.     {
    13.  
    14.         case DLL_PROCESS_ATTACH:
    15.             //
    16.             // Initialize some critical section objects
    17.             //
    18.             __try
    19.             {
    20.                 InitializeCriticalSection( &gCriticalSection );
    21.                 InitializeCriticalSection( &gDebugCritSec );
    22.             }
    23.             __except( EXCEPTION_EXECUTE_HANDLER )
    24.             {
    25.                 goto cleanup;
    26.             }
    27.             break;
    28.  
    29.         case DLL_THREAD_ATTACH:
    30.             break;
    31.  
    32.         case DLL_THREAD_DETACH:
    33.             break;
    34.  
    35.         case DLL_PROCESS_DETACH:
    36.             gDetached = TRUE;
    37.  
    38.             EnterCriticalSection( &gCriticalSection );
    39.             if ( NULL != gLayerInfo )
    40.             {
    41.                 int Error;
    42.  
    43.                 // Free LSP structures if still present as well as call WSPCleanup
    44.                 //    for all providers this LSP loaded
    45.                 FreeLspProviders( gLayerInfo, gLayerCount, &Error );
    46.                 gLayerInfo = NULL;
    47.                 gLayerCount = 0;
    48.             }
    49.             LeaveCriticalSection( &gCriticalSection );
    50.  
    51.             DeleteCriticalSection( &gCriticalSection );
    52.             DeleteCriticalSection( &gDebugCritSec );
    53.  
    54.             break;
    55.     }
    56.  
    57.     return TRUE;
    58.  
    59. cleanup:
    60.  
    61.     return FALSE;
    62. }
    И опять WSPStartup за пределами DllMain. В чем прикол то может кто то расскажет уже я не могу найти как строить дллки правильно для LSP. =\
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    perdimonokl
    И опять WSPStartup за пределами DllMain ...вот прям отрывок оттуда
    Повторяю еще раз: "то, что ты смотрел - это код собственно провайдера".

    Тот lspSample я видел и не раз.
    А "проект, который умеет регистрировать/удалять dll'ку провайдера" видел?

    чем прикол то
    В том, что там три проекта, два провайдера и инсталлер/анинсталлер.
     
  6. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    To q_q: Что значит собственного провайдера o0 Какая разница будет он как ты говоришь собственный или нет. В dllmain то ничего все равно нет ну возьму я другой код или еще третий какой то, там тоже самое и везде WSPStartup за пределами DllMain. Да и все эти бинарники которые дллки регистрируют я собирал и ими ставил, просто дллка не понимаю как должна правильно тогда работать. Может я и туплю но я не могу просто понять почему везде WSPStartup за DllMain. Если так и должно быть то покажить хоть рабочий пример. Может и те которые я смотрел были рабочие просто я не правльно или не там смотрел =(
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    perdimonokl
    почему везде WSPStartup за DllMain
    Провайдер - это dll'ка, которую грузит (LoadLibrary) и инициализирует (pWSPStartup = GetProcAddres(..., "WSPStartup") ... pWSPStartup(...)) либо ws2_32.dll, либо другой провайдер в зависимости от позиции твоей dll'ки в цепОчке провайдеров.

    покажить хоть рабочий пример
    Мне надо вспомнить, что было год назад, поэтому пример будет гораздо позже.


    [offtop]
    Что значит собственного провайдера o0 Какая разница будет он как ты говоришь собственный или нет
    Я использовал слово "собственно", как частицу. Его значение, согласно толкового словаря - "в буквальном смысле слова, непосредственно, именно, только", т.е. моя фраза означает "то, что ты смотрел - это код только провайдера".
    [/offtop]
     
  8. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    To q_q: Хорошо я подожду примера твоего и не буду тупить в сотый раз =)