/***************************************************************************** INT WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) hInst : (IN) Instance handle hPrevInstance : not used szCmdLine : not used iCmdShow : (IN) the state the user wants the window to be in Return Value: returns value of the main window *****************************************************************************/ INT WINAPI WinMain (HINSTANCE hInst, HINSTANCE /*hPrevInstance*/, LPSTR /*szCmdLine*/, int iCmdShow) { MSG msg; HWND mainHwnd; BOOL bPipeNecessary; lFILEINFO *fileList; HANDLE hMutex; g_hInstance = hInst; g_pstatus.bHaveComCtrlv6=CheckOsVersion(5,1); //are the common controls v6 available? (os>=winxp) g_pstatus.bIsVista=CheckOsVersion(6,0); g_pstatus.bHideVerified = false; InitializeCriticalSection(&thread_fileinfo_crit); hMutex = CreateMutex(NULL,FALSE,TEXT("Local\\RapidCRCUMutex")); if(!hMutex) { return 0; } WaitForSingleObject(hMutex,INFINITE); ReadOptions(); fileList = ParseCommandLine(&bPipeNecessary); if(fileList==NULL) { return 0; } RegisterMainWindowClass(); if (!(mainHwnd = InitInstance(iCmdShow))) { MessageBox(NULL, TEXT("Program uses Unicode and requires Windows NT or higher"), TEXT("Error"), MB_ICONERROR); return 0; } if(bPipeNecessary) { PostMessage(mainHwnd,WM_ACCEPT_PIPE,(WPARAM)fileList->uiCmdOpts,NULL); delete fileList; } else { PostMessage(mainHwnd,WM_THREAD_FILEINFO_START,(WPARAM)fileList,NULL); fileList=NULL; } ReleaseMutex(hMutex); while(GetMessage(&msg, NULL, 0, 0)) { if (!IsDialogMessage(mainHwnd, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } DeleteCriticalSection(&thread_fileinfo_crit); return (INT) msg.wParam; }
void InitRealVersions() { CheckCommCtrlsVersion(); CheckOsVersion(); // set real version values realWINVER = MAKEWORD(CNV_OS_VER(g_osviWindows.dwMinorVersion), CNV_OS_VER(g_osviWindows.dwMajorVersion)); #ifdef _WIN32_WINDOWS if (g_osviWindows.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) real_WIN32_WINDOWS = realWINVER; else real_WIN32_WINDOWS = 0; #endif #ifdef _WIN32_WINNT if (g_osviWindows.dwPlatformId == VER_PLATFORM_WIN32_NT) real_WIN32_WINNT = realWINVER; else real_WIN32_WINNT = 0; #endif #ifdef _WIN32_IE switch (g_dviCommCtrls.dwMajorVersion) { case 4: switch (g_dviCommCtrls.dwMinorVersion) { case 70: real_WIN32_IE = 0x0300; break; case 71: real_WIN32_IE = 0x0400; break; case 72: real_WIN32_IE = 0x0401; break; default: real_WIN32_IE = 0x0200; } break; case 5: if (g_dviCommCtrls.dwMinorVersion > 80) real_WIN32_IE = 0x0501; else real_WIN32_IE = 0x0500; break; case 6: real_WIN32_IE = 0x0600; // includes checks for 0x0560 (IE6) break; default: real_WIN32_IE = 0; } #endif }
int main(int argc, char *argv[]) { SOCKET listener; SOCKET newsocket; WSADATA WsaData; struct sockaddr_in serverAddress; struct sockaddr_in clientAddress; int clientAddressLength; int err; CheckOsVersion(); err = WSAStartup (0x0101, &WsaData); if (err == SOCKET_ERROR) { FatalError("WSAStartup Failed"); return EXIT_FAILURE; } /* * Open a TCP socket connection to the server * By default, a socket is always opened * for overlapped I/O. Do NOT attach this * socket (listener) to the I/O completion * port! */ listener = socket(AF_INET, SOCK_STREAM, 0); if (listener < 0) { FatalError("socket() failed"); return EXIT_FAILURE; } /* * Bind our local address */ memset(&serverAddress, 0, sizeof(serverAddress)); serverAddress.sin_family = AF_INET; serverAddress.sin_addr.s_addr = htonl(INADDR_ANY); serverAddress.sin_port = htons(SERV_TCP_PORT); err = bind(listener, (struct sockaddr *)&serverAddress, sizeof(serverAddress) ); if (err < 0) FatalError("bind() failed"); ghCompletionPort = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, // No prior port 0, // No key 0 // Use default # of threads ); if (ghCompletionPort == NULL) FatalError("CreateIoCompletionPort() failed"); CreateWorkerThreads(ghCompletionPort); listen(listener, 5); fprintf(stderr, "Echo Server with I/O Completion Ports\n"); fprintf(stderr, "Running on TCP port %d\n", SERV_TCP_PORT); fprintf(stderr, "\nPress Ctrl+C to stop the server\n"); // // Loop forever accepting requests new connections // and starting reading from them. // for (;;) { struct ContextKey *pKey; clientAddressLength = sizeof(clientAddress); newsocket = accept(listener, (struct sockaddr *)&clientAddress, &clientAddressLength); if (newsocket < 0) { FatalError("accept() Failed"); return EXIT_FAILURE; } // Create a context key and initialize it. // calloc will zero the buffer pKey = calloc(1, sizeof(struct ContextKey)); pKey->sock = newsocket; pKey->ovOut.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // Set the event for writing so that packets // will not be sent to the completion port when // a write finishes. pKey->ovOut.hEvent = (HANDLE)((DWORD)pKey->ovOut.hEvent | 0x1); // Associate the socket with the completion port CreateIoCompletionPort( (HANDLE)newsocket, ghCompletionPort, (DWORD)pKey, // No key 0 // Use default # of threads ); // Kick off the first read IssueRead(pKey); } return 0; }