Каждая из этих библиотек спускаясь на уровень ниже обращается к функции closesocket я в свою очередь хукаю эту функу и в обработчике выставляю для сокета опцию SO_LINGER .... далее передаю управление в настоящую функцию .... closesocket Проблема вот в чем ..... с юзанием libmysql ни какого эффекта ваще нет .... соединения переходят в TIME_WAIT ... с юзанием odbc прога ваще падает ...... падает на вызове функции SQLDriverConnect(hdbc, 0, (unsigned char*)szDsn,SQL_NTS, (unsigned char *)buffer, 256, NULL, SQL_DRIVER_NOPROMPT); // причем buffer забиваетсо до конца пока прога не вылетит ...... а чичаз дам часть кода .... Код (Text): //======================== hook.cpp ============================ int global_addr; void _declspec(naked) closesocket_hook(SOCKET s){ SOCKET sock; _asm{ mov ecx ,[esp+4] mov sock ,ecx } int esi_p; _asm{ mov esi_p,esi } struct linger l ; l.l_linger= 0; l.l_onoff=1; //MessageBox(0,"HookProc",0,0); setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char *)&l, sizeof(struct linger)); _asm{ mov esi,esi_p MOV EDI,EDI PUSH EBP MOV EBP,ESP jmp global_addr } }; struct inject{ char call; char addr4; char addr3; char addr2; char addr1; } ; union address{ int addr; struct bytes { char addr4; char addr3; char addr2; char addr1; } bit; }; void hook(){ // при инициализации вызываю эту функу .......... inject *inj; address un_addr; HMODULE ws; FARPROC addr; //JMPValue := DWORD (NewProcAddress) - DWORD (ProcAddress) - 5; ws=LoadLibrary("ws2_32.dll"); addr=GetProcAddress(ws,"closesocket"); global_addr=(int)addr; global_addr+=5; unsigned long OldProtect; inj=(struct inject *)addr; VirtualProtect(addr,10,PAGE_EXECUTE_READWRITE,&OldProtect); inj->call=0xe9; un_addr.addr=(int)closesocket_hook-int(addr)-5; inj->addr4=un_addr.bit.addr4; inj->addr3=un_addr.bit.addr3; inj->addr2=un_addr.bit.addr2; inj->addr1=un_addr.bit.addr1; VirtualProtect(addr,10,OldProtect,&OldProtect); } //======================= mysql.cpp =========================== void ThreadProcMySql(HANDLE * hthr){ char sPass[1000]; char sHost[3000]; char sLogin[3000]; char sPort[100]; unsigned long lpn; strcpy(sHost,szGHostMySql); strcpy(sLogin,szGLoginMySql); strcpy(sPass,szGPassMySql); HANDLE ht=*hthr; MysqlFlag=0; MYSQL mysql; mysql.reconnect = true; // mysql.options.connect_timeout=global_time_out_my; int llen=strlen(sHost); for(int i=0;i<llen;i++) if(*(sHost+i)==':' && i!=llen-1){ *(sHost+i)=0; strcpy(sPort,sHost+i+1); break; } int port=atoi(sPort); if(port!=0) mysql.options.port=port; mysql_init(&mysql); if (!(mysql_connect(&mysql,sHost,sLogin,sPass))){ BadMySql++; SetDlgItemInt(g_hwnds,IDC_STATIC_IN_PROVERKA,GlobalThreadIDMySql,0); SetDlgItemInt(g_hwnds,IDC_STATIC_BAD,BadMySql,0); mysql_close(&mysql); GlobalThreadIDMySql--; CloseHandle(ht); return ; } else { GoodMySql++; WriteFile(hFileGlobalMySql,sHost,strlen(sHost),&lpn,0); WriteFile(hFileGlobalMySql,":",1,&lpn,0); WriteFile(hFileGlobalMySql,sLogin,strlen(sLogin),&lpn,0); WriteFile(hFileGlobalMySql,":",1,&lpn,0); WriteFile(hFileGlobalMySql,sPass,strlen(sPass),&lpn,0); WriteFile(hFileGlobalMySql,"\n",1,&lpn,0); mysql_close(&mysql); SetDlgItemInt(g_hwnds,IDC_STATIC_IN_PROVERKA,GlobalThreadIDMySql,0); SetDlgItemInt(g_hwnds,IDC_STATIC_GOOD,GoodMySql,0); GlobalThreadIDMySql--; CloseHandle(ht); return ; } } bool MySqlConnect(char* sHost,char * sLogin,char * sPass){ if(strlen(sHost)>300)strncpy(szGHostMySql,sHost,300); else strcpy(szGHostMySql,sHost); if(strlen(sLogin)>300)strncpy(szGLoginMySql,sLogin,300); else strcpy(szGLoginMySql,sLogin); if(strlen(sPass)>300)strncpy(szGPassMySql,sPass,300); else strcpy(szGPassMySql,sPass); filtr(sHost); filtr(sLogin); filtr(sPass); while(kolvo_thr_my<=GlobalThreadIDMySql)Sleep(1); MysqlFlag=1; GlobalThreadIDMySql++; SetDlgItemInt(g_hwnds,IDC_STATIC_IN_PROVERKA,GlobalThreadIDMySql,0); SetDlgItemInt(g_hwnds,IDC_STATIC_PROVERENO,GetDlgItemInt(g_hwnds,IDC_STATIC_PROVERENO,0,0)+1,0); unsigned long ThreadID=(unsigned long)GlobalThreadIDMySql; ht_mysql=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ThreadProcMySql ,&ht_mysql,0,&ThreadID); while(MysqlFlag==1)Sleep(1); return true; } //======================== mssql ======================== void ThreadProcMsSql(HANDLE *hthr){ unsigned long lpn; char sPass[1000]=""; char sHost[3000]=""; char sLogin[3000]=""; char sPort[100]=""; char temp[100]; strcpy(sHost,szGHostMsSql); strcpy(sLogin,szGLoginMsSql); strcpy(sPass,szGPassMsSql); HANDLE ht=*hthr; MsSqlFlag=0; int llen=strlen(sHost); for(int i=0;i<llen;i++) if(*(sHost+i)==':' && i!=llen-1){ *(sHost+i)=0; strcpy(sPort,sHost+i+1); break; } int port=atoi(sPort); if(port==0)port=1433; RETCODE rcode, rcodeinfo; SQLHENV henv; SQLHDBC hdbc; char szDsn[1000],buffer[2000]=""; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,&henv); SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER); sprintf(szDsn,"Driver={SQL Server};server=%s;port=%i;connect timeout=%i;uid=%s;pwd=%s",sHost,port,global_time_out_ms,sLogin,sPass); rcode = SQLDriverConnect(hdbc, 0, (unsigned char*)szDsn, SQL_NTS, (unsigned char *)buffer, 256, NULL, SQL_DRIVER_NOPROMPT); if (rcode !=SQL_SUCCESS && rcode != SQL_SUCCESS_WITH_INFO){ BadMsSql++; SetDlgItemInt(g_hwndthree,IDC_STATIC_BAD,BadMsSql,0); SetDlgItemInt(g_hwndthree,IDC_STATIC_IN_PROVERKA,GlobalThreadIDMsSql,0); } else { GoodMsSql++; WriteFile(hFileGlobalFtp,sHost,strlen(sHost),&lpn,0); WriteFile(hFileGlobalFtp,":",1,&lpn,0); WriteFile(hFileGlobalFtp,sLogin,strlen(sLogin),&lpn,0); WriteFile(hFileGlobalFtp,":",1,&lpn,0); WriteFile(hFileGlobalFtp,sPass,strlen(sPass),&lpn,0); WriteFile(hFileGlobalFtp,"\n",1,&lpn,0); SetDlgItemInt(g_hwndthree,IDC_STATIC_GOOD,GoodMsSql,0); SetDlgItemInt(g_hwndthree,IDC_STATIC_IN_PROVERKA,GlobalThreadIDMsSql,0); } SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); if (henv != NULL){ SQLFreeHandle(SQL_HANDLE_ENV, henv); } GlobalThreadIDMsSql=GlobalThreadIDMsSql-1; CloseHandle(ht); return ; } заранее всем признателен !