#include "windows_surum.hpp" #include namespace fiko { namespace { using RtlGetVersionFn = LONG(WINAPI*)(void*); // RTL_OSVERSIONINFOW elle tanimli — her SDK'da ayni yapiyi vermeyebilir; // alan duzeni (dwOSVersionInfoSize/dwMajorVersion/dwMinorVersion/dwBuildNumber/ // dwPlatformId/szCSDVersion[128]) 2000'den beri sabit ABI'dir. struct RtlOsVersionInfoW { ULONG boy; ULONG majorSurum; ULONG minorSurum; ULONG build; ULONG platform; WCHAR csd[128]; }; WindowsSurumBilgi hesapla() { WindowsSurumBilgi b; HMODULE ntdll = GetModuleHandleW(L"ntdll.dll"); if (ntdll) { auto fn = reinterpret_cast(GetProcAddress(ntdll, "RtlGetVersion")); if (fn) { RtlOsVersionInfoW vi{}; vi.boy = sizeof(vi); if (fn(&vi) == 0 /*STATUS_SUCCESS*/) { b.majorSurum = vi.majorSurum; b.minorSurum = vi.minorSurum; b.build = vi.build; b.tespitBasarili = true; } } } // UBR (Update Build Revision) — yalniz bilgi/loglama amacli; okunamazsa 0 kalir, // ana surum tespitini ETKILEMEZ. HKEY k; if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ, &k) == ERROR_SUCCESS) { DWORD ubr = 0, tip = REG_DWORD, boy = sizeof(ubr); if (RegQueryValueExW(k, L"UBR", nullptr, &tip, reinterpret_cast(&ubr), &boy) == ERROR_SUCCESS) b.ubr = ubr; RegCloseKey(k); } b.windows11Mi = (b.majorSurum == 10 && b.build >= 22000); return b; } } // namespace std::string WindowsSurumBilgi::ozet() const { if (!tespitBasarili) return "Windows surumu tespit edilemedi"; std::string ad = windows11Mi ? "Windows 11" : (majorSurum == 10 ? "Windows 10" : "Windows (eski)"); std::string s = ad + " (build " + std::to_string(build); if (ubr) s += "." + std::to_string(ubr); s += ")"; return s; } const WindowsSurumBilgi& windowsSurumTespitEt() { static const WindowsSurumBilgi kOnbellek = hesapla(); return kOnbellek; } } // namespace fiko