ReactOS 0.4.17-dev-577-ge3e58ac
usetup.c File Reference
#include <usetup.h>
#include <math.h>
#include <ntstrsafe.h>
#include "cmdcons.h"
#include "devinst.h"
#include "fmtchk.h"
#include <debug.h>
Include dependency graph for usetup.c:

Go to the source code of this file.

Classes

struct  _FSVOL_CONTEXT
 
struct  _COPYCONTEXT
 

Macros

#define NDEBUG
 
#define InstallVolume   (InstallPartition->Volume)
 
#define SystemVolume   (SystemPartition->Volume)
 
#define VOLUME_NEW_AUTOCREATE   0x80
 
#define PARTITION_SIZE_INPUT_FIELD_LENGTH   9
 
#define PARTITION_MAXSIZE   (pow(10, (PARTITION_SIZE_INPUT_FIELD_LENGTH - 1)) - 1)
 

Typedefs

typedef struct _FSVOL_CONTEXT FSVOL_CONTEXT
 
typedef struct _FSVOL_CONTEXTPFSVOL_CONTEXT
 
typedef struct _COPYCONTEXT COPYCONTEXT
 
typedef struct _COPYCONTEXTPCOPYCONTEXT
 

Enumerations

enum  { PartTypeData , PartTypeExtended }
 

Functions

static VOID PrintString (IN PCSTR fmt,...)
 
static VOID DrawBox (IN SHORT xLeft, IN SHORT yTop, IN SHORT Width, IN SHORT Height)
 
VOID PopupError (PCCH Text, PCCH Status, PINPUT_RECORD Ir, ULONG WaitEvent)
 
static BOOL ConfirmQuit (PINPUT_RECORD Ir)
 
static VOID UpdateKBLayout (VOID)
 
static NTSTATUS NTAPI GetSettingDescription (IN PGENERIC_LIST_ENTRY Entry, OUT PSTR Buffer, IN SIZE_T cchBufferSize)
 
static NTSTATUS NTAPI GetNTOSInstallationName (IN PGENERIC_LIST_ENTRY Entry, OUT PSTR Buffer, IN SIZE_T cchBufferSize)
 
static VOID __cdecl USetupErrorRoutine (IN PUSETUP_DATA pSetupData,...)
 
static PAGE_NUMBER SetupStartPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER LanguagePage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER WelcomePage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER LicensePage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER RepairIntroPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER UpgradeRepairPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER InstallIntroPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER DeviceSettingsPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER HandleGenericList (PGENERIC_LIST_UI ListUi, PAGE_NUMBER nextPage, PINPUT_RECORD Ir)
 
static PAGE_NUMBER ComputerSettingsPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER DisplaySettingsPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER KeyboardSettingsPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER LayoutSettingsPage (PINPUT_RECORD Ir)
 
static BOOLEAN IsMediumLargeEnough (_In_ ULONGLONG SizeInBytes)
 
static PAGE_NUMBER SelectPartitionPage (PINPUT_RECORD Ir)
 
static VOID ShowPartitionSizeInputBox (SHORT Left, SHORT Top, SHORT Right, SHORT Bottom, ULONG MaxSize, PWSTR InputBuffer, PBOOLEAN Quit, PBOOLEAN Cancel)
 
static PAGE_NUMBER CreatePartitionPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER ConfirmDeleteSystemPartitionPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER DeletePartitionPage (PINPUT_RECORD Ir)
 
static FSVOL_OP CALLBACK FsVolCallback (_In_opt_ PVOID Context, _In_ FSVOLNOTIFY FormatStatus, _In_ ULONG_PTR Param1, _In_ ULONG_PTR Param2)
 
static PAGE_NUMBER StartPartitionOperationsPage (PINPUT_RECORD Ir)
 
static BOOLEAN ChangeSystemPartitionPage (IN PINPUT_RECORD Ir, IN PPARTENTRY SystemPartition)
 
static VOID ResetFileSystemList (VOID)
 
static FSVOL_OP SelectFileSystemPage (_In_ PFSVOL_CONTEXT FsVolContext, _In_ PVOLENTRY Volume)
 
static FSVOL_OP FormatPartitionPage (_In_ PFSVOL_CONTEXT FsVolContext, _In_ PVOLENTRY Volume)
 
static VOID CheckFileSystemPage (_In_ PVOLENTRY Volume)
 
static PAGE_NUMBER InstallDirectoryPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER PrepareCopyPage (PINPUT_RECORD Ir)
 
static VOID SetupUpdateMemoryInfo (IN PCOPYCONTEXT CopyContext, IN BOOLEAN First)
 
static UINT CALLBACK FileCopyCallback (PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2)
 
static PAGE_NUMBER FileCopyPage (PINPUT_RECORD Ir)
 
static VOID __cdecl RegistryStatus (IN REGISTRY_STATUS RegStatus,...)
 
static PAGE_NUMBER RegistryPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER BootLoaderSelectPage (PINPUT_RECORD Ir)
 
static BOOLEAN BootLoaderRemovableDiskPage (PINPUT_RECORD Ir)
 
static BOOLEAN BootLoaderHardDiskPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER BootLoaderInstallPage (PINPUT_RECORD Ir)
 
ProgressTimeOutStringHandler

Handles the generation (displaying) of the timeout countdown to the screen dynamically.

Parameters
BarA pointer to a progress bar.
AlwaysUpdateConstantly update the progress bar (boolean type).
BufferA pointer to a string buffer.
cchBufferSizeThe buffer's size in number of characters.
Returns
TRUE or FALSE on function termination.
static BOOLEAN NTAPI ProgressTimeOutStringHandler (IN PPROGRESSBAR Bar, IN BOOLEAN AlwaysUpdate, OUT PSTR Buffer, IN SIZE_T cchBufferSize)
 
ProgressCountdown

Displays and draws a red-coloured progress bar with a countdown. When the timeout is reached, the flush page is displayed for reboot.

Parameters
IrA pointer to an input keyboard record.
TimeOutInitial countdown value in seconds.
Returns
Nothing.
static VOID ProgressCountdown (IN PINPUT_RECORD Ir, IN LONG TimeOut)
 
static PAGE_NUMBER QuitPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER SuccessPage (PINPUT_RECORD Ir)
 
static PAGE_NUMBER FlushPage (PINPUT_RECORD Ir)
 
NTSTATUS RunUSetup (VOID)
 
VOID NTAPI NtProcessStartup (PPEB Peb)
 

Variables

HANDLE ProcessHeap
 
static USETUP_DATA USetupData
 
static BOOLEAN IsUnattendedSetup
 
static PPARTENTRY InstallPartition = NULL
 
static PPARTENTRY SystemPartition = NULL
 
PCWSTR SelectedLanguageId
 
static WCHAR DefaultLanguage [20]
 
static WCHAR DefaultKBLayout [20]
 
static BOOLEAN RepairUpdateFlag = FALSE
 
static PPARTLIST PartitionList = NULL
 
static PPARTENTRY CurrentPartition = NULL
 
static enum { ... }  PartCreateType = PartTypeData
 
static PFILE_SYSTEM_LIST FileSystemList = NULL
 
static PNTOS_INSTALLATION CurrentInstallation = NULL
 
static PGENERIC_LIST NtOsInstallsList = NULL
 

Macro Definition Documentation

◆ InstallVolume

#define InstallVolume   (InstallPartition->Volume)

Definition at line 50 of file usetup.c.

◆ NDEBUG

#define NDEBUG

Definition at line 36 of file usetup.c.

◆ PARTITION_MAXSIZE

#define PARTITION_MAXSIZE   (pow(10, (PARTITION_SIZE_INPUT_FIELD_LENGTH - 1)) - 1)

Definition at line 1848 of file usetup.c.

◆ PARTITION_SIZE_INPUT_FIELD_LENGTH

#define PARTITION_SIZE_INPUT_FIELD_LENGTH   9

Definition at line 1846 of file usetup.c.

◆ SystemVolume

#define SystemVolume   (SystemPartition->Volume)

Definition at line 63 of file usetup.c.

◆ VOLUME_NEW_AUTOCREATE

#define VOLUME_NEW_AUTOCREATE   0x80

Definition at line 85 of file usetup.c.

Typedef Documentation

◆ COPYCONTEXT

◆ FSVOL_CONTEXT

◆ PCOPYCONTEXT

◆ PFSVOL_CONTEXT

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
PartTypeData 
PartTypeExtended 

Definition at line 79 of file usetup.c.

79 {
80 PartTypeData, // On MBR-disks, primary or logical partition
81 PartTypeExtended // MBR-disk container
@ PartTypeData
Definition: usetup.c:80
@ PartTypeExtended
Definition: usetup.c:81
static enum @81 PartCreateType

Function Documentation

◆ BootLoaderHardDiskPage()

static BOOLEAN BootLoaderHardDiskPage ( PINPUT_RECORD  Ir)
static

Definition at line 3631 of file usetup.c.

3632{
3634
3635 /* Copy FreeLoader to the disk and save the boot entries */
3642 ? 1 /* Install MBR and VBR */
3643 : 0 /* Install VBR only */);
3644 if (Status == STATUS_SUCCESS)
3645 return TRUE; /* Successful installation */
3646
3647 if (Status == ERROR_WRITE_BOOT)
3648 {
3649 /* Error when writing the VBR */
3651 SystemVolume->Info.FileSystem);
3652 }
3653 else if (Status == ERROR_INSTALL_BOOTCODE)
3654 {
3655 /* Error when writing the MBR */
3657 }
3658 else if (Status == STATUS_NOT_SUPPORTED)
3659 {
3660 PopupError("Setup does not currently support installing\n"
3661 "the bootloader on the computer you are using.\n"
3662 "Press ENTER to continue anyway.",
3664 Ir, POPUP_WAIT_ENTER);
3665 }
3666 else if (!NT_SUCCESS(Status))
3667 {
3668 /* Any other NTSTATUS failure code */
3670
3671 DPRINT1("InstallBootManagerAndBootEntries() failed: Status 0x%lx\n", Status);
3673 "Setup could not install the bootloader.\n"
3674 "(Status 0x%08lx).\n"
3675 "Press ENTER to continue anyway.",
3676 Status);
3679 Ir, POPUP_WAIT_ENTER);
3680 }
3681 return FALSE;
3682}
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
NTSTATUS NTAPI InstallBootManagerAndBootEntries(_In_ ARCHITECTURE_TYPE ArchType, _In_ PCUNICODE_STRING SystemRootPath, _In_ PCUNICODE_STRING SourceRootPath, _In_ PCUNICODE_STRING DestinationArcPath, _In_ ULONG_PTR Options)
Installs FreeLoader on the system and configure the boot entries.
Definition: bootsup.c:1674
Definition: bufpool.h:45
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define MAX_PATH
Definition: compat.h:34
#define L(x)
Definition: resources.c:13
@ ERROR_WRITE_BOOT
Definition: errorcode.h:28
@ ERROR_INSTALL_BOOTCODE
Definition: errorcode.h:35
Status
Definition: gdiplustypes.h:24
NTSTRSAFEVAPI RtlStringCbPrintfA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,...)
Definition: ntstrsafe.h:1148
char CHAR
Definition: pedump.c:57
#define STATUS_SUCCESS
Definition: shellext.h:65
UNICODE_STRING SystemRootPath
Definition: setuplib.h:119
UNICODE_STRING SourceRootPath
Definition: setuplib.h:101
LONG BootLoaderLocation
Definition: setuplib.h:132
ARCHITECTURE_TYPE ArchType
Definition: setuplib.h:145
UNICODE_STRING DestinationArcPath
Definition: setuplib.h:122
VOID __cdecl MUIDisplayError(IN ULONG ErrorNum, OUT PINPUT_RECORD Ir, IN ULONG WaitEvent,...)
Definition: mui.c:237
PCSTR MUIGetString(ULONG Number)
Definition: mui.c:251
#define STRING_CONTINUE
Definition: mui.h:149
#define SystemVolume
Definition: usetup.c:63
VOID PopupError(PCCH Text, PCCH Status, PINPUT_RECORD Ir, ULONG WaitEvent)
Definition: usetup.c:261
static USETUP_DATA USetupData
Definition: usetup.c:44
#define POPUP_WAIT_ENTER
Definition: usetup.h:124

Referenced by BootLoaderInstallPage().

◆ BootLoaderInstallPage()

static PAGE_NUMBER BootLoaderInstallPage ( PINPUT_RECORD  Ir)
static

Definition at line 3697 of file usetup.c.

3698{
3700
3702 RtlStringCchPrintfW(PathBuffer, _countof(PathBuffer),
3703 L"%s\\", SystemPartition->DeviceName);
3705 DPRINT1("SystemRootPath: %wZ\n", &USetupData.SystemRootPath);
3706
3709
3711 {
3712 /* Install on removable disk */
3713 case 1:
3715
3716 /* Install on hard-disk */
3717 case 2: // System partition / MBR and VBR (on BIOS-based PC)
3718 case 3: // VBR only (on BIOS-based PC)
3720
3721 /* Skip installation */
3722 case 0:
3723 default:
3724 return SUCCESS_PAGE;
3725 }
3726}
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define RTL_NUMBER_OF_FIELD(type, field)
Definition: ntbasedef.h:715
NTSTRSAFEVAPI RtlStringCchPrintfW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1110
short WCHAR
Definition: pedump.c:58
#define _countof(array)
Definition: sndvol32.h:70
WCHAR DeviceName[MAX_PATH]
NT device name: "\Device\HarddiskM\PartitionN".
Definition: partlist.h:77
VOID MUIDisplayPage(IN ULONG page)
Definition: mui.c:170
static BOOLEAN BootLoaderRemovableDiskPage(PINPUT_RECORD Ir)
Definition: usetup.c:3570
static PPARTENTRY SystemPartition
Definition: usetup.c:61
static BOOLEAN BootLoaderHardDiskPage(PINPUT_RECORD Ir)
Definition: usetup.c:3631
@ SUCCESS_PAGE
Definition: usetup.h:115
@ QUIT_PAGE
Definition: usetup.h:116
@ BOOTLOADER_INSTALL_PAGE
Definition: usetup.h:112
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281

Referenced by RunUSetup().

◆ BootLoaderRemovableDiskPage()

static BOOLEAN BootLoaderRemovableDiskPage ( PINPUT_RECORD  Ir)
static

Definition at line 3570 of file usetup.c.

3571{
3573
3574Retry:
3576 CONSOLE_Flush();
3578// CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
3579
3580 while (TRUE)
3581 {
3582 CONSOLE_ConInKey(Ir);
3583
3584 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
3585 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
3586 {
3587 if (ConfirmQuit(Ir))
3588 return FALSE;
3589 break;
3590 }
3591 else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
3592 {
3593 // FIXME: So far USETUP only supports the 1st floppy.
3594 static const UNICODE_STRING FloppyDrive = RTL_CONSTANT_STRING(L"\\Device\\Floppy0\\");
3596 &FloppyDrive,
3599 if (Status == STATUS_SUCCESS)
3600 return TRUE; /* Successful installation */
3601
3603 {
3605 }
3606 else if (!NT_SUCCESS(Status))
3607 {
3608 /* Any other NTSTATUS failure code */
3610
3611 DPRINT1("InstallBootcodeToRemovable() failed: Status 0x%lx\n", Status);
3613 "Setup could not install the bootloader.\n"
3614 "(Status 0x%08lx).\n"
3615 "Press ENTER to continue anyway.",
3616 Status);
3619 Ir, POPUP_WAIT_ENTER);
3620 }
3621 goto Retry;
3622 }
3623 }
3624 goto Retry;
3625}
NTSTATUS NTAPI InstallBootcodeToRemovable(_In_ ARCHITECTURE_TYPE ArchType, _In_ PCUNICODE_STRING RemovableRootPath, _In_ PCUNICODE_STRING SourceRootPath, _In_ PCUNICODE_STRING DestinationArcPath)
Definition: bootsup.c:1830
_In_ PSCSI_REQUEST_BLOCK _Out_ NTSTATUS _Inout_ BOOLEAN * Retry
Definition: classpnp.h:312
BOOL CONSOLE_Flush(VOID)
Definition: consup.c:175
VOID CONSOLE_ConInKey(OUT PINPUT_RECORD Buffer)
Definition: consup.c:70
VOID CONSOLE_ClearScreen(VOID)
Definition: consup.c:239
#define RTL_CONSTANT_STRING(s)
Definition: combase.c:35
static PDISK_IMAGE FloppyDrive[2]
Definition: dskbios32.c:36
@ ERROR_NO_FLOPPY
Definition: errorcode.h:36
#define STATUS_DEVICE_NOT_READY
Definition: shellext.h:70
union _INPUT_RECORD::@3579 Event
KEY_EVENT_RECORD KeyEvent
Definition: wincon.h:296
WORD wVirtualKeyCode
Definition: wincon.h:263
union _KEY_EVENT_RECORD::@3578 uChar
static BOOL ConfirmQuit(PINPUT_RECORD Ir)
Definition: usetup.c:434
@ BOOTLOADER_REMOVABLE_DISK_PAGE
Definition: usetup.h:113
#define VK_F3
Definition: winuser.h:2293

Referenced by BootLoaderInstallPage().

◆ BootLoaderSelectPage()

static PAGE_NUMBER BootLoaderSelectPage ( PINPUT_RECORD  Ir)
static

Definition at line 3415 of file usetup.c.

