source: trunk/tools/install/odininst.cpp@ 10367

Last change on this file since 10367 was 10169, checked in by sandervl, 22 years ago

YD: check if program files registry entry already exists and verify it's valid

File size: 47.6 KB
Line 
1/* $Id: odininst.cpp,v 1.14 2003-07-16 10:51:10 sandervl Exp $ */
2/*
3 * Odin WarpIn installation app
4 *
5 * Creates:
6 * - SYSTEMDIR\drivers
7 * - SYSTEMDIR\drivers\etc
8 * - WINDOWSDIR\SYSTEM
9 * - WINDOWSDIR\AppData
10 * - WINDOWSDIR\Cache
11 * - WINDOWSDIR\Cookies
12 * - WINDOWSDIR\Desktop
13 * - WINDOWSDIR\Favorites
14 * - WINDOWSDIR\Fonts
15 * - WINDOWSDIR\History
16 * - WINDOWSDIR\NetHood
17 * - WINDOWSDIR\My Documents
18 * - WINDOWSDIR\PrintHood
19 * - WINDOWSDIR\Recent
20 * - WINDOWSDIR\SendTo
21 * - WINDOWSDIR\Start Menu
22 * - WINDOWSDIR\Start Menu\Programs
23 * - WINDOWSDIR\Start Menu\Programs\Startup
24 * - WINDOWSDIR\ShellNew
25 * - x:\Program Files
26 * - x:\Program Files\Common Files
27 * - WINDOWSDIR\Temp
28 * - and a minimal system registry
29 *
30 * Copyright 1999-2001 Sander van Leeuwen (sandervl@xs4all.nl)
31 *
32 * Project Odin Software License can be found in LICENSE.TXT
33 *
34 */
35#include <os2win.h>
36#include <io.h>
37#include <string.h>
38#include <stdio.h>
39#include <heapstring.h>
40#include <ctype.h>
41#include "winreg.h"
42#include "global.h"
43#include "winnt.h"
44#include "winerror.h"
45#include "winreg.h"
46#include "winnls.h"
47#include "debugtools.h"
48#include <odininst.h>
49#include <win\options.h>
50#include <versionos2.h>
51#include <time.h>
52
53BOOL CreateSystemDirectories();
54BOOL SetupControlPanelKeys();
55BOOL InitSystemAndRegistry();
56void SetupTimeZoneInfo();
57
58//******************************************************************************
59//******************************************************************************
60//[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows]
61//"Directory"=hex(2):25,53,79,73,74,65,6d,52,6f,6f,74,25,00
62//"SystemDirectory"=hex(2):25,53,79,73,74,65,6d,52,6f,6f,74,25,5c,73,79,73,74,65,\
63// 6d,33,32,00
64//"ErrorMode"=dword:00000000
65//"NoInteractiveServices"=dword:00000000
66//"CSDVersion"=dword:00000300
67BYTE ShutdownTime[] = {0x44,0x5e,0xf2,0xbb,0x84,0x41,0xbf,0x01};
68
69static char DIR_Windows[260];
70static char DIR_System[260];
71
72//******************************************************************************
73//******************************************************************************
74int main(int argc, char *argv[])
75{
76 char *installdate;
77 time_t anytime;
78
79 time(&anytime);
80 installdate = asctime(localtime(&anytime));
81 PROFILE_SetOdinIniString(ODINSYSTEM_SECTION, "INSTALLDATE", installdate);
82
83 InitSystemAndRegistry();
84 CreateSystemDirectories();
85 SetupControlPanelKeys();
86
87 SetupTimeZoneInfo();
88 return 0;
89}
90//******************************************************************************
91//******************************************************************************
92char *InternalGetWindowsDirectory()
93{
94 static char fInit = FALSE;
95
96 if(fInit == FALSE) {
97 GetWindowsDirectory(DIR_Windows, sizeof(DIR_Windows)-1);
98 fInit = TRUE;
99 }
100 return DIR_Windows;
101}
102//******************************************************************************
103//******************************************************************************
104char *InternalGetSystemDirectory()
105{
106 static char fInit = FALSE;
107
108 if(fInit == FALSE) {
109 GetSystemDirectory(DIR_System, sizeof(DIR_System)-1);
110 fInit = TRUE;
111 }
112 return DIR_System;
113}
114//******************************************************************************
115//******************************************************************************
116BOOL InitSystemAndRegistry()
117{
118 HKEY hkey, hkey1;
119 char *buf;
120 DWORD val;
121 char digbuf[16];
122 char shellpath[260];
123
124 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Control\\Windows",&hkey)!=ERROR_SUCCESS) {
125 dprintf(("InitRegistry: Unable to register system information\n"));
126 return FALSE;
127 }
128 buf = InternalGetWindowsDirectory();
129 RegSetValueEx(hkey,"Directory",0,REG_BINARY, (LPBYTE)buf, strlen(buf)+1);
130 buf = InternalGetSystemDirectory();
131 RegSetValueEx(hkey,"SystemDirectory",0,REG_BINARY, (LPBYTE)buf, strlen(buf)+1);
132 val = 0;
133 RegSetValueEx(hkey,"ErrorMode",0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
134 val = 0;
135 RegSetValueEx(hkey,"NoInteractiveServices",0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
136 val = ODINNT_BUILD_NR;
137 RegSetValueEx(hkey,"CSDVersion",0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
138 RegSetValueEx(hkey,"ShutdownTime",0,REG_DWORD, (LPBYTE)ShutdownTime, sizeof(ShutdownTime));
139 RegCloseKey(hkey);
140
141 //Software\Microsoft\Windows\CurrentVersion\RunOnce
142 if(RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce",&hkey)!=ERROR_SUCCESS) {
143 dprintf(("InitRegistry: Unable to register system information (2)"));
144 return FALSE;
145 }
146 RegCloseKey(hkey);
147
148 //System\CurrentControlSet\Control\Session Manager
149 if(RegCreateKey(HKEY_LOCAL_MACHINE,"System\\CurrentControlSet\\Control\\Session Manager",&hkey)!=ERROR_SUCCESS) {
150 dprintf(("InitRegistry: Unable to register system information (2)"));
151 return FALSE;
152 }
153 RegCloseKey(hkey);
154
155 if(RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\iexplore.exe",&hkey)!=ERROR_SUCCESS) {
156 dprintf(("InitRegistry: Unable to register system information (2)"));
157 return FALSE;
158 }
159 strcpy(shellpath, InternalGetWindowsDirectory());
160 strcat(shellpath, "\\IEXPLORE.EXE");
161 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)shellpath, strlen(shellpath)+1);
162 RegCloseKey(hkey);
163
164
165 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",&hkey)!=ERROR_SUCCESS) {
166 dprintf(("InitRegistry: Unable to register system information (2)"));
167 return FALSE;
168 }
169 buf = InternalGetSystemDirectory();
170 RegSetValueEx(hkey,"SystemRoot",0,REG_SZ, (LPBYTE)buf, strlen(buf)+1);
171 RegSetValueEx(hkey,"PathName",0,REG_SZ, (LPBYTE)buf, strlen(buf)+1);
172 sprintf(digbuf, "%d", ODINNT_BUILD_NR);
173 RegSetValueEx(hkey,"CurrentBuildNumber",0,REG_SZ, (LPBYTE)digbuf, strlen(digbuf)+1);
174 RegSetValueEx(hkey,"CurrentType",0,REG_SZ, (LPBYTE)ODINNT_OSTYPE_UNI, sizeof(ODINNT_OSTYPE_UNI));
175 RegSetValueEx(hkey,"CSDVersion",0,REG_SZ, (LPBYTE)ODINNT_CSDVERSION, sizeof(ODINNT_CSDVERSION));
176 RegSetValueEx(hkey,"SoftwareType",0,REG_SZ, (LPBYTE)ODINNT_SOFTWARE_TYPE, sizeof(ODINNT_SOFTWARE_TYPE));
177
178 sprintf(digbuf, "%d.%d", ODINNT_MAJOR_VERSION, ODINNT_MINOR_VERSION);
179 RegSetValueEx(hkey,"CurrentVersion",0,REG_SZ, (LPBYTE)digbuf, strlen(digbuf)+1);
180
181 val = (DWORD)time(NULL); //todo: Correct format???
182 RegSetValueEx(hkey,"InstallDate",0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
183
184 RegCloseKey(hkey);
185 //todo: productid, registered org/owner, sourcepath,
186
187//#
188//# Entries for OLE32 (COM/OLE base)
189//#
190//
191//# OLE32's built-in marshaler, handles standard interfaces such as IClassFactory.
192//# (PSFactoryBuffer = Proxy/Stub factory)
193//[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000320-0000-0000-C000-000000000046}]
194//@="PSFactoryBuffer"
195//
196//[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000320-0000-0000-C000-000000000046}\InProcServer32]
197//@="ole32.dll"
198//"ThreadingModel"="Both"
199 #define PSFACTORYBUFFER "PSFactoryBuffer"
200 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00000320-0000-0000-C000-000000000046}",&hkey)!=ERROR_SUCCESS) {
201 goto initreg_error;
202 }
203 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)PSFACTORYBUFFER, sizeof(PSFACTORYBUFFER));
204 RegCloseKey(hkey);
205 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00000320-0000-0000-C000-000000000046}\\InProcServer32",&hkey)!=ERROR_SUCCESS) {
206 goto initreg_error;
207 }
208 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)CLASS_OLE32DLL, sizeof(CLASS_OLE32DLL));
209 RegSetValueEx(hkey, COM_THREADMODEL, 0, REG_SZ, (LPBYTE)THREAD_BOTH, sizeof(THREAD_BOTH));
210 RegCloseKey(hkey);
211
212//# IUnknown, the superclass for everything COM/OLE.
213//[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{00000000-0000-0000-C000-000000000046}]
214//@="IUnknown"
215//
216//[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{00000000-0000-0000-C000-000000000046}\BaseInterface]
217//@=""
218//
219//[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{00000000-0000-0000-C000-000000000046}\NumMethods]
220//@="3"
221 #define IUNKNOWN "IUnknown"
222 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00000000-0000-0000-C000-000000000046}",&hkey)!=ERROR_SUCCESS) {
223 goto initreg_error;
224 }
225 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)IUNKNOWN, sizeof(IUNKNOWN));
226 RegCloseKey(hkey);
227 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00000000-0000-0000-C000-000000000046}\\BaseInterface",&hkey)!=ERROR_SUCCESS) {
228 goto initreg_error;
229 }
230 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)"", 1);
231 RegCloseKey(hkey);
232 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00000000-0000-0000-C000-000000000046}\\NumMethods",&hkey)!=ERROR_SUCCESS) {
233 goto initreg_error;
234 }
235 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)"3", 2);
236 RegCloseKey(hkey);
237
238//# IClassFactory, standard interface for creating instances of classes.
239//[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{00000001-0000-0000-C000-000000000046}]
240//@="IClassFactory"
241//
242//[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{00000001-0000-0000-C000-000000000046}\NumMethods]
243//@="5"
244//
245//[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{00000001-0000-0000-C000-000000000046}\ProxyStubClsid32]
246//@="{00000320-0000-0000-C000-000000000046}"
247 #define ICLASSFACTORY "IClassFactory"
248 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00000001-0000-0000-C000-000000000046}",&hkey)!=ERROR_SUCCESS) {
249 goto initreg_error;
250 }
251 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)ICLASSFACTORY, sizeof(ICLASSFACTORY));
252 RegCloseKey(hkey);
253 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00000001-0000-0000-C000-000000000046}\\NumMethods",&hkey)!=ERROR_SUCCESS) {
254 goto initreg_error;
255 }
256 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)"5", 2);
257 RegCloseKey(hkey);
258 #define PSFACTORY_GUID "{00000320-0000-0000-C000-000000000046}"
259 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00000001-0000-0000-C000-000000000046}\\ProxyStubClsid32",&hkey)!=ERROR_SUCCESS) {
260 goto initreg_error;
261 }
262 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)PSFACTORY_GUID, sizeof(PSFACTORY_GUID));
263 RegCloseKey(hkey);
264
265//#
266//# Entries for OLEAUT32 (OLE Automation)
267//#
268//
269//# The Universal Marshaler, also known as the Type Library Marshaler.
270//# (PSOAInterface = Proxy/Stub OLE Automation interface)
271//[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00020424-0000-0000-C000-000000000046}]
272//@="PSOAInterface"
273//
274//[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00020424-0000-0000-C000-000000000046}\InProcServer32]
275//@="oleaut32.dll"
276//"ThreadingModel"="Both"
277 #define PSOAINTERFACE "PSOAInterface"
278 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00020424-0000-0000-C000-000000000046}",&hkey)!=ERROR_SUCCESS) {
279 goto initreg_error;
280 }
281 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)PSOAINTERFACE, sizeof(PSOAINTERFACE));
282 RegCloseKey(hkey);
283 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00020424-0000-0000-C000-000000000046}\\InProcServer32",&hkey)!=ERROR_SUCCESS) {
284 goto initreg_error;
285 }
286 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)CLASS_OLEAUT32DLL, sizeof(CLASS_OLEAUT32DLL));
287 RegSetValueEx(hkey, COM_THREADMODEL, 0, REG_SZ, (LPBYTE)THREAD_BOTH, sizeof(THREAD_BOTH));
288 RegCloseKey(hkey);
289
290
291 //Shell32 & IE related keys
292 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00021400-0000-0000-C000-000000000046}]
293 //@="Desktop"
294 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00021400-0000-0000-C000-000000000046}\InProcServer32]
295 //@="shell32.dll"
296 //ThreadingModel="Apartment"
297 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00021400-0000-0000-C000-000000000046}",&hkey)!=ERROR_SUCCESS) {
298 goto initreg_error;
299 }
300 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)CLASS_DESKTOP, sizeof(CLASS_DESKTOP));
301 RegCloseKey(hkey);
302 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00021400-0000-0000-C000-000000000046}\\InProcServer32",&hkey)!=ERROR_SUCCESS) {
303 goto initreg_error;
304 }
305 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)CLASS_SHELL32DLL, sizeof(CLASS_SHELL32DLL));
306 RegSetValueEx(hkey, COM_THREADMODEL, 0, REG_SZ, (LPBYTE)COM_THREAD_APARTMENT, sizeof(COM_THREAD_APARTMENT));
307 RegCloseKey(hkey);
308 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00021401-0000-0000-C000-000000000046}]
309 //@="Shortcut"
310 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00021401-0000-0000-C000-000000000046}\InProcServer32]
311 //@="shell32.dll"
312 //"ThreadingModel"="Apartment"
313 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00021401-0000-0000-C000-000000000046}\shellex\MayChangeDefaultMenu]
314 //@=""
315 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00021401-0000-0000-C000-000000000046}",&hkey)!=ERROR_SUCCESS) {
316 goto initreg_error;
317 }
318 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)CLASS_SHORTCUT, sizeof(CLASS_SHORTCUT));
319 RegCloseKey(hkey);
320 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00021401-0000-0000-C000-000000000046}\\InProcServer32",&hkey)!=ERROR_SUCCESS) {
321 goto initreg_error;
322 }
323 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)CLASS_SHELL32DLL, sizeof(CLASS_SHELL32DLL));
324 RegSetValueEx(hkey, COM_THREADMODEL, 0, REG_SZ, (LPBYTE)COM_THREAD_APARTMENT, sizeof(COM_THREAD_APARTMENT));
325 RegCloseKey(hkey);
326 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{00021401-0000-0000-C000-000000000046}\\shellex\\MayChangeDefaultMenu",&hkey)!=ERROR_SUCCESS) {
327 goto initreg_error;
328 }
329 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)"", 0);
330 RegCloseKey(hkey);
331
332 //# Entries for IWebBrowser
333 //# Used by Internet Explorer HTML-rendering control
334 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{8856f961-340a-11d0-a96b-00c04fd705a2}]
335 //@="Shortcut"
336 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{8856f961-340a-11d0-a96b-00c04fd705a2}\InProcServer32]
337 //@="shdocvw.dll"
338 //"ThreadingModel"="Apartment"
339 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{8856f961-340a-11d0-a96b-00c04fd705a2}\shellex\MayChangeDefaultMenu]
340 //@=""
341
342 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{8856f961-340a-11d0-a96b-00c04fd705a2}",&hkey)!=ERROR_SUCCESS) {
343 goto initreg_error;
344 }
345 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)CLASS_SHORTCUT, sizeof(CLASS_SHORTCUT));
346 RegCloseKey(hkey);
347
348 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{8856f961-340a-11d0-a96b-00c04fd705a2}\\InProcServer32",&hkey)!=ERROR_SUCCESS) {
349 goto initreg_error;
350 }
351 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)CLASS_SHDOCVW, sizeof(CLASS_SHDOCVW));
352 RegSetValueEx(hkey, COM_THREADMODEL, 0, REG_SZ, (LPBYTE)COM_THREAD_APARTMENT, sizeof(COM_THREAD_APARTMENT));
353 RegCloseKey(hkey);
354
355 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\CLSID\\{8856f961-340a-11d0-a96b-00c04fd705a2}\\shellex\\MayChangeDefaultMenu",&hkey)!=ERROR_SUCCESS) {
356 goto initreg_error;
357 }
358 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)"", 1);
359 RegCloseKey(hkey);
360
361 //Now the Ddraw & dsound registry keys:
362 //HKEY_CLASSES_ROOT\DirectDraw = DirectDraw Object
363 //HKEY_CLASSES_ROOT\DirectDraw\CLSID = {D7B70EE0-4340-11CF-B063-0020AFC2CD35}
364 //HKEY_CLASSES_ROOT\CLSID\{D7B70EE0-4340-11CF-B063-0020AFC2CD35} = DirectDraw Object
365 //HKEY_CLASSES_ROOT\CLSID\{D7B70EE0-4340-11CF-B063-0020AFC2CD35}\InprocServer32 = ddraw.dll
366 if(RegCreateKey(HKEY_CLASSES_ROOT,"DirectDraw",&hkey)!=ERROR_SUCCESS) {
367 goto initreg_error;
368 }
369 RegSetValueEx(hkey, "", 0, REG_SZ, (LPBYTE)DDRAW_DEFAULT, sizeof(DDRAW_DEFAULT));
370 if(RegCreateKey(hkey,COM_CLASS_ID,&hkey1)!=ERROR_SUCCESS) {
371 RegCloseKey(hkey);
372 goto initreg_error;
373 }
374 RegSetValueEx(hkey1,"",0,REG_SZ, (LPBYTE)DDRAW_CLASSID, sizeof(DDRAW_CLASSID));
375 RegCloseKey(hkey1);
376 RegCloseKey(hkey);
377
378 if(RegCreateKey(HKEY_CLASSES_ROOT, COM_CLASS_ID"\\"DDRAW_CLASSID ,&hkey)!=ERROR_SUCCESS) {
379 goto initreg_error;
380 }
381 RegSetValueEx(hkey,"",0,REG_SZ, (LPBYTE)DDRAW_DEFAULT, sizeof(DDRAW_DEFAULT));
382 if(RegCreateKey(hkey,COM_INPROCSERVER, &hkey1)!=ERROR_SUCCESS) {
383 RegCloseKey(hkey);
384 goto initreg_error;
385 }
386 RegSetValueEx(hkey1,"",0,REG_SZ, (LPBYTE)DDRAW_DLL, sizeof(DDRAW_DLL));
387 RegSetValueEx(hkey1, COM_THREADMODEL, 0,REG_SZ, (LPBYTE)THREAD_BOTH, sizeof(THREAD_BOTH));
388 RegCloseKey(hkey1);
389 RegCloseKey(hkey);
390
391 //HKEY_CLASSES_ROOT\DirectDrawClipper = DirectDraw Clipper Object
392 //HKEY_CLASSES_ROOT\DirectDrawClipper\CLSID = {593817A0-7DB3-11CF-A2DE-00AA00B93356}
393 //HKEY_CLASSES_ROOT\CLSID\{593817A0-7DB3-11CF-A2DE-00AA00B93356} = DirectDraw Clipper Object
394 //HKEY_CLASSES_ROOT\CLSID\{593817A0-7DB3-11CF-A2DE-00AA00B93356}\InprocServer32 = ddraw.dll
395 if(RegCreateKey(HKEY_CLASSES_ROOT,"DirectDrawClipper",&hkey)!=ERROR_SUCCESS) {
396 goto initreg_error;
397 }
398 RegSetValueEx(hkey,"",0,REG_SZ, (LPBYTE)DDRAW_CLIPPER_DEFAULT, sizeof(DDRAW_CLIPPER_DEFAULT));
399 if(RegCreateKey(hkey,COM_CLASS_ID,&hkey1)!=ERROR_SUCCESS) {
400 RegCloseKey(hkey);
401 goto initreg_error;
402 }
403 RegSetValueEx(hkey1,"",0,REG_SZ, (LPBYTE)DDRAW_CLIPPER_CLASSID, sizeof(DDRAW_CLIPPER_CLASSID));
404 RegCloseKey(hkey1);
405 RegCloseKey(hkey);
406
407 if(RegCreateKey(HKEY_CLASSES_ROOT, COM_CLASS_ID"\\"DDRAW_CLIPPER_CLASSID,&hkey)!=ERROR_SUCCESS) {
408 goto initreg_error;
409 }
410 RegSetValueEx(hkey,"",0,REG_SZ, (LPBYTE)DDRAW_CLIPPER_DEFAULT, sizeof(DDRAW_CLIPPER_DEFAULT));
411 if(RegCreateKey(hkey,COM_INPROCSERVER, &hkey1)!=ERROR_SUCCESS) {
412 RegCloseKey(hkey);
413 goto initreg_error;
414 }
415 RegSetValueEx(hkey1,"",0,REG_SZ, (LPBYTE)DDRAW_DLL, sizeof(DDRAW_DLL));
416 RegSetValueEx(hkey1, COM_THREADMODEL, 0,REG_SZ, (LPBYTE)THREAD_BOTH, sizeof(THREAD_BOTH));
417 RegCloseKey(hkey1);
418 RegCloseKey(hkey);
419
420 //HKEY_CLASSES_ROOT\DirectSound = DirectSound Object
421 //HKEY_CLASSES_ROOT\DirectSound\CLSID = {47D4D946-62E8-11cf-93BC-444553540000}
422 //HKEY_CLASSES_ROOT\CLSID\{47D4D946-62E8-11cf-93BC-444553540000} = DirectSound Object
423 //HKEY_CLASSES_ROOT\CLSID\{47D4D946-62E8-11cf-93BC-444553540000}\InprocServer32 = dsound.dll
424 if(RegCreateKey(HKEY_CLASSES_ROOT,"DirectSound",&hkey)!=ERROR_SUCCESS) {
425 goto initreg_error;
426 }
427 RegSetValueEx(hkey,"",0,REG_SZ, (LPBYTE)DSOUND_DEFAULT, sizeof(DSOUND_DEFAULT));
428 if(RegCreateKey(hkey,COM_CLASS_ID,&hkey1)!=ERROR_SUCCESS) {
429 RegCloseKey(hkey);
430 goto initreg_error;
431 }
432 RegSetValueEx(hkey1,"",0,REG_SZ, (LPBYTE)DSOUND_CLASSID, sizeof(DSOUND_CLASSID));
433 RegCloseKey(hkey1);
434 RegCloseKey(hkey);
435
436 if(RegCreateKey(HKEY_CLASSES_ROOT, COM_CLASS_ID"\\"DSOUND_CLASSID ,&hkey)!=ERROR_SUCCESS) {
437 goto initreg_error;
438 }
439 RegSetValueEx(hkey,"",0,REG_SZ, (LPBYTE)DSOUND_DEFAULT, sizeof(DSOUND_DEFAULT));
440 if(RegCreateKey(hkey,COM_INPROCSERVER, &hkey1)!=ERROR_SUCCESS) {
441 RegCloseKey(hkey);
442 goto initreg_error;
443 }
444 RegSetValueEx(hkey1,"",0,REG_SZ, (LPBYTE)DSOUND_DLL, sizeof(DSOUND_DLL));
445 RegSetValueEx(hkey1, COM_THREADMODEL, 0,REG_SZ, (LPBYTE)THREAD_BOTH, sizeof(THREAD_BOTH));
446 RegCloseKey(hkey1);
447 RegCloseKey(hkey);
448
449 //DirectPlay
450 if(RegCreateKey(HKEY_LOCAL_MACHINE, "Software\\CLASSES\\CLSID\\"DPLAYX_CLASSID ,&hkey)!=ERROR_SUCCESS) {
451 goto initreg_error;
452 }
453 RegSetValueEx(hkey,"",0,REG_SZ, (LPBYTE)DPLAYX_DEFAULT, sizeof(DPLAYX_DEFAULT));
454 if(RegCreateKey(hkey,COM_INPROCSERVER, &hkey1)!=ERROR_SUCCESS) {
455 RegCloseKey(hkey);
456 goto initreg_error;
457 }
458 RegSetValueEx(hkey1,"",0,REG_SZ, (LPBYTE)DPLAYX_DLL, sizeof(DPLAYX_DLL));
459 RegSetValueEx(hkey1, COM_THREADMODEL, 0,REG_SZ, (LPBYTE)THREAD_BOTH, sizeof(THREAD_BOTH));
460 RegCloseKey(hkey1);
461 RegCloseKey(hkey);
462
463 //DirectPlay Lobby
464 if(RegCreateKey(HKEY_LOCAL_MACHINE, "Software\\CLASSES\\CLSID\\"DPLAYX_LOBBY_CLASSID ,&hkey)!=ERROR_SUCCESS) {
465 goto initreg_error;
466 }
467 RegSetValueEx(hkey,"",0,REG_SZ, (LPBYTE)DPLAYX_LOBBY_DEFAULT, sizeof(DPLAYX_LOBBY_DEFAULT));
468 if(RegCreateKey(hkey,COM_INPROCSERVER, &hkey1)!=ERROR_SUCCESS) {
469 RegCloseKey(hkey);
470 goto initreg_error;
471 }
472 RegSetValueEx(hkey1,"",0,REG_SZ, (LPBYTE)DPLAYX_LOBBY_DLL, sizeof(DPLAYX_LOBBY_DLL));
473 RegSetValueEx(hkey1, COM_THREADMODEL, 0,REG_SZ, (LPBYTE)THREAD_BOTH, sizeof(THREAD_BOTH));
474 RegCloseKey(hkey1);
475 RegCloseKey(hkey);
476
477//#
478//# Entries for quartz.dll
479//#
480
481 //Quartz.dll keys
482 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{CDA42200-BD88-11d0-BD4E-00A0C911CE86}]
483 //@="Filter Mapper2"
484 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{CDA42200-BD88-11d0-BD4E-00A0C911CE86}\InprocServer32]
485 //@="G:\\WINNT\\System32\\quartz.dll"
486 //"ThreadingModel"="Both"
487 if(RegCreateKey(HKEY_LOCAL_MACHINE, "Software\\CLASSES\\CLSID\\"QUARTZ_FILTER_CLASSID ,&hkey)!=ERROR_SUCCESS) {
488 goto initreg_error;
489 }
490 RegSetValueEx(hkey,"",0,REG_SZ, (LPBYTE)QUARTZ_FILTER_DEFAULT, sizeof(QUARTZ_FILTER_DEFAULT));
491 if(RegCreateKey(hkey,COM_INPROCSERVER, &hkey1)!=ERROR_SUCCESS) {
492 RegCloseKey(hkey);
493 goto initreg_error;
494 }
495 RegSetValueEx(hkey1,"",0,REG_SZ, (LPBYTE)QUARTZ_DLL, sizeof(QUARTZ_DLL));
496 RegSetValueEx(hkey1, COM_THREADMODEL, 0,REG_SZ, (LPBYTE)THREAD_BOTH, sizeof(THREAD_BOTH));
497 RegCloseKey(hkey1);
498 RegCloseKey(hkey);
499
500 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{CDBD8D00-C193-11D0-BD4E-00A0C911CE86}]
501 //@="CMediaPropertyBag"
502 //
503 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{CDBD8D00-C193-11D0-BD4E-00A0C911CE86}\InprocServer32]
504 //@="G:\\WINNT\\System32\\quartz.dll"
505 //"ThreadingModel"="Both"
506 if(RegCreateKey(HKEY_LOCAL_MACHINE, "Software\\CLASSES\\CLSID\\"QUARTZ_MEDIAPROP_CLASSID ,&hkey)!=ERROR_SUCCESS) {
507 goto initreg_error;
508 }
509 RegSetValueEx(hkey,"",0,REG_SZ, (LPBYTE)QUARTZ_MEDIAPROP_DEFAULT, sizeof(QUARTZ_MEDIAPROP_DEFAULT));
510 if(RegCreateKey(hkey,COM_INPROCSERVER, &hkey1)!=ERROR_SUCCESS) {
511 RegCloseKey(hkey);
512 goto initreg_error;
513 }
514 RegSetValueEx(hkey1,"",0,REG_SZ, (LPBYTE)QUARTZ_DLL, sizeof(QUARTZ_DLL));
515 RegSetValueEx(hkey1, COM_THREADMODEL, 0,REG_SZ, (LPBYTE)THREAD_BOTH, sizeof(THREAD_BOTH));
516 RegCloseKey(hkey1);
517 RegCloseKey(hkey);
518
519 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{79376820-07D0-11CF-A24D-0020AFD79767}]
520 //@="DirectSound Audio Renderer"
521 //
522 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{79376820-07D0-11CF-A24D-0020AFD79767}\InprocServer32]
523 //@="G:\\WINNT\\System32\\quartz.dll"
524 //"ThreadingModel"="Both"
525 if(RegCreateKey(HKEY_LOCAL_MACHINE, "Software\\CLASSES\\CLSID\\"QUARTZ_DSOUNDREND_CLASSID ,&hkey)!=ERROR_SUCCESS) {
526 goto initreg_error;
527 }
528 RegSetValueEx(hkey,"",0,REG_SZ, (LPBYTE)QUARTZ_DSOUNDREND_DEFAULT, sizeof(QUARTZ_DSOUNDREND_DEFAULT));
529 if(RegCreateKey(hkey,COM_INPROCSERVER, &hkey1)!=ERROR_SUCCESS) {
530 RegCloseKey(hkey);
531 goto initreg_error;
532 }
533 RegSetValueEx(hkey1,"",0,REG_SZ, (LPBYTE)QUARTZ_DLL, sizeof(QUARTZ_DLL));
534 RegSetValueEx(hkey1, COM_THREADMODEL, 0,REG_SZ, (LPBYTE)THREAD_BOTH, sizeof(THREAD_BOTH));
535 RegCloseKey(hkey1);
536 RegCloseKey(hkey);
537
538 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{e436ebb4-524f-11ce-9f53-0020af0ba770}]
539 //@="Filter Graph Control Plug In Distributor"
540 //[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{e436ebb4-524f-11ce-9f53-0020af0ba770}\InprocServer32]
541 //@="G:\\WINNT\\System32\\quartz.dll"
542 //"ThreadingModel"="Both"
543 if(RegCreateKey(HKEY_LOCAL_MACHINE, "Software\\CLASSES\\CLSID\\"QUARTZ_FILTERGRAPHDIST_CLASSID ,&hkey)!=ERROR_SUCCESS) {
544 goto initreg_error;
545 }
546 RegSetValueEx(hkey,"",0,REG_SZ, (LPBYTE)QUARTZ_FILTERGRAPHDIST_DEFAULT, sizeof(QUARTZ_FILTERGRAPHDIST_DEFAULT));
547 if(RegCreateKey(hkey,COM_INPROCSERVER, &hkey1)!=ERROR_SUCCESS) {
548 RegCloseKey(hkey);
549 goto initreg_error;
550 }
551 RegSetValueEx(hkey1,"",0,REG_SZ, (LPBYTE)QUARTZ_DLL, sizeof(QUARTZ_DLL));
552 RegSetValueEx(hkey1, COM_THREADMODEL, 0,REG_SZ, (LPBYTE)THREAD_BOTH, sizeof(THREAD_BOTH));
553 RegCloseKey(hkey1);
554 RegCloseKey(hkey);
555
556
557#if 0
558 if(RegCreateKey(HKEY_LOCAL_MACHINE, "Software\\CLASSES\\CLSID\\E436EBB3-524F-11CE-9F53-0020AF0BA770" ,&hkey)!=ERROR_SUCCESS) {
559 goto initreg_error;
560 }
561 RegSetValueEx(hkey,"",0,REG_SZ, (LPBYTE)QUARTZ_FILTERGRAPHDIST_DEFAULT, sizeof(QUARTZ_FILTERGRAPHDIST_DEFAULT));
562 if(RegCreateKey(hkey,COM_INPROCSERVER, &hkey1)!=ERROR_SUCCESS) {
563 RegCloseKey(hkey);
564 goto initreg_error;
565 }
566 RegSetValueEx(hkey1,"",0,REG_SZ, (LPBYTE)QUARTZ_DLL, sizeof(QUARTZ_DLL));
567 RegSetValueEx(hkey1, COM_THREADMODEL, 0,REG_SZ, (LPBYTE)THREAD_BOTH, sizeof(THREAD_BOTH));
568 RegCloseKey(hkey1);
569 RegCloseKey(hkey);
570
571# CLSID_FilterGraph
572[HKEY_CLASSES_ROOT\CLSID\{E436EBB3-524F-11CE-9F53-0020AF0BA770}\InprocServer32]
573@="quartz.dll"
574"ThreadingModel"="Both"
575
576# CLSID_SystemClock
577[HKEY_CLASSES_ROOT\CLSID\{E436EBB1-524F-11CE-9F53-0020AF0BA770}\InprocServer32]
578@="quartz.dll"
579"ThreadingModel"="Both"
580
581# CLSID_MemoryAllocator
582[HKEY_CLASSES_ROOT\CLSID\{1E651CC0-B199-11D0-8212-00C04FC32C45}\InprocServer32]
583@="quartz.dll"
584"ThreadingModel"="Both"
585#endif
586
587 //[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]
588 //"ProgramFilesDir"="C:\Program Files"
589 //"CommonFilesDir"="C:\Program Files\Common Files"
590 //# This is intended for a centrally managed (server) directory where system files and e.g. fonts can reside. Most installs have this set to C:\WINDOWS, though.
591 //"SharedDir"="C:\WINDOWS"
592 if(RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion",&hkey)!=ERROR_SUCCESS) {
593 goto initreg_error;
594 }
595 //Check if DIR_PROGRAM already created
596 val = sizeof(shellpath);
597 if (RegQueryValueEx(hkey, DIR_PROGRAM, 0, NULL, (LPBYTE)shellpath, &val) != ERROR_SUCCESS
598 || GetFileAttributes( shellpath) == -1) {
599 //Create x:\Program Files directory
600 strcpy(shellpath, InternalGetWindowsDirectory());
601 shellpath[2] = 0; //get drive
602 strcat(shellpath, "\\Program Files");
603 CreateDirectory(shellpath, NULL);
604 RegSetValueEx(hkey, DIR_PROGRAM, 0,REG_SZ, (LPBYTE)shellpath, strlen(shellpath)+1);
605
606 //Create x:\Program Files\Common Files directory
607 strcat(shellpath, "\\Common Files");
608 CreateDirectory(shellpath, NULL);
609 RegSetValueEx(hkey, DIR_PROGRAM_COMMON, 0,REG_SZ, (LPBYTE)shellpath, strlen(shellpath)+1);
610 }
611
612 strcpy(shellpath, InternalGetWindowsDirectory());
613 RegSetValueEx(hkey, DIR_SHARED, 0,REG_SZ, (LPBYTE)shellpath, strlen(shellpath)+1);
614
615 RegCloseKey(hkey);
616
617 //[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\VIDEO]
618 //"\\Device\\Video0"="\\REGISTRY\\Machine\\System\\ControlSet001\\Services\\mga64\\Device0"
619 //"\\Device\\Video1"="\\REGISTRY\\Machine\\System\\ControlSet001\\Services\\VgaSave\\Device0"
620 //"VgaCompatible"="\\Device\\Video1"
621 if(RegCreateKey(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\VIDEO",&hkey)!=ERROR_SUCCESS) {
622 goto initreg_error;
623 }
624 RegSetValueEx(hkey,"\\Device\\Video0",0,REG_SZ, (LPBYTE)HARDWARE_VIDEO_GRADD, sizeof(HARDWARE_VIDEO_GRADD));
625 RegSetValueEx(hkey,"\\Device\\Video1",0,REG_SZ, (LPBYTE)HARDWARE_VIDEO_VGA, sizeof(HARDWARE_VIDEO_VGA));
626 RegSetValueEx(hkey, "VgaCompatible", 0,REG_SZ, (LPBYTE)HARDWARE_VIDEO_COMPATIBLE, sizeof(HARDWARE_VIDEO_COMPATIBLE));
627 RegCloseKey(hkey);
628
629 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Gradd\\Device0",&hkey)!=ERROR_SUCCESS) {
630 goto initreg_error;
631 }
632 RegSetValueEx(hkey,"Device Description", 0, REG_SZ, (LPBYTE)HARDWARE_VIDEO_GRADD_DESCRIPTION, sizeof(HARDWARE_VIDEO_GRADD_DESCRIPTION));
633 RegCloseKey(hkey);
634
635 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\VgaSave\\Device0",&hkey)!=ERROR_SUCCESS) {
636 goto initreg_error;
637 }
638 RegSetValueEx(hkey,"Device Description", 0, REG_SZ, (LPBYTE)HARDWARE_VIDEO_VGA_DESCRIPTION, sizeof(HARDWARE_VIDEO_VGA_DESCRIPTION));
639 RegCloseKey(hkey);
640
641 //Software\Microsoft\Multimedia\Sound Mapper
642 if(RegCreateKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Multimedia\\Sound Mapper",&hkey)!=ERROR_SUCCESS) {
643 goto initreg_error;
644 }
645 RegSetValueEx(hkey,"Playback", 0, REG_SZ, (LPBYTE)ODIN_WINMM_PLAYBACK, sizeof(ODIN_WINMM_PLAYBACK));
646 RegSetValueEx(hkey,"Record", 0, REG_SZ, (LPBYTE)ODIN_WINMM_RECORD, sizeof(ODIN_WINMM_RECORD));
647 RegCloseKey(hkey);
648
649 //Software\Microsoft\DirectX
650 if(RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\DirectX",&hkey)!=ERROR_SUCCESS) {
651 goto initreg_error;
652 }
653 RegSetValueEx(hkey,"",0,REG_SZ, (LPBYTE)"", 0);
654 RegSetValueEx(hkey, "RC", 0,REG_SZ, (LPBYTE)DIRECTX_RC, sizeof(DIRECTX_RC));
655 RegSetValueEx(hkey, "Version", 0,REG_SZ, (LPBYTE)DIRECTX_VERSION, sizeof(DIRECTX_VERSION));
656 val = DIRECTX_INSTALLED_VERSION;
657 RegSetValueEx(hkey, "InstalledVersion", 0,REG_BINARY, (LPBYTE)&val, sizeof(DWORD));
658 RegCloseKey(hkey);
659
660 if(RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\DirectDraw",&hkey)!=ERROR_SUCCESS) {
661 goto initreg_error;
662 }
663 //todo
664 RegCloseKey(hkey);
665
666 if(RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Direct3D",&hkey)!=ERROR_SUCCESS) {
667 goto initreg_error;
668 }
669 //todo
670 RegCloseKey(hkey);
671
672 if(RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\DirectPlay",&hkey)!=ERROR_SUCCESS) {
673 goto initreg_error;
674 }
675 //todo
676 RegCloseKey(hkey);
677
678#if 0
679 if(RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\DirectMusic",&hkey)!=ERROR_SUCCESS) {
680 goto initreg_error;
681 }
682 //todo
683 RegCloseKey(hkey);
684#endif
685
686// [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdfs]
687// "Type"=dword:00000002
688// "Start"=dword:00000004
689// "Group"="File system"
690// "ErrorControl"=dword:00000001
691// "DependOnGroup"=hex(7):53,43,53,49,20,43,44,52,4f,4d,20,43,6c,61,73,73,00,00
692
693 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Cdfs",&hkey)!=ERROR_SUCCESS) {
694 goto initreg_error;
695 }
696 val = 0x2;
697 RegSetValueEx(hkey, KEY_DEVICE_TYPE,0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
698 val = 0x4;
699 RegSetValueEx(hkey, KEY_DEVICE_START,0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
700 val = 0x1;
701 RegSetValueEx(hkey, KEY_DEVICE_ERRORCONTROL,0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
702 RegSetValueEx(hkey, KEY_DEVICE_GROUP,0,REG_SZ, (LPBYTE)DEVICE_GROUP_FILESYSTEM, sizeof(DEVICE_GROUP_FILESYSTEM));
703 //todo dependongroup
704 RegCloseKey(hkey);
705
706
707/*
708// [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdfs\Enum]
709// "0"="Root\\LEGACY_CDFS\\0000"
710// "Count"=dword:00000001
711// "NextInstance"=dword:00000001
712*/
713// [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdrom]
714// "Type"=dword:00000001
715// "Start"=dword:00000001
716// "Group"="SCSI CDROM Class"
717// "ErrorControl"=dword:00000000
718// "Tag"=dword:00000002
719// "DependOnGroup"=hex(7):53,43,53,49,20,6d,69,6e,69,70,6f,72,74,00,00
720// "Autorun"=dword:00000001
721
722 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Cdrom",&hkey)!=ERROR_SUCCESS) {
723 goto initreg_error;
724 }
725 val = 0x1;
726 RegSetValueEx(hkey, KEY_DEVICE_TYPE,0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
727 val = 0x1;
728 RegSetValueEx(hkey, KEY_DEVICE_START,0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
729 val = 0x0;
730 RegSetValueEx(hkey, KEY_DEVICE_ERRORCONTROL,0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
731 val = 0x2;
732 RegSetValueEx(hkey, KEY_DEVICE_TAG,0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
733 val = 0x0;
734 RegSetValueEx(hkey, KEY_DEVICE_AUTORUN,0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
735 RegSetValueEx(hkey, KEY_DEVICE_GROUP,0,REG_SZ, (LPBYTE)DEVICE_GROUP_SCSICDROM, sizeof(DEVICE_GROUP_SCSICDROM));
736 //todo dependongroup
737 RegCloseKey(hkey);
738
739/*
740[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdrom\Enum]
741"0"="Root\\LEGACY_CDROM\\0000"
742"Count"=dword:00000001
743"NextInstance"=dword:00000001
744*/
745
746 //[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\FileSystem]
747 //"Win31FileSystem"=dword:00000000
748 //"NtfsDisable8dot3NameCreation"=dword:00000000
749 //"Win95TruncatedExtensions"=dword:00000001
750 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Control\\FileSystem",&hkey)!=ERROR_SUCCESS) {
751 goto initreg_error;
752 }
753 val = 0x0;
754 RegSetValueEx(hkey, "Win31FileSystem",0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
755 val = 0x0;
756 RegSetValueEx(hkey, "NtfsDisable8dot3NameCreation",0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
757 val = 0x1;
758 RegSetValueEx(hkey, "Win95TruncatedExtensions",0,REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
759 RegCloseKey(hkey);
760
761//[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM]
762//"Serial1"="COM2"
763//// if(RegCreateKey(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",&hkey)!=ERROR_SUCCESS) {
764//// goto initreg_error;
765//// }
766//// RegSetValueEx(hkey, "Serial1",0,REG_SZ, (LPBYTE)"COM2", 5);
767//// RegCloseKey(hkey);
768
769
770//[HKEY_LOCAL_MACHINE\Software\Microsoft\OLE]
771//# allow cross-machine calls (RPC) (default Y)
772//"EnableDCOM"="Y"
773//# allow incoming connections ? (def. N)
774//"EnableRemoteConnect"="N"
775 if(RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\OLE",&hkey)!=ERROR_SUCCESS) {
776 goto initreg_error;
777 }
778 digbuf[0] = 'Y';
779 digbuf[1] = 0;
780 RegSetValueEx(hkey, "EnableDCOM",0,REG_SZ, (LPBYTE)digbuf, 2);
781 digbuf[0] = 'N';
782 digbuf[1] = 0;
783 RegSetValueEx(hkey, "EnableRemoteConnect",0,REG_SZ, (LPBYTE)digbuf, 2);
784 RegCloseKey(hkey);
785
786 //Add MS Sans Serif to WarpSans font conversion entry
787 char temp;
788 if(PROFILE_GetOdinIniString(ODINFONTSECTION, "MS Sans Serif", "", &temp,
789 0) <= 1)
790 {
791 PROFILE_SetOdinIniString(ODINFONTSECTION, "MS Sans Serif", "WarpSans");
792 }
793 //Add MS Shell Dlg
794 if(PROFILE_GetOdinIniString(ODINFONTSECTION, "MS Shell Dlg", "", &temp,
795 0) <= 1)
796 {
797 PROFILE_SetOdinIniString(ODINFONTSECTION, "MS Shell Dlg", "WarpSans");
798 }
799 //Add MS Shell Dlg 2 (win2k and up) too
800 if(PROFILE_GetOdinIniString(ODINFONTSECTION, "MS Shell Dlg 2", "", &temp,
801 0) <= 1)
802 {
803 PROFILE_SetOdinIniString(ODINFONTSECTION, "MS Shell Dlg 2", "WarpSans");
804 }
805
806 //Create system.ini with [mci] section
807 strcpy(shellpath, InternalGetWindowsDirectory());
808 strcat(shellpath, "\\system.ini");
809
810 if(GetPrivateProfileStringA(szMci, szCDAudio, szMciCDA, &temp, 0, shellpath) <= 1) {
811 WritePrivateProfileStringA(szMci, szCDAudio, szMciCDA, shellpath);
812 }
813
814 //Font registry keys (not complete)
815 //[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]
816 //"Courier 10,12,15 (VGA res)"="COURE.FON"
817 //"MS Sans Serif 8,10,12,14,18,24 (VGA res)"="SSERIFE.FON"
818 //"MS Serif 8,10,12,14,18,24 (VGA res)"="SERIFE.FON"
819
820
821 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts",&hkey)!=ERROR_SUCCESS) {
822 goto initreg_error;
823 }
824 #define FONT_COURIER "COURE.FON"
825 #define FONT_SANSSERIF "SSERIFE.FON"
826 #define FONT_SERIF "SERIFE.FON"
827 RegSetValueEx(hkey, "Courier 10,12,15 (VGA res)",0,REG_SZ, (LPBYTE)FONT_COURIER, sizeof(FONT_COURIER));
828 RegSetValueEx(hkey, "MS Sans Serif 8,10,12,14,18,24 (VGA res)",0,REG_SZ, (LPBYTE)FONT_SANSSERIF, sizeof(FONT_SANSSERIF));
829 RegSetValueEx(hkey, "MS Serif 8,10,12,14,18,24 (VGA res)",0,REG_SZ, (LPBYTE)FONT_SERIF, sizeof(FONT_SERIF));
830 RegCloseKey(hkey);
831
832 if(RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Fonts",&hkey)!=ERROR_SUCCESS) {
833 goto initreg_error;
834 }
835 RegSetValueEx(hkey, "Courier 10,12,15 (VGA res)",0,REG_SZ, (LPBYTE)FONT_COURIER, sizeof(FONT_COURIER));
836 RegSetValueEx(hkey, "MS Sans Serif 8,10,12,14,18,24 (VGA res)",0,REG_SZ, (LPBYTE)FONT_SANSSERIF, sizeof(FONT_SANSSERIF));
837 RegSetValueEx(hkey, "MS Serif 8,10,12,14,18,24 (VGA res)",0,REG_SZ, (LPBYTE)FONT_SERIF, sizeof(FONT_SERIF));
838 RegCloseKey(hkey);
839 return TRUE;
840
841initreg_error:
842 dprintf((INITREG_ERROR));
843 return FALSE;
844}
845//******************************************************************************
846//******************************************************************************
847BOOL CreateSystemDirectories()
848{
849 char dirname[260];
850 HKEY hkey;
851
852 //Create Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders keys
853 //"Favorites"="C:\WINDOWS\Favorites"
854 //"StartUp"="C:\WINDOWS\Start Menu\Programs\Startup"
855 //"Desktop"="C:\WINDOWS\Desktop"
856 //"Programs"="C:\WINDOWS\Start Menu\Programs"
857 //"Fonts"="C:\WINDOWS\Fonts"
858 //"SendTo"="C:\WINDOWS\SendTo"
859 //"Start Menu"="C:\WINDOWS\Start Menu"
860 //"Templates"="C:\WINDOWS\ShellNew"
861 //"Recent"="C:\WINDOWS\Recent"
862 //"NetHood"="C:\WINDOWS\NetHood"
863 //"Personal"="C:\My Documents"
864
865 if(RegCreateKey(HKEY_CURRENT_USER,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",&hkey)!=ERROR_SUCCESS) {
866 dprintf(("InitRegistry: Unable to register system information (3)"));
867 return FALSE;
868 }
869 //system32\drivers dir
870 strcpy(dirname, InternalGetSystemDirectory());
871 strcat(dirname, "\\Drivers");
872 CreateDirectory(dirname, NULL);
873 strcat(dirname, "\\etc");
874 CreateDirectory(dirname, NULL);
875
876 //SYSTEM dir
877 strcpy(dirname, InternalGetWindowsDirectory());
878 strcat(dirname, "\\SYSTEM");
879 CreateDirectory(dirname, NULL);
880
881 //AppData
882 strcpy(dirname, InternalGetWindowsDirectory());
883 strcat(dirname, "\\Application Data");
884 CreateDirectory(dirname, NULL);
885 RegSetValueEx(hkey,"AppData",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
886 //Cache
887 strcpy(dirname, InternalGetWindowsDirectory());
888 strcat(dirname, "\\Temporary Internet Files");
889 CreateDirectory(dirname, NULL);
890 RegSetValueEx(hkey,"Cache",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
891 //Cookies
892 strcpy(dirname, InternalGetWindowsDirectory());
893 strcat(dirname, "\\Cookies");
894 CreateDirectory(dirname, NULL);
895 RegSetValueEx(hkey,"Cookies",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
896 //Desktop
897 strcpy(dirname, InternalGetWindowsDirectory());
898 strcat(dirname, "\\Desktop");
899 CreateDirectory(dirname, NULL);
900 RegSetValueEx(hkey,"Desktop",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
901 //Favorites
902 strcpy(dirname, InternalGetWindowsDirectory());
903 strcat(dirname, "\\Favorites");
904 CreateDirectory(dirname, NULL);
905 RegSetValueEx(hkey,"Favorites",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
906 //Fonts
907 strcpy(dirname, InternalGetWindowsDirectory());
908 strcat(dirname, "\\Fonts");
909 CreateDirectory(dirname, NULL);
910 RegSetValueEx(hkey,"Fonts",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
911 //History
912 strcpy(dirname, InternalGetWindowsDirectory());
913 strcat(dirname, "\\History");
914 CreateDirectory(dirname, NULL);
915 RegSetValueEx(hkey,"History",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
916 //NetHood
917 strcpy(dirname, InternalGetWindowsDirectory());
918 strcat(dirname, "\\NetHood");
919 CreateDirectory(dirname, NULL);
920 RegSetValueEx(hkey,"NetHood",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
921 //Personal
922 strcpy(dirname, InternalGetWindowsDirectory());
923 strcat(dirname, "\\My Documents");
924 CreateDirectory(dirname, NULL);
925 RegSetValueEx(hkey,"Personal",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
926 //PrintHood
927 strcpy(dirname, InternalGetWindowsDirectory());
928 strcat(dirname, "\\PrintHood");
929 CreateDirectory(dirname, NULL);
930 RegSetValueEx(hkey,"PrintHood",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
931 //Recent
932 strcpy(dirname, InternalGetWindowsDirectory());
933 strcat(dirname, "\\Recent");
934 CreateDirectory(dirname, NULL);
935 RegSetValueEx(hkey,"Recent",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
936 //SendTo
937 strcpy(dirname, InternalGetWindowsDirectory());
938 strcat(dirname, "\\SendTo");
939 CreateDirectory(dirname, NULL);
940 RegSetValueEx(hkey,"SendTo",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
941 //Start Menu
942 strcpy(dirname, InternalGetWindowsDirectory());
943 strcat(dirname, "\\Start Menu");
944 CreateDirectory(dirname, NULL);
945 RegSetValueEx(hkey,"Start Menu",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
946
947 //Temp directory
948 strcpy(dirname, InternalGetWindowsDirectory());
949 strcat(dirname, "\\Temp");
950 CreateDirectory(dirname, NULL);
951
952 //Programs
953 strcpy(dirname, InternalGetWindowsDirectory());
954 strcat(dirname, "\\Start Menu\\Programs");
955 CreateDirectory(dirname, NULL);
956 RegSetValueEx(hkey,"Programs",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
957 //Startup
958 strcat(dirname, "\\Startup");
959 CreateDirectory(dirname, NULL);
960 RegSetValueEx(hkey,"Startup",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
961 //ShellNew
962 strcpy(dirname, InternalGetWindowsDirectory());
963 strcat(dirname, "\\ShellNew");
964 CreateDirectory(dirname, NULL);
965 RegSetValueEx(hkey,"Templates",0,REG_SZ, (LPBYTE)dirname, strlen(dirname)+1);
966 RegCloseKey(hkey);
967
968 return TRUE;
969}
970//******************************************************************************
971//Example:
972//[HKEY_USERS\.DEFAULT\Control Panel\International]
973//"Locale"="00000409"
974//"sLanguage"="ENU"
975//"sCountry"="United States"
976//"iCountry"="1"
977//"sList"=","
978//"iMeasure"="1"
979//"sDecimal"="."
980//"sThousand"=","
981//"iDigits"="2"
982//"iLZero"="1"
983//"sCurrency"="$"
984//"iCurrDigits"="2"
985//"iCurrency"="0"
986//"iNegCurr"="0"
987//"sDate"="/"
988//"sTime"=":"
989//"sShortDate"="M/d/yy"
990//"sLongDate"="dddd, MMMM dd, yyyy"
991//"iDate"="0"
992//"iTime"="0"
993//"iTLZero"="0"
994//"s1159"="AM"
995//"s2359"="PM"
996//******************************************************************************
997BOOL SetupControlPanelKeys()
998{
999 HKEY hkey;
1000 LCID lcid;
1001 char tmp[128];
1002
1003 if(RegCreateKey(HKEY_CURRENT_USER,"Control Panel\\International",&hkey)!=ERROR_SUCCESS) {
1004 dprintf(("SetupControlPanelKeys: Unable to create key"));
1005 return FALSE;
1006 }
1007 lcid = GetUserDefaultLCID();
1008 sprintf(tmp, "%08X", lcid);
1009 RegSetValueEx(hkey,"Locale",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1010
1011 GetLocaleInfo(lcid, LOCALE_SLANGUAGE, tmp, sizeof(tmp)-1);
1012 RegSetValueEx(hkey,"sLanguage",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1013
1014 GetLocaleInfo(lcid, LOCALE_SCOUNTRY, tmp, sizeof(tmp)-1);
1015 RegSetValueEx(hkey,"sCountry",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1016
1017 GetLocaleInfo(lcid, LOCALE_ICOUNTRY, tmp, sizeof(tmp)-1);
1018 RegSetValueEx(hkey,"iCountry",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1019
1020 GetLocaleInfo(lcid, LOCALE_SLIST, tmp, sizeof(tmp)-1);
1021 RegSetValueEx(hkey,"sList",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1022
1023 GetLocaleInfo(lcid, LOCALE_IMEASURE, tmp, sizeof(tmp)-1);
1024 RegSetValueEx(hkey,"sMeasure",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1025
1026 GetLocaleInfo(lcid, LOCALE_SDECIMAL, tmp, sizeof(tmp)-1);
1027 RegSetValueEx(hkey,"sDecimal",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1028
1029 GetLocaleInfo(lcid, LOCALE_STHOUSAND, tmp, sizeof(tmp)-1);
1030 RegSetValueEx(hkey,"sThousand",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1031
1032 GetLocaleInfo(lcid, LOCALE_IDIGITS, tmp, sizeof(tmp)-1);
1033 RegSetValueEx(hkey,"iDigits",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1034
1035 GetLocaleInfo(lcid, LOCALE_ILZERO, tmp, sizeof(tmp)-1);
1036 RegSetValueEx(hkey,"iLZero",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1037
1038 GetLocaleInfo(lcid, LOCALE_SCURRENCY, tmp, sizeof(tmp)-1);
1039 RegSetValueEx(hkey,"sCurrency",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1040
1041 GetLocaleInfo(lcid, LOCALE_ICURRDIGITS, tmp, sizeof(tmp)-1);
1042 RegSetValueEx(hkey,"iCurrDigits",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1043
1044 GetLocaleInfo(lcid, LOCALE_ICURRENCY, tmp, sizeof(tmp)-1);
1045 RegSetValueEx(hkey,"iCurrency",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1046
1047 GetLocaleInfo(lcid, LOCALE_INEGCURR, tmp, sizeof(tmp)-1);
1048 RegSetValueEx(hkey,"iNegCurr",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1049
1050 GetLocaleInfo(lcid, LOCALE_SDATE, tmp, sizeof(tmp)-1);
1051 RegSetValueEx(hkey,"sDate",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1052
1053 GetLocaleInfo(lcid, LOCALE_STIME, tmp, sizeof(tmp)-1);
1054 RegSetValueEx(hkey,"sTime",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1055
1056 GetLocaleInfo(lcid, LOCALE_SSHORTDATE, tmp, sizeof(tmp)-1);
1057 RegSetValueEx(hkey,"sShortDate",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1058
1059 GetLocaleInfo(lcid, LOCALE_SLONGDATE, tmp, sizeof(tmp)-1);
1060 RegSetValueEx(hkey,"sLongDate",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1061
1062 GetLocaleInfo(lcid, LOCALE_IDATE, tmp, sizeof(tmp)-1);
1063 RegSetValueEx(hkey,"iDate",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1064
1065 GetLocaleInfo(lcid, LOCALE_ITIME, tmp, sizeof(tmp)-1);
1066 RegSetValueEx(hkey,"iTime",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1067
1068 GetLocaleInfo(lcid, LOCALE_ITLZERO, tmp, sizeof(tmp)-1);
1069 RegSetValueEx(hkey,"iTLZero",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1070
1071 GetLocaleInfo(lcid, LOCALE_S1159, tmp, sizeof(tmp)-1);
1072 RegSetValueEx(hkey,"s1159",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1073
1074 GetLocaleInfo(lcid, LOCALE_S2359, tmp, sizeof(tmp)-1);
1075 RegSetValueEx(hkey,"s2359",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1076
1077 GetLocaleInfo(lcid, LOCALE_ICALENDARTYPE, tmp, sizeof(tmp)-1);
1078 RegSetValueEx(hkey,"iCalendarType",0,REG_SZ, (LPBYTE)tmp, strlen(tmp)+1);
1079
1080 RegCloseKey(hkey);
1081
1082 if(RegCreateKey(HKEY_CURRENT_USER,"Control Panel\\International\\Sorting Order",&hkey)!=ERROR_SUCCESS) {
1083 dprintf(("SetupControlPanelKeys: Unable to create key"));
1084 return FALSE;
1085 }
1086 RegCloseKey(hkey);
1087 return TRUE;
1088}
1089//******************************************************************************
1090//[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation]
1091//"Bias"=dword:ffffffc4
1092//"StandardName"="Romance Standard Time"
1093//"StandardBias"=dword:00000000
1094//"StandardStart"=hex:00,00,0a,00,05,00,03,00,00,00,00,00,00,00,00,00
1095// typedef struct _SYSTEMTIME {
1096// WORD wYear;
1097// WORD wMonth;
1098// WORD wDayOfWeek;
1099// WORD wDay;
1100// WORD wHour;
1101// WORD wMinute;
1102// WORD wSecond;
1103// WORD wMilliseconds;
1104//} SYSTEMTIME, *PSYSTEMTIME;
1105//"DaylightName"="Romance Daylight Time"
1106//"DaylightBias"=dword:ffffffc4
1107//"DaylightStart"=hex:00,00,03,00,05,00,02,00,00,00,00,00,00,00,00,00
1108//"ActiveTimeBias"=dword:ffffffc4
1109//******************************************************************************
1110void SetupTimeZoneInfo()
1111{
1112 HKEY hkey;
1113 DWORD val = 0;
1114 char szTimeZoneStd[4];
1115 char szTimeZoneDay[4];
1116 int sign = FALSE;
1117 int bias;
1118 char *pszTZ = NULL;
1119 SYSTEMTIME stime = {0};
1120 SYSTEMTIME dtime = {0};
1121
1122 if (RegCreateKey(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation", &hkey) != ERROR_SUCCESS)
1123 {
1124 dprintf(("SetupTimeZoneInfo: Unable to create key"));
1125 return;
1126 }
1127 //Little bit difficult to map the 3 letter timezone to a name
1128 //(duplicate values for different regions)
1129 //So we just copy that timezone string and hope the apps don't really
1130 //on hardcoded timezone names.
1131
1132 //parse TZ environment variable
1133 pszTZ = getenv("TZ");
1134 if(pszTZ == NULL) {
1135 //default is Central European Time
1136 pszTZ = "CET-1CDT";
1137 }
1138 strncpy(szTimeZoneStd, pszTZ, 3);
1139 szTimeZoneStd[3] = 0;
1140 if(pszTZ[3] == '-') {
1141 sign = TRUE;
1142 pszTZ += 4;
1143 }
1144 else pszTZ += 3;
1145
1146 if(isdigit(*pszTZ)) {
1147 bias = (int)(*pszTZ - '0') * 60;
1148 pszTZ++;
1149 if(isdigit(*pszTZ)) {//double digit hour difference
1150 bias *= 10;
1151 bias += (int)(*pszTZ - '0') * 60;
1152 pszTZ++;
1153 }
1154 }
1155 else bias = 0;
1156
1157 if(sign) bias = -bias;
1158
1159 if(isalpha(*pszTZ)) {//daylight timezone name follows
1160 strncpy(szTimeZoneDay, pszTZ, 3);
1161 szTimeZoneDay[3] = 0;
1162 }
1163 else szTimeZoneDay[0] = 0;
1164
1165 RegSetValueEx(hkey, "Bias",0,REG_DWORD, (LPBYTE)&bias, sizeof(bias));
1166 RegSetValueEx(hkey, "ActiveTimeBias",0,REG_DWORD, (LPBYTE)&bias, sizeof(bias));
1167
1168 RegSetValueEx(hkey, "StandardName", 0, REG_SZ, (LPBYTE)szTimeZoneStd, strlen(szTimeZoneStd));
1169 RegSetValueEx(hkey, "StandardBias",0,REG_DWORD, (LPBYTE)&bias, sizeof(bias));
1170 RegSetValueEx(hkey, "StandardStart",0,REG_BINARY, (LPBYTE)&stime, sizeof(stime));
1171 RegSetValueEx(hkey, "DaylightName", 0, REG_SZ, (LPBYTE)szTimeZoneDay, strlen(szTimeZoneDay));
1172 RegSetValueEx(hkey, "DaylightBias",0,REG_DWORD, (LPBYTE)&bias, sizeof(bias));
1173 RegSetValueEx(hkey, "DaylightStart",0,REG_BINARY, (LPBYTE)&dtime, sizeof(dtime));
1174 RegCloseKey(hkey);
1175
1176 TIME_ZONE_INFORMATION tzinfo;
1177
1178 tzinfo.Bias = bias;
1179 lstrcpynAtoW(tzinfo.StandardName, szTimeZoneStd, sizeof(tzinfo.StandardName)/sizeof(WCHAR));
1180 tzinfo.StandardDate = stime;
1181 tzinfo.StandardBias = bias;
1182 lstrcpynAtoW(tzinfo.DaylightName, szTimeZoneDay, sizeof(tzinfo.StandardName)/sizeof(WCHAR));
1183 tzinfo.DaylightDate = dtime;
1184 tzinfo.DaylightBias = bias;
1185
1186 SetTimeZoneInformation(&tzinfo);
1187}
1188//******************************************************************************
1189//******************************************************************************
1190
Note: See TracBrowser for help on using the repository browser.