* Casper S. Hornstrup (chorns@users.sourceforge.net)
*/
-
-#include "precomp.h"
-#include <ntdll/rtl.h>
-
-#include <ntos/minmax.h>
-#include <reactos/resource.h>
-
-#include "usetup.h"
-#include "console.h"
-#include "partlist.h"
-#include "inicache.h"
-#include "infcache.h"
-#include "filequeue.h"
-#include "progress.h"
-#include "bootsup.h"
-#include "registry.h"
-#include "format.h"
-#include "fslist.h"
-#include "cabinet.h"
-#include "filesup.h"
-#include "drivesup.h"
-#include "genlist.h"
-#include "settings.h"
+#include <usetup.h>
#define NDEBUG
#include <debug.h>
-
typedef enum _PAGE_NUMBER
{
START_PAGE,
INTRO_PAGE,
LICENSE_PAGE,
+ WARNING_PAGE,
INSTALL_INTRO_PAGE,
// SCSI_CONTROLLER_PAGE,
DISPLAY_SETTINGS_PAGE,
KEYBOARD_SETTINGS_PAGE,
LAYOUT_SETTINGS_PAGE,
- POINTER_SETTINGS_PAGE,
SELECT_PARTITION_PAGE,
CREATE_PARTITION_PAGE,
REPAIR_INTRO_PAGE,
- EMERGENCY_INTRO_PAGE,
-
SUCCESS_PAGE,
QUIT_PAGE,
FLUSH_PAGE,
static PGENERIC_LIST DisplayList = NULL;
static PGENERIC_LIST KeyboardList = NULL;
static PGENERIC_LIST LayoutList = NULL;
-static PGENERIC_LIST PointerList = NULL;
/* FUNCTIONS ****************************************************************/
coPos.Y++;
coPos.X = xLeft + 2;
WriteConsoleOutputCharacters(Status,
- min(strlen(Status), Width - 4),
+ min(strlen(Status), (SIZE_T)Width - 4),
coPos);
}
}
{
WCHAR UnattendInfPath[MAX_PATH];
UNICODE_STRING FileName;
- INFCONTEXT Context;
+ PINFCONTEXT Context;
HINF UnattendInf;
ULONG ErrorLine;
NTSTATUS Status;
if (!InfFindFirstLine(UnattendInf, L"Unattend", L"Signature", &Context))
{
DPRINT("InfFindFirstLine() failed for section 'Unattend'\n");
+ InfFreeContext(Context);
InfCloseFile(UnattendInf);
return;
}
/* Get pointer 'Signature' key */
- if (!InfGetData(&Context, NULL, &Value))
+ if (!InfGetData(Context, NULL, &Value))
{
DPRINT("InfGetData() failed for key 'Signature'\n");
+ InfFreeContext(Context);
InfCloseFile(UnattendInf);
return;
}
if (_wcsicmp(Value, L"$ReactOS$") != 0)
{
DPRINT("Signature not $ReactOS$\n");
+ InfFreeContext(Context);
InfCloseFile(UnattendInf);
return;
}
if (!InfFindFirstLine(UnattendInf, L"Unattend", L"DestinationDiskNumber", &Context))
{
DPRINT("InfFindFirstLine() failed for key 'DestinationDiskNumber'\n");
+ InfFreeContext(Context);
InfCloseFile(UnattendInf);
return;
}
- if (!InfGetIntField(&Context, 0, &IntValue))
+ if (!InfGetIntField(Context, 0, &IntValue))
{
DPRINT("InfGetIntField() failed for key 'DestinationDiskNumber'\n");
+ InfFreeContext(Context);
InfCloseFile(UnattendInf);
return;
}
UnattendDestinationDiskNumber = IntValue;
+ InfFreeContext(Context);
/* Search for 'DestinationPartitionNumber' in the 'Unattend' section */
if (!InfFindFirstLine(UnattendInf, L"Unattend", L"DestinationPartitionNumber", &Context))
{
DPRINT("InfFindFirstLine() failed for key 'DestinationPartitionNumber'\n");
+ InfFreeContext(Context);
InfCloseFile(UnattendInf);
return;
}
- if (!InfGetIntField(&Context, 0, &IntValue))
+ if (!InfGetIntField(Context, 0, &IntValue))
{
DPRINT("InfGetIntField() failed for key 'DestinationPartitionNumber'\n");
+ InfFreeContext(Context);
InfCloseFile(UnattendInf);
return;
}
UnattendDestinationPartitionNumber = IntValue;
+ InfFreeContext(Context);
/* Search for 'DestinationPartitionNumber' in the 'Unattend' section */
if (!InfFindFirstLine(UnattendInf, L"Unattend", L"DestinationPartitionNumber", &Context))
}
/* Get pointer 'InstallationDirectory' key */
- if (!InfGetData(&Context, NULL, &Value))
+ if (!InfGetData(Context, NULL, &Value))
{
DPRINT("InfGetData() failed for key 'InstallationDirectory'\n");
+ InfFreeContext(Context);
InfCloseFile(UnattendInf);
return;
}
wcscpy(UnattendInstallationDirectory, Value);
+ InfFreeContext(Context);
InfCloseFile(UnattendInf);
IsUnattendedSetup = TRUE;
* Number of the next page.
*/
static PAGE_NUMBER
-StartPage(PINPUT_RECORD Ir)
+SetupStartPage(PINPUT_RECORD Ir)
{
SYSTEM_DEVICE_INFORMATION Sdi;
NTSTATUS Status;
WCHAR FileNameBuffer[MAX_PATH];
UNICODE_STRING FileName;
- INFCONTEXT Context;
+ PINFCONTEXT Context;
PWCHAR Value;
ULONG ErrorLine;
ULONG ReturnSize;
/* Get pointer 'Signature' key */
- if (!InfGetData (&Context, NULL, &Value))
+ if (!InfGetData (Context, NULL, &Value))
{
+ InfFreeContext(Context);
PopupError("Setup found a corrupt TXTSETUP.SIF.\n",
"ENTER = Reboot computer");
/* Check 'Signature' string */
if (_wcsicmp(Value, L"$ReactOS$") != 0)
{
+ InfFreeContext(Context);
PopupError("Setup found an invalid signature in TXTSETUP.SIF.\n",
"ENTER = Reboot computer");
}
}
}
+ InfFreeContext(Context);
CheckUnattendedSetup();
SetTextXY(6, 12, "computer and prepares the second part of the setup.");
SetTextXY(8, 15, "\x07 Press ENTER to install ReactOS.");
- SetTextXY(8, 17, "\x07 Press L to view the licensing terms for ReactOS.");
- SetTextXY(8, 19, "\x07 Press E to start the emergency console.");
- SetTextXY(8, 21, "\x07 Press R to repair ReactOS.");
- SetTextXY(8, 23, "\x07 Press F3 to quit without installing ReactOS.");
+ SetTextXY(8, 17, "\x07 Press R to repair ReactOS.");
+ SetTextXY(8, 19, "\x07 Press L to view the ReactOS Licensing Terms and Conditions");
+ SetTextXY(8, 21, "\x07 Press F3 to quit without installing ReactOS.");
- SetStatusText(" ENTER = Continue F3 = Quit");
+ SetStatusText(" ENTER = Continue R = Repair F3 = Quit");
if (IsUnattendedSetup)
{
}
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
{
- return INSTALL_INTRO_PAGE;
- }
- else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'L') /* L */
- {
- return LICENSE_PAGE;
- }
- else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'E') /* E */
- {
- return EMERGENCY_INTRO_PAGE;
+ return WARNING_PAGE;
+ break;
}
else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'R') /* R */
{
return REPAIR_INTRO_PAGE;
+ break;
}
+ else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'L') /* R */
+ {
+ return LICENSE_PAGE;
+ break;
+ }
}
return INTRO_PAGE;
SetTextXY(8, 19, "save applicable local and international law. The licensing of");
SetTextXY(8, 20, "ReactOS only covers distribution to third parties.");
- SetTextXY(8, 22, "If for some resion you did not receive a copy of the");
+ SetTextXY(8, 22, "If for some reason you did not receive a copy of the");
SetTextXY(8, 23, "GNU General Public License with ReactOS please visit");
SetHighlightedTextXY(8, 25, "http://www.gnu.org/licenses/licenses.html");
-
- SetStatusText("ENTER = Continue F3 = Quit");
+
+ SetStatusText(" ENTER = Return");
while (TRUE)
{
ConInKey(Ir);
- if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
- (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
- {
- if (ConfirmQuit(Ir) == TRUE)
- return QUIT_PAGE;
- break;
- }
- else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
- {
- return INTRO_PAGE;
- }
+ if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
+ {
+ return INTRO_PAGE;
+ break;
+ }
}
return LICENSE_PAGE;
}
+/*
+ * Warning Page
+ * RETURNS
+ * Continues to setup
+ */
static PAGE_NUMBER
-EmergencyIntroPage(PINPUT_RECORD Ir)
+WarningPage(PINPUT_RECORD Ir)
{
- SetTextXY(6, 8, "ReactOS Setup is in an early development phase. It does not yet");
- SetTextXY(6, 9, "support all the functions of a fully usable setup application.");
+ SetUnderlinedTextXY(4, 3, " ReactOS " KERNEL_VERSION_STR " Warranty Statement");
+ SetHighlightedTextXY(6, 8, "Warranty:");
- SetTextXY(6, 12, "The emergency console is not implemented yet.");
+ SetTextXY(8, 11, "This is free software; see the source for copying conditions.");
+ SetTextXY(8, 12, "There is NO warranty; not even for MERCHANTABILITY or");
+ SetTextXY(8, 13, "FITNESS FOR A PARTICULAR PURPOSE");
- SetTextXY(8, 15, "\x07 Press ESC to return to the main page.");
+ SetTextXY(8, 15, "For more information on ReactOS, please visit:");
+ SetHighlightedTextXY(8, 16, "http://www.reactos.org");
- SetTextXY(8, 17, "\x07 Press ENTER to reboot your computer.");
+ SetStatusText(" F8 = Continue ESC = Exit");
- SetStatusText(" ESC = Main page ENTER = Reboot");
-
- while(TRUE)
+ while (TRUE)
{
ConInKey(Ir);
- if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
+ if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
+ (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F8)) /* F8 */
{
- return REBOOT_PAGE;
+ return INSTALL_INTRO_PAGE;
+ break;
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */
{
- return INTRO_PAGE;
+ return QUIT_PAGE;
}
}
- return REPAIR_INTRO_PAGE;
+ return LICENSE_PAGE;
}
-
static PAGE_NUMBER
RepairIntroPage(PINPUT_RECORD Ir)
{
SetTextXY(6, 12, "The repair functions are not implemented yet.");
- SetTextXY(8, 15, "\x07 Press ESC to return to the main page.");
+ SetTextXY(8, 15, "\x07 Press R for the Recovery Console.");
+
+ SetTextXY(8, 17, "\x07 Press ESC to return to the main page.");
- SetTextXY(8, 17, "\x07 Press ENTER to reboot your computer.");
+ SetTextXY(8, 19, "\x07 Press ENTER to reboot your computer.");
SetStatusText(" ESC = Main page ENTER = Reboot");
{
return REBOOT_PAGE;
}
+ else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'R') /* R */
+ {
+ return INTRO_PAGE;
+ }
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */
{
static PAGE_NUMBER
InstallIntroPage(PINPUT_RECORD Ir)
{
+ SetUnderlinedTextXY(4, 3, " ReactOS " KERNEL_VERSION_STR " Setup ");
+
SetTextXY(6, 8, "ReactOS Setup is in an early development phase. It does not yet");
SetTextXY(6, 9, "support all the functions of a fully usable setup application.");
static PAGE_NUMBER
DeviceSettingsPage(PINPUT_RECORD Ir)
{
- static ULONG Line = 17;
+ static ULONG Line = 16;
/* Initialize the computer settings list */
if (ComputerList == NULL)
}
}
- /* Initialize the pointer settings list */
- if (PointerList == NULL)
- {
- PointerList = CreateMouseDriverList(SetupInf);
- if (PointerList == NULL)
- {
- /* FIXME: report error */
- }
- }
-
SetTextXY(6, 8, "The list below shows the current device settings.");
SetTextXY(8, 11, " Computer:");
SetTextXY(8, 12, " Display:");
SetTextXY(8, 13, " Keyboard:");
SetTextXY(8, 14, "Keyboard layout:");
- SetTextXY(8, 15, " Pointer device:");
- SetTextXY(8, 17, " Accept:");
+ SetTextXY(8, 16, " Accept:");
SetTextXY(25, 11, GetGenericListEntry(ComputerList)->Text);
SetTextXY(25, 12, GetGenericListEntry(DisplayList)->Text);
SetTextXY(25, 13, GetGenericListEntry(KeyboardList)->Text);
SetTextXY(25, 14, GetGenericListEntry(LayoutList)->Text);
- SetTextXY(25, 15, GetGenericListEntry(PointerList)->Text);
- SetTextXY(25, 17, "Accept these device settings");
+ SetTextXY(25, 16, "Accept these device settings");
InvertTextXY (24, Line, 48, 1);
- SetTextXY(6, 20, "You can change the hardware settings by pressing the UP or DOWN keys");
- SetTextXY(6, 21, "to select an entry. Then press the ENTER key to select alternative");
- SetTextXY(6, 22, "settings.");
+ SetTextXY(6, 19, "You can change the hardware settings by pressing the UP or DOWN keys");
+ SetTextXY(6, 20, "to select an entry. Then press the ENTER key to select alternative");
+ SetTextXY(6, 21, "settings.");
- SetTextXY(6, 24, "When all settings are correct, select \"Accept these device settings\"");
- SetTextXY(6, 25, "and press ENTER.");
+ SetTextXY(6, 23, "When all settings are correct, select \"Accept these device settings\"");
+ SetTextXY(6, 24, "and press ENTER.");
SetStatusText(" ENTER = Continue F3 = Quit");
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
{
NormalTextXY (24, Line, 48, 1);
- if (Line == 15)
- Line = 17;
- else if (Line == 17)
+ if (Line == 14)
+ Line = 16;
+ else if (Line == 16)
Line = 11;
else
Line++;
{
NormalTextXY (24, Line, 48, 1);
if (Line == 11)
- Line = 17;
- else if (Line == 17)
- Line = 15;
+ Line = 16;
+ else if (Line == 16)
+ Line = 14;
else
Line--;
InvertTextXY (24, Line, 48, 1);
return KEYBOARD_SETTINGS_PAGE;
else if (Line == 14)
return LAYOUT_SETTINGS_PAGE;
- else if (Line == 15)
- return POINTER_SETTINGS_PAGE;
- else if (Line == 17)
+ else if (Line == 16)
return SELECT_PARTITION_PAGE;
}
}
}
-static PAGE_NUMBER
-PointerSettingsPage(PINPUT_RECORD Ir)
-{
- SHORT xScreen;
- SHORT yScreen;
-
- SetTextXY(6, 8, "You want to change the pointing device to be installed.");
-
- SetTextXY(8, 10, "\x07 Press the UP or DOWN key to select the desired pointing");
- SetTextXY(8, 11, " device. Then press ENTER.");
-
- SetTextXY(8, 13, "\x07 Press the ESC key to return to the previous page without changing");
- SetTextXY(8, 14, " the pointing device.");
-
- GetScreenSize(&xScreen, &yScreen);
-
- DrawGenericList(PointerList,
- 2,
- 18,
- xScreen - 3,
- yScreen - 3);
-
- SetStatusText(" ENTER = Continue ESC = Cancel F3 = Quit");
-
- SaveGenericListState(PointerList);
-
- while(TRUE)
- {
- ConInKey(Ir);
-
- if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
- (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
- {
- ScrollDownGenericList(PointerList);
- }
- else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
- (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
- {
- ScrollUpGenericList(PointerList);
- }
- else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
- (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
- {
- if (ConfirmQuit(Ir) == TRUE)
- return QUIT_PAGE;
- break;
- }
- else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
- (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */
- {
- RestoreGenericListState(PointerList);
- return DEVICE_SETTINGS_PAGE;
- }
- else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
- {
- return DEVICE_SETTINGS_PAGE;
- }
- }
-
- return DISPLAY_SETTINGS_PAGE;
-}
-
-
static PAGE_NUMBER
SelectPartitionPage(PINPUT_RECORD Ir)
{
return SELECT_FILE_SYSTEM_PAGE;
}
- else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_C) /* C */
+ else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'C') /* C */
{
if (PartitionList->CurrentPartition->Unpartitioned == FALSE)
{
return CREATE_PARTITION_PAGE;
}
- else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_D) /* D */
+ else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'D') /* D */
{
if (PartitionList->CurrentPartition->Unpartitioned == TRUE)
{
strlen (Buffer),
coPos);
- Buffer[0] = 0;
- Index = 0;
+ sprintf(Buffer, "%lu", MaxSize);
+ Index = strlen(Buffer);
DrawInputField (PARTITION_SIZE_INPUT_FIELD_LENGTH,
iLeft,
iTop,
}
#if 0
- if (PartEntry->PartInfo[0].PartitionLength.QuadPart >= 0x280000000ULL) /* 10 GB */
+ if (PartEntry->PartInfo[0].PartitionLength.QuadPart >= 0x280000000LL) /* 10 GB */
{
PartSize = (PartEntry->PartInfo[0].PartitionLength.QuadPart + (1 << 29)) >> 30;
Unit = "GB";
}
else
#endif
- if (PartEntry->PartInfo[0].PartitionLength.QuadPart >= 0xA00000ULL) /* 10 MB */
+ if (PartEntry->PartInfo[0].PartitionLength.QuadPart >= 0xA00000LL) /* 10 MB */
{
PartSize = (PartEntry->PartInfo[0].PartitionLength.QuadPart + (1 << 19)) >> 20;
Unit = "MB";
{
return SELECT_PARTITION_PAGE;
}
- else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_D) /* D */
+ else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'D') /* D */
{
DeleteCurrentPartition (PartitionList);
}
/* adjust partition size */
- if (PartEntry->PartInfo[0].PartitionLength.QuadPart >= 0x280000000ULL) /* 10 GB */
+ if (PartEntry->PartInfo[0].PartitionLength.QuadPart >= 0x280000000LL) /* 10 GB */
{
PartSize = (PartEntry->PartInfo[0].PartitionLength.QuadPart + (1 << 29)) >> 30;
PartUnit = "GB";
#ifndef NDEBUG
ULONG Line;
ULONG i;
+ PLIST_ENTRY Entry;
#endif
switch (FileSystemList->CurrentFileSystem)
{
case FsFat:
- if (PartEntry->PartInfo[0].PartitionLength.QuadPart < (4200ULL * 1024ULL))
+ if (PartEntry->PartInfo[0].PartitionLength.QuadPart < (4200LL * 1024LL))
{
/* FAT12 CHS partition (disk is smaller than 4.1MB) */
PartEntry->PartInfo[0].PartitionType = PARTITION_FAT_12;
}
- else if (PartEntry->PartInfo[0].StartingOffset.QuadPart < (1024ULL * 255ULL * 63ULL * 512ULL))
+ else if (PartEntry->PartInfo[0].StartingOffset.QuadPart < (1024LL * 255LL * 63LL * 512LL))
{
/* Partition starts below the 8.4GB boundary ==> CHS partition */
- if (PartEntry->PartInfo[0].PartitionLength.QuadPart < (32ULL * 1024ULL * 1024ULL))
+ if (PartEntry->PartInfo[0].PartitionLength.QuadPart < (32LL * 1024LL * 1024LL))
{
/* FAT16 CHS partition (partiton size < 32MB) */
PartEntry->PartInfo[0].PartitionType = PARTITION_FAT_16;
}
- else if (PartEntry->PartInfo[0].PartitionLength.QuadPart < (512ULL * 1024ULL * 1024ULL))
+ else if (PartEntry->PartInfo[0].PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
{
/* FAT16 CHS partition (partition size < 512MB) */
PartEntry->PartInfo[0].PartitionType = PARTITION_HUGE;
{
/* Partition starts above the 8.4GB boundary ==> LBA partition */
- if (PartEntry->PartInfo[0].PartitionLength.QuadPart < (512ULL * 1024ULL * 1024ULL))
+ if (PartEntry->PartInfo[0].PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
{
/* FAT16 LBA partition (partition size < 512MB) */
PartEntry->PartInfo[0].PartitionType = PARTITION_XINT13;
RtlFreeUnicodeString(&DestinationArcPath);
swprintf(PathBuffer,
L"multi(0)disk(0)rdisk(%lu)partition(%lu)",
- DiskEntry->DiskNumber,
+ DiskEntry->BiosDiskNumber,
PartEntry->PartInfo[0].PartitionNumber);
if (InstallDir[0] != L'\\')
wcscat(PathBuffer,
PPARTENTRY PartEntry;
WCHAR InstallDir[51];
PWCHAR DefaultPath;
- INFCONTEXT Context;
+ PINFCONTEXT Context;
ULONG Length;
if (PartitionList == NULL ||
}
/* Read the 'DefaultPath' data */
- if (InfGetData (&Context, NULL, &DefaultPath))
+ if (InfGetData (Context, NULL, &DefaultPath))
{
wcscpy(InstallDir, DefaultPath);
}
{
wcscpy(InstallDir, L"\\ReactOS");
}
+ InfFreeContext(Context);
Length = wcslen(InstallDir);
SetTextXY(6, 8, "Setup installs ReactOS files onto the selected partition. Choose a");
static BOOLEAN
-PrepareCopyPageInfFile(HINF InfFile,
+AddSectionToCopyQueue(HINF InfFile,
+ PWCHAR SectionName,
PWCHAR SourceCabinet,
PINPUT_RECORD Ir)
{
- WCHAR PathBuffer[MAX_PATH];
- INFCONTEXT FilesContext;
- INFCONTEXT DirContext;
- PWCHAR KeyValue;
- ULONG Length;
- NTSTATUS Status;
+ PINFCONTEXT FilesContext;
+ PINFCONTEXT DirContext;
PWCHAR FileKeyName;
PWCHAR FileKeyValue;
PWCHAR DirKeyValue;
PWCHAR TargetFileName;
- /* Search for the 'SourceFiles' section */
- if (!InfFindFirstLine (InfFile, L"SourceFiles", NULL, &FilesContext))
+ /* Search for the SectionName section */
+ if (!InfFindFirstLine (InfFile, SectionName, NULL, &FilesContext))
{
- PopupError("Setup failed to find the 'SourceFiles' section\n"
- "in TXTSETUP.SIF.\n", // FIXME
- "ENTER = Reboot computer");
+ char Buffer[128];
+ sprintf(Buffer, "Setup failed to find the '%S' section\nin TXTSETUP.SIF.\n", SectionName);
+ PopupError(Buffer, "ENTER = Reboot computer");
while(TRUE)
{
}
/*
- * Enumerate the files in the 'SourceFiles' section
+ * Enumerate the files in the section
* and add them to the file queue.
*/
do
{
/* Get source file name and target directory id */
- if (!InfGetData (&FilesContext, &FileKeyName, &FileKeyValue))
+ if (!InfGetData (FilesContext, &FileKeyName, &FileKeyValue))
{
/* FIXME: Handle error! */
DPRINT1("InfGetData() failed\n");
}
/* Get optional target file name */
- if (!InfGetDataField (&FilesContext, 2, &TargetFileName))
+ if (!InfGetDataField (FilesContext, 2, &TargetFileName))
TargetFileName = NULL;
DPRINT ("FileKeyName: '%S' FileKeyValue: '%S'\n", FileKeyName, FileKeyValue);
break;
}
- if (!InfGetData (&DirContext, NULL, &DirKeyValue))
+ if (!InfGetData (DirContext, NULL, &DirKeyValue))
{
/* FIXME: Handle error! */
+ InfFreeContext(DirContext);
DPRINT1("InfGetData() failed\n");
break;
}
/* FIXME: Handle error! */
DPRINT1("SetupQueueCopy() failed\n");
}
+ InfFreeContext(DirContext);
}
- while (InfFindNextLine(&FilesContext, &FilesContext));
+ while (InfFindNextLine(FilesContext, FilesContext));
+
+ InfFreeContext(FilesContext);
+ return TRUE;
+}
+
+static BOOLEAN
+PrepareCopyPageInfFile(HINF InfFile,
+ PWCHAR SourceCabinet,
+ PINPUT_RECORD Ir)
+{
+ WCHAR PathBuffer[MAX_PATH];
+ PINFCONTEXT DirContext;
+ PWCHAR AdditionalSectionName = NULL;
+ PWCHAR KeyValue;
+ ULONG Length;
+ NTSTATUS Status;
+
+ /* Add common files */
+ if (!AddSectionToCopyQueue(InfFile, L"SourceFiles", SourceCabinet, Ir))
+ return FALSE;
+
+ /* Add specific files depending of computer type */
+ if (SourceCabinet == NULL)
+ {
+ if (!ProcessComputerFiles(InfFile, ComputerList, &AdditionalSectionName))
+ return FALSE;
+ if (AdditionalSectionName)
+ {
+ if (!AddSectionToCopyQueue(InfFile, AdditionalSectionName, SourceCabinet, Ir))
+ return FALSE;
+ }
+ }
/* Create directories */
}
/* Create the install directory */
- Status = CreateDirectory(PathBuffer);
+ Status = SetupCreateDirectory(PathBuffer);
if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_NAME_COLLISION)
{
DPRINT("Creating directory '%S' failed: Status = 0x%08lx", PathBuffer, Status);
/* Enumerate the directory values and create the subdirectories */
do
{
- if (!InfGetData (&DirContext, NULL, &KeyValue))
+ if (!InfGetData (DirContext, NULL, &KeyValue))
{
DPRINT1("break\n");
break;
DPRINT("FullPath: '%S'\n", PathBuffer);
- Status = CreateDirectory(PathBuffer);
+ Status = SetupCreateDirectory(PathBuffer);
if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_NAME_COLLISION)
{
DPRINT("Creating directory '%S' failed: Status = 0x%08lx", PathBuffer, Status);
}
}
}
- while (InfFindNextLine (&DirContext, &DirContext));
+ while (InfFindNextLine (DirContext, DirContext));
+
+ InfFreeContext(DirContext);
return(TRUE);
}
{
HINF InfHandle;
WCHAR PathBuffer[MAX_PATH];
- INFCONTEXT CabinetsContext;
+ PINFCONTEXT CabinetsContext;
ULONG InfFileSize;
PWCHAR KeyValue;
NTSTATUS Status;
*/
do
{
- if (!InfGetData (&CabinetsContext, NULL, &KeyValue))
+ if (!InfGetData (CabinetsContext, NULL, &KeyValue))
break;
wcscpy(PathBuffer, SourcePath.Buffer);
return QUIT_PAGE;
}
}
- while (InfFindNextLine (&CabinetsContext, &CabinetsContext));
+ while (InfFindNextLine (CabinetsContext, CabinetsContext));
+
+ InfFreeContext(CabinetsContext);
return FILE_COPY_PAGE;
}
case SPFILENOTIFY_STARTCOPY:
/* Display copy message */
- PrintTextXYN(6, 16, 60, "Copying file: %S", (PWSTR)Param1);
-
- PrintTextXYN(6, 18, 60, "File %lu of %lu",
- CopyContext->CompletedOperations + 1,
- CopyContext->TotalOperations);
+ SetStatusText(" \xB3 Copying file: %S", (PWSTR)Param1);
break;
case SPFILENOTIFY_ENDCOPY:
SHORT xScreen;
SHORT yScreen;
- SetStatusText(" Please wait...");
-
- SetTextXY(6, 8, "Copying files");
+ SetStatusText(" \xB3 Please wait... ");
- GetScreenSize(&xScreen, &yScreen);
+ SetTextXY(11, 12, "Please wait while ReactOS Setup copies files to your ReactOS");
+ SetTextXY(30, 13, "installation folder.");
+ SetTextXY(20, 14, "This may take several minutes to complete.");
+ GetScreenSize(&xScreen, &yScreen);
CopyContext.TotalOperations = 0;
CopyContext.CompletedOperations = 0;
- CopyContext.ProgressBar = CreateProgressBar(6,
- yScreen - 14,
- xScreen - 7,
- yScreen - 10);
+ CopyContext.ProgressBar = CreateProgressBar(13,
+ 26,
+ xScreen - 13,
+ yScreen - 20,
+ "Setup is copying files...");
SetupCommitFileQueue(SetupFileQueue,
DestinationRootPath.Buffer,
static PAGE_NUMBER
RegistryPage(PINPUT_RECORD Ir)
{
- INFCONTEXT InfContext;
+ PINFCONTEXT InfContext;
PWSTR Action;
PWSTR File;
PWSTR Section;
do
{
- InfGetDataField (&InfContext, 0, &Action);
- InfGetDataField (&InfContext, 1, &File);
- InfGetDataField (&InfContext, 2, &Section);
+ InfGetDataField (InfContext, 0, &Action);
+ InfGetDataField (InfContext, 1, &File);
+ InfGetDataField (InfContext, 2, &Section);
DPRINT("Action: %S File: %S Section %S\n", Action, File, Section);
}
}
}
- while (InfFindNextLine (&InfContext, &InfContext));
+ while (InfFindNextLine (InfContext, InfContext));
+
+ InfFreeContext(InfContext);
/* Update display registry settings */
SetStatusText(" Updating display registry settings...");
}
}
- /* Update mouse registry settings */
- SetStatusText(" Updating mouse registry settings...");
- if (!ProcessMouseRegistry(SetupInf, PointerList))
- {
- PopupError("Setup failed to update mouse registry settings.",
- "ENTER = Reboot computer");
-
- while(TRUE)
- {
- ConInKey(Ir);
-
- if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
- {
- return QUIT_PAGE;
- }
- }
- }
+ /* Update the mounted devices list */
+ SetMountedDeviceValues(PartitionList);
SetStatusText(" Done...");
SetTextXY(8, 12, "Install bootloader on the harddisk (MBR).");
SetTextXY(8, 13, "Install bootloader on a floppy disk.");
+ SetTextXY(8, 14, "Skip install bootloader.");
InvertTextXY (8, Line, 48, 1);
SetStatusText(" ENTER = Continue F3 = Quit");
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
{
NormalTextXY (8, Line, 48, 1);
- if (Line == 12)
- Line = 13;
- else if (Line == 13)
- Line = 12;
-#if 0
- else
- Line++;
-#endif
+
+ Line++;
+ if (Line<12) Line=14;
+ if (Line>14) Line=12;
+
+
+
InvertTextXY (8, Line, 48, 1);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
{
NormalTextXY (8, Line, 48, 1);
- if (Line == 12)
- Line = 13;
- else if (Line == 13)
- Line = 12;
-#if 0
- else
- Line--;
-#endif
+
+ Line--;
+ if (Line<12) Line=14;
+ if (Line>14) Line=12;
+
+
InvertTextXY (8, Line, 48, 1);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
{
return BOOT_LOADER_FLOPPY_PAGE;
}
+ else if (Line == 14)
+ {
+ return SUCCESS_PAGE;;
+ }
return BOOT_LOADER_PAGE;
}
LayoutList = NULL;
}
- /* Destroy pointer device list */
- if (PointerList != NULL)
- {
- DestroyGenericList(PointerList, TRUE);
- PointerList = NULL;
- }
-
SetStatusText(" ENTER = Reboot computer");
while(TRUE)
}
+static VOID
+SignalInitEvent()
+{
+ NTSTATUS Status;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING UnicodeString = RTL_CONSTANT_STRING(L"\\ReactOSInitDone");
+ HANDLE ReactOSInitEvent;
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ &UnicodeString,
+ 0,
+ 0,
+ NULL);
+ Status = NtOpenEvent(&ReactOSInitEvent,
+ EVENT_ALL_ACCESS,
+ &ObjectAttributes);
+ if (NT_SUCCESS(Status))
+ {
+ LARGE_INTEGER Timeout;
+ /* This will cause the boot screen image to go away (if displayed) */
+ NtPulseEvent(ReactOSInitEvent, NULL);
+
+ /* Wait for the display mode to be changed (if in graphics mode) */
+ Timeout.QuadPart = -50000000LL; /* 5 second timeout */
+ NtWaitForSingleObject(ReactOSInitEvent, FALSE, &Timeout);
+
+ NtClose(ReactOSInitEvent);
+ }
+ else
+ {
+ /* We don't really care if this fails */
+ DPRINT1("USETUP: Failed to open ReactOS init notification event\n");
+ }
+}
+
+
VOID STDCALL
NtProcessStartup(PPEB Peb)
{
RtlNormalizeProcessParams(Peb->ProcessParameters);
ProcessHeap = Peb->ProcessHeap;
+ InfSetHeap(ProcessHeap);
+
+ SignalInitEvent();
Status = AllocConsole();
if (!NT_SUCCESS(Status))
{
- PrintString("AllocConsole() failed (Status = 0x%08lx)\n", Status);
+ PrintString("Unable to open the console (Status = 0x%08lx)\n\n", Status);
+ PrintString("The most common cause of this is using an USB keyboard\n");
+ PrintString("USB keyboards are not fully supported yet\n");
/* Raise a hard error (crash the system/BSOD) */
NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED,
{
/* Start page */
case START_PAGE:
- Page = StartPage(&Ir);
+ Page = SetupStartPage(&Ir);
break;
/* License page */
case LICENSE_PAGE:
Page = LicensePage(&Ir);
break;
+
+ /* Warning page */
+ case WARNING_PAGE:
+ Page = WarningPage(&Ir);
+ break;
/* Intro page */
case INTRO_PAGE:
Page = LayoutSettingsPage(&Ir);
break;
- case POINTER_SETTINGS_PAGE:
- Page = PointerSettingsPage(&Ir);
- break;
-
case SELECT_PARTITION_PAGE:
Page = SelectPartitionPage(&Ir);
break;
Page = RepairIntroPage(&Ir);
break;
-
- /* Emergency pages */
- case EMERGENCY_INTRO_PAGE:
- Page = EmergencyIntroPage(&Ir);
- break;
-
-
case SUCCESS_PAGE:
Page = SuccessPage(&Ir);
break;
/* Reboot */
FreeConsole();
NtShutdownSystem(ShutdownReboot);
+ NtTerminateProcess(NtCurrentProcess(), 0);
}
/* EOF */