3416{
3417 USHORT Line = 12;
3418
3420
3421 /* We must have a supported system partition by now */
3423
3424 /*
3425 * If we repair an existing installation and we made it up to here,
3426 * this means a valid bootloader and boot entry have been found.
3427 * Thus, there is no need to re-install it: skip its installation.
3428 */
3429 if (RepairUpdateFlag)
3430 {
3432 goto Quit;
3433 }
3434
3435 /* For unattended setup, skip MBR installation or install on removable disk if needed */
3437 {
3438 if ((USetupData.BootLoaderLocation == 0) ||
3440 {
3441 goto Quit;
3442 }
3443 }
3444
3445#if 0 // Deprecated code, whose global logic may need to be moved elsewhere...
3446 /*
3447 * We may install an MBR or VBR, but before that, check whether
3448 * we need to actually install the VBR on removable disk if the
3449 * system partition is not recognized.
3450 */
3451 if ((SystemPartition->DiskEntry->DiskStyle != PARTITION_STYLE_MBR) ||
3453 {
3455 goto Quit;
3456 }
3457#endif
3458
3459 /* Is it an unattended install on hdd? */
3461 {
3462 if ((USetupData.BootLoaderLocation == 2) ||
3464 {
3465 goto Quit;
3466 }
3467 }
3468
3470 CONSOLE_InvertTextXY(8, Line, 60, 1);
3471
3472 while (TRUE)
3473 {
3474 CONSOLE_ConInKey(Ir);
3475
3476 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
3477 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
3478 {
3479 CONSOLE_NormalTextXY(8, Line, 60, 1);
3480
3481 Line++;
3482 if (Line < 12)
3483 Line = 15;
3484
3485 if (Line > 15)
3486 Line = 12;
3487
3488 CONSOLE_InvertTextXY(8, Line, 60, 1);
3489 }
3490 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
3491 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
3492 {
3493 CONSOLE_NormalTextXY(8, Line, 60, 1);
3494
3495 Line--;
3496 if (Line < 12)
3497 Line = 15;
3498
3499 if (Line > 15)
3500 Line = 12;
3501
3502 CONSOLE_InvertTextXY(8, Line, 60, 1);
3503 }
3504 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
3505 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_HOME)) /* HOME */
3506 {
3507 CONSOLE_NormalTextXY(8, Line, 60, 1);
3508
3509 Line = 12;
3510
3511 CONSOLE_InvertTextXY(8, Line, 60, 1);
3512 }
3513 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
3514 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_END)) /* END */
3515 {
3516 CONSOLE_NormalTextXY(8, Line, 60, 1);
3517
3518 Line = 15;
3519
3520 CONSOLE_InvertTextXY(8, Line, 60, 1);
3521 }
3522 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
3523 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
3524 {
3525 if (ConfirmQuit(Ir))
3526 return QUIT_PAGE;
3527 break;
3528 }
3529 else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
3530 {
3531 if (Line == 12)
3532 {
3533 /* Install on both MBR and VBR */
3535 break;
3536 }
3537 else if (Line == 13)
3538 {
3539 /* Install on VBR only */
3541 break;
3542 }
3543 else if (Line == 14)
3544 {
3545 /* Install on removable disk */
3547 break;
3548 }
3549 else if (Line == 15)
3550 {
3551 /* Skip installation */
3553 break;
3554 }
3555
3557 }
3558 }
3559
3560Quit:
3561 /* Continue the installation; the bootloader is installed at the end */
3563}
VOID CONSOLE_InvertTextXY(IN SHORT x, IN SHORT y, IN SHORT col, IN SHORT row)
Definition: consup.c:276
VOID CONSOLE_NormalTextXY(IN SHORT x, IN SHORT y, IN SHORT col, IN SHORT row)
Definition: consup.c:298
VOID __cdecl CONSOLE_SetStatusText(IN LPCSTR fmt,...)
Definition: consup.c:480
#define ASSERT(a)
Definition: mode.c:44
@ PARTITION_STYLE_MBR
Definition: imports.h:201
#define IsRecognizedPartition(PartitionType)
Definition: ntdddisk.h:342
unsigned short USHORT
Definition: pedump.c:61
Definition: ncftp.h:79
BOOLEAN IsPartitioned
Definition: partlist.h:82
UCHAR PartitionType
Definition: partlist.h:73
struct _DISKENTRY * DiskEntry
Definition: partlist.h:66
ULONG PartitionNumber
Definition: partlist.h:75
#define STRING_PLEASEWAIT
Definition: mui.h:132
static BOOLEAN IsUnattendedSetup
Definition: usetup.c:45
static BOOLEAN RepairUpdateFlag
Definition: usetup.c:72
@ BOOTLOADER_SELECT_PAGE
Definition: usetup.h:106
@ INSTALL_DIRECTORY_PAGE
Definition: usetup.h:109
#define VK_UP
Definition: winuser.h:2261
#define VK_END
Definition: winuser.h:2258
#define VK_HOME
Definition: winuser.h:2259
#define VK_DOWN
Definition: winuser.h:2263

Referenced by RunUSetup().

◆ ChangeSystemPartitionPage()

static BOOLEAN ChangeSystemPartitionPage ( IN PINPUT_RECORD  Ir,
IN PPARTENTRY  SystemPartition 
)
static

Definition at line 2316 of file usetup.c.

2319{
2320 PPARTENTRY PartEntry;
2321 PDISKENTRY DiskEntry;
2322 CHAR LineBuffer[100];
2323
2324 // CONSOLE_ClearScreen();
2325 // CONSOLE_Flush();
2327
2328 PartEntry = PartitionList->SystemPartition;
2329 DiskEntry = PartEntry->DiskEntry;
2330
2331 PartitionDescription(PartEntry, LineBuffer, ARRAYSIZE(LineBuffer));
2332 CONSOLE_SetTextXY(8, 10, LineBuffer);
2333
2334 DiskDescription(DiskEntry, LineBuffer, ARRAYSIZE(LineBuffer));
2336 LineBuffer);
2337
2338
2339 PartEntry = SystemPartition;
2340 DiskEntry = PartEntry->DiskEntry;
2341
2342 PartitionDescription(PartEntry, LineBuffer, ARRAYSIZE(LineBuffer));
2343 CONSOLE_SetTextXY(8, 23, LineBuffer);
2344
2345 while (TRUE)
2346 {
2347 CONSOLE_ConInKey(Ir);
2348
2349 if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */
2350 break;
2351 else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) /* ESC */
2352 return FALSE;
2353 }
2354
2355 return TRUE;
2356}
VOID CONSOLE_SetTextXY(IN SHORT x, IN SHORT y, IN LPCSTR Text)
Definition: consup.c:320
VOID __cdecl CONSOLE_PrintTextXY(IN SHORT x, IN SHORT y, IN LPCSTR fmt,...)
Definition: consup.c:595
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
VOID PartitionDescription(IN PPARTENTRY PartEntry, OUT PSTR strBuffer, IN SIZE_T cchBuffer)
Definition: partlist.c:126
VOID DiskDescription(IN PDISKENTRY DiskEntry, OUT PSTR strBuffer, IN SIZE_T cchBuffer)
Definition: partlist.c:279
PPARTENTRY SystemPartition
Definition: partlist.h:181
#define STRING_HDDISK1
Definition: mui.h:173
static PPARTLIST PartitionList
Definition: usetup.c:75
@ CHANGE_SYSTEM_PARTITION
Definition: usetup.h:98
#define VK_RETURN
Definition: winuser.h:2237
#define VK_ESCAPE
Definition: winuser.h:2250

Referenced by FsVolCallback().

◆ CheckFileSystemPage()

static VOID CheckFileSystemPage ( _In_ PVOLENTRY  Volume)
static

Definition at line 2583 of file usetup.c.

2585{
2586 PPARTENTRY PartEntry = Volume->PartEntry;
2587 PDISKENTRY DiskEntry = PartEntry->DiskEntry;
2588 CHAR LineBuffer[100];
2589
2591 CONSOLE_Flush();
2593
2594 PartitionDescription(PartEntry, LineBuffer, ARRAYSIZE(LineBuffer));
2595 CONSOLE_SetTextXY(6, 10, LineBuffer);
2596
2597 DiskDescription(DiskEntry, LineBuffer, ARRAYSIZE(LineBuffer));
2599 LineBuffer);
2600}
UNICODE_STRING Volume
Definition: fltkernel.h:1172
#define STRING_HDDISK2
Definition: mui.h:174
@ CHECK_FILE_SYSTEM_PAGE
Definition: usetup.h:105

Referenced by FsVolCallback().

◆ ComputerSettingsPage()

static PAGE_NUMBER ComputerSettingsPage ( PINPUT_RECORD  Ir)
static

Definition at line 1424 of file usetup.c.

1425{
1426 GENERIC_LIST_UI ListUi;
1428
1430 DrawGenericList(&ListUi,
1431 2, 18,
1432 xScreen - 3,
1433 yScreen - 3);
1434
1435 return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
1436}
SHORT yScreen
Definition: consup.c:40
SHORT xScreen
Definition: consup.c:39
PGENERIC_LIST ComputerList
Definition: setuplib.h:138
VOID InitGenericListUi(IN OUT PGENERIC_LIST_UI ListUi, IN PGENERIC_LIST List, IN PGET_ENTRY_DESCRIPTION GetEntryDescriptionProc)
Definition: genlist.c:37
VOID DrawGenericList(IN PGENERIC_LIST_UI ListUi, IN SHORT Left, IN SHORT Top, IN SHORT Right, IN SHORT Bottom)
Definition: genlist.c:326
static NTSTATUS NTAPI GetSettingDescription(IN PGENERIC_LIST_ENTRY Entry, OUT PSTR Buffer, IN SIZE_T cchBufferSize)
Definition: usetup.c:498
static PAGE_NUMBER HandleGenericList(PGENERIC_LIST_UI ListUi, PAGE_NUMBER nextPage, PINPUT_RECORD Ir)
Definition: usetup.c:1360
@ COMPUTER_SETTINGS_PAGE
Definition: usetup.h:91
@ DEVICE_SETTINGS_PAGE
Definition: usetup.h:90

Referenced by RunUSetup().

◆ ConfirmDeleteSystemPartitionPage()

static PAGE_NUMBER ConfirmDeleteSystemPartitionPage ( PINPUT_RECORD  Ir)
static

Definition at line 2153 of file usetup.c.

2154{
2156
2157 while (TRUE)
2158 {
2159 CONSOLE_ConInKey(Ir);
2160
2161 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
2162 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
2163 {
2164 if (ConfirmQuit(Ir))
2165 return QUIT_PAGE;
2166 break;
2167 }
2168 else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */
2169 {
2170 return DELETE_PARTITION_PAGE;
2171 }
2172 else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) /* ESC */
2173 {
2174 return SELECT_PARTITION_PAGE;
2175 }
2176 }
2177
2179}
@ DELETE_PARTITION_PAGE
Definition: usetup.h:100
@ SELECT_PARTITION_PAGE
Definition: usetup.h:96
@ CONFIRM_DELETE_SYSTEM_PARTITION_PAGE
Definition: usetup.h:99

Referenced by RunUSetup().

◆ ConfirmQuit()

static BOOL ConfirmQuit ( PINPUT_RECORD  Ir)
static

Definition at line 434 of file usetup.c.

435{
436 BOOL Result = FALSE;
438
439 while (TRUE)
440 {
442
443 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
444 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
445 {
446 Result = TRUE;
447 break;
448 }
449 else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
450 {
451 Result = FALSE;
452 break;
453 }
454 }
455
456 return Result;
457}
#define NULL
Definition: types.h:112
unsigned int BOOL
Definition: ntddk_ex.h:94
#define ERROR_NOT_INSTALLED
Definition: setupapi.h:295
#define POPUP_WAIT_NONE
Definition: usetup.h:122
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409

Referenced by BootLoaderRemovableDiskPage(), BootLoaderSelectPage(), ConfirmDeleteSystemPartitionPage(), CreatePartitionPage(), DeletePartitionPage(), DeviceSettingsPage(), FormatPartitionPage(), FsVolCallback(), HandleGenericList(), InstallDirectoryPage(), InstallIntroPage(), LanguagePage(), SelectFileSystemPage(), SelectPartitionPage(), UpgradeRepairPage(), and WelcomePage().

◆ CreatePartitionPage()

static PAGE_NUMBER CreatePartitionPage ( PINPUT_RECORD  Ir)
static

Definition at line 2044 of file usetup.c.

2045{
2046 PPARTENTRY PartEntry;
2047 PDISKENTRY DiskEntry;
2048 ULONG uID;
2049 ULONG MaxSize;
2050 ULONGLONG MaxPartSize, PartSize;
2051 BOOLEAN Quit, Cancel;
2052 WCHAR InputBuffer[50];
2053 CHAR LineBuffer[100];
2054
2056 {
2057 /* FIXME: show an error dialog */
2058 return QUIT_PAGE;
2059 }
2060
2062 {
2066 }
2067 else // if (PartCreateType == PartTypeExtended)
2068 {
2070 }
2071
2073
2074 PartEntry = CurrentPartition;
2075 DiskEntry = CurrentPartition->DiskEntry;
2076
2077 DiskDescription(DiskEntry, LineBuffer, ARRAYSIZE(LineBuffer));
2079 LineBuffer);
2080
2082
2084
2085 MaxPartSize = GetPartEntrySizeInBytes(PartEntry);
2086
2087 while (TRUE)
2088 {
2089 /* Retrieve the maximum size in MB (rounded up)
2090 * and cap it with what the user can enter */
2091 MaxSize = (ULONG)RoundingDivide(MaxPartSize, MB);
2092 MaxSize = min(MaxSize, PARTITION_MAXSIZE);
2093
2094 ShowPartitionSizeInputBox(12, 14, xScreen - 12, 17,
2095 MaxSize, InputBuffer, &Quit, &Cancel);
2096 if (Quit)
2097 {
2098 if (ConfirmQuit(Ir))
2099 return QUIT_PAGE;
2100 break;
2101 }
2102 else if (Cancel)
2103 {
2104 return SELECT_PARTITION_PAGE;
2105 }
2106
2107 PartSize = _wcstoui64(InputBuffer, NULL, 10);
2108
2109 /* Retry if too small or too large */
2110 if ((PartSize < 1) || (PartSize > MaxSize))
2111 continue;
2112
2113 /*
2114 * If the input size, given in MB, specifies the maximum partition
2115 * size, it may slightly under- or over-estimate the latter due to
2116 * rounding error. In this case, use all of the unpartitioned space.
2117 * Otherwise, directly convert the size to bytes.
2118 */
2119 if (PartSize == MaxSize)
2120 PartSize = MaxPartSize;
2121 else // if (PartSize < MaxSize)
2122 PartSize *= MB;
2123 DPRINT("Partition size: %I64u bytes\n", PartSize);
2124
2125 ASSERT(PartSize <= MaxPartSize);
2126
2129 PartSize,
2131 ? 0
2132 // (PartCreateType == PartTypeExtended)
2134
2135 return SELECT_PARTITION_PAGE;
2136 }
2137
2138 return CREATE_PARTITION_PAGE;
2139}
unsigned char BOOLEAN
Definition: actypes.h:127
_ACRTIMP unsigned __int64 __cdecl _wcstoui64(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2890
#define GetPartEntrySizeInBytes(PartEntry)
Definition: partlist.h:255
void Cancel(int sigNum)
Definition: shell.c:481
#define min(a, b)
Definition: monoChain.cc:55
#define PARTITION_EXTENDED
Definition: part_mbr.h:55
_In_ UINT uID
Definition: shlwapi.h:156
ULONGLONG RoundingDivide(IN ULONGLONG Dividend, IN ULONGLONG Divisor)
Definition: partlist.c:97
BOOLEAN NTAPI CreatePartition(_In_ PPARTLIST List, _Inout_ PPARTENTRY PartEntry, _In_opt_ ULONGLONG SizeBytes, _In_opt_ ULONG_PTR PartitionInfo)
Definition: partlist.c:2975
#define MB
Definition: setuplib.h:75
#define DPRINT
Definition: sndvol32.h:73
BOOLEAN LogicalPartition
Definition: partlist.h:79
uint64_t ULONGLONG
Definition: typedefs.h:67
uint32_t ULONG
Definition: typedefs.h:59
#define STRING_CREATEPARTITION
Definition: mui.h:142
#define STRING_CHOOSE_NEW_EXTENDED_PARTITION
Definition: mui.h:139
#define STRING_CHOOSE_NEW_PARTITION
Definition: mui.h:138
#define STRING_HDPARTSIZE
Definition: mui.h:141
#define STRING_CHOOSE_NEW_LOGICAL_PARTITION
Definition: mui.h:140
static PPARTENTRY CurrentPartition
Definition: usetup.c:78
#define PARTITION_MAXSIZE
Definition: usetup.c:1848
static VOID ShowPartitionSizeInputBox(SHORT Left, SHORT Top, SHORT Right, SHORT Bottom, ULONG MaxSize, PWSTR InputBuffer, PBOOLEAN Quit, PBOOLEAN Cancel)
Definition: usetup.c:1851
@ CREATE_PARTITION_PAGE
Definition: usetup.h:97
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
Definition: wdfiotarget.h:953

Referenced by RunUSetup().

◆ DeletePartitionPage()

static PAGE_NUMBER DeletePartitionPage ( PINPUT_RECORD  Ir)
static

Definition at line 2193 of file usetup.c.

2194{
2195 PPARTENTRY PartEntry;
2196 PDISKENTRY DiskEntry;
2197 CHAR LineBuffer[100];
2198
2200 {
2201 /* FIXME: show an error dialog */
2202 return QUIT_PAGE;
2203 }
2204
2205 PartEntry = CurrentPartition;
2206 DiskEntry = CurrentPartition->DiskEntry;
2207
2209
2210 PartitionDescription(PartEntry, LineBuffer, ARRAYSIZE(LineBuffer));
2211 CONSOLE_SetTextXY(6, 10, LineBuffer);
2212
2213 DiskDescription(DiskEntry, LineBuffer, ARRAYSIZE(LineBuffer));
2215 LineBuffer);
2216
2217 while (TRUE)
2218 {
2219 CONSOLE_ConInKey(Ir);
2220
2221 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
2222 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
2223 {
2224 if (ConfirmQuit(Ir))
2225 return QUIT_PAGE;
2226 break;
2227 }
2228 else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) /* ESC */
2229 {
2230 return SELECT_PARTITION_PAGE;
2231 }
2232 else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'L') /* L */
2233 {
2237 return SELECT_PARTITION_PAGE;
2238 }
2239 }
2240
2241 return DELETE_PARTITION_PAGE;
2242}
BOOLEAN NTAPI DeletePartition(_In_ PPARTLIST List, _In_ PPARTENTRY PartEntry, _Out_opt_ PPARTENTRY *FreeRegion)
Definition: partlist.c:3075

Referenced by RunUSetup().

◆ DeviceSettingsPage()

static PAGE_NUMBER DeviceSettingsPage ( PINPUT_RECORD  Ir)
static

Definition at line 1229 of file usetup.c.

1230{
1231 static ULONG Line = 16;
1232
1233 /* Initialize the computer settings list */
1235 {
1238 {
1240 return QUIT_PAGE;
1241 }
1242 }
1243
1244 /* Initialize the display settings list */
1246 {
1249 {
1251 return QUIT_PAGE;
1252 }
1253 }
1254
1255 /* Initialize the keyboard settings list */
1257 {
1260 {
1262 return QUIT_PAGE;
1263 }
1264 }
1265
1266 /* Initialize the keyboard layout list */
1268 {
1271 {
1272 /* FIXME: report error */
1274 return QUIT_PAGE;
1275 }
1276 }
1277
1278 if (RepairUpdateFlag)
1279 return SELECT_PARTITION_PAGE;
1280
1281 // if (IsUnattendedSetup)
1282 // return SELECT_PARTITION_PAGE;
1283
1285
1290
1291 CONSOLE_InvertTextXY(24, Line, 48, 1);
1292
1293 while (TRUE)
1294 {
1295 CONSOLE_ConInKey(Ir);
1296
1297 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1298 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
1299 {
1300 CONSOLE_NormalTextXY(24, Line, 48, 1);
1301
1302 if (Line == 14)
1303 Line = 16;
1304 else if (Line == 16)
1305 Line = 11;
1306 else
1307 Line++;
1308
1309 CONSOLE_InvertTextXY(24, Line, 48, 1);
1310 }
1311 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1312 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
1313 {
1314 CONSOLE_NormalTextXY(24, Line, 48, 1);
1315
1316 if (Line == 11)
1317 Line = 16;
1318 else if (Line == 16)
1319 Line = 14;
1320 else
1321 Line--;
1322
1323 CONSOLE_InvertTextXY(24, Line, 48, 1);
1324 }
1325 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1326 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
1327 {
1328 if (ConfirmQuit(Ir))
1329 return QUIT_PAGE;
1330 break;
1331 }
1332 else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
1333 {
1334 if (Line == 11)
1336 else if (Line == 12)
1337 return DISPLAY_SETTINGS_PAGE;
1338 else if (Line == 13)
1340 else if (Line == 14)
1341 return LAYOUT_SETTINGS_PAGE;
1342 else if (Line == 16)
1343 return SELECT_PARTITION_PAGE;
1344 }
1345 }
1346
1347 return DEVICE_SETTINGS_PAGE;
1348}
PGENERIC_LIST CreateKeyboardDriverList(IN HINF InfFile)
Definition: settings.c:1072
PGENERIC_LIST CreateComputerTypeList(IN HINF InfFile)
Definition: settings.c:524
PGENERIC_LIST CreateDisplayDriverList(IN HINF InfFile)
Definition: settings.c:708
PGENERIC_LIST CreateKeyboardLayoutList(IN HINF InfFile, IN PCWSTR LanguageId, OUT PWSTR DefaultKBLayout)
Definition: settings.c:1209
@ ERROR_LOAD_KBLAYOUT
Definition: errorcode.h:32
@ ERROR_LOAD_KEYBOARD
Definition: errorcode.h:31
@ ERROR_LOAD_DISPLAY
Definition: errorcode.h:30
@ ERROR_LOAD_COMPUTER
Definition: errorcode.h:29
PGENERIC_LIST DisplayList
Definition: setuplib.h:139
PGENERIC_LIST LayoutList
Definition: setuplib.h:141
HINF SetupInf
Definition: setuplib.h:95
PGENERIC_LIST KeyboardList
Definition: setuplib.h:140
VOID DrawGenericListCurrentItem(IN PGENERIC_LIST List, IN PGET_ENTRY_DESCRIPTION GetEntryDescriptionProc, IN SHORT Left, IN SHORT Top)
Definition: genlist.c:353
static WCHAR DefaultKBLayout[20]
Definition: usetup.c:70
PCWSTR SelectedLanguageId
Definition: usetup.c:68
@ LAYOUT_SETTINGS_PAGE
Definition: usetup.h:94
@ DISPLAY_SETTINGS_PAGE
Definition: usetup.h:92
@ KEYBOARD_SETTINGS_PAGE
Definition: usetup.h:93

