72 lines
2 KiB
C
72 lines
2 KiB
C
#include <windows.h>
|
|
#include "versionhelpers.h"
|
|
|
|
typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG);
|
|
typedef const char* (CDECL* WINE_GET_VERSIONPROC)();
|
|
typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release);
|
|
|
|
static RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo;
|
|
static WINE_GET_VERSIONPROC wine_get_version;
|
|
static WINE_GET_HOST_VERSIONPROC wine_get_host_version;
|
|
|
|
/* GetProcAddress is rather slow so we use a function to inizialize it once on startup */
|
|
void verhelp_init()
|
|
{
|
|
HMODULE mod = GetModuleHandleA("ntdll.dll");
|
|
if (mod)
|
|
{
|
|
RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo");
|
|
wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version");
|
|
wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version");
|
|
}
|
|
}
|
|
|
|
BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask)
|
|
{
|
|
return RtlVerifyVersionInfo ?
|
|
RtlVerifyVersionInfo(versionInfo, typeMask, conditionMask) == 0 :
|
|
VerifyVersionInfoW(versionInfo, typeMask, conditionMask);
|
|
}
|
|
|
|
const char* verhelp_wine_get_version()
|
|
{
|
|
return wine_get_version ? wine_get_version() : NULL;
|
|
}
|
|
|
|
void verhelp_wine_get_host_version(const char** sysname, const char** release)
|
|
{
|
|
if (wine_get_host_version)
|
|
{
|
|
wine_get_host_version(sysname, release);
|
|
return;
|
|
}
|
|
|
|
if (sysname)
|
|
*sysname = NULL;
|
|
|
|
if (release)
|
|
*release = NULL;
|
|
}
|
|
|
|
BOOL verhelp_is_wine()
|
|
{
|
|
return wine_get_version != NULL;
|
|
}
|
|
|
|
BOOL verhelp_is_macos()
|
|
{
|
|
const char* sysname = NULL;
|
|
const char* release = NULL;
|
|
verhelp_wine_get_host_version(&sysname, &release);
|
|
|
|
return sysname && _strcmpi(sysname, "Darwin") == 0;
|
|
}
|
|
|
|
BOOL verhelp_is_linux()
|
|
{
|
|
const char* sysname = NULL;
|
|
const char* release = NULL;
|
|
verhelp_wine_get_host_version(&sysname, &release);
|
|
|
|
return sysname && _strcmpi(sysname, "Linux") == 0;
|
|
}
|