LRESULT CALLBACK SharedSocketDataReceiverWndProc(HWND wnd,UINT message,WPARAM wp,LPARAM lp) { switch (message) { case WM_SHARED_SOCKET_EVENT: { switch (WSAGETSELECTEVENT(lp)) { case FD_READ: { SOCKET data_socket=(SOCKET)wp; char type; DWORD length; PBYTE data=RecvTLVData(data_socket,&type,&length); if(data) { gSharedSocketDataReceiver(data_socket,type,length,data); }else{ //msg("Got Error on Socket\n"); } //WSAAsyncSelect: READ|CLOSE if (WSAAsyncSelect(data_socket , wnd, WM_SHARED_SOCKET_EVENT, FD_READ|FD_CLOSE ) == SOCKET_ERROR) { /* print_function("failed to async select client %d, %x data_socket=%d, message_window=%x\n", data_socket, WSAGetLastError(), data_socket, message_window); */ } } break; case FD_CLOSE: closesocket((SOCKET)wp); break; } } break; default: return DefWindowProc(wnd, message, wp, lp); } return 0; }
DWORD DarunGrim::IDACommandProcessor() { SOCKET SocketArray[WSA_MAXIMUM_WAIT_EVENTS]; WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS]; WSANETWORKEVENTS NetworkEvents; DWORD EventTotal = 0, index; SocketArray[0] = pSourceController->GetSocket(); SocketArray[1] = pTargetController->GetSocket(); for (int i = 0; i<2; i++) { WSAEVENT NewEvent = WSACreateEvent(); WSAEventSelect(SocketArray[i], NewEvent, FD_READ | FD_CLOSE); EventArray[EventTotal] = NewEvent; EventTotal++; } while (1) { index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, FALSE); if (index<0) break; index = index - WSA_WAIT_EVENT_0; //------------------------- // Iterate through all events and enumerate // if the wait does not fail. for (DWORD i = index; i<EventTotal; i++) { if (SocketArray[i] == WSA_INVALID_HANDLE) continue; index = WSAWaitForMultipleEvents(1, &EventArray[i], TRUE, 1000, FALSE); if ((index != WSA_WAIT_FAILED) && (index != WSA_WAIT_TIMEOUT)) { if (WSAEnumNetworkEvents(SocketArray[i], EventArray[i], &NetworkEvents) == 0) { Logger.Log(10, "Signal( %d - %d )\n", i, NetworkEvents.lNetworkEvents); if (NetworkEvents.lNetworkEvents == FD_READ) { char buffer[DATA_BUFSIZE] = { 0, }; WSABUF DataBuf; DataBuf.len = DATA_BUFSIZE; DataBuf.buf = buffer; /* DWORD RecvBytes; DWORD Flags=0; if ( WSARecv( SocketArray[i], &DataBuf, 1, &RecvBytes, &Flags, NULL, NULL )==SOCKET_ERROR ) { Logger.Log( 10, "Error occurred at WSARecv()\n" ); }else { Logger.Log( 10, "Read %d bytes\n", RecvBytes ); }*/ char type; DWORD length; PBYTE data = RecvTLVData(SocketArray[i], &type, &length); if (data) { Logger.Log(10, "%s: Type: %d Length: %d data:%x\n", __FUNCTION__, type, length, data); if (type == SHOW_MATCH_ADDR && length >= 4) { DWORD address = *(DWORD *)data; Logger.Log(10, "%s: Showing address=%x\n", __FUNCTION__, address); //Get Matching Address DWORD MatchingAddress = 0; if (pDiffMachine) { MatchingAddress = pDiffMachine->GetMatchAddr(i, address); } if (MatchingAddress != 0) { //Show using JUMP_TO_ADDR if (i == 0) { pTargetController->ShowAddress(MatchingAddress); } else { pSourceController->ShowAddress(MatchingAddress); } } } } } else if (NetworkEvents.lNetworkEvents == FD_CLOSE) { closesocket(SocketArray[i]); WSACloseEvent(EventArray[i]); memcpy(SocketArray + i, SocketArray + i + 1, EventTotal - i + 1); memcpy(EventArray + i, EventArray + i + 1, EventTotal - i + 1); EventTotal--; break; } } } } } return 1; }