Referenced by RunUSetup().

◆ DisplaySettingsPage()

static PAGE_NUMBER DisplaySettingsPage ( PINPUT_RECORD  Ir)
static

Definition at line 1450 of file usetup.c.

1451{
1452 GENERIC_LIST_UI ListUi;
1454
1456 DrawGenericList(&ListUi,
1457 2, 18,
1458 xScreen - 3,
1459 yScreen - 3);
1460
1461 return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
1462}

Referenced by RunUSetup().

◆ DrawBox()

static VOID DrawBox ( IN SHORT  xLeft,
IN SHORT  yTop,
IN SHORT  Width,
IN SHORT  Height 
)
static

Definition at line 171 of file usetup.c.

175{
176 COORD coPos;
177 DWORD Written;
178
179 /* Draw upper left corner */
180 coPos.X = xLeft;
181 coPos.Y = yTop;
183 CharUpperLeftCorner, // '+',
184 1,
185 coPos,
186 &Written);
187
188 /* Draw upper edge */
189 coPos.X = xLeft + 1;
190 coPos.Y = yTop;
192 CharHorizontalLine, // '-',
193 Width - 2,
194 coPos,
195 &Written);
196
197 /* Draw upper right corner */
198 coPos.X = xLeft + Width - 1;
199 coPos.Y = yTop;
201 CharUpperRightCorner, // '+',
202 1,
203 coPos,
204 &Written);
205
206 /* Draw right edge, inner space and left edge */
207 for (coPos.Y = yTop + 1; coPos.Y < yTop + Height - 1; coPos.Y++)
208 {
209 coPos.X = xLeft;
211 CharVerticalLine, // '|',
212 1,
213 coPos,
214 &Written);
215
216 coPos.X = xLeft + 1;
218 ' ',
219 Width - 2,
220 coPos,
221 &Written);
222
223 coPos.X = xLeft + Width - 1;
225 CharVerticalLine, // '|',
226 1,
227 coPos,
228 &Written);
229 }
230
231 /* Draw lower left corner */
232 coPos.X = xLeft;
233 coPos.Y = yTop + Height - 1;
235 CharLowerLeftCorner, // '+',
236 1,
237 coPos,
238 &Written);
239
240 /* Draw lower edge */
241 coPos.X = xLeft + 1;
242 coPos.Y = yTop + Height - 1;
244 CharHorizontalLine, // '-',
245 Width - 2,
246 coPos,
247 &Written);
248
249 /* Draw lower right corner */
250 coPos.X = xLeft + Width - 1;
251 coPos.Y = yTop + Height - 1;
253 CharLowerRightCorner, // '+',
254 1,
255 coPos,
256 &Written);
257}
BOOL WINAPI FillConsoleOutputCharacterA(IN HANDLE hConsoleOutput, IN CHAR cCharacter, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfCharsWritten)
Definition: console.c:560
HANDLE StdOutput
Definition: consup.c:37
unsigned long DWORD
Definition: ntddk_ex.h:95
Definition: blue.h:25
SHORT Y
Definition: blue.h:27
SHORT X
Definition: blue.h:26
_In_ HFONT _Out_ PUINT _Out_ PUINT Width
Definition: font.h:89
_In_ HFONT _Out_ PUINT Height
Definition: font.h:88
CHAR CharHorizontalLine
Definition: mui.c:39
CHAR CharUpperRightCorner
Definition: mui.c:42
CHAR CharLowerRightCorner
Definition: mui.c:44
CHAR CharUpperLeftCorner
Definition: mui.c:41
CHAR CharVerticalLine
Definition: mui.c:40
CHAR CharLowerLeftCorner
Definition: mui.c:43

Referenced by PopupError(), and ShowPartitionSizeInputBox().

◆ FileCopyCallback()

static UINT CALLBACK FileCopyCallback ( PVOID  Context,
UINT  Notification,
UINT_PTR  Param1,
UINT_PTR  Param2 
)
static

Definition at line 3135 of file usetup.c.

3139{
3141 PFILEPATHS_W FilePathInfo;
3142 PCWSTR SrcFileName, DstFileName;
3143
3144 switch (Notification)
3145 {
3147 {
3148 CopyContext->TotalOperations = (ULONG)Param2;
3149 CopyContext->CompletedOperations = 0;
3150 ProgressSetStepCount(CopyContext->ProgressBar,
3151 CopyContext->TotalOperations);
3153 break;
3154 }
3155
3159 {
3160 FilePathInfo = (PFILEPATHS_W)Param1;
3161
3163 {
3164 /* Display delete message */
3165 ASSERT(Param2 == FILEOP_DELETE);
3166
3167 DstFileName = wcsrchr(FilePathInfo->Target, L'\\');
3168 if (DstFileName) ++DstFileName;
3169 else DstFileName = FilePathInfo->Target;
3170
3172 DstFileName);
3173 }
3175 {
3176 /* Display move/rename message */
3177 ASSERT(Param2 == FILEOP_RENAME);
3178
3179 SrcFileName = wcsrchr(FilePathInfo->Source, L'\\');
3180 if (SrcFileName) ++SrcFileName;
3181 else SrcFileName = FilePathInfo->Source;
3182
3183 DstFileName = wcsrchr(FilePathInfo->Target, L'\\');
3184 if (DstFileName) ++DstFileName;
3185 else DstFileName = FilePathInfo->Target;
3186
3187 if (!_wcsicmp(SrcFileName, DstFileName))
3188 Param2 = STRING_MOVING;
3189 else
3190 Param2 = STRING_RENAMING;
3191
3193 SrcFileName, DstFileName);
3194 }
3196 {
3197 static PCSTR s_pszCopying = NULL; /* Cached for speed */
3198
3199 /* Display copy message */
3200 ASSERT(Param2 == FILEOP_COPY);
3201
3202 /* NOTE: When extracting from CABs the Source is the CAB name */
3203 DstFileName = wcsrchr(FilePathInfo->Target, L'\\');
3204 if (DstFileName) ++DstFileName;
3205 else DstFileName = FilePathInfo->Target;
3206
3207 if (!s_pszCopying)
3208 s_pszCopying = MUIGetString(STRING_COPYING);
3209 CONSOLE_SetStatusText(s_pszCopying, DstFileName);
3210#ifdef __REACTOS__ /* HACK */
3211 DoWatchDestFileName(DstFileName);
3212#endif
3213 }
3214
3216 break;
3217 }
3218
3220 {
3221 FilePathInfo = (PFILEPATHS_W)Param1;
3222
3223 DPRINT1("An error happened while trying to copy file '%S' (error 0x%08lx), skipping it...\n",
3224 FilePathInfo->Target, FilePathInfo->Win32Error);
3225 return FILEOP_SKIP;
3226 }
3227
3231 {
3232 CopyContext->CompletedOperations++;
3233
3234 /* SYSREG checkpoint */
3235 if (CopyContext->TotalOperations >> 1 == CopyContext->CompletedOperations)
3236 DPRINT1("CHECKPOINT:HALF_COPIED\n");
3237
3238 ProgressNextStep(CopyContext->ProgressBar);
3240 break;
3241 }
3242 }
3243
3244 return FILEOP_DOIT;
3245}
VOID ProgressNextStep(IN PPROGRESSBAR Bar)
Definition: progress.c:361
VOID ProgressSetStepCount(IN PPROGRESSBAR Bar, IN ULONG StepCount)
Definition: progress.c:347
#define wcsrchr
Definition: compat.h:16
BOOL WINAPI CopyContext(CONTEXT *dst, DWORD context_flags, CONTEXT *src)
Definition: memory.c:1633
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:164
#define SPFILENOTIFY_ENDDELETE
Definition: fileqsup.h:28
#define FILEOP_COPY
Definition: fileqsup.h:42
struct _FILEPATHS_W * PFILEPATHS_W
#define FILEOP_SKIP
Definition: fileqsup.h:49
#define SPFILENOTIFY_STARTDELETE
Definition: fileqsup.h:27
#define SPFILENOTIFY_STARTSUBQUEUE
Definition: fileqsup.h:24
#define FILEOP_DOIT
Definition: fileqsup.h:48
#define SPFILENOTIFY_ENDCOPY
Definition: fileqsup.h:36
#define SPFILENOTIFY_STARTCOPY
Definition: fileqsup.h:35
#define SPFILENOTIFY_COPYERROR
Definition: fileqsup.h:37
#define FILEOP_RENAME
Definition: fileqsup.h:43
#define SPFILENOTIFY_STARTRENAME
Definition: fileqsup.h:31
#define SPFILENOTIFY_ENDRENAME
Definition: fileqsup.h:32
#define FILEOP_DELETE
Definition: fileqsup.h:44
_In_ PVOID Context
Definition: storport.h:2269
UINT Win32Error
Definition: fileqsup.h:62
PCWSTR Source
Definition: fileqsup.h:61
PCWSTR Target
Definition: fileqsup.h:60
const uint16_t * PCWSTR
Definition: typedefs.h:57
const char * PCSTR
Definition: typedefs.h:52
#define STRING_COPYING
Definition: mui.h:155
#define STRING_MOVING
Definition: mui.h:153
#define STRING_DELETING
Definition: mui.h:152
#define STRING_RENAMING
Definition: mui.h:154
struct _COPYCONTEXT * PCOPYCONTEXT
static VOID SetupUpdateMemoryInfo(IN PCOPYCONTEXT CopyContext, IN BOOLEAN First)
Definition: usetup.c:3107
_In_ PWDFDEVICE_INIT _In_ PFN_WDF_DEVICE_SHUTDOWN_NOTIFICATION Notification
Definition: wdfcontrol.h:115

Referenced by FileCopyPage().

◆ FileCopyPage()

static PAGE_NUMBER FileCopyPage ( PINPUT_RECORD  Ir)
static

Definition at line 3261 of file usetup.c.

3262{
3264 UINT MemBarWidth;
3265
3267
3268 /* Create context for the copy process */
3269 CopyContext.TotalOperations = 0;
3270 CopyContext.CompletedOperations = 0;
3271
3272 /* Create the progress bar as well */
3273 CopyContext.ProgressBar = CreateProgressBar(13,
3274 26,
3275 xScreen - 13,
3276 yScreen - 20,
3277 10,
3278 24,
3279 TRUE,
3281
3282 // fit memory bars to screen width, distribute them uniform
3283 MemBarWidth = (xScreen - 26) / 5;
3284 MemBarWidth -= MemBarWidth % 2; // make even
3285 /* ATTENTION: The following progress bars are debug stuff, which should not be translated!! */
3286 /* Create the paged pool progress bar */
3287 CopyContext.MemoryBars[0] = CreateProgressBar(13,
3288 40,
3289 13 + MemBarWidth,
3290 43,
3291 13,
3292 44,
3293 FALSE,
3294 "Kernel Pool");
3295
3296 /* Create the non paged pool progress bar */
3297 CopyContext.MemoryBars[1] = CreateProgressBar((xScreen / 2)- (MemBarWidth / 2),
3298 40,
3299 (xScreen / 2) + (MemBarWidth / 2),
3300 43,
3301 (xScreen / 2)- (MemBarWidth / 2),
3302 44,
3303 FALSE,
3304 "Kernel Cache");
3305
3306 /* Create the global memory progress bar */
3307 CopyContext.MemoryBars[2] = CreateProgressBar(xScreen - 13 - MemBarWidth,
3308 40,
3309 xScreen - 13,
3310 43,
3311 xScreen - 13 - MemBarWidth,
3312 44,
3313 FALSE,
3314 "Free Memory");
3315
3316 /* Do the file copying */
3318
3319 /* If we get here, we're done, so cleanup the progress bar */
3320 DestroyProgressBar(CopyContext.ProgressBar);
3321 DestroyProgressBar(CopyContext.MemoryBars[0]);
3322 DestroyProgressBar(CopyContext.MemoryBars[1]);
3323 DestroyProgressBar(CopyContext.MemoryBars[2]);
3324
3325 /* Create the $winnt$.inf file */
3327
3328 /* Go display the next page */
3329 return REGISTRY_PAGE;
3330}
BOOLEAN NTAPI DoFileCopy(IN OUT PUSETUP_DATA pSetupData, IN PSP_FILE_CALLBACK_W MsgHandler, IN PVOID Context OPTIONAL)
Definition: install.c:828
PPROGRESSBAR CreateProgressBar(IN SHORT Left, IN SHORT Top, IN SHORT Right, IN SHORT Bottom, IN SHORT TextTop, IN SHORT TextRight, IN BOOLEAN DoubleEdge, IN PCSTR DescriptionText OPTIONAL)
Definition: progress.c:317
VOID DestroyProgressBar(IN OUT PPROGRESSBAR Bar)
Definition: progress.c:339
unsigned int UINT
Definition: sysinfo.c:13
VOID NTAPI InstallSetupInfFile(IN OUT PUSETUP_DATA pSetupData)
Definition: setuplib.c:208
#define STRING_SETUPCOPYINGFILES
Definition: mui.h:156
static UINT CALLBACK FileCopyCallback(PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2)
Definition: usetup.c:3135
@ FILE_COPY_PAGE
Definition: usetup.h:110
@ REGISTRY_PAGE
Definition: usetup.h:111

Referenced by RunUSetup().

◆ FlushPage()

static PAGE_NUMBER FlushPage ( PINPUT_RECORD  Ir)
static

Definition at line 3999 of file usetup.c.

4000{
4002 return REBOOT_PAGE;
4003}
@ FLUSH_PAGE
Definition: usetup.h:117
@ REBOOT_PAGE
Definition: usetup.h:118

Referenced by RunUSetup().

◆ FormatPartitionPage()

static FSVOL_OP FormatPartitionPage ( _In_ PFSVOL_CONTEXT  FsVolContext,
_In_ PVOLENTRY  Volume 
)
static

Definition at line 2527 of file usetup.c.

2530{
2531 PINPUT_RECORD Ir = FsVolContext->Ir;
2532 PPARTENTRY PartEntry = Volume->PartEntry;
2533 PDISKENTRY DiskEntry = PartEntry->DiskEntry;
2534 CHAR LineBuffer[100];
2535
2536Restart:
2538 CONSOLE_Flush();
2540
2541 PartitionDescription(PartEntry, LineBuffer, ARRAYSIZE(LineBuffer));
2542 CONSOLE_SetTextXY(6, 10, LineBuffer);
2543
2544 DiskDescription(DiskEntry, LineBuffer, ARRAYSIZE(LineBuffer));
2546 LineBuffer);
2547
2548 while (TRUE)
2549 {
2550 if (!IsUnattendedSetup)
2551 CONSOLE_ConInKey(Ir);
2552
2553 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
2554 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
2555 {
2556 if (ConfirmQuit(Ir))
2557 {
2558 FsVolContext->NextPageOnAbort = QUIT_PAGE;
2559 return FSVOL_ABORT;
2560 }
2561 goto Restart;
2562 }
2563 else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) /* ESC */
2564 {
2565 FsVolContext->NextPageOnAbort = SELECT_PARTITION_PAGE;
2566 return FSVOL_ABORT;
2567 }
2568 else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN || IsUnattendedSetup) /* ENTER */
2569 {
2570 /*
2571 * Remove the "Press ENTER to continue" message prompt when the ENTER
2572 * key is pressed as the user wants to begin the partition formatting.
2573 */
2576
2577 return FSVOL_DOIT;
2578 }
2579 }
2580}
#define TEXT_TYPE_REGULAR
Definition: consup.h:39
@ Restart
Definition: sacdrv.h:269
@ FSVOL_DOIT
Definition: fsutil.h:166
@ FSVOL_ABORT
Definition: fsutil.h:165
VOID MUIClearStyledText(IN ULONG Page, IN INT TextID, IN INT Flags)
Definition: mui.c:399
#define TEXT_ID_FORMAT_PROMPT
Definition: mui.h:129
@ FORMAT_PARTITION_PAGE
Definition: usetup.h:104

Referenced by FsVolCallback().

◆ FsVolCallback()

static FSVOL_OP CALLBACK FsVolCallback ( _In_opt_ PVOID  Context,
_In_ FSVOLNOTIFY  FormatStatus,
_In_ ULONG_PTR  Param1,
_In_ ULONG_PTR  Param2 
)
static

HACK!!

HACK!!

Definition at line 2605 of file usetup.c.

