source: trunk/src/kernel32/version.cpp@ 7573

Last change on this file since 7573 was 7573, checked in by sandervl, 24 years ago

new version constants for ME & XP

File size: 6.5 KB
Line 
1/* $Id: version.cpp,v 1.5 2001-12-08 12:01:28 sandervl Exp $ */
2
3/*
4 * Win32 compatibility file functions for OS/2
5 *
6 * Copyright 1998-2000 Sander van Leeuwen
7 * Copyright 1998 Patrick Haller
8 *
9 * Based on Wine code: (misc\version.c)
10 * Copyright 1997 Alexandre Julliard
11 * Copyright 1997 Marcus Meissner
12 * Copyright 1998 Patrik Stridvall
13 * Copyright 1998 Andreas Mohr
14 *
15 * Project Odin Software License can be found in LICENSE.TXT
16 *
17 */
18
19#include <odin.h>
20#include <odinwrap.h>
21#include <os2sel.h>
22
23#include <os2win.h>
24#include <winnt.h>
25#include <winnls.h>
26#include <stdlib.h>
27#include <string.h>
28#include <ctype.h>
29#include <heapstring.h>
30
31#include <misc.h>
32#include "heap.h"
33#include <handlemanager.h>
34#include "wprocess.h"
35#include "oslibdos.h"
36#include <versionos2.h>
37#include "profile.h"
38
39#define DBG_LOCALLOG DBG_version
40#include "dbglocal.h"
41
42typedef struct
43{
44 LONG getVersion16;
45 LONG getVersion;
46 OSVERSIONINFOA getVersionEx;
47} VERSION_DATA;
48
49static VERSION_DATA VersionData[WINVERSION_MAX] =
50{
51 // Windows 98
52 {
53 0x070A5F03,
54 0xC0000A04,
55 {
56 sizeof(OSVERSIONINFOA), 4, 10, 0x40A07CE,
57 VER_PLATFORM_WIN32_WINDOWS, "Win98"
58 }
59 },
60 // Windows ME
61 {
62 0x07005F03, /* Assuming DOS 7 like the other Win9x */
63 0xC0005A04,
64 {
65 sizeof(OSVERSIONINFOA), 4, 90, 0x45A0BB8,
66 VER_PLATFORM_WIN32_WINDOWS, " "
67 }
68 },
69 // Windows NT 4.0 (SP6)
70 {
71 0x05000A03,
72 ODINNT_VERSION,
73 {
74 sizeof(OSVERSIONINFOA), ODINNT_MAJOR_VERSION, ODINNT_MINOR_VERSION,
75 ODINNT_BUILD_NR, VER_PLATFORM_WIN32_NT, ODINNT_CSDVERSION
76 }
77 },
78 // Windows 2000 (SP2)
79 {
80 0x05005F03,
81 0x08930005,
82 {
83 sizeof(OSVERSIONINFOA), 5, 0, 0x893,
84 VER_PLATFORM_WIN32_NT, "Service Pack 2"
85 }
86 },
87 // Windows XP
88 {
89 0x05005F03, /* Assuming DOS 5 like the other NT */
90 0x0A280105,
91 {
92 sizeof(OSVERSIONINFOA), 5, 1, 0xA28,
93 VER_PLATFORM_WIN32_NT, ""
94 }
95 }
96};
97
98static BOOL fCheckVersion = FALSE;
99static int winversion = WINVERSION_NT40;
100
101//******************************************************************************
102//******************************************************************************
103void WIN32API OdinSetVersion(ULONG version)
104{
105 switch(version) {
106 case WINVERSION_WIN98:
107 case WINVERSION_WINME:
108 case WINVERSION_NT40:
109 case WINVERSION_WIN2000:
110 case WINVERSION_WINXP:
111 break;
112 default:
113 DebugInt3();
114 return;
115 }
116 winversion = version;
117}
118//******************************************************************************
119//******************************************************************************
120void CheckVersion()
121{
122 char szVersion[16];
123
124 if(PROFILE_GetOdinIniString(PROFILE_WINVERSION_SECTION, PROFILE_WINVERSION_KEY,
125 "", szVersion, sizeof(szVersion)-1) > 1)
126 {
127 if(!stricmp(szVersion, PROFILE_WINVERSION_WIN98)) {
128 winversion = WINVERSION_WIN98;
129 }
130 else
131 if(!stricmp(szVersion, PROFILE_WINVERSION_WINME)) {
132 winversion = WINVERSION_WINME;
133 }
134 else
135 if(!stricmp(szVersion, PROFILE_WINVERSION_WIN2000)) {
136 winversion = WINVERSION_WIN2000;
137 }
138 else
139 if(!stricmp(szVersion, PROFILE_WINVERSION_WINXP)) {
140 winversion = WINVERSION_WINXP;
141 }
142 }
143 fCheckVersion = TRUE;
144}
145//******************************************************************************
146//******************************************************************************
147BOOL WIN32API GetVersionExA(OSVERSIONINFOA *lpVersionInformation)
148{
149 dprintf(("KERNEL32: GetVersionExA %x", lpVersionInformation));
150
151 if(lpVersionInformation == NULL)
152 {
153 dprintf(("ERROR: invalid parameter"));
154 SetLastError(ERROR_INVALID_PARAMETER);
155 return(FALSE);
156 }
157 if(lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOA))
158 {
159 dprintf(("ERROR: buffer too small (%d != %d)", lpVersionInformation->dwOSVersionInfoSize, sizeof(OSVERSIONINFOA)));
160 SetLastError(ERROR_INSUFFICIENT_BUFFER);
161 return(FALSE);
162 }
163
164 if(fCheckVersion == FALSE) {
165 CheckVersion();
166 }
167 lpVersionInformation->dwMajorVersion = VersionData[winversion].getVersionEx.dwMajorVersion;
168 lpVersionInformation->dwMinorVersion = VersionData[winversion].getVersionEx.dwMinorVersion;
169 lpVersionInformation->dwBuildNumber = VersionData[winversion].getVersionEx.dwBuildNumber;
170 lpVersionInformation->dwPlatformId = VersionData[winversion].getVersionEx.dwPlatformId;
171 strcpy(lpVersionInformation->szCSDVersion, VersionData[winversion].getVersionEx.szCSDVersion );
172
173 SetLastError(ERROR_SUCCESS);
174 return(TRUE);
175}
176//******************************************************************************
177//******************************************************************************
178BOOL WIN32API GetVersionExW(OSVERSIONINFOW *lpVersionInformation)
179{
180 dprintf(("KERNEL32: GetVersionExW %x", lpVersionInformation));
181
182 if(lpVersionInformation == NULL)
183 {
184 dprintf(("ERROR: invalid parameter"));
185 SetLastError(ERROR_INVALID_PARAMETER);
186 return(FALSE);
187 }
188 if(lpVersionInformation->dwOSVersionInfoSize != sizeof(OSVERSIONINFOW))
189 {
190 dprintf(("ERROR: buffer too small"));
191 SetLastError(ERROR_INSUFFICIENT_BUFFER);
192 return(FALSE);
193 }
194
195 if(fCheckVersion == FALSE) {
196 CheckVersion();
197 }
198 lpVersionInformation->dwMajorVersion = VersionData[winversion].getVersionEx.dwMajorVersion;
199 lpVersionInformation->dwMinorVersion = VersionData[winversion].getVersionEx.dwMinorVersion;
200 lpVersionInformation->dwBuildNumber = VersionData[winversion].getVersionEx.dwBuildNumber;
201 lpVersionInformation->dwPlatformId = VersionData[winversion].getVersionEx.dwPlatformId;
202 lstrcpyAtoW(lpVersionInformation->szCSDVersion, VersionData[winversion].getVersionEx.szCSDVersion);
203 SetLastError(ERROR_SUCCESS);
204 return(TRUE);
205}
206//******************************************************************************
207//******************************************************************************
208LONG WIN32API GetVersion()
209{
210 dprintf(("KERNEL32: GetVersion"));
211 // highword 0 = NT, lowword high byte major ver, low byte minor ver
212/* @@@PH 98/04/04 MFC30 makes assumptions about process control block */
213/* structures that lead to crashes if we don't identify as NT */
214
215 if(fCheckVersion == FALSE) {
216 CheckVersion();
217 }
218 return VersionData[winversion].getVersion;
219}
220//******************************************************************************
221//******************************************************************************
Note: See TracBrowser for help on using the repository browser.