DWORD WINAPI InspectionManager(LPVOID lpParameter) { HANDLE hEvent = CreateEvent( NULL, FALSE, FALSE, EVENT_NAME ); ThreadObject* tpThreads[DRIVES]; for (int iIndex = 0; iIndex < DRIVES; iIndex++) tpThreads[iIndex] = NULL; DetectAlreadyConnectedDevices(tpThreads); try { int iOptionValue = 1; SocketObject* spSocketServer = new SocketObject(); spSocketServer->SetSockOpt(SOL_SOCKET, SO_REUSEADDR, (char*)&iOptionValue, sizeof(iOptionValue)); spSocketServer->Bind(IP, PORT); spSocketServer->Listen(BACKLOG); SetEvent(hEvent); SocketObject* spSocketClient = spSocketServer->Accept(); char szData[BUFFER]; bool bRunning = true; while (bRunning) { int iLength = spSocketClient->Recv(szData, BUFFER); szData[iLength] = '\0'; if (strstr(szData, IN_DRIVE) != NULL) { char cDrive = szData[strlen(IN_DRIVE)]; int iIndex = cDrive - 'A'; printf("%c:\\ will be watched\n", cDrive); tpThreads[iIndex] = new ThreadObject(Inspection, (LPVOID)cDrive); tpThreads[iIndex]->Start(); } else if (strstr(szData, OUT_DRIVE) != NULL) { char cDrive = szData[strlen(OUT_DRIVE)]; int iIndex = cDrive - 'A'; /* If the drive is already being watched by the ReadDirectoryChangesW function than stop watching it. */ if (tpThreads[iIndex] != NULL) { printf("%c:\\ will no longer be watched\n", cDrive); tpThreads[iIndex]->Kill(); delete tpThreads[iIndex]; tpThreads[iIndex] = NULL; } } else { spSocketClient->Close(); bRunning = false; } } } catch (SocketError& socketError) { printf("Main [%d] %s", socketError.GetErrorCode(), socketError.ErrorFormat()); } return 0; }