2610{
2611 PFSVOL_CONTEXT FsVolContext = (PFSVOL_CONTEXT)Context;
2612 PINPUT_RECORD Ir = FsVolContext->Ir;
2613
2614 switch (FormatStatus)
2615 {
2616 // FIXME: Deprecate!
2618 {
2620
2621 FsVolContext->NextPageOnAbort = SELECT_PARTITION_PAGE;
2623 return FSVOL_DOIT;
2624 return FSVOL_ABORT;
2625 }
2626
2628 {
2629 switch (Param1)
2630 {
2632 {
2634 FsVolContext->NextPageOnAbort = QUIT_PAGE;
2635 break;
2636 }
2637
2639 {
2640 /* FIXME: improve the error dialog */
2641 //
2642 // Error dialog should say that we cannot find a suitable
2643 // system partition and create one on the system. At this point,
2644 // it may be nice to ask the user whether he wants to continue,
2645 // or use an external drive as the system drive/partition
2646 // (e.g. floppy, USB drive, etc...)
2647 //
2648 PopupError("The ReactOS Setup could not find a supported system partition\n"
2649 "on your system or could not create a new one. Without such a partition\n"
2650 "the Setup program cannot install ReactOS.\n"
2651 "Press ENTER to return to the partition selection list.",
2653 Ir, POPUP_WAIT_ENTER);
2654
2655 FsVolContext->NextPageOnAbort = SELECT_PARTITION_PAGE;
2656 break;
2657 }
2658
2659 default:
2660 break;
2661 }
2662 return FSVOL_ABORT;
2663 }
2664
2667 // NOTE: If needed, clear screen and flush input.
2668 return FSVOL_DOIT;
2669
2671 {
2672 if ((FSVOL_OP)Param1 == FSVOL_FORMAT)
2673 {
2674 /*
2675 * In case we just repair an existing installation, or make
2676 * an unattended setup without formatting, just go to the
2677 * file system check step.
2678 */
2679 if (RepairUpdateFlag)
2680 return FSVOL_SKIP;
2683 return FSVOL_SKIP;
2684 }
2685 return FSVOL_DOIT;
2686 }
2687
2689 return 0;
2690
2692 {
2693 PFORMAT_VOLUME_INFO FmtInfo = (PFORMAT_VOLUME_INFO)Param1;
2695
2696 // FIXME: See also FSVOLNOTIFY_PARTITIONERROR
2697 if (FmtInfo->ErrorStatus == STATUS_PARTITION_FAILURE)
2698 {
2700 FsVolContext->NextPageOnAbort = QUIT_PAGE;
2701 return FSVOL_ABORT;
2702 }
2703 else
2705 {
2706 /* FIXME: show an error dialog */
2707 // MUIDisplayError(ERROR_FORMATTING_PARTITION, Ir, POPUP_WAIT_ANY_KEY,
2708 // FmtInfo->Volume->Info.DeviceName);
2709 FsVolContext->NextPageOnAbort = QUIT_PAGE;
2710 return FSVOL_ABORT;
2711 }
2712 else
2713 if (FmtInfo->ErrorStatus == STATUS_NOT_SUPPORTED)
2714 {
2716 sizeof(Buffer),
2717 "Setup is currently unable to format a partition in %S.\n"
2718 "\n"
2719 " \x07 Press ENTER to continue Setup.\n"
2720 " \x07 Press F3 to quit Setup.",
2721 FmtInfo->FileSystemName);
2722
2726
2727 while (TRUE)
2728 {
2729 CONSOLE_ConInKey(Ir);
2730
2731 if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x00 &&
2732 Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3) /* F3 */
2733 {
2734 if (ConfirmQuit(Ir))
2735 {
2736 FsVolContext->NextPageOnAbort = QUIT_PAGE;
2737 return FSVOL_ABORT;
2738 }
2739 return FSVOL_RETRY;
2740 }
2741 else if (Ir->Event.KeyEvent.uChar.AsciiChar == VK_RETURN) /* ENTER */
2742 {
2743 return FSVOL_RETRY;
2744 }
2745 }
2746 }
2747 else if (!NT_SUCCESS(FmtInfo->ErrorStatus))
2748 {
2749 DPRINT1("FormatPartition() failed: Status 0x%08lx\n", FmtInfo->ErrorStatus);
2751 FmtInfo->Volume->Info.DeviceName);
2752 FsVolContext->NextPageOnAbort = QUIT_PAGE;
2753 return FSVOL_ABORT;
2754 }
2755 return FSVOL_RETRY;
2756 }
2757
2759 {
2760 PCHECK_VOLUME_INFO ChkInfo = (PCHECK_VOLUME_INFO)Param1;
2762
2763 if (ChkInfo->ErrorStatus == STATUS_NOT_SUPPORTED)
2764 {
2766 sizeof(Buffer),
2767 "Setup is currently unable to check a partition formatted in %S.\n"
2768 "\n"
2769 " \x07 Press ENTER to continue Setup.\n"
2770 " \x07 Press F3 to quit Setup.",
2771 ChkInfo->Volume->Info.FileSystem);
2772
2776
2777 while (TRUE)
2778 {
2779 CONSOLE_ConInKey(Ir);
2780
2781 if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x00 &&
2782 Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3) /* F3 */
2783 {
2784 if (ConfirmQuit(Ir))
2785 {
2786 FsVolContext->NextPageOnAbort = QUIT_PAGE;
2787 return FSVOL_ABORT;
2788 }
2789 return FSVOL_SKIP;
2790 }
2791 else if (Ir->Event.KeyEvent.uChar.AsciiChar == VK_RETURN) /* ENTER */
2792 {
2793 return FSVOL_SKIP;
2794 }
2795 }
2796 }
2797 else if (!NT_SUCCESS(ChkInfo->ErrorStatus))
2798 {
2799 DPRINT1("ChkdskPartition() failed: Status 0x%08lx\n", ChkInfo->ErrorStatus);
2800
2802 sizeof(Buffer),
2803 "ChkDsk detected some disk errors.\n(Status 0x%08lx).\n",
2804 ChkInfo->ErrorStatus);
2805
2808 Ir, POPUP_WAIT_ENTER);
2809 return FSVOL_SKIP;
2810 }
2811 return FSVOL_SKIP;
2812 }
2813
2815 {
2816 PFORMAT_VOLUME_INFO FmtInfo = (PFORMAT_VOLUME_INFO)Param1;
2818
2819 ASSERT((FSVOL_OP)Param2 == FSVOL_FORMAT);
2820
2821 /* Select the file system */
2822 Result = SelectFileSystemPage(FsVolContext, FmtInfo->Volume);
2823 if (Result != FSVOL_DOIT)
2824 return Result;
2825
2826 /* Display the formatting page */
2827 Result = FormatPartitionPage(FsVolContext, FmtInfo->Volume);
2828 if (Result != FSVOL_DOIT)
2829 return Result;
2830
2832 return FSVOL_DOIT;
2833 }
2834
2836 {
2837 PFORMAT_VOLUME_INFO FmtInfo = (PFORMAT_VOLUME_INFO)Param1;
2838 EndFormat(FmtInfo->ErrorStatus);
2839
2840 /* Reset the file system list */
2842 return 0;
2843 }
2844
2846 {
2847 PCHECK_VOLUME_INFO ChkInfo = (PCHECK_VOLUME_INFO)Param1;
2848
2849 ASSERT((FSVOL_OP)Param2 == FSVOL_CHECK);
2850
2851 CheckFileSystemPage(ChkInfo->Volume);
2852 StartCheck(ChkInfo);
2853 return FSVOL_DOIT;
2854 }
2855
2857 {
2858 PCHECK_VOLUME_INFO ChkInfo = (PCHECK_VOLUME_INFO)Param1;
2859 EndCheck(ChkInfo->ErrorStatus);
2860 return 0;
2861 }
2862 }
2863
2864 return 0;
2865}
@ ERROR_WRITE_PTABLE
Definition: errorcode.h:51
@ ERROR_FORMATTING_PARTITION
Definition: errorcode.h:60
VOID EndCheck(_In_ NTSTATUS Status)
Definition: fmtchk.c:150
VOID StartCheck(_Inout_ PCHECK_VOLUME_INFO ChkInfo)
Definition: fmtchk.c:127
VOID StartFormat(_Inout_ PFORMAT_VOLUME_INFO FmtInfo, _In_ PFILE_SYSTEM_ITEM SelectedFileSystem)
Definition: fmtchk.c:70
VOID EndFormat(_In_ NTSTATUS Status)
Definition: fmtchk.c:97
struct _PARTENTRY * PPARTENTRY
Definition: partlist.h:42
#define STATUS_PARTITION_FAILURE
Definition: ntstatus.h:698
@ FSVOLNOTIFY_STARTCHECK
Definition: fsutil.h:153
@ FSVOLNOTIFY_ENDQUEUE
Definition: fsutil.h:145
@ FSVOLNOTIFY_STARTSUBQUEUE
Definition: fsutil.h:146
@ FSVOLNOTIFY_ENDFORMAT
Definition: fsutil.h:151
@ FSVOLNOTIFY_STARTFORMAT
Definition: fsutil.h:150
@ FSVOLNOTIFY_STARTQUEUE
Definition: fsutil.h:144
@ FSVOLNOTIFY_ENDSUBQUEUE
Definition: fsutil.h:147
@ FSVOLNOTIFY_PARTITIONERROR
Definition: fsutil.h:149
@ FSVOLNOTIFY_CHECKERROR
Definition: fsutil.h:155
@ ChangeSystemPartition
Definition: fsutil.h:156
@ FSVOLNOTIFY_FORMATERROR
Definition: fsutil.h:152
@ FSVOLNOTIFY_ENDCHECK
Definition: fsutil.h:154
enum _FSVOL_OP FSVOL_OP
struct _FORMAT_VOLUME_INFO * PFORMAT_VOLUME_INFO
@ FSVOL_FORMAT
Definition: fsutil.h:162
@ FSVOL_CHECK
Definition: fsutil.h:163
@ FSVOL_RETRY
Definition: fsutil.h:167
@ FSVOL_SKIP
Definition: fsutil.h:168
struct _CHECK_VOLUME_INFO * PCHECK_VOLUME_INFO
#define ERROR_SYSTEM_PARTITION_NOT_FOUND
Definition: setuplib.h:188
NTSTATUS ErrorStatus
Definition: fsutil.h:191
PVOLENTRY Volume
Definition: fsutil.h:189
PFILE_SYSTEM_ITEM Selected
Definition: fslist.h:42
NTSTATUS ErrorStatus
Definition: fsutil.h:175
PVOLENTRY Volume
Definition: fsutil.h:173
PCWSTR FileSystemName
Definition: fsutil.h:178
PAGE_NUMBER NextPageOnAbort
Definition: usetup.c:2270
PINPUT_RECORD Ir
Definition: usetup.c:2269
LONG FormatPartition
Definition: setuplib.h:133
VOLINFO Info
Definition: partlist.h:47
WCHAR DeviceName[MAX_PATH]
NT device name: "\Device\HarddiskVolumeN".
Definition: volutil.h:18
WCHAR FileSystem[MAX_PATH+1]
Definition: volutil.h:22
#define STATUS_UNRECOGNIZED_VOLUME
Definition: udferr_usr.h:173
#define STRING_QUITCONTINUE
Definition: mui.h:150
static VOID CheckFileSystemPage(_In_ PVOLENTRY Volume)
Definition: usetup.c:2583
static BOOLEAN ChangeSystemPartitionPage(IN PINPUT_RECORD Ir, IN PPARTENTRY SystemPartition)
Definition: usetup.c:2316
static VOID ResetFileSystemList(VOID)
Definition: usetup.c:2359
static FSVOL_OP FormatPartitionPage(_In_ PFSVOL_CONTEXT FsVolContext, _In_ PVOLENTRY Volume)
Definition: usetup.c:2527
struct _FSVOL_CONTEXT * PFSVOL_CONTEXT
static FSVOL_OP SelectFileSystemPage(_In_ PFSVOL_CONTEXT FsVolContext, _In_ PVOLENTRY Volume)
Definition: usetup.c:2369
static PFILE_SYSTEM_LIST FileSystemList
Definition: usetup.c:88
#define POPUP_WAIT_ANY_KEY
Definition: usetup.h:123

Referenced by StartPartitionOperationsPage().

◆ GetNTOSInstallationName()

static NTSTATUS NTAPI GetNTOSInstallationName ( IN PGENERIC_LIST_ENTRY  Entry,
OUT PSTR  Buffer,
IN SIZE_T  cchBufferSize 
)
static

Definition at line 509 of file usetup.c.

513{
515 PVOLINFO VolInfo = (NtOsInstall->Volume ? &NtOsInstall->Volume->Info : NULL);
516
517 if (VolInfo && VolInfo->DriveLetter)
518 {
519 /* We have retrieved a partition that is mounted */
520 return RtlStringCchPrintfA(Buffer, cchBufferSize,
521 "%C:%S \"%S\"",
522 VolInfo->DriveLetter,
523 NtOsInstall->PathComponent,
524 NtOsInstall->InstallationName);
525 }
526 else
527 {
528 /* We failed somewhere, just show the NT path */
529 return RtlStringCchPrintfA(Buffer, cchBufferSize,
530 "%wZ \"%S\"",
531 &NtOsInstall->SystemNtPath,
532 NtOsInstall->InstallationName);
533 }
534}
PVOID NTAPI GetListEntryData(IN PGENERIC_LIST_ENTRY Entry)
Definition: genlist.c:134
NTSTRSAFEVAPI RtlStringCchPrintfA(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cchDest, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,...)
Definition: ntstrsafe.h:1085
struct _NTOS_INSTALLATION * PNTOS_INSTALLATION
Entry
Definition: section.c:5216
WCHAR InstallationName[MAX_PATH]
Definition: osdetect.h:26
UNICODE_STRING SystemNtPath
Definition: osdetect.h:21
PVOLENTRY Volume
Definition: osdetect.h:25
PCWSTR PathComponent
Definition: osdetect.h:22
WCHAR DriveLetter
Definition: volutil.h:20

Referenced by UpgradeRepairPage().

◆ GetSettingDescription()

static NTSTATUS NTAPI GetSettingDescription ( IN PGENERIC_LIST_ENTRY  Entry,
OUT PSTR  Buffer,
IN SIZE_T  cchBufferSize 
)
static

Definition at line 498 of file usetup.c.

502{
503 return RtlStringCchPrintfA(Buffer, cchBufferSize, "%S",
505}
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413

Referenced by ComputerSettingsPage(), DeviceSettingsPage(), DisplaySettingsPage(), KeyboardSettingsPage(), LanguagePage(), and LayoutSettingsPage().

◆ HandleGenericList()

static PAGE_NUMBER HandleGenericList ( PGENERIC_LIST_UI  ListUi,
PAGE_NUMBER  nextPage,
PINPUT_RECORD  Ir 
)
static

Definition at line 1360 of file usetup.c.

1363{
1364 while (TRUE)
1365 {
1366 CONSOLE_ConInKey(Ir);
1367
1368 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1369 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
1370 {
1371 ScrollDownGenericList(ListUi);
1372 }
1373 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1374 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
1375 {
1376 ScrollUpGenericList(ListUi);
1377 }
1378 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1379 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_NEXT)) /* PAGE DOWN */
1380 {
1382 }
1383 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1384 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_PRIOR)) /* PAGE UP */
1385 {
1387 }
1388 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1389 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
1390 {
1391 if (ConfirmQuit(Ir))
1392 return QUIT_PAGE;
1393 RedrawGenericList(ListUi);
1394 }
1395 else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) /* ESC */
1396 {
1398 return nextPage; // Use some "prevPage;" instead?
1399 }
1400 else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
1401 {
1402 return nextPage;
1403 }
1404 else if ((Ir->Event.KeyEvent.uChar.AsciiChar > 0x60) && (Ir->Event.KeyEvent.uChar.AsciiChar < 0x7b))
1405 {
1406 /* a-z */
1408 }
1409 }
1410}
VOID RedrawGenericList(IN PGENERIC_LIST_UI ListUi)
Definition: genlist.c:511
VOID ScrollPageUpGenericList(IN PGENERIC_LIST_UI ListUi)
Definition: genlist.c:454
VOID RestoreGenericListUiState(IN PGENERIC_LIST_UI ListUi)
Definition: genlist.c:62
VOID GenericListKeyPress(IN PGENERIC_LIST_UI ListUi, IN CHAR AsciiChar)
Definition: genlist.c:525
VOID ScrollUpGenericList(IN PGENERIC_LIST_UI ListUi)
Definition: genlist.c:404
VOID ScrollDownGenericList(IN PGENERIC_LIST_UI ListUi)
Definition: genlist.c:376
VOID ScrollPageDownGenericList(IN PGENERIC_LIST_UI ListUi)
Definition: genlist.c:432
#define VK_NEXT
Definition: winuser.h:2257
#define VK_PRIOR
Definition: winuser.h:2256

Referenced by ComputerSettingsPage(), DisplaySettingsPage(), KeyboardSettingsPage(), and LayoutSettingsPage().

◆ InstallDirectoryPage()

static PAGE_NUMBER InstallDirectoryPage ( PINPUT_RECORD  Ir)
static

Definition at line 2879 of file usetup.c.

2880{
2882 ULONG Length, Pos;
2883 WCHAR c;
2884 WCHAR InstallDir[MAX_PATH];
2885
2887 {
2888 /* FIXME: show an error dialog */
2889 return QUIT_PAGE;
2890 }
2891
2892 // if (IsUnattendedSetup)
2893 if (RepairUpdateFlag)
2894 wcscpy(InstallDir, CurrentInstallation->PathComponent); // SystemNtPath
2897 else
2898 wcscpy(InstallDir, L"\\ReactOS");
2899
2900 /*
2901 * Check the validity of the predefined 'InstallDir'. If we are either
2902 * in unattended setup or in update/repair mode, and the installation path
2903 * is valid, just perform the installation. Otherwise (either in the case
2904 * of an invalid path, or we are in regular setup), display the UI and allow
2905 * the user to specify a new installation path.
2906 */
2908 {
2909 /* Check for the validity of the installation directory and pop up
2910 * an error if it is not the case. Then the user can fix it. */
2911 if (IsValidInstallDirectory(InstallDir))
2912 goto InitInstallDir;
2913
2915 }
2916
2917 Length = wcslen(InstallDir);
2918 Pos = Length;
2919
2921 CONSOLE_SetInputTextXY(8, 11, 51, InstallDir);
2922 CONSOLE_SetCursorXY(8 + Pos, 11);
2924
2925 while (TRUE)
2926 {
2927 CONSOLE_ConInKey(Ir);
2928
2929 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
2930 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
2931 {
2933
2934 if (ConfirmQuit(Ir))
2935 return QUIT_PAGE;
2937 }
2938 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
2939 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DELETE)) /* DEL */
2940 {
2941 if (Pos < Length)
2942 {
2943 memmove(&InstallDir[Pos],
2944 &InstallDir[Pos + 1],
2945 (Length - Pos - 1) * sizeof(WCHAR));
2946 InstallDir[Length - 1] = UNICODE_NULL;
2947
2948 Length--;
2949 CONSOLE_SetInputTextXY(8, 11, 51, InstallDir);
2950 CONSOLE_SetCursorXY(8 + Pos, 11);
2951 }
2952 }
2953 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
2954 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_HOME)) /* HOME */
2955 {
2956 Pos = 0;
2957 CONSOLE_SetCursorXY(8 + Pos, 11);
2958 }
2959 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
2960 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_END)) /* END */
2961 {
2962 Pos = Length;
2963 CONSOLE_SetCursorXY(8 + Pos, 11);
2964 }
2965 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
2966 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_LEFT)) /* LEFT */
2967 {
2968 if (Pos > 0)
2969 {
2970 Pos--;
2971 CONSOLE_SetCursorXY(8 + Pos, 11);
2972 }
2973 }
2974 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
2975 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RIGHT)) /* RIGHT */
2976 {
2977 if (Pos < Length)
2978 {
2979 Pos++;
2980 CONSOLE_SetCursorXY(8 + Pos, 11);
2981 }
2982 }
2983 else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) /* ESC */
2984 {
2985 /* Erase the whole line */
2986 *InstallDir = UNICODE_NULL;
2987 Pos = Length = 0;
2988 CONSOLE_SetInputTextXY(8, 11, 51, InstallDir);
2989 CONSOLE_SetCursorXY(8 + Pos, 11);
2990 }
2991 else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
2992 {
2994
2995 /* Check for the validity of the installation directory and pop up
2996 * an error if it is not the case. Then the user can fix it. */
2997 if (IsValidInstallDirectory(InstallDir))
2998 goto InitInstallDir;
2999
3002 }
3003 else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x08) /* BACKSPACE */
3004 {
3005 if (Pos > 0)
3006 {
3007 if (Pos < Length)
3008 memmove(&InstallDir[Pos - 1],
3009 &InstallDir[Pos],
3010 (Length - Pos) * sizeof(WCHAR));
3011 InstallDir[Length - 1] = UNICODE_NULL;
3012
3013 Pos--;
3014 Length--;
3015 CONSOLE_SetInputTextXY(8, 11, 51, InstallDir);
3016 CONSOLE_SetCursorXY(8 + Pos, 11);
3017 }
3018 }
3019 else if (isprint(Ir->Event.KeyEvent.uChar.AsciiChar))
3020 {
3021 if (Length < 50)
3022 {
3023 /* Only accept valid characters for the installation path */
3026 {
3027 if (Pos < Length)
3028 memmove(&InstallDir[Pos + 1],
3029 &InstallDir[Pos],
3030 (Length - Pos) * sizeof(WCHAR));
3031 InstallDir[Length + 1] = UNICODE_NULL;
3032 InstallDir[Pos] = c;
3033
3034 Pos++;
3035 Length++;
3036 CONSOLE_SetInputTextXY(8, 11, 51, InstallDir);
3037 CONSOLE_SetCursorXY(8 + Pos, 11);
3038 }
3039 }
3040 }
3041 }
3042
3043InitInstallDir:
3045 if (!NT_SUCCESS(Status))
3046 {
3047 DPRINT1("InitDestinationPaths() failed: Status 0x%lx\n", Status);
3049 return QUIT_PAGE;
3050 }
3051
3052 /*
3053 * Check whether the user attempts to install ReactOS within the
3054 * installation source directory, or in a subdirectory thereof.
3055 * If so, fail with an error.
3056 */
3058 {
3061 }
3062
3063 return PREPARE_COPY_PAGE;
3064}
#define isprint(c)
Definition: acclib.h:73
VOID CONSOLE_SetInputTextXY(IN SHORT x, IN SHORT y, IN SHORT len, IN LPCWSTR Text)
Definition: consup.c:357
VOID CONSOLE_SetCursorXY(IN SHORT x, IN SHORT y)
Definition: consup.c:227
VOID CONSOLE_SetCursorType(IN BOOL bInsert, IN BOOL bVisible)
Definition: consup.c:214
ush Pos
Definition: deflate.h:92
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
@ ERROR_SOURCE_DIR
Definition: errorcode.h:21
@ ERROR_DIRECTORY_NAME
Definition: errorcode.h:56
@ ERROR_NO_BUILD_PATH
Definition: errorcode.h:19
const GLubyte * c
Definition: glext.h:8905
#define c
Definition: ke_i.h:80
if(dx< 0)
Definition: linetemp.h:194
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
NTSYSAPI BOOLEAN NTAPI RtlPrefixUnicodeString(IN PUNICODE_STRING String1, IN PUNICODE_STRING String2, IN BOOLEAN CaseInSensitive)
#define UNICODE_NULL
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
wcscpy
NTSTATUS NTAPI InitDestinationPaths(_Inout_ PUSETUP_DATA pSetupData, _In_ PCWSTR InstallationDir, _In_ PVOLENTRY Volume)
Definition: setuplib.c:866
BOOLEAN NTAPI IsValidInstallDirectory(_In_ PCWSTR InstallDir)
Verify whether the given directory is suitable for ReactOS installation. Each path component must be ...
Definition: setuplib.c:781
#define IS_VALID_INSTALL_PATH_CHAR(c)
Defines the class of characters valid for the installation directory.
Definition: setuplib.h:206
UNICODE_STRING SourcePath
Definition: setuplib.h:103
WCHAR InstallationDirectory[MAX_PATH]
Definition: setuplib.h:157
UNICODE_STRING DestinationPath
Definition: setuplib.h:123
#define InstallVolume
Definition: usetup.c:50
static PPARTENTRY InstallPartition
Definition: usetup.c:48
static PNTOS_INSTALLATION CurrentInstallation
Definition: usetup.c:92
@ PREPARE_COPY_PAGE
Definition: usetup.h:108
#define VK_LEFT
Definition: winuser.h:2260
#define VK_RIGHT
Definition: winuser.h:2262
#define VK_DELETE
Definition: winuser.h:2269

