static void test_GetProductInfo(void) { DWORD product; DWORD res; DWORD table[] = {9,8,7,6, 7,0,0,0, 6,2,0,0, 6,1,2,0, 6,1,1,0, 6,1,0,2, 6,1,0,0, 6,0,3,0, 6,0,2,0, 6,0,1,5, 6,0,1,0, 6,0,0,0, 5,3,0,0, 5,2,0,0, 5,1,0,0, 5,0,0,0, 0 }; DWORD *entry = table; if (!pGetProductInfo) { /* Not present before Vista */ win_skip("GetProductInfo() not available\n"); return; } while (*entry) { /* SetLastError() / GetLastError(): value is untouched */ product = 0xdeadbeef; SetLastError(0xdeadbeef); res = pGetProductInfo(entry[0], entry[1], entry[2], entry[3], &product); if (entry[0] >= 6) ok(res && (product > PRODUCT_UNDEFINED) && (product <= PRODUCT_PROFESSIONAL_WMC), "got %d and 0x%x (expected TRUE and a valid PRODUCT_* value)\n", res, product); else ok(!res && !product && (GetLastError() == 0xdeadbeef), "got %d and 0x%x with 0x%x (expected FALSE and PRODUCT_UNDEFINED with LastError untouched)\n", res, product, GetLastError()); entry+= 4; } /* NULL pointer is not a problem */ SetLastError(0xdeadbeef); res = pGetProductInfo(6, 1, 0, 0, NULL); ok( (!res) && (GetLastError() == 0xdeadbeef), "got %d with 0x%x (expected FALSE with LastError untouched\n", res, GetLastError()); }
int LoadNetlibModule(void) { WSADATA wsadata; bModuleInitialized = TRUE; WSAStartup(MAKEWORD(2,2), &wsadata); HookEvent(ME_OPT_INITIALISE,NetlibOptInitialise); InitializeCriticalSection(&csNetlibUser); hConnectionHeaderMutex=CreateMutex(NULL,FALSE,NULL); NetlibLogInit(); connectionTimeout = 0; OSVERSIONINFOEX osvi = {0}; osvi.dwOSVersionInfoSize = sizeof(osvi); if (GetVersionEx((LPOSVERSIONINFO)&osvi)) { // Connection limiting was introduced in Windows XP SP2 and later and set to 10 / sec if (osvi.dwMajorVersion == 5 && ((osvi.dwMinorVersion == 1 && osvi.wServicePackMajor >= 2) || osvi.dwMinorVersion > 1)) connectionTimeout = 150; // Connection limiting has limits based on addition Windows Vista pre SP2 else if (osvi.dwMajorVersion == 6 && osvi.wServicePackMajor < 2) { DWORD dwType = 0; tGetProductInfo pGetProductInfo = (tGetProductInfo) GetProcAddress(GetModuleHandleA("kernel32"), "GetProductInfo"); if (pGetProductInfo != NULL) pGetProductInfo(6, 0, 0, 0, &dwType); switch( dwType ) { case 0x01: // Vista Ultimate edition have connection limit of 25 / sec - plenty for Miranda case 0x1c: break; case 0x02: // Vista Home Basic edition have connection limit of 2 / sec case 0x05: connectionTimeout = 1000; break; default: // all other editions have connection limit of 10 / sec connectionTimeout = 150; break; } } // Connection limiting is disabled by default and is controlled by registry setting in Windows Vista SP2 and later else if (osvi.dwMajorVersion >= 6) { static const char keyn[] = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"; static const char valn[] = "EnableConnectionRateLimiting"; HKEY hSettings; if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, keyn, 0, KEY_QUERY_VALUE, &hSettings) == ERROR_SUCCESS) { DWORD tValueLen, enabled; tValueLen = sizeof(enabled); if (RegQueryValueExA(hSettings, valn, NULL, NULL, (BYTE*)&enabled, &tValueLen) == ERROR_SUCCESS && enabled) connectionTimeout = 150; // if enabled limit is set to 10 / sec RegCloseKey(hSettings); } } } hConnectionOpenMutex = connectionTimeout ? CreateMutex(NULL,FALSE,NULL) : NULL; g_LastConnectionTick = GetTickCount(); CreateServiceFunction(MS_NETLIB_REGISTERUSER,NetlibRegisterUser); CreateServiceFunction(MS_NETLIB_GETUSERSETTINGS,NetlibGetUserSettings); CreateServiceFunction(MS_NETLIB_SETUSERSETTINGS,NetlibSetUserSettings); CreateServiceFunction(MS_NETLIB_CLOSEHANDLE,NetlibCloseHandle); CreateServiceFunction(MS_NETLIB_BINDPORT,NetlibBindPort); CreateServiceFunction(MS_NETLIB_OPENCONNECTION,NetlibOpenConnection); CreateServiceFunction(MS_NETLIB_SETHTTPPROXYINFO,NetlibHttpGatewaySetInfo); CreateServiceFunction(MS_NETLIB_SETSTICKYHEADERS,NetlibHttpSetSticky); CreateServiceFunction(MS_NETLIB_GETSOCKET,NetlibGetSocket); CreateServiceFunction(MS_NETLIB_URLENCODE,NetlibHttpUrlEncode); CreateServiceFunction(MS_NETLIB_BASE64ENCODE,NetlibBase64Encode); CreateServiceFunction(MS_NETLIB_BASE64DECODE,NetlibBase64Decode); CreateServiceFunction(MS_NETLIB_SENDHTTPREQUEST,NetlibHttpSendRequest); CreateServiceFunction(MS_NETLIB_RECVHTTPHEADERS,NetlibHttpRecvHeaders); CreateServiceFunction(MS_NETLIB_FREEHTTPREQUESTSTRUCT,NetlibHttpFreeRequestStruct); CreateServiceFunction(MS_NETLIB_HTTPTRANSACTION,NetlibHttpTransaction); CreateServiceFunction(MS_NETLIB_SEND,NetlibSend); CreateServiceFunction(MS_NETLIB_RECV,NetlibRecv); CreateServiceFunction(MS_NETLIB_SELECT,NetlibSelect); CreateServiceFunction(MS_NETLIB_SELECTEX,NetlibSelectEx); CreateServiceFunction(MS_NETLIB_SHUTDOWN,NetlibShutdown); CreateServiceFunction(MS_NETLIB_CREATEPACKETRECVER,NetlibPacketRecverCreate); CreateServiceFunction(MS_NETLIB_GETMOREPACKETS,NetlibPacketRecverGetMore); CreateServiceFunction(MS_NETLIB_SETPOLLINGTIMEOUT,NetlibHttpSetPollingTimeout); CreateServiceFunction(MS_NETLIB_STARTSSL,NetlibStartSsl); hRecvEvent = CreateHookableEvent(ME_NETLIB_FASTRECV); hSendEvent = CreateHookableEvent(ME_NETLIB_FASTSEND); NetlibUPnPInit(); NetlibSecurityInit(); NetlibLoadIeProxy(); return 0; }
bool getWindowsVersion(char* version) { int index = 0; OSVERSIONINFOEX osvi = {}; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (!GetVersionEx((OSVERSIONINFO*)&osvi)) return false; if (osvi.dwPlatformId != VER_PLATFORM_WIN32_NT) return false; // Vista if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) { if (osvi.wProductType == VER_NT_WORKSTATION) { index += sprintf(version + index, "Microsoft Windows Vista"); uint32_t productType = 0; HMODULE hKernel = GetModuleHandle("KERNEL32.DLL"); if (hKernel) { typedef bool (__stdcall *funcGetProductInfo)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t*); funcGetProductInfo pGetProductInfo = (funcGetProductInfo)GetProcAddress(hKernel, "GetProductInfo"); if (pGetProductInfo) pGetProductInfo(6, 0, 0, 0, &productType); switch (productType) { case PRODUCT_STARTER: { index += sprintf(version + index, " Starter"); break; } case PRODUCT_HOME_BASIC_N: { index += sprintf(version + index, " Home Basic N"); break; } case PRODUCT_HOME_BASIC: { index += sprintf(version + index, " Home Basic"); break; } case PRODUCT_HOME_PREMIUM: { index += sprintf(version + index, " Home Premium"); break; } case PRODUCT_BUSINESS_N: { index += sprintf(version + index, " Business N"); break; } case PRODUCT_BUSINESS: { index += sprintf(version + index, " Business"); break; } case PRODUCT_ENTERPRISE: { index += sprintf(version + index, " Enterprise"); break; } case PRODUCT_ULTIMATE: { index += sprintf(version + index, " Ultimate"); break; } default: break; } } } else if (osvi.wProductType == VER_NT_SERVER)
bool getWindowsVersion(char* version) { int index = 0; OSVERSIONINFOEX osvi = {}; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (!GetVersionEx((OSVERSIONINFO*)&osvi)) return false; if (osvi.dwPlatformId != VER_PLATFORM_WIN32_NT) return false; // Vista if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) { if (osvi.wProductType == VER_NT_WORKSTATION) { index += sprintf(version + index, "Microsoft Windows Vista"); uint32_t productType = 0; HMODULE hKernel = GetModuleHandle("KERNEL32.DLL"); if (hKernel) { typedef bool (*funcGetProductInfo)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t*); funcGetProductInfo pGetProductInfo = (funcGetProductInfo)GetProcAddress(hKernel, "GetProductInfo"); if (pGetProductInfo) pGetProductInfo(6, 0, 0, 0, &productType); switch (productType) { case PRODUCT_STARTER: { index += sprintf(version + index, " Starter"); break; } case PRODUCT_HOME_BASIC_N: { index += sprintf(version + index, " Home Basic N"); break; } case PRODUCT_HOME_BASIC: { index += sprintf(version + index, " Home Basic"); break; } case PRODUCT_HOME_PREMIUM: { index += sprintf(version + index, " Home Premium"); break; } case PRODUCT_BUSINESS_N: { index += sprintf(version + index, " Business N"); break; } case PRODUCT_BUSINESS: { index += sprintf(version + index, " Business"); break; } case PRODUCT_ENTERPRISE: { index += sprintf(version + index, " Enterprise"); break; } case PRODUCT_ULTIMATE: { index += sprintf(version + index, " Ultimate"); break; } default: break; } } } else if (osvi.wProductType == VER_NT_SERVER) { index += sprintf(version + index, "Microsoft Windows Server 2008"); if (osvi.wSuiteMask & VER_SUITE_DATACENTER) index += sprintf(version + index, " Datacenter Edition"); else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) index += sprintf(version + index, " Enterprise Edition"); else if (osvi.wSuiteMask == VER_SUITE_BLADE) index += sprintf(version + index, " Web Edition"); else index += sprintf(version + index, " Standard Edition"); } } // Windows Server 2003 else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) { index += sprintf(version + index, "Microsoft Windows Server 2003"); if (GetSystemMetrics(SM_SERVERR2)) index += sprintf(version + index, " R2"); if (osvi.wSuiteMask & VER_SUITE_DATACENTER) index += sprintf(version + index, " Datacenter Edition"); else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) index += sprintf(version + index, " Enterprise Edition"); else if (osvi.wSuiteMask == VER_SUITE_BLADE) index += sprintf(version + index, " Web Edition"); else index += sprintf(version + index, " Standard Edition"); } // Windows XP else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) { index += sprintf(version + index, "Microsoft Windows XP"); if (GetSystemMetrics(SM_MEDIACENTER)) index += sprintf(version + index, " Media Center Edition"); else if (GetSystemMetrics(SM_STARTER)) index += sprintf(version + index, " Starter Edition"); else if (GetSystemMetrics(SM_TABLETPC)) index += sprintf(version + index, " Tablet PC Edition"); else if (osvi.wSuiteMask & VER_SUITE_PERSONAL) index += sprintf(version + index, " Home Edition"); else index += sprintf(version + index, " Professional"); } // Windows 2000 else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) { index += sprintf(version + index, "Microsoft Windows 2000"); if (osvi.wProductType == VER_NT_WORKSTATION) { index += sprintf(version + index, " Professional"); } else if (osvi.wProductType == VER_NT_SERVER) { if (osvi.wSuiteMask & VER_SUITE_DATACENTER) index += sprintf(version + index, " Datacenter Server"); else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) index += sprintf(version + index, " Advanced Server"); else index += sprintf(version + index, " Server"); } } // Windows NT 4 else if (osvi.dwMajorVersion == 4) { index += sprintf(version + index, "Microsoft Windows NT 4"); if (osvi.wProductType == VER_NT_WORKSTATION) { index += sprintf(version + index, " Workstation"); } else if (osvi.wProductType == VER_NT_SERVER) { if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) index += sprintf(version + index, " Server, Enterprise Edition"); else index += sprintf(version + index, " Server"); } } else { index += sprintf(version + index, "Microsoft Windows"); } // Service pack and full version info if (strlen(osvi.szCSDVersion) > 0) { index += sprintf(version + index, " %s", osvi.szCSDVersion); } index += sprintf(version + index, " (%d.%d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber & 0xFFFF); // 64-bit Windows bool isWow64 = false; HMODULE hKernel = GetModuleHandle("kernel32.dll"); if (hKernel) { typedef bool (*funcIsWow64Process)(void*, bool*); funcIsWow64Process pIsWow64Process = (funcIsWow64Process)GetProcAddress(hKernel, "IsWow64Process"); if (pIsWow64Process) { pIsWow64Process(GetCurrentProcess(), &isWow64); } } if (isWow64) index += sprintf(version + index, "; 64-bit"); else index += sprintf(version + index, "; 32-bit"); index += sprintf(version + index, ")"); return true; }