1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/*
* Windows and DOS version functions
*
* Copyright 1997 Marcus Meissner
* Copyright 1998 Patrik Stridvall
* Copyright 1998, 2003 Andreas Mohr
* Copyright 1997, 2003 Alexandre Julliard
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "config.h"
#include "wine/port.h"
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "winuser.h"
#include "winternl.h"
#include "winerror.h"
#include "wine/unicode.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(ver);
/***********************************************************************
* GetVersion (KERNEL32.@)
*
* Win31 0x80000a03
* Win95 0xc0000004
* Win98 0xc0000a04
* WinME 0xc0005a04
* NT351 0x04213303
* NT4 0x05650004
* Win2000 0x08930005
* WinXP 0x0a280105
*/
DWORD WINAPI GetVersion(void)
{
DWORD result = MAKELONG( MAKEWORD( NtCurrentTeb()->Peb->OSMajorVersion,
NtCurrentTeb()->Peb->OSMinorVersion ),
(NtCurrentTeb()->Peb->OSPlatformId ^ 2) << 14 );
if (NtCurrentTeb()->Peb->OSPlatformId == VER_PLATFORM_WIN32_NT)
result |= LOWORD(NtCurrentTeb()->Peb->OSBuildNumber) << 16;
return result;
}
/***********************************************************************
* GetVersionExA (KERNEL32.@)
*/
BOOL WINAPI GetVersionExA(OSVERSIONINFOA *v)
{
RTL_OSVERSIONINFOEXW infoW;
if (v->dwOSVersionInfoSize != sizeof(OSVERSIONINFOA) &&
v->dwOSVersionInfoSize != sizeof(OSVERSIONINFOEXA))
{
WARN("wrong OSVERSIONINFO size from app (got: %d)\n",
v->dwOSVersionInfoSize );
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
infoW.dwOSVersionInfoSize = sizeof(infoW);
if (RtlGetVersion( &infoW ) != STATUS_SUCCESS) return FALSE;
v->dwMajorVersion = infoW.dwMajorVersion;
v->dwMinorVersion = infoW.dwMinorVersion;
v->dwBuildNumber = infoW.dwBuildNumber;
v->dwPlatformId = infoW.dwPlatformId;
WideCharToMultiByte( CP_ACP, 0, infoW.szCSDVersion, -1,
v->szCSDVersion, sizeof(v->szCSDVersion), NULL, NULL );
if(v->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA))
{
LPOSVERSIONINFOEXA vex = (LPOSVERSIONINFOEXA) v;
vex->wServicePackMajor = infoW.wServicePackMajor;
vex->wServicePackMinor = infoW.wServicePackMinor;
vex->wSuiteMask = infoW.wSuiteMask;
vex->wProductType = infoW.wProductType;
}
return TRUE;
}
/***********************************************************************
* GetVersionExW (KERNEL32.@)
*/
BOOL WINAPI GetVersionExW( OSVERSIONINFOW *info )
{
if (info->dwOSVersionInfoSize != sizeof(OSVERSIONINFOW) &&
info->dwOSVersionInfoSize != sizeof(OSVERSIONINFOEXW))
{
WARN("wrong OSVERSIONINFO size from app (got: %d)\n",
info->dwOSVersionInfoSize);
return FALSE;
}
return (RtlGetVersion( (RTL_OSVERSIONINFOEXW *)info ) == STATUS_SUCCESS);
}
/******************************************************************************
* VerifyVersionInfoA (KERNEL32.@)
*/
BOOL WINAPI VerifyVersionInfoA( LPOSVERSIONINFOEXA lpVersionInfo, DWORD dwTypeMask,
DWORDLONG dwlConditionMask)
{
OSVERSIONINFOEXW verW;
verW.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW);
verW.dwMajorVersion = lpVersionInfo->dwMajorVersion;
verW.dwMinorVersion = lpVersionInfo->dwMinorVersion;
verW.dwBuildNumber = lpVersionInfo->dwBuildNumber;
verW.dwPlatformId = lpVersionInfo->dwPlatformId;
verW.wServicePackMajor = lpVersionInfo->wServicePackMajor;
verW.wServicePackMinor = lpVersionInfo->wServicePackMinor;
verW.wSuiteMask = lpVersionInfo->wSuiteMask;
verW.wProductType = lpVersionInfo->wProductType;
verW.wReserved = lpVersionInfo->wReserved;
return VerifyVersionInfoW(&verW, dwTypeMask, dwlConditionMask);
}
/******************************************************************************
* VerifyVersionInfoW (KERNEL32.@)
*/
BOOL WINAPI VerifyVersionInfoW( LPOSVERSIONINFOEXW lpVersionInfo, DWORD dwTypeMask,
DWORDLONG dwlConditionMask)
{
switch(RtlVerifyVersionInfo( lpVersionInfo, dwTypeMask, dwlConditionMask ))
{
case STATUS_INVALID_PARAMETER:
SetLastError( ERROR_BAD_ARGUMENTS );
return FALSE;
case STATUS_REVISION_MISMATCH:
SetLastError( ERROR_OLD_WIN_VERSION );
return FALSE;
}
return TRUE;
}
/***********************************************************************
* TermsrvAppInstallMode (KERNEL32.@)
*
* Find out whether the terminal server is in INSTALL or EXECUTE mode.
*/
BOOL WINAPI TermsrvAppInstallMode(void)
{
FIXME("stub\n");
return FALSE;
}
/***********************************************************************
* SetTermsrvAppInstallMode (KERNEL32.@)
*
* This function is said to switch between the INSTALL (TRUE) or
* EXECUTE (FALSE) terminal server modes.
*
* This function always returns zero on WinXP Home so it's probably
* safe to return that value in most cases. However, if a terminal
* server is running it will probably return something else.
*/
DWORD WINAPI SetTermsrvAppInstallMode(BOOL bInstallMode)
{
FIXME("(%d): stub\n", bInstallMode);
return 0;
}
/***********************************************************************
* GetProductInfo (KERNEL32.@)
*
* Gives info about the current Windows product type, in a format compatible
* with the given Windows version
*
* Returns TRUE if the input is valid, FALSE otherwise
*/
BOOL WINAPI GetProductInfo(DWORD dwOSMajorVersion, DWORD dwOSMinorVersion, DWORD dwSpMajorVersion,
DWORD dwSpMinorVersion, PDWORD pdwReturnedProductType)
{
return RtlGetProductInfo(dwOSMajorVersion, dwOSMinorVersion,
dwSpMajorVersion, dwSpMinorVersion, pdwReturnedProductType);
}
LONG WINAPI GetCurrentPackageId(UINT32 *len, BYTE *buffer)
{
FIXME("(%p %p): stub\n", len, buffer);
return APPMODEL_ERROR_NO_PACKAGE;
}