Referenced by RunUSetup().

◆ InstallIntroPage()

static PAGE_NUMBER InstallIntroPage ( PINPUT_RECORD  Ir)
static

Definition at line 1096 of file usetup.c.

1097{
1098 if (RepairUpdateFlag)
1099 {
1100#if 1 /* Old code that looks good */
1101
1102 // return SELECT_PARTITION_PAGE;
1103 return DEVICE_SETTINGS_PAGE;
1104
1105#else /* Possible new code? */
1106
1107 return DEVICE_SETTINGS_PAGE;
1108 // return SCSI_CONTROLLER_PAGE;
1109
1110#endif
1111 }
1112
1114 return SELECT_PARTITION_PAGE;
1115
1117
1118 while (TRUE)
1119 {
1120 CONSOLE_ConInKey(Ir);
1121
1122 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1123 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
1124 {
1125 if (ConfirmQuit(Ir))
1126 return QUIT_PAGE;
1127 break;
1128 }
1129 else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
1130 {
1131 return UPGRADE_REPAIR_PAGE;
1132 }
1133 }
1134
1135 return INSTALL_INTRO_PAGE;
1136}
@ UPGRADE_REPAIR_PAGE
Definition: usetup.h:88
@ INSTALL_INTRO_PAGE
Definition: usetup.h:82

Referenced by RunUSetup().

◆ IsMediumLargeEnough()

static BOOLEAN IsMediumLargeEnough ( _In_ ULONGLONG  SizeInBytes)
static

Definition at line 1518 of file usetup.c.

1520{
1521 /* Retrieve the maximum size in MB (rounded up) */
1522 ULONGLONG SizeInMB = RoundingDivide(SizeInBytes, MB);
1523
1524 /* Check the medium size */
1526 {
1527 DPRINT1("Partition/Volume is too small (size: %I64u MB), required space is %lu MB\n",
1529 return FALSE;
1530 }
1531 return TRUE;
1532}
ULONG RequiredPartitionDiskSpace
Definition: setuplib.h:156

Referenced by SelectPartitionPage().

◆ KeyboardSettingsPage()

static PAGE_NUMBER KeyboardSettingsPage ( PINPUT_RECORD  Ir)
static

Definition at line 1476 of file usetup.c.

1477{
1478 GENERIC_LIST_UI ListUi;
1480
1482 DrawGenericList(&ListUi,
1483 2, 18,
1484 xScreen - 3,
1485 yScreen - 3);
1486
1487 return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
1488}

Referenced by RunUSetup().

◆ LanguagePage()

static PAGE_NUMBER LanguagePage ( PINPUT_RECORD  Ir)
static

Definition at line 675 of file usetup.c.

676{
677 GENERIC_LIST_UI ListUi;
678 PCWSTR NewLanguageId;
679 BOOL RefreshPage = FALSE;
680
681 /* Initialize the computer settings list */
683 {
686 {
687 PopupError("Setup failed to initialize available translations", NULL, NULL, POPUP_WAIT_NONE);
688 return WELCOME_PAGE;
689 }
690 }
691
694
695 /* Load the font */
698
699 /*
700 * If there is no language or just a single one in the list,
701 * skip the language selection process altogether.
702 */
704 {
706 return WELCOME_PAGE;
707 }
708
710 DrawGenericList(&ListUi,
711 2, 18,
712 xScreen - 3,
713 yScreen - 3);
714
716
718
719 while (TRUE)
720 {
722
723 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
724 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
725 {
726 ScrollDownGenericList(&ListUi);
727 RefreshPage = TRUE;
728 }
729 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
730 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
731 {
732 ScrollUpGenericList(&ListUi);
733 RefreshPage = TRUE;
734 }
735 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
736 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_NEXT)) /* PAGE DOWN */
737 {
739 RefreshPage = TRUE;
740 }
741 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
742 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_PRIOR)) /* PAGE UP */
743 {
745 RefreshPage = TRUE;
746 }
747 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
748 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
749 {
750 if (ConfirmQuit(Ir))
751 return QUIT_PAGE;
752 RedrawGenericList(&ListUi);
753 }
754 else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
755 {
757
760
762
764 {
766 }
767
768 /* Load the font */
770
771 return WELCOME_PAGE;
772 }
773 else if ((Ir->Event.KeyEvent.uChar.AsciiChar > 0x60) && (Ir->Event.KeyEvent.uChar.AsciiChar < 0x7b))
774 {
775 /* a-z */
777 RefreshPage = TRUE;
778 }
779
780 if (RefreshPage)
781 {
783
784 NewLanguageId =
786
787 if (wcscmp(SelectedLanguageId, NewLanguageId))
788 {
789 /* Clear the language page */
791
792 SelectedLanguageId = NewLanguageId;
793
794 /* Load the font */
796
797 /* Redraw the list */
798 DrawGenericList(&ListUi,
799 2, 18,
800 xScreen - 3,
801 yScreen - 3);
802
803 /* Redraw language selection page in native language */
805 }
806
807 RefreshPage = FALSE;
808 }
809 }
810
811 return WELCOME_PAGE;
812}
ULONG GetDefaultLanguageIndex(VOID)
Definition: settings.c:1098
PGENERIC_LIST CreateLanguageList(IN HINF InfFile, OUT PWSTR DefaultLanguage)
Definition: settings.c:1159
struct _GENENTRY * PGENENTRY
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2752
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
USHORT LANGID
Definition: mui.h:9
ULONG NTAPI GetNumberOfListEntries(IN PGENERIC_LIST List)
Definition: genlist.c:149
PGENERIC_LIST_ENTRY NTAPI GetCurrentListEntry(IN PGENERIC_LIST List)
Definition: genlist.c:102
PGENERIC_LIST LanguageList
Definition: setuplib.h:142
LANGID LanguageId
Definition: setuplib.h:154
VOID ScrollToPositionGenericList(IN PGENERIC_LIST_UI ListUi, IN ULONG uIndex)
Definition: genlist.c:476
VOID SetConsoleCodePage(VOID)
Definition: mui.c:537
VOID MUIClearPage(IN ULONG page)
Definition: mui.c:142
static WCHAR DefaultLanguage[20]
Definition: usetup.c:69
static VOID UpdateKBLayout(VOID)
Definition: usetup.c:461
@ WELCOME_PAGE
Definition: usetup.h:80
@ LANGUAGE_PAGE
Definition: usetup.h:79

Referenced by RunUSetup().

◆ LayoutSettingsPage()

static PAGE_NUMBER LayoutSettingsPage ( PINPUT_RECORD  Ir)
static

Definition at line 1502 of file usetup.c.

1503{
1504 GENERIC_LIST_UI ListUi;
1506
1508 DrawGenericList(&ListUi,
1509 2, 18,
1510 xScreen - 3,
1511 yScreen - 3);
1512
1513 return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
1514}

Referenced by RunUSetup().

◆ LicensePage()

static PAGE_NUMBER LicensePage ( PINPUT_RECORD  Ir)
static

Definition at line 872 of file usetup.c.

873{
875
876 while (TRUE)
877 {
879
880 if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
881 {
882 return WELCOME_PAGE;
883 }
884 }
885
886 return LICENSE_PAGE;
887}
@ LICENSE_PAGE
Definition: usetup.h:81

Referenced by RunUSetup().

◆ NtProcessStartup()

VOID NTAPI NtProcessStartup ( PPEB  Peb)

Definition at line 4215 of file usetup.c.

4216{
4219
4221
4223
4225
4226 Status = RunUSetup();
4227
4228 if (NT_SUCCESS(Status))
4229 {
4230 /*
4231 * Avoid a bugcheck if RunUSetup() finishes too quickly by implementing
4232 * a protective waiting.
4233 * This wait is needed because, since we are started as SMSS.EXE,
4234 * the NT kernel explicitly waits 5 seconds for the initial process
4235 * SMSS.EXE to initialize (as a protective measure), and otherwise
4236 * bugchecks with the code SESSION5_INITIALIZATION_FAILED.
4237 */
4238 Time.QuadPart += 50000000;
4240 }
4241 else
4242 {
4243 /* The installer failed to start: raise a hard error (crash the system/BSOD) */
4245 0, 0, NULL, 0, NULL);
4246 }
4247
4249}
PPEB Peb
Definition: dllmain.c:27
NTSTATUS NTAPI NtRaiseHardError(IN NTSTATUS ErrorStatus, IN ULONG NumberOfParameters, IN ULONG UnicodeStringParameterMask, IN PULONG_PTR Parameters, IN ULONG ValidResponseOptions, OUT PULONG Response)
Definition: harderr.c:551
static PLARGE_INTEGER Time
Definition: time.c:37
NTSYSAPI PRTL_USER_PROCESS_PARAMETERS NTAPI RtlNormalizeProcessParams(_In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters)
NTSTATUS NTAPI NtTerminateProcess(HANDLE ProcessHandle, LONG ExitStatus)
#define NtCurrentProcess()
Definition: nt_native.h:1660
NTSTATUS NTAPI NtDelayExecution(IN BOOLEAN Alertable, IN PLARGE_INTEGER DelayInterval)
Definition: wait.c:876
NTSTATUS NTAPI NtQuerySystemTime(OUT PLARGE_INTEGER SystemTime)
Definition: time.c:563
#define STATUS_SYSTEM_PROCESS_TERMINATED
Definition: ntstatus.h:792
PVOID ProcessHeap
Definition: ntddk_ex.h:249
PRTL_USER_PROCESS_PARAMETERS ProcessParameters
Definition: btrfs_drv.h:1913
LONGLONG QuadPart
Definition: typedefs.h:114
HANDLE ProcessHeap
Definition: usetup.c:42
NTSTATUS RunUSetup(VOID)
Definition: usetup.c:4010

◆ PopupError()

VOID PopupError ( PCCH  Text,
PCCH  Status,
PINPUT_RECORD  Ir,
ULONG  WaitEvent 
)

Definition at line 261 of file usetup.c.

265{
266 SHORT yTop;
267 SHORT xLeft;
268 COORD coPos;
269 DWORD Written;
271 ULONG MaxLength;
272 ULONG Lines;
273 PCHAR p;
274 PCCH pnext;
275 BOOLEAN LastLine;
276 SHORT Width;
278
279 /* Count text lines and longest line */
280 MaxLength = 0;
281 Lines = 0;
282 pnext = Text;
283
284 while (TRUE)
285 {
286 p = strchr(pnext, '\n');
287
288 if (p == NULL)
289 {
290 Length = strlen(pnext);
291 LastLine = TRUE;
292 }
293 else
294 {
295 Length = (ULONG)(p - pnext);
296 LastLine = FALSE;
297 }
298
299 Lines++;
300
301 if (Length > MaxLength)
302 MaxLength = Length;
303
304 if (LastLine)
305 break;
306
307 pnext = p + 1;
308 }
309
310 /* Check length of status line */
311 if (Status != NULL)
312 {
314
315 if (Length > MaxLength)
316 MaxLength = Length;
317 }
318
319 Width = MaxLength + 4;
320 Height = Lines + 2;
321
322 if (Status != NULL)
323 Height += 2;
324
325 yTop = (yScreen - Height) / 2;
326 xLeft = (xScreen - Width) / 2;
327
328
329 /* Set screen attributes */
330 coPos.X = xLeft;
331 for (coPos.Y = yTop; coPos.Y < yTop + Height; coPos.Y++)
332 {
335 Width,
336 coPos,
337 &Written);
338 }
339
340 DrawBox(xLeft, yTop, Width, Height);
341
342 /* Print message text */
343 coPos.Y = yTop + 1;
344 pnext = Text;
345 while (TRUE)
346 {
347 p = strchr(pnext, '\n');
348
349 if (p == NULL)
350 {
351 Length = strlen(pnext);
352 LastLine = TRUE;
353 }
354 else
355 {
356 Length = (ULONG)(p - pnext);
357 LastLine = FALSE;
358 }
359
360 if (Length != 0)
361 {
362 coPos.X = xLeft + 2;
364 pnext,
365 Length,
366 coPos,
367 &Written);
368 }
369
370 if (LastLine)
371 break;
372
373 coPos.Y++;
374 pnext = p + 1;
375 }
376
377 /* Print separator line and status text */
378 if (Status != NULL)
379 {
380 coPos.Y = yTop + Height - 3;
381 coPos.X = xLeft;
384 1,
385 coPos,
386 &Written);
387
388 coPos.X = xLeft + 1;
390 CharHorizontalLine, // '-',
391 Width - 2,
392 coPos,
393 &Written);
394
395 coPos.X = xLeft + Width - 1;
398 1,
399 coPos,
400 &Written);
401
402 coPos.Y++;
403 coPos.X = xLeft + 2;
405 Status,
406 min(strlen(Status), (SIZE_T)Width - 4),
407 coPos,
408 &Written);
409 }
410
411 if (WaitEvent == POPUP_WAIT_NONE)
412 return;
413
414 while (TRUE)
415 {
417
418 if (WaitEvent == POPUP_WAIT_ANY_KEY ||
419 Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D)
420 {
421 return;
422 }
423 }
424}
BOOL WINAPI WriteConsoleOutputCharacterA(HANDLE hConsoleOutput, IN LPCSTR lpCharacter, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfCharsWritten)
Definition: console.c:407
BOOL WINAPI FillConsoleOutputAttribute(IN HANDLE hConsoleOutput, IN WORD wAttribute, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfAttrsWritten)
Definition: console.c:525
#define FOREGROUND_RED
Definition: blue.h:63
char * Text
Definition: combotst.c:136
#define BACKGROUND_WHITE
Definition: consup.h:31
_ACRTIMP char *__cdecl strchr(const char *, int)
Definition: string.c:3291
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
GLfloat GLfloat p
Definition: glext.h:8902
CONST CHAR * PCCH
Definition: ntbasedef.h:404
short SHORT
Definition: pedump.c:59
ULONG_PTR SIZE_T
Definition: typedefs.h:80
char * PCHAR
Definition: typedefs.h:51
CHAR CharLeftHorizLineAndVertLine
Definition: mui.c:46
CHAR CharVertLineAndRightHorizLine
Definition: mui.c:45
static VOID DrawBox(IN SHORT xLeft, IN SHORT yTop, IN SHORT Width, IN SHORT Height)
Definition: usetup.c:171

Referenced by BootLoaderHardDiskPage(), BootLoaderRemovableDiskPage(), FsVolCallback(), LanguagePage(), MUIClearPage(), MUIDisplayErrorV(), MUIDisplayPage(), MUIGetString(), and SelectPartitionPage().

◆ PrepareCopyPage()

static PAGE_NUMBER PrepareCopyPage ( PINPUT_RECORD  Ir)
static

Definition at line 3081 of file usetup.c.

3082{
3083 // ERROR_NUMBER ErrorNumber;
3085
3087
3088 /* ErrorNumber = */ Success = PrepareFileCopy(&USetupData, NULL);
3089 if (/*ErrorNumber != ERROR_SUCCESS*/ !Success)
3090 {
3091 // MUIDisplayError(ErrorNumber, Ir, POPUP_WAIT_ENTER);
3092 return QUIT_PAGE;
3093 }
3094
3095 return FILE_COPY_PAGE;
3096}
BOOLEAN NTAPI PrepareFileCopy(IN OUT PUSETUP_DATA pSetupData, IN PFILE_COPY_STATUS_ROUTINE StatusRoutine OPTIONAL)
Definition: install.c:685
@ Success
Definition: eventcreate.c:712

Referenced by RunUSetup().

◆ PrintString()

static VOID PrintString ( IN PCSTR  fmt,
  ... 
)
static

Definition at line 152 of file usetup.c.

