Re[6]: LSP , нужна помощь
От: wertyman  
Дата: 29.02.08 09:28
Оценка:
Здравствуйте, TarasCo, Вы писали:

W>>А что есть разница, если я сам вызову у себя WSPCleanup и откуда то из другой части программы вызовут ?


TC>большая разница. WSPCleanup вызывается когда Ваш провайдер больше не нужен, когда больше никто не использует его ресурсы ( сокеты и.т.д )


Ну так, на примере браузера смотрим
Инсталим провайдера, делаем пару кликов, весь траф через наш провайдер прошел.. Делаем унистал, делаем клик и провайдер сразу же выгружается.
Хотя бывает, что если долго работать, она уже просто так не выгружается. Скорее всего, потому что остается открытый сокет, на прослушку например.

W>>А если все сокеты самому закрыть, вызов произойдет сразу же или же опять ждать ?


TC>А как Вы собираетесь самостоятельно закрыть сокеты?


TC>Вы себя утопией тешите. Корректно выгрузить LSP фильтр на лету не получится. Я вообще сомневаюсь, что получится выгрузить не дожидаясь остановки приложения.


Ну уже немного получилось:


LPWSPPROC_TABLE     lpMyProcTable = NULL, lpNextProcTable = NULL;

int WSPAPI 
WSPStartup(
    WORD                wVersion,
    LPWSPDATA           lpWSPData,
    LPWSAPROTOCOL_INFOW lpProtocolInfo,
    WSPUPCALLTABLE      UpCallTable,
    LPWSPPROC_TABLE     lpProcTable
    )
{
// ..........
    lpNextProcTable = &loadProvider->NextProcTable;
    lpMyProcTable   = lpProcTable;
// ..........
}

        case DLL_PROCESS_DETACH:
            gDetached = TRUE;                        

            EnterCriticalSection( &gCriticalSection );

            if ( NULL != gLayerInfo ) {
                int Error;
            
                FreeLspProviders( gLayerInfo, gLayerCount, &Error );
                gLayerInfo = NULL;
                gLayerCount = 0;
        *lpMyProcTable = *lpNextProcTable;
            }


программа уже не валится. и продолжает работать хорошо. только в случае, если идет работа с сокетами и одновременно выгрузка, проблемы начинаются ессно. Думаю теперь как лучше сделать ? Дергать мьютекс в каждой функции и потом ожидать освобождение его в потоке выгрузки ?

з.ы. я знаю, как это выглядит, но не судите строго, таково ТЗ проекта и нужно очень постараться это сделать..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.