Changelog: Implemented IsOS function Known bugs: Perfect implementation of IsOS is impossible, but I think this patch should be good enought. Index: dlls/shlwapi/ordinal.c =================================================================== RCS file: /home/wine/wine/dlls/shlwapi/ordinal.c,v retrieving revision 1.90 diff -u -r1.90 ordinal.c --- dlls/shlwapi/ordinal.c 17 Jul 2004 00:05:23 -0000 1.90 +++ dlls/shlwapi/ordinal.c 11 Aug 2004 19:13:28 -0000 @@ -47,6 +47,7 @@ #include "winreg.h" #include "wine/debug.h" #include "shlwapi.h" +#include "winnt.h" WINE_DEFAULT_DEBUG_CHANNEL(shell); @@ -3657,12 +3658,118 @@ * TRUE If the feature is available. * FALSE If the feature is not available. */ -DWORD WINAPI IsOS(DWORD feature) +BOOL WINAPI IsOS(DWORD feature) { - FIXME("(0x%08lx) stub\n", feature); - if (feature == 4) - return TRUE; - return FALSE; + OSVERSIONINFOA osvi; + DWORD platform, majorv, minorv; + + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); + if(!GetVersionExA(&osvi)) { + ERR("GetVersionEx failed"); + return FALSE; + } + + majorv = osvi.dwMajorVersion; + minorv = osvi.dwMinorVersion; + platform = osvi.dwPlatformId; + +#define ISOS_RETURN(x) \ + TRACE("(0x%x) ret=%d\n",(unsigned)feature,(x)); \ + return (x); + + switch(feature) { + case OS_WIN32SORGREATER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32s + || platform == VER_PLATFORM_WIN32_WINDOWS) + case OS_NT: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT) + case OS_WIN95ORGREATER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_WINDOWS) + case OS_NT4ORGREATER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT && majorv >= 4) + case OS_WIN2000ORGREATER_ALT: + case OS_WIN2000ORGREATER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT && majorv >= 5) + case OS_WIN98ORGREATER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_WINDOWS && minorv >= 10) + case OS_WIN98_GOLD: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_WINDOWS && minorv == 10) + case OS_WIN2000PRO: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT && majorv >= 5) + case OS_WIN2000SERVER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT && (minorv == 0 || minorv == 1)) + case OS_WIN2000ADVSERVER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT && (minorv == 0 || minorv == 1)) + case OS_WIN2000DATACENTER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT && (minorv == 0 || minorv == 1)) + case OS_WIN2000TERMINAL: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT && (minorv == 0 || minorv == 1)) + case OS_EMBEDDED: + FIXME("(OS_EMBEDDED) What should we return here?\n"); + return FALSE; + case OS_TERMINALCLIENT: + FIXME("(OS_TERMINALCLIENT) What should we return here?\n"); + return FALSE; + case OS_TERMINALREMOTEADMIN: + FIXME("(OS_TERMINALREMOTEADMIN) What should we return here?\n"); + return FALSE; + case OS_WIN95_GOLD: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_WINDOWS && minorv == 0) + case OS_MEORGREATER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_WINDOWS && minorv >= 90) + case OS_XPORGREATER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT && majorv >= 5 && minorv >= 1) + case OS_HOME: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT && majorv >= 5 && minorv >= 1) + case OS_PROFESSIONAL: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT) + case OS_DATACENTER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT) + case OS_ADVSERVER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT && majorv >= 5) + case OS_SERVER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT) + case OS_TERMINALSERVER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT) + case OS_PERSONALTERMINALSERVER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT && minorv >= 1 && majorv >= 5) + case OS_FASTUSERSWITCHING: + FIXME("(OS_FASTUSERSWITCHING) What should we return here?\n"); + return TRUE; + case OS_WELCOMELOGONUI: + FIXME("(OS_WELCOMELOGONUI) What should we return here?\n"); + return FALSE; + case OS_DOMAINMEMBER: + FIXME("(OS_DOMAINMEMBER) What should we return here?\n"); + return TRUE; + case OS_ANYSERVER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT) + case OS_WOW6432: + FIXME("(OS_WOW6432) Should we check this?\n"); + return FALSE; + case OS_WEBSERVER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT) + case OS_SMALLBUSINESSSERVER: + ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT) + case OS_TABLETPC: + FIXME("(OS_TABLEPC) What should we return here?\n"); + return FALSE; + case OS_SERVERADMINUI: + FIXME("(OS_SERVERADMINUI) What should we return here?\n"); + return FALSE; + case OS_MEDIACENTER: + FIXME("(OS_MEDIACENTER) What should we return here?\n"); + return FALSE; + case OS_APPLIANCE: + FIXME("(OS_APPLIANCE) What should we return here?\n"); + return FALSE; + } + +#undef ISOS_RETURN + + WARN("(0x%x) unknown parameter\n",(unsigned)feature); + + return FALSE; } /************************************************************************* Index: include/shlwapi.h =================================================================== RCS file: /home/wine/wine/include/shlwapi.h,v retrieving revision 1.45 diff -u -r1.45 shlwapi.h --- include/shlwapi.h 8 Jul 2004 20:16:23 -0000 1.45 +++ include/shlwapi.h 11 Aug 2004 19:13:29 -0000 @@ -939,6 +939,49 @@ HRESULT WINAPI DllInstall(BOOL,LPCWSTR); + +/* IsOS definitions */ + +#define OS_WIN32SORGREATER 0x00 +#define OS_NT 0x01 +#define OS_WIN95ORGREATER 0x02 +#define OS_NT4ORGREATER 0x03 +#define OS_WIN2000ORGREATER_ALT 0x04 +#define OS_WIN98ORGREATER 0x05 +#define OS_WIN98_GOLD 0x06 +#define OS_WIN2000ORGREATER 0x07 +#define OS_WIN2000PRO 0x08 +#define OS_WIN2000SERVER 0x09 +#define OS_WIN2000ADVSERVER 0x0A +#define OS_WIN2000DATACENTER 0x0B +#define OS_WIN2000TERMINAL 0x0C +#define OS_EMBEDDED 0x0D +#define OS_TERMINALCLIENT 0x0E +#define OS_TERMINALREMOTEADMIN 0x0F +#define OS_WIN95_GOLD 0x10 +#define OS_MEORGREATER 0x11 +#define OS_XPORGREATER 0x12 +#define OS_HOME 0x13 +#define OS_PROFESSIONAL 0x14 +#define OS_DATACENTER 0x15 +#define OS_ADVSERVER 0x16 +#define OS_SERVER 0x17 +#define OS_TERMINALSERVER 0x18 +#define OS_PERSONALTERMINALSERVER 0x19 +#define OS_FASTUSERSWITCHING 0x1A +#define OS_WELCOMELOGONUI 0x1B +#define OS_DOMAINMEMBER 0x1C +#define OS_ANYSERVER 0x1D +#define OS_WOW6432 0x1E +#define OS_WEBSERVER 0x1F +#define OS_SMALLBUSINESSSERVER 0x20 +#define OS_TABLETPC 0x21 +#define OS_SERVERADMINUI 0x22 +#define OS_MEDIACENTER 0x23 +#define OS_APPLIANCE 0x24 + +BOOL WINAPI IsOS(DWORD); + #include #ifdef __cplusplus