153{
154 CHAR buffer[512];
155 va_list ap;
158
159 va_start(ap, fmt);
161 va_end(ap);
162
167}
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
_ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl vsprintf(char *, const char *, va_list) __WINE_CRT_PRINTF_ATTR(2
char * va_list
Definition: vadefs.h:50
@ AnsiString
Definition: dnslib.h:19
GLuint buffer
Definition: glext.h:5915
NTSTATUS NTAPI NtDisplayString(PUNICODE_STRING String)
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI VOID NTAPI RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
Definition: dsound.c:943
WDF_EXTERN_C_START typedef _Must_inspect_result_ _In_opt_ PCUNICODE_STRING UnicodeString
Definition: wdfstring.h:64
void int int ULONGLONG int va_list * ap
Definition: winesup.h:36

Referenced by RunUSetup().

◆ ProgressCountdown()

static VOID ProgressCountdown ( IN PINPUT_RECORD  Ir,
IN LONG  TimeOut 
)
static

Definition at line 3800 of file usetup.c.

3803{
3805 ULONG StartTime, BarWidth, TimerDiv;
3806 LONG TimeElapsed;
3807 LONG TimerValue, OldTimerValue;
3810 BOOLEAN RefreshProgress = TRUE;
3811
3812 /* Bail out if the timeout is already zero */
3813 if (TimeOut <= 0)
3814 return;
3815
3816 /* Create the timeout progress bar and set it up */
3818 26,
3819 xScreen - 13,
3820 yScreen - 20,
3821 10,
3822 24,
3823 TRUE,
3825 0,
3826 NULL,
3829
3830 BarWidth = max(1, ProgressBar->Width);
3831 TimerValue = TimeOut * BarWidth;
3832 ProgressSetStepCount(ProgressBar, TimerValue);
3833
3835 CONSOLE_Flush();
3836
3837 TimerDiv = 1000 / BarWidth;
3838 TimerDiv = max(1, TimerDiv);
3839 OldTimerValue = TimerValue;
3840 while (TRUE)
3841 {
3842 /* Decrease the timer */
3843
3844 /*
3845 * Compute how much time the previous operations took.
3846 * This allows us in particular to take account for any time
3847 * elapsed if something slowed down.
3848 */
3849 TimeElapsed = NtGetTickCount() - StartTime;
3850 if (TimeElapsed >= TimerDiv)
3851 {
3852 /* Increase StartTime by steps of 1 / ProgressBar->Width seconds */
3853 TimeElapsed /= TimerDiv;
3854 StartTime += (TimerDiv * TimeElapsed);
3855
3856 if (TimeElapsed <= TimerValue)
3857 TimerValue -= TimeElapsed;
3858 else
3859 TimerValue = 0;
3860
3861 RefreshProgress = TRUE;
3862 }
3863
3864 if (RefreshProgress)
3865 {
3866 ProgressSetStep(ProgressBar, OldTimerValue - TimerValue);
3867 RefreshProgress = FALSE;
3868 }
3869
3870 /* Stop when the timer reaches zero */
3871 if (TimerValue <= 0)
3872 break;
3873
3874 /* Check for user key presses */
3875
3876 /*
3877 * If the timer is used, use a passive wait of maximum 1 second
3878 * while monitoring for incoming console input events, so that
3879 * we are still able to display the timing count.
3880 */
3881
3882 /* Wait a maximum of 1 second for input events */
3883 TimeElapsed = NtGetTickCount() - StartTime;
3884 if (TimeElapsed < TimerDiv)
3885 {
3886 /* Convert the time to NT format */
3887 Timeout.QuadPart = (TimerDiv - TimeElapsed) * -10000LL;
3889 }
3890 else
3891 {
3893 }
3894
3895 /* Check whether the input event has been signaled, or a timeout happened */
3896 if (Status == STATUS_TIMEOUT)
3897 {
3898 continue;
3899 }
3900 if (Status != STATUS_WAIT_0)
3901 {
3902 /* An error happened, bail out */
3903 DPRINT1("NtWaitForSingleObject() failed, Status 0x%08lx\n", Status);
3904 break;
3905 }
3906
3907 /* Check for an ENTER key press */
3908 while (CONSOLE_ConInKeyPeek(Ir))
3909 {
3910 if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
3911 {
3912 /* Found it, stop waiting */
3913 goto Exit;
3914 }
3915 }
3916 }
3917
3918Exit:
3919 /* Destroy the progress bar and quit */
3921}
VOID ProgressSetStep(IN PPROGRESSBAR Bar, IN ULONG Step)
Definition: progress.c:368
PPROGRESSBAR CreateProgressBarEx(IN SHORT Left, IN SHORT Top, IN SHORT Right, IN SHORT Bottom, IN SHORT TextTop, IN SHORT TextRight, IN BOOLEAN DoubleEdge, IN SHORT ProgressColour, IN ULONG StepCount, IN PCSTR DescriptionText OPTIONAL, IN PCSTR ProgressFormatText OPTIONAL, IN PUPDATE_PROGRESS UpdateProgressProc OPTIONAL)
Definition: progress.c:272
#define BACKGROUND_BLUE
Definition: blue.h:65
BOOLEAN CONSOLE_ConInKeyPeek(OUT PINPUT_RECORD Buffer)
Definition: consup.c:89
HANDLE StdInput
Definition: consup.c:36
#define STATUS_TIMEOUT
Definition: d3dkmdt.h:49
static PPROGRESSBAR ProgressBar
Definition: fmtchk.c:17
static LARGE_INTEGER StartTime
Definition: sys_arch.c:15
NTSYSAPI NTSTATUS NTAPI NtWaitForSingleObject(IN HANDLE hObject, IN BOOLEAN bAlertable, IN PLARGE_INTEGER Timeout)
#define STATUS_WAIT_0
Definition: ntstatus.h:330
long LONG
Definition: pedump.c:60
static ULONG Timeout
Definition: ping.c:61
#define NtGetTickCount
Definition: rtlp.h:163
static void Exit(void)
Definition: sock.c:1330
SHORT Width
Definition: progress.h:48
#define max(a, b)
Definition: svc.c:63
#define STRING_REBOOTPROGRESSBAR
Definition: mui.h:188
static BOOLEAN NTAPI ProgressTimeOutStringHandler(IN PPROGRESSBAR Bar, IN BOOLEAN AlwaysUpdate, OUT PSTR Buffer, IN SIZE_T cchBufferSize)
Definition: usetup.c:3753

Referenced by QuitPage(), and SuccessPage().

◆ ProgressTimeOutStringHandler()

static BOOLEAN NTAPI ProgressTimeOutStringHandler ( IN PPROGRESSBAR  Bar,
IN BOOLEAN  AlwaysUpdate,
OUT PSTR  Buffer,
IN SIZE_T  cchBufferSize 
)
static

Definition at line 3753 of file usetup.c.

3758{
3759 ULONG OldProgress = Bar->Progress;
3760
3761 if (Bar->StepCount == 0)
3762 {
3763 Bar->Progress = 0;
3764 }
3765 else
3766 {
3767 Bar->Progress = Bar->StepCount - Bar->CurrentStep;
3768 }
3769
3770 /* Build the progress string if it has changed */
3771 if (Bar->ProgressFormatText &&
3772 (AlwaysUpdate || (Bar->Progress != OldProgress)))
3773 {
3774 RtlStringCchPrintfA(Buffer, cchBufferSize,
3775 Bar->ProgressFormatText, Bar->Progress / max(1, Bar->Width) + 1);
3776
3777 return TRUE;
3778 }
3779
3780 return FALSE;
3781}
void Bar(void)
Definition: terminate.cpp:70

Referenced by ProgressCountdown().

◆ QuitPage()

static PAGE_NUMBER QuitPage ( PINPUT_RECORD  Ir)
static

Definition at line 3937 of file usetup.c.

3938{
3940
3941 /* Destroy the NTOS installations list */
3942 if (NtOsInstallsList != NULL)
3943 {
3946 }
3947
3948 /* Destroy the partition list */
3949 if (PartitionList != NULL)
3950 {
3953 }
3954
3956
3957 /* Wait for maximum 15 seconds or an ENTER key before quitting */
3958 ProgressCountdown(Ir, 15);
3959 return FLUSH_PAGE;
3960}
VOID NTAPI DestroyGenericList(IN OUT PGENERIC_LIST List, IN BOOLEAN FreeData)
Definition: genlist.c:38
VOID NTAPI DestroyPartitionList(IN PPARTLIST List)
Definition: partlist.c:2130
#define STRING_REBOOTCOMPUTER2
Definition: mui.h:164
static VOID ProgressCountdown(IN PINPUT_RECORD Ir, IN LONG TimeOut)
Definition: usetup.c:3800
static PGENERIC_LIST NtOsInstallsList
Definition: usetup.c:93

Referenced by RunUSetup().

◆ RegistryPage()

static PAGE_NUMBER RegistryPage ( PINPUT_RECORD  Ir)
static

Definition at line 3378 of file usetup.c.

3379{
3380 ULONG Error;
3381
3383
3387 InstallVolume->Info.DriveLetter,
3390 &s_SubstSettings);
3391 if (Error != ERROR_SUCCESS)
3392 {
3394 return QUIT_PAGE;
3395 }
3396 else
3397 {
3400 }
3401}
BOOL Error
Definition: chkdsk.c:66
#define ERROR_SUCCESS
Definition: deptool.c:10
ERROR_NUMBER NTAPI UpdateRegistry(IN OUT PUSETUP_DATA pSetupData, IN BOOLEAN RepairUpdateFlag, IN PPARTLIST PartitionList, IN WCHAR DestinationDriveLetter, IN PCWSTR SelectedLanguageId, IN PREGISTRY_STATUS_ROUTINE StatusRoutine OPTIONAL, IN PFONTSUBSTSETTINGS SubstSettings OPTIONAL)
Definition: setuplib.c:1157
#define STRING_DONE
Definition: mui.h:163
static VOID __cdecl RegistryStatus(IN REGISTRY_STATUS RegStatus,...)
Definition: usetup.c:3335

Referenced by RunUSetup().

◆ RegistryStatus()

static VOID __cdecl RegistryStatus ( IN REGISTRY_STATUS  RegStatus,
  ... 
)
static

Definition at line 3335 of file usetup.c.

3336{
3337 /* WARNING: Please keep this lookup table in sync with the resources! */
3338 static const UINT StringIDs[] =
3339 {
3340 STRING_DONE, /* Success */
3341 STRING_REGHIVEUPDATE, /* RegHiveUpdate */
3342 STRING_IMPORTFILE, /* ImportRegHive */
3343 STRING_DISPLAYSETTINGSUPDATE, /* DisplaySettingsUpdate */
3344 STRING_LOCALESETTINGSUPDATE, /* LocaleSettingsUpdate */
3345 STRING_ADDKBLAYOUTS, /* KeybLayouts */
3346 STRING_KEYBOARDSETTINGSUPDATE, /* KeybSettingsUpdate */
3347 STRING_CODEPAGEINFOUPDATE, /* CodePageInfoUpdate */
3348 };
3349
3350 va_list args;
3351
3352 if (RegStatus < ARRAYSIZE(StringIDs))
3353 {
3354 va_start(args, RegStatus);
3355 CONSOLE_SetStatusTextV(MUIGetString(StringIDs[RegStatus]), args);
3356 va_end(args);
3357 }
3358 else
3359 {
3360 CONSOLE_SetStatusText("Unknown status %d", RegStatus);
3361 }
3362}
VOID CONSOLE_SetStatusTextV(IN LPCSTR fmt, IN va_list args)
Definition: consup.c:471
#define args
Definition: format.c:66
Definition: match.c:390
#define STRING_KEYBOARDSETTINGSUPDATE
Definition: mui.h:161
#define STRING_CODEPAGEINFOUPDATE
Definition: mui.h:162
#define STRING_LOCALESETTINGSUPDATE
Definition: mui.h:160
#define STRING_IMPORTFILE
Definition: mui.h:158
#define STRING_ADDKBLAYOUTS
Definition: mui.h:187
#define STRING_DISPLAYSETTINGSUPDATE
Definition: mui.h:159
#define STRING_REGHIVEUPDATE
Definition: mui.h:157

Referenced by RegistryPage().

◆ RepairIntroPage()

static PAGE_NUMBER RepairIntroPage ( PINPUT_RECORD  Ir)
static

Definition at line 903 of file usetup.c.

904{
906
907 while (TRUE)
908 {
910
911 if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
912 {
913 return REBOOT_PAGE;
914 }
915 else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'U') /* U */
916 {
918 return INSTALL_INTRO_PAGE;
919 }
920 else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'R') /* R */
921 {
922 return RECOVERY_PAGE;
923 }
924 else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) /* ESC */
925 {
926 return WELCOME_PAGE;
927 }
928 }
929
930 return REPAIR_INTRO_PAGE;
931}
int CDECL toupper(int c)
Definition: ctype.c:514
@ REPAIR_INTRO_PAGE
Definition: usetup.h:87
@ RECOVERY_PAGE
Definition: usetup.h:119

Referenced by RunUSetup().

◆ ResetFileSystemList()

static VOID ResetFileSystemList ( VOID  )
static

Definition at line 2359 of file usetup.c.

2360{
2361 if (!FileSystemList)
2362 return;
2363
2366}
VOID DestroyFileSystemList(IN PFILE_SYSTEM_LIST List)
Definition: fslist.c:149

Referenced by FsVolCallback(), and SelectFileSystemPage().

◆ RunUSetup()

NTSTATUS RunUSetup ( VOID  )

Definition at line 4010 of file usetup.c.

4011{
4013 INPUT_RECORD Ir;
4015 BOOLEAN Old;
4016
4018
4019 /* Tell the Cm this is a setup boot, and it has to behave accordingly */
4021 if (!NT_SUCCESS(Status))
4022 DPRINT1("NtInitializeRegistry() failed (Status 0x%08lx)\n", Status);
4023
4024 /* Initialize the user-mode PnP manager */
4026 if (!NT_SUCCESS(Status))
4027 {
4028 // PrintString(??);
4029 DPRINT1("The user-mode PnP manager could not initialize (Status 0x%08lx), expect unavailable devices!\n", Status);
4030 }
4031
4032 if (!CONSOLE_Init())
4033 {
4037
4038 /* We failed to initialize the video, just quit the installer */
4040 }
4041
4042 /* Hide the cursor and clear the screen and keyboard buffer */
4045 CONSOLE_Flush();
4046
4047 /* Global Initialization page */
4048 Page = SetupStartPage(&Ir);
4049
4050 while (Page != REBOOT_PAGE && Page != RECOVERY_PAGE)
4051 {
4053 CONSOLE_Flush();
4054
4055 // CONSOLE_SetUnderlinedTextXY(4, 3, " ReactOS " KERNEL_VERSION_STR " Setup ");
4056
4057 switch (Page)
4058 {
4059 /* Language page */
4060 case LANGUAGE_PAGE:
4061 Page = LanguagePage(&Ir);
4062 break;
4063
4064 /* Welcome page */
4065 case WELCOME_PAGE:
4066 Page = WelcomePage(&Ir);
4067 break;
4068
4069 /* License page */
4070 case LICENSE_PAGE:
4071 Page = LicensePage(&Ir);
4072 break;
4073
4074 /* Install pages */
4075 case INSTALL_INTRO_PAGE:
4076 Page = InstallIntroPage(&Ir);
4077 break;
4078
4079#if 0
4080 case SCSI_CONTROLLER_PAGE:
4081 Page = ScsiControllerPage(&Ir);
4082 break;
4083
4084 case OEM_DRIVER_PAGE:
4085 Page = OemDriverPage(&Ir);
4086 break;
4087#endif
4088
4090 Page = DeviceSettingsPage(&Ir);
4091 break;
4092
4095 break;
4096
4099 break;
4100
4103 break;
4104
4106 Page = LayoutSettingsPage(&Ir);
4107 break;
4108
4109 /* Partitioning pages */
4112 break;
4113
4116 break;
4117
4120 break;
4121
4124 break;
4125
4126 /* File system partition operations pages */
4129 break;
4130
4131 /* Bootloader selection page */
4134 break;
4135
4136 /* Installation pages */
4139 break;
4140
4141 case PREPARE_COPY_PAGE:
4142 Page = PrepareCopyPage(&Ir);
4143 break;
4144
4145 case FILE_COPY_PAGE:
4146 Page = FileCopyPage(&Ir);
4147 break;
4148
4149 case REGISTRY_PAGE:
4150 Page = RegistryPage(&Ir);
4151 break;
4152
4153 /* Bootloader installation page */
4155 // case BOOTLOADER_REMOVABLE_DISK_PAGE:
4157 break;
4158
4159 /* Repair pages */
4160 case REPAIR_INTRO_PAGE:
4161 Page = RepairIntroPage(&Ir);
4162 break;
4163
4165 Page = UpgradeRepairPage(&Ir);
4166 break;
4167
4168 case SUCCESS_PAGE:
4169 Page = SuccessPage(&Ir);
4170 break;
4171
4172 case FLUSH_PAGE:
4173 Page = FlushPage(&Ir);
4174 break;
4175
4176 case QUIT_PAGE:
4177 Page = QuitPage(&Ir);
4178 break;
4179
4180 /* Virtual pages */
4181 case SETUP_INIT_PAGE:
4184 // case CHECK_FILE_SYSTEM_PAGE:
4185 case REBOOT_PAGE:
4186 case RECOVERY_PAGE:
4187 break;
4188
4189 default:
4190 break;
4191 }
4192 }
4193
4194 /* Terminate the user-mode PnP manager */
4196
4197 /* Setup has finished */
4199
4200 if (Page == RECOVERY_PAGE)
4202
4203 FreeConsole();
4204
4205 /* Reboot */
4209
4210 return STATUS_SUCCESS;
4211}
NTSTATUS InitializeUserModePnpManager(IN HINF *phSetupInf)
Definition: devinst.c:559
VOID TerminateUserModePnpManager(VOID)
Definition: devinst.c:690
VOID RecoveryConsole(VOID)
Definition: cmdcons.c:1160
BOOLEAN CONSOLE_Init(VOID)
Definition: consup.c:45
BOOL WINAPI DECLSPEC_HOTPATCH FreeConsole(void)
Definition: console.c:663
VOID InfSetHeap(PVOID Heap)
Definition: infrosgen.c:40
#define SE_SHUTDOWN_PRIVILEGE
Definition: security.c:573
#define CM_BOOT_FLAG_SETUP
Definition: cmtypes.h:173
@ ShutdownReboot
Definition: extypes.h:177
NTSYSAPI NTSTATUS NTAPI RtlAdjustPrivilege(_In_ ULONG Privilege, _In_ BOOLEAN NewValue, _In_ BOOLEAN ForThread, _Out_ PBOOLEAN OldValue)
NTSTATUS NTAPI NtInitializeRegistry(IN USHORT Flag)
Definition: ntapi.c:1318
NTSTATUS NTAPI NtShutdownSystem(IN SHUTDOWN_ACTION Action)
Definition: shutdown.c:43
_In_ PVOID _Out_opt_ BOOLEAN _Out_opt_ PPFN_NUMBER Page
Definition: mm.h:1305
#define STATUS_APP_INIT_FAILURE
Definition: ntstatus.h:655
VOID NTAPI FinishSetup(IN OUT PUSETUP_DATA pSetupData)
Definition: setuplib.c:1106
#define STRING_CONSOLEFAIL1
Definition: mui.h:165
#define STRING_CONSOLEFAIL3
Definition: mui.h:167
#define STRING_CONSOLEFAIL2
Definition: mui.h:166
static PAGE_NUMBER DeviceSettingsPage(PINPUT_RECORD Ir)
Definition: usetup.c:1229
static PAGE_NUMBER FlushPage(PINPUT_RECORD Ir)
Definition: usetup.c:3999
static PAGE_NUMBER DeletePartitionPage(PINPUT_RECORD Ir)
Definition: usetup.c:2193
static PAGE_NUMBER LicensePage(PINPUT_RECORD Ir)
Definition: usetup.c:872
static PAGE_NUMBER DisplaySettingsPage(PINPUT_RECORD Ir)
Definition: usetup.c:1450
static PAGE_NUMBER ComputerSettingsPage(PINPUT_RECORD Ir)
Definition: usetup.c:1424
static PAGE_NUMBER FileCopyPage(PINPUT_RECORD Ir)
Definition: usetup.c:3261
static PAGE_NUMBER KeyboardSettingsPage(PINPUT_RECORD Ir)
Definition: usetup.c:1476
static PAGE_NUMBER LanguagePage(PINPUT_RECORD Ir)
Definition: usetup.c:675
static PAGE_NUMBER StartPartitionOperationsPage(PINPUT_RECORD Ir)
Definition: usetup.c:2274
static PAGE_NUMBER BootLoaderSelectPage(PINPUT_RECORD Ir)
Definition: usetup.c:3415
static PAGE_NUMBER RegistryPage(PINPUT_RECORD Ir)
Definition: usetup.c:3378
static PAGE_NUMBER LayoutSettingsPage(PINPUT_RECORD Ir)
Definition: usetup.c:1502
static PAGE_NUMBER InstallIntroPage(PINPUT_RECORD Ir)
Definition: usetup.c:1096
static PAGE_NUMBER SuccessPage(PINPUT_RECORD Ir)
Definition: usetup.c:3976
static PAGE_NUMBER BootLoaderInstallPage(PINPUT_RECORD Ir)
Definition: usetup.c:3697
static PAGE_NUMBER SelectPartitionPage(PINPUT_RECORD Ir)
Definition: usetup.c:1553
static PAGE_NUMBER WelcomePage(PINPUT_RECORD Ir)
Definition: usetup.c:829
static PAGE_NUMBER ConfirmDeleteSystemPartitionPage(PINPUT_RECORD Ir)
Definition: usetup.c:2153
static PAGE_NUMBER QuitPage(PINPUT_RECORD Ir)
Definition: usetup.c:3937
static VOID PrintString(IN PCSTR fmt,...)
Definition: usetup.c:152
static PAGE_NUMBER CreatePartitionPage(PINPUT_RECORD Ir)
Definition: usetup.c:2044
static PAGE_NUMBER SetupStartPage(PINPUT_RECORD Ir)
Definition: usetup.c:583
static PAGE_NUMBER PrepareCopyPage(PINPUT_RECORD Ir)
Definition: usetup.c:3081
static PAGE_NUMBER RepairIntroPage(PINPUT_RECORD Ir)
Definition: usetup.c:903
static PAGE_NUMBER UpgradeRepairPage(PINPUT_RECORD Ir)
Definition: usetup.c:946
static PAGE_NUMBER InstallDirectoryPage(PINPUT_RECORD Ir)
Definition: usetup.c:2879
@ SELECT_FILE_SYSTEM_PAGE
Definition: usetup.h:103
@ START_PARTITION_OPERATIONS_PAGE
Definition: usetup.h:102
@ SETUP_INIT_PAGE
Definition: usetup.h:78
enum _PAGE_NUMBER PAGE_NUMBER

