2 * Windows and DOS version functions
4 * Copyright 1997 Marcus Meissner
5 * Copyright 1998 Patrik Stridvall
6 * Copyright 1998, 2003 Andreas Mohr
7 * Copyright 1997, 2003 Alexandre Julliard
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #include "wine/port.h"
32 #define WIN32_NO_STATUS
39 #include "wine/unicode.h"
40 #include "wine/debug.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(ver
);
45 /***********************************************************************
46 * GetVersion (KERNEL32.@)
57 DWORD WINAPI
GetVersion(void)
59 DWORD result
= MAKELONG( MAKEWORD( NtCurrentTeb()->Peb
->OSMajorVersion
,
60 NtCurrentTeb()->Peb
->OSMinorVersion
),
61 (NtCurrentTeb()->Peb
->OSPlatformId
^ 2) << 14 );
62 if (NtCurrentTeb()->Peb
->OSPlatformId
== VER_PLATFORM_WIN32_NT
)
63 result
|= LOWORD(NtCurrentTeb()->Peb
->OSBuildNumber
) << 16;
68 /***********************************************************************
69 * GetVersionExA (KERNEL32.@)
71 BOOL WINAPI
GetVersionExA(OSVERSIONINFOA
*v
)
73 RTL_OSVERSIONINFOEXW infoW
;
75 if (v
->dwOSVersionInfoSize
!= sizeof(OSVERSIONINFOA
) &&
76 v
->dwOSVersionInfoSize
!= sizeof(OSVERSIONINFOEXA
))
78 WARN("wrong OSVERSIONINFO size from app (got: %d)\n",
79 v
->dwOSVersionInfoSize
);
80 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
84 infoW
.dwOSVersionInfoSize
= sizeof(infoW
);
85 if (RtlGetVersion( &infoW
) != STATUS_SUCCESS
) return FALSE
;
87 v
->dwMajorVersion
= infoW
.dwMajorVersion
;
88 v
->dwMinorVersion
= infoW
.dwMinorVersion
;
89 v
->dwBuildNumber
= infoW
.dwBuildNumber
;
90 v
->dwPlatformId
= infoW
.dwPlatformId
;
91 WideCharToMultiByte( CP_ACP
, 0, infoW
.szCSDVersion
, -1,
92 v
->szCSDVersion
, sizeof(v
->szCSDVersion
), NULL
, NULL
);
94 if(v
->dwOSVersionInfoSize
== sizeof(OSVERSIONINFOEXA
))
96 LPOSVERSIONINFOEXA vex
= (LPOSVERSIONINFOEXA
) v
;
97 vex
->wServicePackMajor
= infoW
.wServicePackMajor
;
98 vex
->wServicePackMinor
= infoW
.wServicePackMinor
;
99 vex
->wSuiteMask
= infoW
.wSuiteMask
;
100 vex
->wProductType
= infoW
.wProductType
;
106 /***********************************************************************
107 * GetVersionExW (KERNEL32.@)
109 BOOL WINAPI
GetVersionExW( OSVERSIONINFOW
*info
)
111 if (info
->dwOSVersionInfoSize
!= sizeof(OSVERSIONINFOW
) &&
112 info
->dwOSVersionInfoSize
!= sizeof(OSVERSIONINFOEXW
))
114 WARN("wrong OSVERSIONINFO size from app (got: %d)\n",
115 info
->dwOSVersionInfoSize
);
118 return (RtlGetVersion( (RTL_OSVERSIONINFOEXW
*)info
) == STATUS_SUCCESS
);
122 /******************************************************************************
123 * VerifyVersionInfoA (KERNEL32.@)
125 BOOL WINAPI
VerifyVersionInfoA( LPOSVERSIONINFOEXA lpVersionInfo
, DWORD dwTypeMask
,
126 DWORDLONG dwlConditionMask
)
128 OSVERSIONINFOEXW verW
;
130 verW
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOEXW
);
131 verW
.dwMajorVersion
= lpVersionInfo
->dwMajorVersion
;
132 verW
.dwMinorVersion
= lpVersionInfo
->dwMinorVersion
;
133 verW
.dwBuildNumber
= lpVersionInfo
->dwBuildNumber
;
134 verW
.dwPlatformId
= lpVersionInfo
->dwPlatformId
;
135 verW
.wServicePackMajor
= lpVersionInfo
->wServicePackMajor
;
136 verW
.wServicePackMinor
= lpVersionInfo
->wServicePackMinor
;
137 verW
.wSuiteMask
= lpVersionInfo
->wSuiteMask
;
138 verW
.wProductType
= lpVersionInfo
->wProductType
;
139 verW
.wReserved
= lpVersionInfo
->wReserved
;
141 return VerifyVersionInfoW(&verW
, dwTypeMask
, dwlConditionMask
);
145 /******************************************************************************
146 * VerifyVersionInfoW (KERNEL32.@)
148 BOOL WINAPI
VerifyVersionInfoW( LPOSVERSIONINFOEXW lpVersionInfo
, DWORD dwTypeMask
,
149 DWORDLONG dwlConditionMask
)
151 switch(RtlVerifyVersionInfo( lpVersionInfo
, dwTypeMask
, dwlConditionMask
))
153 case STATUS_INVALID_PARAMETER
:
154 SetLastError( ERROR_BAD_ARGUMENTS
);
156 case STATUS_REVISION_MISMATCH
:
157 SetLastError( ERROR_OLD_WIN_VERSION
);
163 /***********************************************************************
164 * TermsrvAppInstallMode (KERNEL32.@)
166 * Find out whether the terminal server is in INSTALL or EXECUTE mode.
168 BOOL WINAPI
TermsrvAppInstallMode(void)
174 /***********************************************************************
175 * SetTermsrvAppInstallMode (KERNEL32.@)
177 * This function is said to switch between the INSTALL (TRUE) or
178 * EXECUTE (FALSE) terminal server modes.
180 * This function always returns zero on WinXP Home so it's probably
181 * safe to return that value in most cases. However, if a terminal
182 * server is running it will probably return something else.
184 DWORD WINAPI
SetTermsrvAppInstallMode(BOOL bInstallMode
)
186 FIXME("(%d): stub\n", bInstallMode
);
190 /***********************************************************************
191 * GetProductInfo (KERNEL32.@)
193 * Gives info about the current Windows product type, in a format compatible
194 * with the given Windows version
196 * Returns TRUE if the input is valid, FALSE otherwise
198 BOOL WINAPI
GetProductInfo(DWORD dwOSMajorVersion
, DWORD dwOSMinorVersion
, DWORD dwSpMajorVersion
,
199 DWORD dwSpMinorVersion
, PDWORD pdwReturnedProductType
)
201 return RtlGetProductInfo(dwOSMajorVersion
, dwOSMinorVersion
,
202 dwSpMajorVersion
, dwSpMinorVersion
, pdwReturnedProductType
);