В общем, написал LSP DLL-ку. Если кто не знает, это сервис-провайдер; все приложения, которые вызывают функции WinSock API загружают эту DLL-ку, вызывают соответствующие функции winsock, переопределенные в этой библиотеке. Эти функции выполнят скажем фильтрацию потоков данных передающихся через сокеты, и передают управление нижележащим провайдерам и так далее. И у меня есть программа написана с использованием...ну скажем MFC, в которой я вообще хочу видеть все что записано в файл log.txt.
Мне необходимо вести лог всех подключений. Что я делаю. В функции DllMain я делаю вот что :
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
HDllInstance = hinstDll;
InitializeCriticalSection(&gCriticalSection);
InitOverlappedCS();
hLog=CreateFile(_T("c:\\log.txt"),GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,0,NULL);
if (hLog==INVALID_HANDLE_VALUE){
MessageBox(NULL,_T("Error creating log file !"),_T("lsp.dll"),MB_OK);
return FALSE;
}
SetFilePointer(hLog,0,NULL,FILE_END);
WriteMess("Lsp.dll loaded",NULL);
hMutex=CreateMutex(NULL,false,"MyMutex");
if (hMutex==NULL){
MessageBox(NULL,_T("Error creating mutex object !"),_T("Error"),MB_OK);
return FALSE;
}
hCallEvent=CreateEvent(NULL,false,false,_T("CallEvent"));
if (hCallEvent==NULL) {
WriteMess("Error in creating event!",NULL);
}
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
WriteMess("Lsp.dll unloaded",NULL);
CloseHandle(hLog);
CloseHandle(hMutex);
break;
}
return TRUE;
Показываю для ясности функцию WriteMess :
void WriteMess(char *szText,struct sockaddr *addr){
TLog sl; // кое-какая структура для записи в файл
if (addr!=NULL){
struct sockaddr_in *addr_in=(struct sockaddr_in*)addr;
sl.ip=addr_in->sin_addr.s_addr;
sl.port=ntohs(addr_in->sin_port);
}
else{
sl.ip=0;
sl.port=0;
}
if (szText!=NULL)
strcpy(sl.szMessage,szText);
GetLocalTime(&sl.t);
TCHAR szBuffer[MAX_PATH];
GetExeName(szBuffer); // эта функция возвращает имя модуля, который загрузил эту DLL
sprintf(sl.szExe,"%S",szBuffer);
DWORD size=sizeof(sl);
DWORD nWritten;
DWORD res=WaitForSingleObject(hMutex,INFINITE);// для эксклюзивного доступа к файлу лога
if (res==WAIT_OBJECT_0 || res==WAIT_ABANDONED){
WriteFile(hLog,&sl,size,&nWritten,NULL);
FlushFileBuffers(hLog);
ReleaseMutex(hMutex);
}
}
Я ранее создавал событие в этой же DllMain и тогда после записи в файл лога определенной инфы, устанавливал это событие в сигнальное состояние. В программе, которая показывает лог был запущен поток, в котором делалось вот что :
DWORD WINAPI fnEventFunc(LPVOID pParam){
DWORD res;
Reset=FALSE;
while (!Reset){
res=WaitForSingleObject(hEventCall,TIME_OUT);
if (res==WAIT_OBJECT_0)
FillLog(NULL); // здесь заполняется список из файла log.txt
}
return 0;
}
И вот ребята, уважаемые коллеги, эти то ли события, то ли мьютексы (ИМЕНОВАННЫЕ!) просто напросто не хотят создаваться. Кажется первый мьютекс создается, а остальные не хотят ни в самой DllMain ни в моей этой программе которая показывает лог. По ошибке я определил, что ОТКАЗАНО В ДОСТУПЕ. Что получается ? Что если нельзя создавать несколько именованных объектов синхронизации ? И самое интересное, что я это все тестировал на иных программах, не LSP. Там эта техника работает без проблем. Может быть проблема в том что много этих мьютексов создается, что ли ? Но я пытался вести запись в файл с помощью LockFileEx , какие глюки начались вообще не записывалось ничего.
Кто с этим сталкивался, помогите пожалуйста, не знаю просто что делать.