Referenced by NtProcessStartup().

◆ SelectFileSystemPage()

static FSVOL_OP SelectFileSystemPage ( _In_ PFSVOL_CONTEXT  FsVolContext,
_In_ PVOLENTRY  Volume 
)
static

Definition at line 2369 of file usetup.c.

2372{
2373 PINPUT_RECORD Ir = FsVolContext->Ir;
2374 PPARTENTRY PartEntry = Volume->PartEntry;
2375 PDISKENTRY DiskEntry = PartEntry->DiskEntry;
2376 PCWSTR DefaultFs;
2377 BOOLEAN ForceFormat;
2378 CHAR LineBuffer[100];
2379
2380 DPRINT("SelectFileSystemPage()\n");
2381
2382 ForceFormat = (Volume->New || Volume->FormatState == Unformatted);
2383
2384Restart:
2385 /* Reset the file system list for each volume that is to be formatted */
2387
2389 CONSOLE_Flush();
2391
2392 if (Volume->New & VOLUME_NEW_AUTOCREATE)
2393 {
2394 Volume->New &= ~VOLUME_NEW_AUTOCREATE;
2395
2397 }
2398 else if (Volume->New)
2399 {
2400 ULONG uID;
2401
2402 if (Volume == SystemVolume)
2404 else if (Volume == InstallVolume)
2406 else
2408
2410 }
2411 else
2412 {
2414 }
2415
2416 PartitionDescription(PartEntry, LineBuffer, ARRAYSIZE(LineBuffer));
2417 CONSOLE_SetTextXY(6, 10, LineBuffer);
2418
2419 DiskDescription(DiskEntry, LineBuffer, ARRAYSIZE(LineBuffer));
2421 LineBuffer);
2422
2423 /* Show "This Partition will be formatted next" only if it is unformatted */
2424 if (ForceFormat)
2426
2428
2430 {
2432
2433 switch (USetupData.FsType)
2434 {
2435 /* 1 is for BtrFS */
2436 case 1:
2437 DefaultFs = L"BTRFS";
2438 break;
2439
2440 /* If we don't understand input, default to FAT */
2441 default:
2442 DefaultFs = L"FAT";
2443 break;
2444 }
2445 }
2446 else
2447 {
2448 /* By default select the "FAT" file system */
2449 DefaultFs = L"FAT";
2450 }
2451
2452 /* Create the file system list */
2453 // TODO: Display only the FSes compatible with the selected volume!
2454 FileSystemList = CreateFileSystemList(6, 26, ForceFormat, DefaultFs);
2455 if (!FileSystemList)
2456 {
2457 /* FIXME: show an error dialog */
2458 FsVolContext->NextPageOnAbort = QUIT_PAGE;
2459 return FSVOL_ABORT;
2460 }
2461
2463 {
2465 return FSVOL_DOIT;
2466 }
2467
2469
2470 while (TRUE)
2471 {
2472 CONSOLE_ConInKey(Ir);
2473
2474 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
2475 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
2476 {
2477 if (ConfirmQuit(Ir))
2478 {
2479 FsVolContext->NextPageOnAbort = QUIT_PAGE;
2480 return FSVOL_ABORT;
2481 }
2482 break;
2483 }
2484 else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) /* ESC */
2485 {
2486 FsVolContext->NextPageOnAbort = SELECT_PARTITION_PAGE;
2487 return FSVOL_ABORT;
2488 }
2489 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
2490 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
2491 {
2493 }
2494 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
2495 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
2496 {
2498 }
2499 else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */
2500 {
2502 {
2503 /* The 'Keep existing filesystem' entry was chosen,
2504 * the volume must be already formatted */
2505 ASSERT(!ForceFormat);
2506
2507 /* Skip formatting this volume. We will also ignore
2508 * file system checks on it, unless it is either the
2509 * system or the installation volume. */
2510 if ((Volume != SystemVolume) && (Volume != InstallVolume))
2511 Volume->NeedsCheck = FALSE;
2512
2513 return FSVOL_SKIP;
2514 }
2515 else
2516 {
2517 /* Format this volume */
2518 return FSVOL_DOIT;
2519 }
2520 }
2521 }
2522
2523 goto Restart;
2524}
VOID ScrollUpFileSystemList(IN PFILE_SYSTEM_LIST List)
Definition: fslist.c:236
VOID DrawFileSystemList(IN PFILE_SYSTEM_LIST List)
Definition: fslist.c:167
VOID ScrollDownFileSystemList(IN PFILE_SYSTEM_LIST List)
Definition: fslist.c:225
PFILE_SYSTEM_LIST CreateFileSystemList(IN SHORT Left, IN SHORT Top, IN BOOLEAN ForceFormat, IN PCWSTR SelectFileSystem)
Definition: fslist.c:109
@ Unformatted
Definition: partlist.h:34
PCWSTR FileSystem
Definition: fslist.h:34
LONG FsType
Definition: setuplib.h:135
#define STRING_NONFORMATTEDSYSTEMPART
Definition: mui.h:146
#define STRING_NONFORMATTEDOTHERPART
Definition: mui.h:147
#define STRING_PARTFORMAT
Definition: mui.h:144
#define STRING_INSTALLONPART
Definition: mui.h:148
#define STRING_NEWPARTITION
Definition: mui.h:143
#define STRING_NONFORMATTEDPART
Definition: mui.h:145
#define VOLUME_NEW_AUTOCREATE
Definition: usetup.c:85

Referenced by FsVolCallback().

◆ SelectPartitionPage()

static PAGE_NUMBER SelectPartitionPage ( PINPUT_RECORD  Ir)
static

Definition at line 1553 of file usetup.c.

1554{
1555 PARTLIST_UI ListUi;
1556 ULONG Error;
1557 ULONGLONG MaxTargetSize;
1558
1559 if (PartitionList == NULL)
1560 {
1562 if (PartitionList == NULL)
1563 {
1565 return QUIT_PAGE;
1566 }
1568 {
1570 return QUIT_PAGE;
1571 }
1572 }
1573
1574 if (RepairUpdateFlag)
1575 {
1577
1578 /* Determine the selected installation disk & partition.
1579 * It must exist and be valid, since this is the partition
1580 * where the existing installation already resides. */
1584 if (!InstallPartition)
1585 {
1586 DPRINT1("RepairUpdateFlag == TRUE, SelectPartition() returned FALSE, assert!\n");
1587 ASSERT(FALSE);
1588 }
1591
1593 }
1594
1596
1599 2, 21,
1600 xScreen - 3,
1601 yScreen - 3);
1602 DrawPartitionList(&ListUi);
1603
1604 if (IsUnattendedSetup) do
1605 {
1606 /* If DestinationDiskNumber or DestinationPartitionNumber are invalid
1607 * (see below), don't select the partition and show the list instead */
1610 {
1611 break;
1612 }
1613
1614 /* Determine the selected installation disk & partition */
1618
1619 /* Now reset DestinationDiskNumber and DestinationPartitionNumber
1620 * to *invalid* values, so that if the corresponding partition is
1621 * determined to be invalid by the code below or in CreateInstallPartition,
1622 * we don't reselect it when SelectPartitionPage() is called again */
1625
1626 // FIXME: Here and in the AutoPartition case below, the CurrentPartition
1627 // may actually be unsuitable (MBR-extended, non-simple volume...).
1628 // More checks need to be made here!
1629 //
1630 // NOTE: We don't check for CurrentPartition->Volume in case
1631 // the partition doesn't contain a recognized volume/none exists.
1632 // We also don't check whether IsPartitioned is TRUE, because if
1633 // the partition is still empty space, we'll try to partition it.
1635 goto CreateInstallPartition;
1636
1638 {
1640 // TODO: Do more checks, and loop until we find a valid partition.
1641 goto CreateInstallPartition;
1642 }
1643 } while (0);
1644
1645 while (TRUE)
1646 {
1647 ULONG uID;
1648
1650
1651 /* Update status text */
1652 if (!CurrentPartition)
1653 {
1654 // FIXME: If we get a NULL current partition, this means that
1655 // the current disk is of unrecognized type. So we should display
1656 // instead a status string to initialize the disk with one of
1657 // the recognized partitioning schemes (MBR, later: GPT, etc.)
1658 // For the time being we don't have that, so use instead another
1659 // known string.
1661 }
1662 else
1663 {
1665 {
1669 {
1671 }
1672 }
1673 else
1674 {
1678 }
1679 }
1681
1682 CONSOLE_ConInKey(Ir);
1683
1684 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1685 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
1686 {
1687 if (ConfirmQuit(Ir))
1688 {
1691 return QUIT_PAGE;
1692 }
1693 return SELECT_PARTITION_PAGE;
1694 }
1695 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1696 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
1697 {
1699 }
1700 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1701 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
1702 {
1704 }
1705 else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */
1706 {
1708
1709 /* Don't select an extended partition for OS installation */
1711 continue;
1712
1713 /*
1714 * Check whether the user wants to install ReactOS on a disk that
1715 * is not recognized by the computer's firmware and if so, display
1716 * a warning since such disks may not be bootable.
1717 */
1718 if (CurrentPartition->DiskEntry->MediaType == FixedMedia &&
1719 !CurrentPartition->DiskEntry->BiosFound)
1720 {
1721 PopupError("The disk you have selected for installing ReactOS\n"
1722 "is not visible by the firmware of your computer,\n"
1723 "and so may not be bootable.\n"
1724 "Press ENTER to continue anyway.",
1726 Ir, POPUP_WAIT_ENTER);
1727 // return SELECT_PARTITION_PAGE;
1728 }
1729
1730 goto CreateInstallPartition;
1731 }
1732 else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'C') /* C */
1733 {
1735
1737 if (Error != NOT_AN_ERROR)
1738 {
1740 return SELECT_PARTITION_PAGE;
1741 }
1742
1744 return CREATE_PARTITION_PAGE;
1745 }
1746 else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'E') /* E */
1747 {
1749
1750 /* Don't create an extended partition within a logical partition */
1752 continue;
1753
1755 if (Error != NOT_AN_ERROR)
1756 {
1758 return SELECT_PARTITION_PAGE;
1759 }
1760
1762 return CREATE_PARTITION_PAGE;
1763 }
1764 else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'D') /* D */
1765 {
1767
1768 /* Ignore deletion in case this is not a partitioned entry */
1770 continue;
1771
1772// TODO: Do something similar before trying to format the partition?
1775 {
1776 UNICODE_STRING CurrentPartitionU;
1777 WCHAR PathBuffer[RTL_NUMBER_OF_FIELD(VOLINFO, DeviceName) + 1];
1778
1780
1781 RtlStringCchPrintfW(PathBuffer, _countof(PathBuffer),
1783 RtlInitUnicodeString(&CurrentPartitionU, PathBuffer);
1784
1785 /*
1786 * Check whether the user attempts to delete the partition on which
1787 * the installation source is present. If so, fail with an error.
1788 */
1789 // &USetupData.SourceRootPath
1790 if (RtlPrefixUnicodeString(&CurrentPartitionU, &USetupData.SourcePath, TRUE))
1791 {
1793 return SELECT_PARTITION_PAGE;
1794 }
1795 }
1796
1799 {
1801 }
1802
1803 return DELETE_PARTITION_PAGE;
1804 }
1805 }
1806
1807CreateInstallPartition:
1810
1811 /* Create the partition if the selected region is empty */
1813 {
1815 if (Error != NOT_AN_ERROR)
1816 {
1818 return SELECT_PARTITION_PAGE;
1819 }
1820
1821 /* Automatically create the partition on the whole empty space;
1822 * it will be formatted later with default parameters */
1825 0ULL,
1826 0);
1830 }
1831
1832 /* Verify the target medium size */
1834 if (!IsMediumLargeEnough(MaxTargetSize))
1835 {
1838 return SELECT_PARTITION_PAGE; /* Let the user select another partition */
1839 }
1840
1843}
static VOID DrawPartitionList(_In_ HWND hWndList, _In_ PPARTLIST List)
Definition: drivepage.c:1319
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
@ NOT_AN_ERROR
Definition: errorcode.h:17
@ ERROR_DRIVE_INFORMATION
Definition: errorcode.h:27
@ ERROR_INSUFFICIENT_PARTITION_SIZE
Definition: errorcode.h:57
@ ERROR_SOURCE_PATH
Definition: errorcode.h:20
@ ERROR_NO_HDD
Definition: errorcode.h:22
#define ULL(a, b)
Definition: format_msg.c:27
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define IsContainerPartition(PartitionType)
Definition: ntdddisk.h:321
@ FixedMedia
Definition: ntdddisk.h:383
ERROR_NUMBER NTAPI PartitionCreateChecks(_In_ PPARTENTRY PartEntry, _In_opt_ ULONGLONG SizeBytes, _In_opt_ ULONG_PTR PartitionInfo)
Definition: partlist.c:2946
BOOLEAN IsPartitionActive(IN PPARTENTRY PartEntry)
Definition: partlist.c:1962
PPARTLIST NTAPI CreatePartitionList(VOID)
Definition: partlist.c:2043
PPARTENTRY SelectPartition(_In_ PPARTLIST List, _In_ ULONG DiskNumber, _In_ ULONG PartitionNumber)
Definition: partlist.c:2333
VOID ScrollUpDownPartitionList(_In_ PPARTLIST_UI ListUi, _In_ BOOLEAN Direction)
Definition: partlist.c:819
VOID InitPartitionListUi(IN OUT PPARTLIST_UI ListUi, IN PPARTLIST List, IN PPARTENTRY CurrentEntry OPTIONAL, IN SHORT Left, IN SHORT Top, IN SHORT Right, IN SHORT Bottom)
Definition: partlist.c:329
ULONG PartitionNumber
Definition: osdetect.h:24
PVOLENTRY Volume
Definition: partlist.h:95
PPARTENTRY CurrentPartition
Definition: partlist.h:43
LIST_ENTRY DiskListHead
Definition: partlist.h:183
LONG DestinationPartitionNumber
Definition: setuplib.h:130
LONG AutoPartition
Definition: setuplib.h:134
LONG DestinationDiskNumber
Definition: setuplib.h:129
FORMATSTATE FormatState
Definition: partlist.h:48
BOOLEAN New
Definition: partlist.h:53
#define STRING_DELETEPARTITION
Definition: mui.h:136
#define STRING_INSTALLCREATELOGICAL
Definition: mui.h:134
#define STRING_INSTALLDELETEPARTITION
Definition: mui.h:135
#define STRING_INSTALLCREATEPARTITION
Definition: mui.h:133
static BOOLEAN IsMediumLargeEnough(_In_ ULONGLONG SizeInBytes)
Definition: usetup.c:1518

Referenced by RunUSetup().

◆ SetupStartPage()

static PAGE_NUMBER SetupStartPage ( PINPUT_RECORD  Ir)
static

Definition at line 583 of file usetup.c.

584{
585 ULONG Error;
586 PGENERIC_LIST_ENTRY ListEntry;
588
590
591 /* Initialize Setup */
594 if (Error != ERROR_SUCCESS)
595 {
597 return QUIT_PAGE;
598 }
599
600 /* Initialize the user-mode PnP manager */
602 DPRINT1("The user-mode PnP manager could not initialize, expect unavailable devices!\n");
603
604 /* Wait for any immediate pending installations to finish */
606 DPRINT1("WaitNoPendingInstallEvents() failed to wait!\n");
607
610 {
611 // TODO: Read options from inf
612 /* Load the hardware, language and keyboard layout lists */
613
617
619
620 /* new part */
624
626
627 /* first we hack LanguageList */
628 for (ListEntry = GetFirstListEntry(USetupData.LanguageList); ListEntry;
629 ListEntry = GetNextListEntry(ListEntry))
630 {
631 LocaleId = ((PGENENTRY)GetListEntryData(ListEntry))->Id;
633 {
634 DPRINT("found %S in LanguageList\n", LocaleId);
636 break;
637 }
638 }
639
640 /* now LayoutList */
641 for (ListEntry = GetFirstListEntry(USetupData.LayoutList); ListEntry;
642 ListEntry = GetNextListEntry(ListEntry))
643 {
644 LocaleId = ((PGENENTRY)GetListEntryData(ListEntry))->Id;
646 {
647 DPRINT("found %S in LayoutList\n", LocaleId);
649 break;
650 }
651 }
652
654
655 return INSTALL_INTRO_PAGE;
656 }
657
658 return LANGUAGE_PAGE;
659}
DWORD Id
NTSTATUS WaitNoPendingInstallEvents(IN PLARGE_INTEGER Timeout OPTIONAL)
Definition: devinst.c:514
BOOLEAN EnableUserModePnpManager(VOID)
Definition: devinst.c:521
SPFILE_EXPORTS SpFileExports
Definition: fileqsup.c:23
SPINF_EXPORTS SpInfExports
Definition: infsupp.c:24
VOID NTAPI SetCurrentListEntry(IN PGENERIC_LIST List, IN PGENERIC_LIST_ENTRY Entry)
Definition: genlist.c:91
PGENERIC_LIST_ENTRY NTAPI GetFirstListEntry(IN PGENERIC_LIST List)
Definition: genlist.c:110
PGENERIC_LIST_ENTRY NTAPI GetNextListEntry(IN PGENERIC_LIST_ENTRY Entry)
Definition: genlist.c:121
ERROR_NUMBER NTAPI InitializeSetup(_Inout_ PUSETUP_DATA pSetupData, _In_opt_ PSETUP_ERROR_ROUTINE ErrorRoutine, _In_ PSPFILE_EXPORTS pSpFileExports, _In_ PSPINF_EXPORTS pSpInfExports)
Definition: setuplib.c:1022
BOOLEAN NTAPI CheckUnattendedSetup(IN OUT PUSETUP_DATA pSetupData)
Definition: setuplib.c:32
Definition: genlist.h:11
WCHAR LocaleID[9]
Definition: setuplib.h:153
static VOID __cdecl USetupErrorRoutine(IN PUSETUP_DATA pSetupData,...)
Definition: usetup.c:540
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ PCUNICODE_STRING _In_ PCUNICODE_STRING _In_ LCID LocaleId
Definition: wdfpdo.h:437

