usetup.c
来自「一个类似windows」· C语言 代码 · 共 2,599 行 · 第 1/5 页
C
2,599 行
1,
coPos,
&Written);
/* draw lower edge */
coPos.X = Left + 1;
coPos.Y = Bottom;
FillConsoleOutputCharacter(0xC4, // '-',
Right - Left - 1,
coPos,
&Written);
/* draw lower right corner */
coPos.X = Right;
coPos.Y = Bottom;
FillConsoleOutputCharacter(0xD9, // '+',
1,
coPos,
&Written);
/* Print message */
coPos.X = Left + 2;
coPos.Y = Top + 2;
strcpy (Buffer, "Size of new partition:");
iLeft = coPos.X + strlen (Buffer) + 1;
iTop = coPos.Y;
WriteConsoleOutputCharacters (Buffer,
strlen (Buffer),
coPos);
sprintf (Buffer, "MB (max. %lu MB)", MaxSize);
coPos.X = iLeft + PARTITION_SIZE_INPUT_FIELD_LENGTH + 1;
coPos.Y = iTop;
WriteConsoleOutputCharacters (Buffer,
strlen (Buffer),
coPos);
sprintf(Buffer, "%lu", MaxSize);
Index = strlen(Buffer);
DrawInputField (PARTITION_SIZE_INPUT_FIELD_LENGTH,
iLeft,
iTop,
Buffer);
while (TRUE)
{
ConInKey (&Ir);
if ((Ir.Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir.Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
if (Quit != NULL)
*Quit = TRUE;
Buffer[0] = 0;
break;
}
else if (Ir.Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */
{
break;
}
else if (Ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) /* ESCAPE */
{
if (Cancel != NULL)
*Cancel = TRUE;
Buffer[0] = 0;
break;
}
else if ((Ir.Event.KeyEvent.wVirtualKeyCode == VK_BACK) && /* BACKSPACE */
(Index > 0))
{
Index--;
Buffer[Index] = 0;
DrawInputField (PARTITION_SIZE_INPUT_FIELD_LENGTH,
iLeft,
iTop,
Buffer);
}
else if ((Ir.Event.KeyEvent.uChar.AsciiChar != 0x00) &&
(Index < PARTITION_SIZE_INPUT_FIELD_LENGTH))
{
ch = Ir.Event.KeyEvent.uChar.AsciiChar;
if ((ch >= '0') && (ch <= '9'))
{
Buffer[Index] = ch;
Index++;
Buffer[Index] = 0;
DrawInputField (PARTITION_SIZE_INPUT_FIELD_LENGTH,
iLeft,
iTop,
Buffer);
}
}
}
strcpy (InputBuffer,
Buffer);
}
static PAGE_NUMBER
CreatePartitionPage (PINPUT_RECORD Ir)
{
PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
SHORT xScreen;
SHORT yScreen;
BOOLEAN Quit;
BOOLEAN Cancel;
CHAR InputBuffer[50];
ULONG MaxSize;
ULONGLONG PartSize;
ULONGLONG DiskSize;
PCHAR Unit;
if (PartitionList == NULL ||
PartitionList->CurrentDisk == NULL ||
PartitionList->CurrentPartition == NULL)
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
}
DiskEntry = PartitionList->CurrentDisk;
PartEntry = PartitionList->CurrentPartition;
SetStatusText (" Please wait...");
GetScreenSize (&xScreen, &yScreen);
SetTextXY (6, 8, "You have chosen to create a new partition on");
#if 0
if (DiskEntry->DiskSize >= 0x280000000ULL) /* 10 GB */
{
DiskSize = (DiskEntry->DiskSize + (1 << 29)) >> 30;
Unit = "GB";
}
else
#endif
{
DiskSize = (DiskEntry->DiskSize + (1 << 19)) >> 20;
if (DiskSize == 0)
DiskSize = 1;
Unit = "MB";
}
if (DiskEntry->DriverName.Length > 0)
{
PrintTextXY (6, 10,
"%I64u %s Harddisk %lu (Port=%hu, Bus=%hu, Id=%hu) on %wZ.",
DiskSize,
Unit,
DiskEntry->DiskNumber,
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id,
&DiskEntry->DriverName);
}
else
{
PrintTextXY (6, 10,
"%I64u %s Harddisk %lu (Port=%hu, Bus=%hu, Id=%hu).",
DiskSize,
Unit,
DiskEntry->DiskNumber,
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id);
}
SetTextXY (6, 12, "Please enter the size of the new partition in megabytes.");
#if 0
PrintTextXY (8, 10, "Maximum size of the new partition is %I64u MB",
PartitionList->CurrentPartition->UnpartitionedLength / (1024*1024));
#endif
SetStatusText (" ENTER = Create Partition ESC = Cancel F3 = Quit");
PartEntry = PartitionList->CurrentPartition;
while (TRUE)
{
MaxSize = (PartEntry->UnpartitionedLength + (1 << 19)) >> 20; /* in MBytes (rounded) */
ShowPartitionSizeInputBox (12, 14, xScreen - 12, 17, /* left, top, right, bottom */
MaxSize, InputBuffer, &Quit, &Cancel);
if (Quit == TRUE)
{
if (ConfirmQuit (Ir) == TRUE)
{
return QUIT_PAGE;
}
}
else if (Cancel == TRUE)
{
return SELECT_PARTITION_PAGE;
}
else
{
PartSize = atoi (InputBuffer);
if (PartSize < 1)
{
/* Too small */
continue;
}
if (PartSize > MaxSize)
{
/* Too large */
continue;
}
/* Convert to bytes */
if (PartSize == MaxSize)
{
/* Use all of the unpartitioned disk space */
PartSize = PartEntry->UnpartitionedLength;
}
else
{
/* Round-up by cylinder size */
PartSize = ROUND_UP (PartSize * 1024 * 1024,
DiskEntry->CylinderSize);
/* But never get larger than the unpartitioned disk space */
if (PartSize > PartEntry->UnpartitionedLength)
PartSize = PartEntry->UnpartitionedLength;
}
DPRINT ("Partition size: %I64u bytes\n", PartSize);
CreateNewPartition (PartitionList,
PartSize,
FALSE);
return SELECT_PARTITION_PAGE;
}
}
return CREATE_PARTITION_PAGE;
}
static PAGE_NUMBER
DeletePartitionPage (PINPUT_RECORD Ir)
{
PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
ULONGLONG DiskSize;
ULONGLONG PartSize;
PCHAR Unit;
PCHAR PartType;
if (PartitionList == NULL ||
PartitionList->CurrentDisk == NULL ||
PartitionList->CurrentPartition == NULL)
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
}
DiskEntry = PartitionList->CurrentDisk;
PartEntry = PartitionList->CurrentPartition;
SetTextXY (6, 8, "You have chosen to delete the partition");
/* Determine partition type */
PartType = NULL;
if (PartEntry->New == TRUE)
{
PartType = "New (Unformatted)";
}
else if (PartEntry->Unpartitioned == FALSE)
{
if ((PartEntry->PartInfo[0].PartitionType == PARTITION_FAT_12) ||
(PartEntry->PartInfo[0].PartitionType == PARTITION_FAT_16) ||
(PartEntry->PartInfo[0].PartitionType == PARTITION_HUGE) ||
(PartEntry->PartInfo[0].PartitionType == PARTITION_XINT13))
{
PartType = "FAT";
}
else if ((PartEntry->PartInfo[0].PartitionType == PARTITION_FAT32) ||
(PartEntry->PartInfo[0].PartitionType == PARTITION_FAT32_XINT13))
{
PartType = "FAT32";
}
else if (PartEntry->PartInfo[0].PartitionType == PARTITION_IFS)
{
PartType = "NTFS"; /* FIXME: Not quite correct! */
}
}
#if 0
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 >= 0xA00000LL) /* 10 MB */
{
PartSize = (PartEntry->PartInfo[0].PartitionLength.QuadPart + (1 << 19)) >> 20;
Unit = "MB";
}
else
{
PartSize = (PartEntry->PartInfo[0].PartitionLength.QuadPart + (1 << 9)) >> 10;
Unit = "KB";
}
if (PartType == NULL)
{
PrintTextXY (6, 10,
" %c%c Type %lu %I64u %s",
(PartEntry->DriveLetter == 0) ? '-' : PartEntry->DriveLetter,
(PartEntry->DriveLetter == 0) ? '-' : ':',
PartEntry->PartInfo[0].PartitionType,
PartSize,
Unit);
}
else
{
PrintTextXY (6, 10,
" %c%c %s %I64u %s",
(PartEntry->DriveLetter == 0) ? '-' : PartEntry->DriveLetter,
(PartEntry->DriveLetter == 0) ? '-' : ':',
PartType,
PartSize,
Unit);
}
#if 0
if (DiskEntry->DiskSize >= 0x280000000ULL) /* 10 GB */
{
DiskSize = (DiskEntry->DiskSize + (1 << 29)) >> 30;
Unit = "GB";
}
else
#endif
{
DiskSize = (DiskEntry->DiskSize + (1 << 19)) >> 20;
if (DiskSize == 0)
DiskSize = 1;
Unit = "MB";
}
if (DiskEntry->DriverName.Length > 0)
{
PrintTextXY (6, 12,
"on %I64u %s Harddisk %lu (Port=%hu, Bus=%hu, Id=%hu) on %wZ.",
DiskSize,
Unit,
DiskEntry->DiskNumber,
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id,
&DiskEntry->DriverName);
}
else
{
PrintTextXY (6, 12,
"on %I64u %s Harddisk %lu (Port=%hu, Bus=%hu, Id=%hu).",
DiskSize,
Unit,
DiskEntry->DiskNumber,
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id);
}
SetTextXY (8, 18, "\x07 Press D to delete the partition.");
SetTextXY (11, 19, "WARNING: All data on this partition will be lost!");
SetTextXY (8, 21, "\x07 Press ESC to cancel.");
SetStatusText (" D = Delete Partition ESC = Cancel F3 = Quit");
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.wVirtualKeyCode == VK_ESCAPE) /* ESC */
{
return SELECT_PARTITION_PAGE;
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'D') /* D */
{
DeleteCurrentPartition (PartitionList);
return SELECT_PARTITION_PAGE;
}
}
return DELETE_PARTITION_PAGE;
}
static PAGE_NUMBER
SelectFileSystemPage (PINPUT_RECORD Ir)
{
PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
ULONGLONG DiskSize;
ULONGLONG PartSize;
PCHAR DiskUnit;
PCHAR PartUnit;
PCHAR PartType;
if (PartitionList == NULL ||
PartitionList->CurrentDisk == NULL ||
PartitionList->CurrentPartition == NULL)
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
}
DiskEntry = PartitionList->CurrentDisk;
PartEntry = PartitionList->CurrentPartition;
/* adjust disk size */
if (DiskEntry->DiskSize >= 0x280000000ULL) /* 10 GB */
{
DiskSize = (DiskEntry->DiskSize + (1 << 29)) >> 30;
DiskUnit = "GB";
}
else
{
DiskSize = (DiskEntry->DiskSize + (1 << 19)) >> 20;
DiskUnit = "MB";
}
/* adjust partition size */
if (PartEntry->PartInfo[0].PartitionLength.QuadPart >= 0x280000000LL) /* 10 GB */
{
PartSize = (PartEntry->PartInfo[0].PartitionLength.QuadPart + (1 << 29)) >> 30;
PartUnit = "GB";
}
else
{
PartSize = (PartEntry->PartInfo[0].PartitionLength.QuadPart + (1 << 19)) >> 20;
PartUnit = "MB";
}
/* adjust partition type */
if ((PartEntry->PartInfo[0].PartitionType == PARTITION_FAT_12) ||
(PartEntry->PartInfo[0].PartitionType == PARTITION_FAT_16) ||
(PartEntry->PartInfo[0].PartitionType == PARTITION_HUGE) ||
(PartEntry->PartInfo[0].PartitionType == PARTITION_XINT13))
{
PartType = "FAT";
}
else if ((PartEntry->PartInfo[0].PartitionType == PARTITION_FAT32) ||
(PartEntry->PartInfo[0].PartitionType == PARTITION_FAT32_XINT13))
{
PartType = "FAT32";
}
else if (PartEntry->PartInfo[0].PartitionType == PARTITION_IFS)
{
PartType = "NTFS"; /* FIXME: Not quite correct! */
}
else if (PartEntry->PartInfo[0].PartitionType == PARTITION_ENTRY_UNUSED)
{
PartType = "Unused";
}
else
{
PartType = "Unknown";
}
if (PartEntry->AutoCreate == TRUE)
{
SetTextXY(6, 8, "Setup created a new partition on");
#if 0
PrintTextXY(8, 10, "Partition %lu (%I64u %s) %s of",
PartEntry->PartInfo[0].PartitionNumber,
PartSize,
PartUnit,
PartType);
#endif
PrintTextXY(8, 10, "Harddisk %lu (%I64u %s), Port=%hu, Bus=%hu, Id=%hu (%wZ).",
DiskEntry->DiskNumber,
DiskSize,
DiskUnit,
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id,
&DiskEntry->DriverName);
SetTextXY(6, 12, "This Partition will be formatted next.");
PartEntry->AutoCreate = FALSE;
}
else if (PartEntry->New == TRUE)
{
SetTextXY(6, 8, "You chose to install ReactOS on a new or unformatted Partition.");
SetTextXY(6, 10, "This Partition will be formatted next.");
}
else
{
SetTextXY(6, 8, "Setup install ReactOS onto Partition");
if (PartType == NULL)
{
PrintTextXY (8, 10,
"%c%c Type %lu %I64u %s",
(PartEntry->DriveLetter == 0) ? '-' : PartEntry->DriveLetter,
(PartEntry->DriveLetter == 0) ? '-' : ':',
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?