[Wine] Re: Detecting a programm runs using Wine
JonDoe
wineforum-user at winehq.org
Sat Feb 14 21:24:44 CST 2009
Hi,
I have also been searching for a way to detect if my application is running under wine. As I haven´t found an appropriate solution I came to the following solution. It may not be perfect and there is no guarantee that it will be always working but I think it is a good approach.
Code:
BOOL CMyClass::IsWine()
{
CString csRet;
BOOL fRet = FALSE;
CString csEntry = _T("ProductName");
HMODULE hLib = LoadLibrary(_T("ntdll"));
if (hLib != NULL)
{
HRSRC hVersion = FindResource( hLib,
MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION );
if (hVersion != NULL)
{
HGLOBAL hGlobal = LoadResource( hLib, hVersion );
if ( hGlobal != NULL)
{
LPVOID versionInfo = LockResource(hGlobal);
if (versionInfo != NULL)
{
DWORD vLen,langD;
BOOL retVal;
LPVOID retbuf=NULL;
TCHAR fileEntry[256];
_stprintf(fileEntry,_T("\\VarFileInfo\\Translation"));
retVal = VerQueryValue(versionInfo,fileEntry,&retbuf,(UINT *)&vLen);
if (retVal && vLen==4)
{
memcpy(&langD,retbuf,4);
_stprintf(fileEntry, _T("\\StringFileInfo\\%02X%02X%02X%02X\\%s"),
(langD & 0xff00)>>8,langD & 0xff,(langD & 0xff000000)>>24,
(langD & 0xff0000)>>16, csEntry);
}
else
_stprintf(fileEntry, _T("\\StringFileInfo\\%04X04B0\\%s"),
GetUserDefaultLangID(), csEntry);
if (VerQueryValue(versionInfo,fileEntry,&retbuf,(UINT *)&vLen))
{
csRet = (TCHAR*)retbuf;
csRet.MakeLower();
if(0 <= csRet.Find(_T("wine")))
fRet = TRUE;
}
}
}
UnlockResource( hGlobal );
FreeResource( hGlobal );
FreeLibrary(hLib);
}
}
return fRet;
}
This code is mainly based on a publication on www.codeproject.com by luetz: http://www.codeproject.com/KB/cpp/GetLocalVersionInfos.aspx?display=Print.
I simply read the product name of the ntdll.dll which is "Wine" when running under wine.
Hope this helps, JonDoe
More information about the wine-users
mailing list