Referenced by RunUSetup().

◆ SetupUpdateMemoryInfo()

static VOID SetupUpdateMemoryInfo ( IN PCOPYCONTEXT  CopyContext,
IN BOOLEAN  First 
)
static

Definition at line 3107 of file usetup.c.

3109{
3111
3112 /* Get the memory information from the system */
3114 &PerfInfo,
3115 sizeof(PerfInfo),
3116 NULL);
3117
3118 /* Check if this is initial setup */
3119 if (First)
3120 {
3121 /* Set maximum limits to be total RAM pages */
3122 ProgressSetStepCount(CopyContext->MemoryBars[0], PerfInfo.CommitLimit);
3123 ProgressSetStepCount(CopyContext->MemoryBars[1], PerfInfo.CommitLimit);
3124 ProgressSetStepCount(CopyContext->MemoryBars[2], PerfInfo.CommitLimit);
3125 }
3126
3127 /* Set current values */
3128 ProgressSetStep(CopyContext->MemoryBars[0], PerfInfo.PagedPoolPages + PerfInfo.NonPagedPoolPages);
3129 ProgressSetStep(CopyContext->MemoryBars[1], PerfInfo.ResidentSystemCachePage);
3130 ProgressSetStep(CopyContext->MemoryBars[2], PerfInfo.AvailablePages);
3131}
WCHAR First[]
Definition: FormatMessage.c:11
#define SystemPerformanceInformation
Definition: memtest.h:87
NTSYSAPI NTSTATUS NTAPI NtQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)

Referenced by FileCopyCallback().

◆ ShowPartitionSizeInputBox()

static VOID ShowPartitionSizeInputBox ( SHORT  Left,
SHORT  Top,
SHORT  Right,
SHORT  Bottom,
ULONG  MaxSize,
PWSTR  InputBuffer,
PBOOLEAN  Quit,
PBOOLEAN  Cancel 
)
static

Definition at line 1851 of file usetup.c.

1859{
1860 INPUT_RECORD Ir;
1861 COORD coPos;
1862 DWORD Written;
1863 CHAR Buffer[128];
1864 INT Length, Pos;
1865 WCHAR ch;
1866 SHORT iLeft;
1867 SHORT iTop;
1868
1869 if (Quit != NULL)
1870 *Quit = FALSE;
1871
1872 if (Cancel != NULL)
1873 *Cancel = FALSE;
1874
1875 DrawBox(Left, Top, Right - Left + 1, Bottom - Top + 1);
1876
1877 /* Print message */
1878 coPos.X = Left + 2;
1879 coPos.Y = Top + 2;
1881 iLeft = coPos.X + (USHORT)strlen(Buffer) + 1;
1882 iTop = coPos.Y;
1883
1885 Buffer,
1886 strlen(Buffer),
1887 coPos,
1888 &Written);
1889
1891 coPos.X = iLeft + PARTITION_SIZE_INPUT_FIELD_LENGTH + 1;
1892 coPos.Y = iTop;
1894 Buffer,
1895 strlen(Buffer),
1896 coPos,
1897 &Written);
1898
1899 _swprintf(InputBuffer, L"%lu", MaxSize);
1901 Pos = Length;
1903 iTop,
1905 InputBuffer);
1906 CONSOLE_SetCursorXY(iLeft + Length, iTop);
1908
1909 while (TRUE)
1910 {
1911 CONSOLE_ConInKey(&Ir);
1912
1913 if ((Ir.Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1914 (Ir.Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
1915 {
1916 if (Quit != NULL)
1917 *Quit = TRUE;
1918
1920 break;
1921 }
1922 else if (Ir.Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */
1923 {
1924 break;
1925 }
1926 else if (Ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) /* ESC */
1927 {
1928 if (Cancel != NULL)
1929 *Cancel = TRUE;
1930
1932 break;
1933 }
1934 else if ((Ir.Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1935 (Ir.Event.KeyEvent.wVirtualKeyCode == VK_HOME)) /* HOME */
1936 {
1937 Pos = 0;
1938 CONSOLE_SetCursorXY(iLeft + Pos, iTop);
1939 }
1940 else if ((Ir.Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1941 (Ir.Event.KeyEvent.wVirtualKeyCode == VK_END)) /* END */
1942 {
1943 Pos = Length;
1944 CONSOLE_SetCursorXY(iLeft + Pos, iTop);
1945 }
1946 else if ((Ir.Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1947 (Ir.Event.KeyEvent.wVirtualKeyCode == VK_LEFT)) /* LEFT */
1948 {
1949 if (Pos > 0)
1950 {
1951 Pos--;
1952 CONSOLE_SetCursorXY(iLeft + Pos, iTop);
1953 }
1954 }
1955 else if ((Ir.Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1956 (Ir.Event.KeyEvent.wVirtualKeyCode == VK_RIGHT)) /* RIGHT */
1957 {
1958 if (Pos < Length)
1959 {
1960 Pos++;
1961 CONSOLE_SetCursorXY(iLeft + Pos, iTop);
1962 }
1963 }
1964 else if ((Ir.Event.KeyEvent.uChar.AsciiChar == 0x00) &&
1965 (Ir.Event.KeyEvent.wVirtualKeyCode == VK_DELETE)) /* DEL */
1966 {
1967 if (Pos < Length)
1968 {
1970 &InputBuffer[Pos + 1],
1971 (Length - Pos - 1) * sizeof(WCHAR));
1973
1974 Length--;
1976 iTop,
1978 InputBuffer);
1979 CONSOLE_SetCursorXY(iLeft + Pos, iTop);
1980 }
1981 }
1982 else if (Ir.Event.KeyEvent.wVirtualKeyCode == VK_BACK) /* BACKSPACE */
1983 {
1984 if (Pos > 0)
1985 {
1986 if (Pos < Length)
1987 memmove(&InputBuffer[Pos - 1],
1988 &InputBuffer[Pos],
1989 (Length - Pos) * sizeof(WCHAR));
1991
1992 Pos--;
1993 Length--;
1995 iTop,
1997 InputBuffer);
1998 CONSOLE_SetCursorXY(iLeft + Pos, iTop);
1999 }
2000 }
2001 else if (Ir.Event.KeyEvent.uChar.AsciiChar != 0x00)
2002 {
2004 {
2006
2007 if ((ch >= L'0') && (ch <= L'9'))
2008 {
2009 if (Pos < Length)
2010 memmove(&InputBuffer[Pos + 1],
2011 &InputBuffer[Pos],
2012 (Length - Pos) * sizeof(WCHAR));
2014 InputBuffer[Pos] = ch;
2015
2016 Pos++;
2017 Length++;
2019 iTop,
2021 InputBuffer);
2022 CONSOLE_SetCursorXY(iLeft + Pos, iTop);
2023 }
2024 }
2025 }
2026 }
2027
2029}
static LPHIST_ENTRY Bottom
Definition: history.c:54
static LPHIST_ENTRY Top
Definition: history.c:53
unsigned char ch[4][2]
Definition: console.c:118
#define sprintf
Definition: sprintf.c:45
#define _swprintf(buf, format,...)
Definition: sprintf.c:56
strcpy
Definition: string.h:131
int32_t INT
Definition: typedefs.h:58
#define STRING_MAXSIZE
Definition: mui.h:179
#define STRING_PARTITIONSIZE
Definition: mui.h:137
#define PARTITION_SIZE_INPUT_FIELD_LENGTH
Definition: usetup.c:1846
#define VK_BACK
Definition: winuser.h:2234

Referenced by CreatePartitionPage().

◆ StartPartitionOperationsPage()

static PAGE_NUMBER StartPartitionOperationsPage ( PINPUT_RECORD  Ir)
static

Definition at line 2274 of file usetup.c.

2275{
2276 FSVOL_CONTEXT FsVolContext = {Ir, QUIT_PAGE};
2278
2280 {
2281 /* FIXME: show an error dialog */
2282 return QUIT_PAGE;
2283 }
2284
2285 /* Find or set the active system partition before starting formatting */
2290 &FsVolContext);
2291 if (!Success)
2292 return FsVolContext.NextPageOnAbort;
2293 //
2294 // FIXME?? If cannot use any system partition, install FreeLdr on floppy / removable media??
2295 //
2296
2297 /* Set the AUTOCREATE flag if the system partition was automatically created */
2300
2302 CONSOLE_Flush();
2303
2304 /* Apply all pending operations on partitions: formatting and checking */
2309 &FsVolContext);
2310 if (!Success)
2311 return FsVolContext.NextPageOnAbort;
2313}
BOOLEAN NTAPI FsVolCommitOpsQueue(_In_ PPARTLIST PartitionList, _In_ PVOLENTRY SystemVolume, _In_ PVOLENTRY InstallVolume, _In_opt_ PFSVOL_CALLBACK FsVolCallback, _In_opt_ PVOID Context)
Definition: fsutil.c:1097
BOOLEAN NTAPI InitSystemPartition(_In_ PPARTLIST PartitionList, _In_ PPARTENTRY InstallPartition, _Out_ PPARTENTRY *pSystemPartition, _In_opt_ PFSVOL_CALLBACK FsVolCallback, _In_opt_ PVOID Context)
Find or set the active system partition.
Definition: setuplib.c:681
BOOLEAN New
Definition: partlist.h:85
static FSVOL_OP CALLBACK FsVolCallback(_In_opt_ PVOID Context, _In_ FSVOLNOTIFY FormatStatus, _In_ ULONG_PTR Param1, _In_ ULONG_PTR Param2)
Definition: usetup.c:2605

Referenced by RunUSetup().

◆ SuccessPage()

static PAGE_NUMBER SuccessPage ( PINPUT_RECORD  Ir)
static

Definition at line 3976 of file usetup.c.

3977{
3979
3981 return FLUSH_PAGE;
3982
3983 /* Wait for maximum 15 seconds or an ENTER key before quitting */
3984 ProgressCountdown(Ir, 15);
3985 return FLUSH_PAGE;
3986}

Referenced by RunUSetup().

◆ UpdateKBLayout()

static VOID UpdateKBLayout ( VOID  )
static

Definition at line 461 of file usetup.c.

462{
463 PGENERIC_LIST_ENTRY ListEntry;
464 KLID newLayout;
465
467
469 {
472 {
473 /* FIXME: Handle error! */
474 return;
475 }
476 }
477
478 /* Search for default layout (if provided) */
479 if (newLayout != 0)
480 {
481 for (ListEntry = GetFirstListEntry(USetupData.LayoutList); ListEntry;
482 ListEntry = GetNextListEntry(ListEntry))
483 {
484 PCWSTR pszLayoutId = ((PGENENTRY)GetListEntryData(ListEntry))->Id;
485 KLID LayoutId = (KLID)(pszLayoutId ? wcstoul(pszLayoutId, NULL, 16) : 0);
486 if (newLayout == LayoutId)
487 {
489 break;
490 }
491 }
492 }
493}
_ACRTIMP __msvcrt_ulong __cdecl wcstoul(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2917
KLID MUIDefaultKeyboardLayout(IN PCWSTR LanguageId)
Definition: mui.c:88
ULONG KLID
Definition: mui.h:10

Referenced by LanguagePage().

◆ UpgradeRepairPage()

static PAGE_NUMBER UpgradeRepairPage ( PINPUT_RECORD  Ir)
static

Definition at line 946 of file usetup.c.

947{
948 GENERIC_LIST_UI ListUi;
949
950/*** HACK!! ***/
951 if (PartitionList == NULL)
952 {
954 if (PartitionList == NULL)
955 {
956 /* FIXME: show an error dialog */
958 return QUIT_PAGE;
959 }
961 {
963 return QUIT_PAGE;
964 }
965 }
966/**************/
967
969 if (!NtOsInstallsList)
970 DPRINT1("Failed to get a list of NTOS installations; continue installation...\n");
971
972 /*
973 * If there is no available installation (or just a single one??) that can
974 * be updated in the list, just continue with the regular installation.
975 */
977 {
979
980 // return INSTALL_INTRO_PAGE;
982 // return SCSI_CONTROLLER_PAGE;
983 }
984
986
988 DrawGenericList(&ListUi,
989 2, 23,
990 xScreen - 3,
991 yScreen - 3);
992
993 // return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
994 while (TRUE)
995 {
997
998 if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x00)
999 {
1000 switch (Ir->Event.KeyEvent.wVirtualKeyCode)
1001 {
1002 case VK_DOWN: /* DOWN */
1003 ScrollDownGenericList(&ListUi);
1004 break;
1005 case VK_UP: /* UP */
1006 ScrollUpGenericList(&ListUi);
1007 break;
1008 case VK_NEXT: /* PAGE DOWN */
1010 break;
1011 case VK_PRIOR: /* PAGE UP */
1012 ScrollPageUpGenericList(&ListUi);
1013 break;
1014 case VK_F3: /* F3 */
1015 {
1016 if (ConfirmQuit(Ir))
1017 return QUIT_PAGE;
1018 RedrawGenericList(&ListUi);
1019 break;
1020 }
1021#if 1
1022/* TODO: Temporarily kept until correct keyboard layout is in place.
1023 * (Actual AsciiChar of ESCAPE should be 0x1B instead of 0.)
1024 * Addendum to commit 8b94515b.
1025 */
1026 case VK_ESCAPE: /* ESC */
1027 {
1029 // return nextPage; // prevPage;
1030
1031 // return INSTALL_INTRO_PAGE;
1032 return DEVICE_SETTINGS_PAGE;
1033 // return SCSI_CONTROLLER_PAGE;
1034 }
1035
1036#endif
1037 }
1038 }
1039#if 0
1040/* TODO: Restore this once correct keyboard layout is in place. */
1041 else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) /* ESC */
1042 {
1044 // return nextPage; // prevPage;
1045
1046 // return INSTALL_INTRO_PAGE;
1047 return DEVICE_SETTINGS_PAGE;
1048 // return SCSI_CONTROLLER_PAGE;
1049 }
1050#endif
1051 else
1052 {
1053 // switch (toupper(Ir->Event.KeyEvent.uChar.AsciiChar))
1054 // if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
1055 if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'U') /* U */
1056 {
1057 /* Retrieve the current installation */
1059
1062
1063 DPRINT1("Selected installation for repair: \"%S\" ; DiskNumber = %d , PartitionNumber = %d\n",
1065
1067
1068 // return nextPage;
1069 /***/return INSTALL_INTRO_PAGE;/***/
1070 }
1071 else if ((Ir->Event.KeyEvent.uChar.AsciiChar > 0x60) &&
1072 (Ir->Event.KeyEvent.uChar.AsciiChar < 0x7b)) /* a-z */
1073 {
1075 }
1076 }
1077 }
1078
1079 return UPGRADE_REPAIR_PAGE;
1080}
PGENERIC_LIST NTAPI CreateNTOSInstallationsList(_In_ PPARTLIST PartList)
Create a list of available NT OS installations on the computer, by searching for recognized ones on e...
Definition: osdetect.c:768
static NTSTATUS NTAPI GetNTOSInstallationName(IN PGENERIC_LIST_ENTRY Entry, OUT PSTR Buffer, IN SIZE_T cchBufferSize)
Definition: usetup.c:509

Referenced by RunUSetup().

◆ USetupErrorRoutine()

static VOID __cdecl USetupErrorRoutine ( IN PUSETUP_DATA  pSetupData,
  ... 
)
static

Definition at line 540 of file usetup.c.

543{
544 INPUT_RECORD Ir;
545 va_list arg_ptr;
546
547 va_start(arg_ptr, pSetupData);
548
549 if (pSetupData->LastErrorNumber >= ERROR_SUCCESS &&
550 pSetupData->LastErrorNumber < ERROR_LAST_ERROR_CODE)
551 {
552 // Note: the "POPUP_WAIT_ENTER" actually depends on the LastErrorNumber...
553 MUIDisplayErrorV(pSetupData->LastErrorNumber, &Ir, POPUP_WAIT_ENTER, arg_ptr);
554 }
555
556 va_end(arg_ptr);
557}
@ ERROR_LAST_ERROR_CODE
Definition: errorcode.h:62
VOID MUIDisplayErrorV(IN ULONG ErrorNum, OUT PINPUT_RECORD Ir, IN ULONG WaitEvent, IN va_list args)
Definition: mui.c:199

Referenced by SetupStartPage().

◆ WelcomePage()

static PAGE_NUMBER WelcomePage ( PINPUT_RECORD  Ir)
static

Definition at line 829 of file usetup.c.

830{
832
833 while (TRUE)
834 {
836
837 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
838 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
839 {
840 if (ConfirmQuit(Ir))
841 return QUIT_PAGE;
842 break;
843 }
844 else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
845 {
846 return INSTALL_INTRO_PAGE;
847 }
848 else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'R') /* R */
849 {
850 return RECOVERY_PAGE; // REPAIR_INTRO_PAGE;
851 }
852 else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'L') /* L */
853 {
854 return LICENSE_PAGE;
855 }
856 }
857
858 return WELCOME_PAGE;
859}

Referenced by RunUSetup().

Variable Documentation

◆ CurrentInstallation

PNTOS_INSTALLATION CurrentInstallation = NULL
static

Definition at line 92 of file usetup.c.

Referenced by InstallDirectoryPage(), SelectPartitionPage(), and UpgradeRepairPage().

◆ CurrentPartition

◆ DefaultKBLayout

WCHAR DefaultKBLayout[20]
static

◆ DefaultLanguage

WCHAR DefaultLanguage[20]
static

Definition at line 69 of file usetup.c.

Referenced by CreateLanguageList(), LanguagePage(), and SetupStartPage().

◆ FileSystemList

PFILE_SYSTEM_LIST FileSystemList = NULL
static

Definition at line 88 of file usetup.c.

Referenced by FsVolCallback(), ResetFileSystemList(), and SelectFileSystemPage().

◆ InstallPartition

PPARTENTRY InstallPartition = NULL
static

◆ IsUnattendedSetup

◆ NtOsInstallsList

PGENERIC_LIST NtOsInstallsList = NULL
static

Definition at line 93 of file usetup.c.

Referenced by QuitPage(), and UpgradeRepairPage().

◆ 

enum { ... } PartCreateType

◆ PartitionList

◆ ProcessHeap

HANDLE ProcessHeap
  • Internal Headers *‍/

Definition at line 42 of file usetup.c.

Referenced by NtProcessStartup(), and RunUSetup().

◆ RepairUpdateFlag

◆ SelectedLanguageId

◆ SystemPartition

◆ USetupData