Windows2003-3790/inetcore/setup/sdslib/checks.c
2020-09-30 16:53:55 +02:00

163 lines
4.2 KiB
C

#include <windows.h>
BOOL RunningOnMillennium()
{
OSVERSIONINFO VersionInfo;
static BOOL bRet = -2;
if (bRet == -2)
{
bRet = FALSE;
VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&VersionInfo))
{
if (VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
bRet = ((VersionInfo.dwMajorVersion == 4) && (VersionInfo.dwMinorVersion == 90));
}
}
}
return bRet;
}
BOOL ConvertHexStringToIntA( CHAR *pszHexNum , int *piNum )
{
int n=0L;
CHAR *psz=pszHexNum;
for(n=0 ; ; psz=CharNextA(psz))
{
if( (*psz>='0') && (*psz<='9') )
n = 0x10 * n + *psz - '0';
else
{
CHAR ch = *psz;
int n2;
if(ch >= 'a')
ch -= 'a' - 'A';
n2 = ch - 'A' + 0xA;
if (n2 >= 0xA && n2 <= 0xF)
n = 0x10 * n + n2;
else
break;
}
}
/*
* Update results
*/
*piNum = n;
return (psz != pszHexNum);
}
typedef struct {
WORD wLang;
BOOL fFoundLang;
LPCTSTR lpszType;
} ENUMLANGDATA;
BOOL CALLBACK EnumResLangProc(HINSTANCE hinst, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIdLang, LPARAM lparam)
{
ENUMLANGDATA *pel = (ENUMLANGDATA *)lparam;
BOOL fContinue = TRUE;
if (lpszType == pel->lpszType)
{
if (pel->wLang == PRIMARYLANGID(wIdLang))
{
pel->wLang = wIdLang;
pel->fFoundLang = TRUE;
fContinue = FALSE;
}
}
return fContinue; // continue until we get langs...
}
BOOL GetResourceLanguage(HINSTANCE hinst, LPCTSTR lpszType, LPCTSTR lpszName, WORD wLang)
{
ENUMLANGDATA el;
el.wLang = wLang;
el.fFoundLang = FALSE;
el.lpszType = lpszType;
EnumResourceLanguages(hinst, lpszType, lpszName, EnumResLangProc, (LPARAM)&el);
return el.fFoundLang;
}
BOOL IsBiDiLocalizedBinary(HINSTANCE hinst, LPCTSTR lpszType, LPCTSTR lpszName)
{
static BOOL bRet = -2;
if(bRet == -2)
{
bRet = FALSE;
if(GetResourceLanguage(hinst,lpszType, lpszName, LANG_ARABIC)
|| GetResourceLanguage(hinst, lpszType, lpszName, LANG_HEBREW))
{
bRet = TRUE;
}
}
return bRet;
}
BOOL RunningOnWin95BiDiLoc()
{
OSVERSIONINFO VersionInfo;
static BOOL bRet = -2;
HKEY hKey;
DWORD dwType;
CHAR szResourceLocale[12];
DWORD dwSize = sizeof(szResourceLocale)/sizeof(CHAR);
LONG lRes;
int iLCID=0L;
if (bRet == -2)
{
bRet = FALSE;
VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&VersionInfo))
{
if ((VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
&& (VersionInfo.dwMajorVersion == 4)
&& (VersionInfo.dwMinorVersion < 10)
&& (GetSystemMetrics(SM_MIDEASTENABLED))) // Anything before Win98.
{
if( RegOpenKeyExA( HKEY_CURRENT_USER ,
"Control Panel\\Desktop\\ResourceLocale" ,
0,
KEY_READ, &hKey) == ERROR_SUCCESS)
{
lRes = RegQueryValueExA( hKey , "" , 0 , &dwType , (LPBYTE) szResourceLocale , &dwSize );
RegCloseKey(hKey);
if(ERROR_SUCCESS != lRes)
{
return bRet;
}
if( ConvertHexStringToIntA( szResourceLocale , &iLCID ) )
{
iLCID = PRIMARYLANGID(LANGIDFROMLCID(iLCID));
if( (LANG_ARABIC == iLCID) || (LANG_HEBREW == iLCID) )
{
bRet = TRUE;
}
}
}
}
}
}
return bRet;
}