fix shortcut icons
[reactos.git] / reactos / dll / win32 / syssetup / install.c
1 /*
2 * ReactOS kernel
3 * Copyright (C) 2003 ReactOS Team
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19 /*
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS system libraries
22 * PURPOSE: System setup
23 * FILE: lib/syssetup/install.c
24 * PROGRAMER: Eric Kohl
25 */
26
27 /* INCLUDES *****************************************************************/
28
29 #define WIN32_NO_STATUS
30 #include <windows.h>
31 #define NTOS_MODE_USER
32 #include <ndk/ntndk.h>
33
34 #include <commctrl.h>
35 #include <stdio.h>
36 #include <io.h>
37 #include <tchar.h>
38 #include <stdlib.h>
39
40 #include <samlib/samlib.h>
41 #include <syssetup/syssetup.h>
42 #include <userenv.h>
43 #include <setupapi.h>
44
45 #include <shlobj.h>
46 #include <objidl.h>
47 #include <shlwapi.h>
48
49 #include "globals.h"
50 #include "resource.h"
51
52 #include <debug.h>
53
54 DWORD WINAPI
55 CMP_WaitNoPendingInstallEvents(DWORD dwTimeout);
56
57 /* GLOBALS ******************************************************************/
58
59 PSID DomainSid = NULL;
60 PSID AdminSid = NULL;
61
62 HINF hSysSetupInf = INVALID_HANDLE_VALUE;
63
64 /* FUNCTIONS ****************************************************************/
65
66 static VOID
67 DebugPrint(char* fmt,...)
68 {
69 char buffer[512];
70 va_list ap;
71
72 va_start(ap, fmt);
73 vsprintf(buffer, fmt, ap);
74 va_end(ap);
75
76 LogItem(SYSSETUP_SEVERITY_FATAL_ERROR, L"Failed");
77
78 strcat(buffer, "\nRebooting now!");
79 MessageBoxA(NULL,
80 buffer,
81 "ReactOS Setup",
82 MB_OK);
83 }
84
85
86 HRESULT CreateShellLink(LPCTSTR linkPath, LPCTSTR cmd, LPCTSTR arg, LPCTSTR dir, LPCTSTR iconPath, int icon_nr, LPCTSTR comment)
87 {
88 IShellLink* psl;
89 IPersistFile* ppf;
90 #ifndef _UNICODE
91 WCHAR buffer[MAX_PATH];
92 #endif /* _UNICODE */
93
94 HRESULT hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, (LPVOID*)&psl);
95
96 if (SUCCEEDED(hr))
97 {
98 hr = psl->lpVtbl->SetPath(psl, cmd);
99
100 if (arg)
101 {
102 hr = psl->lpVtbl->SetArguments(psl, arg);
103 }
104
105 if (dir)
106 {
107 hr = psl->lpVtbl->SetWorkingDirectory(psl, dir);
108 }
109
110 if (iconPath)
111 {
112 hr = psl->lpVtbl->SetIconLocation(psl, iconPath, icon_nr);
113 }
114
115 if (comment)
116 {
117 hr = psl->lpVtbl->SetDescription(psl, comment);
118 }
119
120 hr = psl->lpVtbl->QueryInterface(psl, &IID_IPersistFile, (LPVOID*)&ppf);
121
122 if (SUCCEEDED(hr))
123 {
124 #ifdef _UNICODE
125 hr = ppf->lpVtbl->Save(ppf, linkPath, TRUE);
126 #else /* _UNICODE */
127 MultiByteToWideChar(CP_ACP, 0, linkPath, -1, buffer, MAX_PATH);
128
129 hr = ppf->lpVtbl->Save(ppf, buffer, TRUE);
130 #endif /* _UNICODE */
131
132 ppf->lpVtbl->Release(ppf);
133 }
134
135 psl->lpVtbl->Release(psl);
136 }
137
138 return hr;
139 }
140
141
142 static BOOL
143 CreateShortcut(int csidl, LPCTSTR folder, UINT nIdName, LPCTSTR command, UINT nIdTitle, BOOL bCheckExistence)
144 {
145 TCHAR path[MAX_PATH];
146 TCHAR exeName[MAX_PATH];
147 TCHAR title[256];
148 TCHAR name[256];
149 LPTSTR p = path;
150 TCHAR szWorkingDir[MAX_PATH];
151 LPTSTR lpWorkingDir = NULL;
152 LPTSTR lpFilePart;
153 DWORD dwLen;
154
155 if (ExpandEnvironmentStrings(command,
156 path,
157 sizeof(path) / sizeof(path[0])) == 0)
158 {
159 _tcscpy(path,
160 command);
161 }
162
163 if (bCheckExistence)
164 {
165 if ((_taccess(path, 0 )) == -1)
166 /* Expected error, don't return FALSE */
167 return TRUE;
168 }
169
170 dwLen = GetFullPathName(path,
171 sizeof(szWorkingDir) / sizeof(szWorkingDir[0]),
172 szWorkingDir,
173 &lpFilePart);
174 if (dwLen != 0 && dwLen <= sizeof(szWorkingDir) / sizeof(szWorkingDir[0]))
175 {
176 /* Save the file name */
177 _tcscpy(exeName, lpFilePart);
178
179 if (lpFilePart != NULL)
180 {
181 /* We're only interested in the path. Cut the file name off.
182 Also remove the trailing backslash unless the working directory
183 is only going to be a drive, ie. C:\ */
184 *(lpFilePart--) = _T('\0');
185 if (!(lpFilePart - szWorkingDir == 2 && szWorkingDir[1] == _T(':') &&
186 szWorkingDir[2] == _T('\\')))
187 {
188 *lpFilePart = _T('\0');
189 }
190 }
191
192 lpWorkingDir = szWorkingDir;
193 }
194
195
196 if (!SHGetSpecialFolderPath(0, path, csidl, TRUE))
197 return FALSE;
198
199 if (folder)
200 {
201 p = PathAddBackslash(p);
202 _tcscpy(p, folder);
203 }
204
205 p = PathAddBackslash(p);
206
207 if (!LoadString(hDllInstance, nIdName, name, sizeof(name)/sizeof(name[0])))
208 return FALSE;
209 _tcscpy(p, name);
210
211 if (!LoadString(hDllInstance, nIdTitle, title, sizeof(title)/sizeof(title[0])))
212 return FALSE;
213
214 return SUCCEEDED(CreateShellLink(path, exeName, _T(""), lpWorkingDir, NULL, 0, title));
215 }
216
217
218 static BOOL
219 CreateShortcutFolder(int csidl, UINT nID, LPTSTR name, int nameLen)
220 {
221 TCHAR path[MAX_PATH];
222 LPTSTR p;
223
224 if (!SHGetSpecialFolderPath(0, path, csidl, TRUE))
225 return FALSE;
226
227 if (!LoadString(hDllInstance, nID, name, nameLen))
228 return FALSE;
229
230 p = PathAddBackslash(path);
231 _tcscpy(p, name);
232
233 return CreateDirectory(path, NULL) || GetLastError()==ERROR_ALREADY_EXISTS;
234 }
235
236
237 static BOOL
238 CreateRandomSid(
239 OUT PSID *Sid)
240 {
241 SID_IDENTIFIER_AUTHORITY SystemAuthority = {SECURITY_NT_AUTHORITY};
242 LARGE_INTEGER SystemTime;
243 PULONG Seed;
244 NTSTATUS Status;
245
246 NtQuerySystemTime(&SystemTime);
247 Seed = &SystemTime.u.LowPart;
248
249 Status = RtlAllocateAndInitializeSid(
250 &SystemAuthority,
251 4,
252 SECURITY_NT_NON_UNIQUE,
253 RtlUniform(Seed),
254 RtlUniform(Seed),
255 RtlUniform(Seed),
256 SECURITY_NULL_RID,
257 SECURITY_NULL_RID,
258 SECURITY_NULL_RID,
259 SECURITY_NULL_RID,
260 Sid);
261 return NT_SUCCESS(Status);
262 }
263
264
265 static VOID
266 AppendRidToSid(
267 OUT PSID *Dst,
268 IN PSID Src,
269 IN ULONG NewRid)
270 {
271 ULONG Rid[8] = {0, 0, 0, 0, 0, 0, 0, 0};
272 UCHAR RidCount;
273 ULONG i;
274
275 RidCount = *RtlSubAuthorityCountSid (Src);
276
277 for (i = 0; i < RidCount; i++)
278 Rid[i] = *RtlSubAuthoritySid (Src, i);
279
280 if (RidCount < 8)
281 {
282 Rid[RidCount] = NewRid;
283 RidCount++;
284 }
285
286 RtlAllocateAndInitializeSid(
287 RtlIdentifierAuthoritySid(Src),
288 RidCount,
289 Rid[0],
290 Rid[1],
291 Rid[2],
292 Rid[3],
293 Rid[4],
294 Rid[5],
295 Rid[6],
296 Rid[7],
297 Dst);
298 }
299
300
301 static VOID
302 CreateTempDir(
303 IN LPCWSTR VarName)
304 {
305 TCHAR szTempDir[MAX_PATH];
306 TCHAR szBuffer[MAX_PATH];
307 DWORD dwLength;
308 HKEY hKey;
309
310 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
311 _T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"),
312 0,
313 KEY_QUERY_VALUE,
314 &hKey))
315 {
316 DebugPrint("Error: %lu\n", GetLastError());
317 return;
318 }
319
320 /* Get temp dir */
321 dwLength = MAX_PATH * sizeof(TCHAR);
322 if (RegQueryValueEx(hKey,
323 VarName,
324 NULL,
325 NULL,
326 (LPBYTE)szBuffer,
327 &dwLength))
328 {
329 DebugPrint("Error: %lu\n", GetLastError());
330 RegCloseKey(hKey);
331 return;
332 }
333
334 /* Expand it */
335 if (!ExpandEnvironmentStrings(szBuffer,
336 szTempDir,
337 MAX_PATH))
338 {
339 DebugPrint("Error: %lu\n", GetLastError());
340 RegCloseKey(hKey);
341 return;
342 }
343
344 /* Create profiles directory */
345 if (!CreateDirectory(szTempDir, NULL))
346 {
347 if (GetLastError() != ERROR_ALREADY_EXISTS)
348 {
349 DebugPrint("Error: %lu\n", GetLastError());
350 RegCloseKey(hKey);
351 return;
352 }
353 }
354
355 RegCloseKey(hKey);
356 }
357
358
359 BOOL
360 ProcessSysSetupInf(VOID)
361 {
362 INFCONTEXT InfContext;
363 TCHAR LineBuffer[256];
364 DWORD LineLength;
365
366 if (!SetupFindFirstLine(hSysSetupInf,
367 _T("DeviceInfsToInstall"),
368 NULL,
369 &InfContext))
370 {
371 return FALSE;
372 }
373
374 do
375 {
376 if (!SetupGetStringField(&InfContext,
377 0,
378 LineBuffer,
379 sizeof(LineBuffer)/sizeof(LineBuffer[0]),
380 &LineLength))
381 {
382 return FALSE;
383 }
384
385 if (!SetupDiInstallClass(NULL, LineBuffer, DI_QUIETINSTALL, NULL))
386 {
387 return FALSE;
388 }
389 }
390 while (SetupFindNextLine(&InfContext, &InfContext));
391
392 return TRUE;
393 }
394
395
396 static BOOL
397 EnableUserModePnpManager(VOID)
398 {
399 SC_HANDLE hSCManager = NULL;
400 SC_HANDLE hService = NULL;
401 BOOL ret = FALSE;
402
403 hSCManager = OpenSCManager(NULL, NULL, 0);
404 if (hSCManager == NULL)
405 goto cleanup;
406
407 hService = OpenService(hSCManager, _T("PlugPlay"), SERVICE_CHANGE_CONFIG | SERVICE_START);
408 if (hService == NULL)
409 goto cleanup;
410
411 ret = ChangeServiceConfig(
412 hService,
413 SERVICE_NO_CHANGE, SERVICE_AUTO_START, SERVICE_NO_CHANGE,
414 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
415 if (!ret)
416 goto cleanup;
417
418 ret = StartService(hService, 0, NULL);
419 if (!ret)
420 goto cleanup;
421
422 ret = TRUE;
423
424 cleanup:
425 if (hSCManager != NULL)
426 CloseServiceHandle(hSCManager);
427 if (hService != NULL)
428 CloseServiceHandle(hService);
429 return ret;
430 }
431
432
433 static BOOL CALLBACK
434 StatusMessageWindowProc(
435 IN HWND hwndDlg,
436 IN UINT uMsg,
437 IN WPARAM wParam,
438 IN LPARAM lParam)
439 {
440 UNREFERENCED_PARAMETER(wParam);
441
442 switch (uMsg)
443 {
444 case WM_INITDIALOG:
445 {
446 TCHAR szMsg[256];
447
448 if (!LoadString(hDllInstance, IDS_STATUS_INSTALL_DEV, szMsg, sizeof(szMsg)/sizeof(szMsg[0])))
449 return FALSE;
450 SetDlgItemText(hwndDlg, IDC_STATUSLABEL, szMsg);
451 return TRUE;
452 }
453 }
454 return FALSE;
455 }
456
457
458 static DWORD WINAPI
459 ShowStatusMessageThread(
460 IN LPVOID lpParameter)
461 {
462 HWND *phWnd = (HWND *)lpParameter;
463 HWND hWnd;
464 MSG Msg;
465
466 hWnd = CreateDialogParam(
467 hDllInstance,
468 MAKEINTRESOURCE(IDD_STATUSWINDOW_DLG),
469 GetDesktopWindow(),
470 StatusMessageWindowProc,
471 (LPARAM)NULL);
472 if (!hWnd)
473 return 0;
474 *phWnd = hWnd;
475
476 ShowWindow(hWnd, SW_SHOW);
477
478 /* Message loop for the Status window */
479 while (GetMessage(&Msg, NULL, 0, 0))
480 {
481 TranslateMessage(&Msg);
482 DispatchMessage(&Msg);
483 }
484
485 return 0;
486 }
487
488 static BOOL
489 CommonInstall(VOID)
490 {
491 HWND hWnd = NULL;
492
493 hSysSetupInf = SetupOpenInfFileW(
494 L"syssetup.inf",
495 NULL,
496 INF_STYLE_WIN4,
497 NULL);
498 if (hSysSetupInf == INVALID_HANDLE_VALUE)
499 {
500 DebugPrint("SetupOpenInfFileW() failed to open 'syssetup.inf' (Error: %lu)\n", GetLastError());
501 return FALSE;
502 }
503
504 if (!ProcessSysSetupInf())
505 {
506 DebugPrint("ProcessSysSetupInf() failed!\n");
507 SetupCloseInfFile(hSysSetupInf);
508 return FALSE;
509 }
510
511 CreateThread(
512 NULL,
513 0,
514 ShowStatusMessageThread,
515 (LPVOID)&hWnd,
516 0,
517 NULL);
518
519 if (!EnableUserModePnpManager())
520 {
521 DebugPrint("EnableUserModePnpManager() failed!\n");
522 SetupCloseInfFile(hSysSetupInf);
523 EndDialog(hWnd, 0);
524 return FALSE;
525 }
526
527 if (CMP_WaitNoPendingInstallEvents(INFINITE) != WAIT_OBJECT_0)
528 {
529 DebugPrint("CMP_WaitNoPendingInstallEvents() failed!\n");
530 SetupCloseInfFile(hSysSetupInf);
531 EndDialog(hWnd, 0);
532 return FALSE;
533 }
534
535 EndDialog(hWnd, 0);
536 return TRUE;
537 }
538
539 DWORD WINAPI
540 InstallLiveCD(IN HINSTANCE hInstance)
541 {
542 STARTUPINFO StartupInfo;
543 PROCESS_INFORMATION ProcessInformation;
544 BOOL res;
545
546 if (!CommonInstall())
547 goto cleanup;
548 SetupCloseInfFile(hSysSetupInf);
549
550 /* Run the shell */
551 StartupInfo.cb = sizeof(StartupInfo);
552 StartupInfo.lpReserved = NULL;
553 StartupInfo.lpDesktop = NULL;
554 StartupInfo.lpTitle = NULL;
555 StartupInfo.dwFlags = 0;
556 StartupInfo.cbReserved2 = 0;
557 StartupInfo.lpReserved2 = 0;
558 res = CreateProcess(
559 _T("userinit.exe"),
560 NULL,
561 NULL,
562 NULL,
563 FALSE,
564 0,
565 NULL,
566 NULL,
567 &StartupInfo,
568 &ProcessInformation);
569 if (!res)
570 goto cleanup;
571
572 /* Wait for process termination */
573 WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
574
575 cleanup:
576 MessageBoxA(
577 NULL,
578 "You can shutdown your computer, or press ENTER to reboot",
579 "ReactOS LiveCD",
580 MB_OK);
581 return 0;
582 }
583
584
585 static BOOL
586 CreateShortcuts(VOID)
587 {
588 TCHAR szFolder[256];
589
590 CoInitialize(NULL);
591
592 /* Create desktop shortcuts */
593 CreateShortcut(CSIDL_DESKTOP, NULL, IDS_SHORT_CMD, _T("%SystemRoot%\\system32\\cmd.exe"), IDS_CMT_CMD, FALSE);
594
595 /* Create program startmenu shortcuts */
596 CreateShortcut(CSIDL_PROGRAMS, NULL, IDS_SHORT_EXPLORER, _T("%SystemRoot%\\explorer.exe"), IDS_CMT_EXPLORER, FALSE);
597 CreateShortcut(CSIDL_PROGRAMS, NULL, IDS_SHORT_DOWNLOADER, _T("%SystemRoot%\\system32\\downloader.exe"), IDS_CMT_DOWNLOADER, TRUE);
598
599 /* Create administrative tools startmenu shortcuts */
600 CreateShortcut(CSIDL_COMMON_ADMINTOOLS, NULL, IDS_SHORT_SERVICE, _T("%SystemRoot%\\system32\\servman.exe"), IDS_CMT_SERVMAN, FALSE);
601 CreateShortcut(CSIDL_COMMON_ADMINTOOLS, NULL, IDS_SHORT_DEVICE, _T("%SystemRoot%\\system32\\devmgmt.exe"), IDS_CMT_DEVMGMT, FALSE);
602
603 /* Create and fill Accessories subfolder */
604 if (CreateShortcutFolder(CSIDL_PROGRAMS, IDS_ACCESSORIES, szFolder, sizeof(szFolder)/sizeof(szFolder[0])))
605 {
606 CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_CALC, _T("%SystemRoot%\\system32\\calc.exe"), IDS_CMT_CALC, FALSE);
607 CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_CMD, _T("%SystemRoot%\\system32\\cmd.exe"), IDS_CMT_CMD, FALSE);
608 CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_NOTEPAD, _T("%SystemRoot%\\system32\\notepad.exe"), IDS_CMT_NOTEPAD, FALSE);
609 CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_REGEDIT, _T("%SystemRoot%\\regedit.exe"), IDS_CMT_REGEDIT, FALSE);
610 CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_WORDPAD, _T("%SystemRoot%\\system32\\wordpad.exe"), IDS_CMT_WORDPAD, FALSE);
611 CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_SNAP, _T("%SystemRoot%\\system32\\screenshot.exe"), IDS_CMT_SCREENSHOT, TRUE);
612 }
613
614 /* Create Games subfolder and fill if the exe is available */
615 if (CreateShortcutFolder(CSIDL_PROGRAMS, IDS_GAMES, szFolder, sizeof(szFolder)/sizeof(szFolder[0])))
616 {
617 CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_SOLITAIRE, _T("%SystemRoot%\\system32\\sol.exe"), IDS_CMT_SOLITAIRE, FALSE);
618 CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_WINEMINE, _T("%SystemRoot%\\system32\\winemine.exe"), IDS_CMT_WINEMINE, FALSE);
619 }
620
621 CoUninitialize();
622
623 return TRUE;
624 }
625
626 DWORD WINAPI
627 InstallReactOS(HINSTANCE hInstance)
628 {
629 TCHAR szBuffer[MAX_PATH];
630 DWORD LastError;
631
632 InitializeSetupActionLog(FALSE);
633 LogItem(SYSSETUP_SEVERITY_INFORMATION, L"Installing ReactOS");
634
635 /* Set user langage to the system language */
636 SetUserDefaultLCID(GetSystemDefaultLCID());
637 SetThreadLocale(GetSystemDefaultLCID());
638
639 if (!InitializeProfiles())
640 {
641 DebugPrint("InitializeProfiles() failed");
642 return 0;
643 }
644
645 if (!CreateShortcuts())
646 {
647 DebugPrint("InitializeProfiles() failed");
648 return 0;
649 }
650
651 /* Initialize the Security Account Manager (SAM) */
652 if (!SamInitializeSAM())
653 {
654 DebugPrint("SamInitializeSAM() failed!");
655 return 0;
656 }
657
658 /* Create the semi-random Domain-SID */
659 if (!CreateRandomSid(&DomainSid))
660 {
661 DebugPrint("Domain-SID creation failed!");
662 return 0;
663 }
664
665 /* Set the Domain SID (aka Computer SID) */
666 if (!SamSetDomainSid(DomainSid))
667 {
668 DebugPrint("SamSetDomainSid() failed!");
669 RtlFreeSid(DomainSid);
670 return 0;
671 }
672
673 /* Append the Admin-RID */
674 AppendRidToSid(&AdminSid, DomainSid, DOMAIN_USER_RID_ADMIN);
675
676 /* Create the Administrator account */
677 if (!SamCreateUser(L"Administrator", L"", AdminSid))
678 {
679 /* Check what the error was.
680 * If the Admin Account already exists, then it means Setup
681 * wasn't allowed to finish properly. Instead of rebooting
682 * and not completing it, let it restart instead
683 */
684 LastError = GetLastError();
685 if (LastError != ERROR_USER_EXISTS)
686 {
687 DebugPrint("SamCreateUser() failed!");
688 RtlFreeSid(AdminSid);
689 RtlFreeSid(DomainSid);
690 return 0;
691 }
692 }
693
694 /* Create the Administrator profile */
695 if (!CreateUserProfileW(AdminSid, L"Administrator"))
696 {
697 DebugPrint("CreateUserProfileW() failed!");
698 RtlFreeSid(AdminSid);
699 RtlFreeSid(DomainSid);
700 return 0;
701 }
702
703 RtlFreeSid(AdminSid);
704 RtlFreeSid(DomainSid);
705
706 CreateTempDir(L"TEMP");
707 CreateTempDir(L"TMP");
708
709 if (GetWindowsDirectory(szBuffer, sizeof(szBuffer) / sizeof(TCHAR)))
710 {
711 PathAddBackslash(szBuffer);
712 _tcscat(szBuffer, _T("system"));
713 CreateDirectory(szBuffer, NULL);
714 }
715
716 if (!CommonInstall())
717 return 0;
718
719 InstallWizard();
720
721 SetupCloseInfFile(hSysSetupInf);
722
723 LogItem(SYSSETUP_SEVERITY_INFORMATION, L"Installing ReactOS done");
724 TerminateSetupActionLog();
725
726 /// THE FOLLOWING DPRINT IS FOR THE SYSTEM REGRESSION TOOL
727 /// DO NOT REMOVE!!!
728 DbgPrint("SYSREG_CHECKPOINT:SYSSETUP_COMPLETE\n");
729
730 return 0;
731 }
732
733
734 /*
735 * @unimplemented
736 */
737 DWORD STDCALL
738 SetupChangeFontSize(
739 IN HANDLE hWnd,
740 IN LPCWSTR lpszFontSize)
741 {
742 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
743 return FALSE;
744 }