mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 09:34:43 +00:00
Prepared bootloader installation.
svn path=/trunk/; revision=4022
This commit is contained in:
parent
fec5d8fcaf
commit
5dc512f7c3
10 changed files with 1049 additions and 92 deletions
282
reactos/subsys/system/usetup/bootsup.c
Normal file
282
reactos/subsys/system/usetup/bootsup.c
Normal file
|
@ -0,0 +1,282 @@
|
||||||
|
/*
|
||||||
|
* ReactOS kernel
|
||||||
|
* Copyright (C) 2002 ReactOS Team
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS text-mode setup
|
||||||
|
* FILE: subsys/system/usetup/bootsup.c
|
||||||
|
* PURPOSE: Bootloader support functions
|
||||||
|
* PROGRAMMER: Eric Kohl
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ddk/ntddk.h>
|
||||||
|
#include <ntdll/rtl.h>
|
||||||
|
|
||||||
|
#include "usetup.h"
|
||||||
|
#include "inicache.h"
|
||||||
|
#include "bootsup.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
CreateCommonFreeLoaderSections(PINICACHE IniCache)
|
||||||
|
{
|
||||||
|
PINICACHESECTION IniSection;
|
||||||
|
|
||||||
|
/* Create "FREELOADER" section */
|
||||||
|
IniSection = IniCacheAppendSection(IniCache,
|
||||||
|
L"FREELOADER");
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
MessageLine=Welcome to FreeLoader!
|
||||||
|
MessageLine=Copyright (c) 2002 by Brian Palmer <brianp@sginet.com>
|
||||||
|
MessageLine=
|
||||||
|
MessageBox=Edit your FREELDR.INI file to change your boot settings.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* DefaultOS=ReactOS */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"DefaultOS",
|
||||||
|
L"ReactOS");
|
||||||
|
|
||||||
|
/* Timeout=10 */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"TimeOut",
|
||||||
|
L"10");
|
||||||
|
|
||||||
|
|
||||||
|
/* Create "Display" section */
|
||||||
|
IniSection = IniCacheAppendSection(IniCache,
|
||||||
|
L"Display");
|
||||||
|
|
||||||
|
/* DisplayMode=NORMAL_VGA */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"DisplayMode",
|
||||||
|
L"NORMAL_VGA");
|
||||||
|
|
||||||
|
/* TitleText=Boot Menu */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"TitleText",
|
||||||
|
L"Boot Menu");
|
||||||
|
|
||||||
|
/* StatusBarColor=Cyan */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"StatusBarColor",
|
||||||
|
L"Cyan");
|
||||||
|
|
||||||
|
/* StatusBarTextColor=Black */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"StatusBarTextColor",
|
||||||
|
L"Black");
|
||||||
|
|
||||||
|
/* BackdropTextColor=White */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"BackdropTextColor",
|
||||||
|
L"White");
|
||||||
|
|
||||||
|
/* BackdropColor=Blue */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"BackdropColor",
|
||||||
|
L"Blue");
|
||||||
|
|
||||||
|
/* BackdropFillStyle=Medium */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"BackdropFillStyle",
|
||||||
|
L"Medium");
|
||||||
|
|
||||||
|
/* TitleBoxTextColor=White */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"TitleBoxTextColor",
|
||||||
|
L"White");
|
||||||
|
|
||||||
|
/* TitleBoxColor=Red */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"TitleBoxColor",
|
||||||
|
L"Red");
|
||||||
|
|
||||||
|
/* MessageBoxTextColor=White */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"MessageBoxTextColor",
|
||||||
|
L"White");
|
||||||
|
|
||||||
|
/* MessageBoxColor=Blue */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"MessageBoxColor",
|
||||||
|
L"Blue");
|
||||||
|
|
||||||
|
/* MenuTextColor=White */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"MenuTextColor",
|
||||||
|
L"White");
|
||||||
|
|
||||||
|
/* MenuColor=Blue */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"MenuColor",
|
||||||
|
L"Blue");
|
||||||
|
|
||||||
|
/* TextColor=Yellow */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"TextColor",
|
||||||
|
L"Yellow");
|
||||||
|
|
||||||
|
/* SelectedTextColor=Black */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"SelectedTextColor",
|
||||||
|
L"Black");
|
||||||
|
|
||||||
|
/* SelectedColor=Gray */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"SelectedColor",
|
||||||
|
L"Gray");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
CreateFreeLoaderIniForDos(PWCHAR IniPath,
|
||||||
|
PWCHAR SystemPath)
|
||||||
|
{
|
||||||
|
PINICACHE IniCache;
|
||||||
|
PINICACHESECTION IniSection;
|
||||||
|
|
||||||
|
IniCache = IniCacheCreate();
|
||||||
|
|
||||||
|
CreateCommonFreeLoaderSections(IniCache);
|
||||||
|
|
||||||
|
/* Create "OperatingSystems" section */
|
||||||
|
IniSection = IniCacheAppendSection(IniCache,
|
||||||
|
L"OperatingSystems");
|
||||||
|
|
||||||
|
/* REACTOS=ReactOS */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"REACTOS",
|
||||||
|
L"ReactOS");
|
||||||
|
|
||||||
|
/* DOS=Dos/Windows */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"DOS",
|
||||||
|
L"DOS/Windows");
|
||||||
|
|
||||||
|
/* Create "REACTOS" section */
|
||||||
|
IniSection = IniCacheAppendSection(IniCache,
|
||||||
|
L"REACTOS");
|
||||||
|
|
||||||
|
/* BootType=ReactOS */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"BootType",
|
||||||
|
L"ReactOS");
|
||||||
|
|
||||||
|
/* SystemPath=multi(0)disk(0)rdisk(0)partition(1)\reactos */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"SystemPath",
|
||||||
|
SystemPath);
|
||||||
|
|
||||||
|
/* Options=/DEBUGPORT=SCREEN */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"Options",
|
||||||
|
L"/DEBUGPORT=SCREEN");
|
||||||
|
|
||||||
|
|
||||||
|
/* Kernel=\REACTOS\SYSTEM32\NTOSKRNL.EXE */
|
||||||
|
#if 0
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"Options",
|
||||||
|
L"/DEBUGPORT=SCREEN");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Hal=\REACTOS\SYSTEM32\HAL.DLL */
|
||||||
|
#if 0
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"Hal",
|
||||||
|
L"/DEBUGPORT=SCREEN");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Create "DOS" section */
|
||||||
|
IniSection = IniCacheAppendSection(IniCache,
|
||||||
|
L"DOS");
|
||||||
|
|
||||||
|
/* BootType=BootSector */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"BootType",
|
||||||
|
L"BootSector");
|
||||||
|
|
||||||
|
/* BootSector=BOOTDOS.BIN */
|
||||||
|
IniCacheInsertKey(IniSection,
|
||||||
|
NULL,
|
||||||
|
INSERT_LAST,
|
||||||
|
L"BootSector",
|
||||||
|
L"BOOTDOS.BIN");
|
||||||
|
|
||||||
|
IniCacheSave(IniCache, IniPath);
|
||||||
|
IniCacheDestroy(IniCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
37
reactos/subsys/system/usetup/bootsup.h
Normal file
37
reactos/subsys/system/usetup/bootsup.h
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* ReactOS kernel
|
||||||
|
* Copyright (C) 2002 ReactOS Team
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
/* $Id: bootsup.h,v 1.1 2003/01/17 13:18:15 ekohl Exp $
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS text-mode setup
|
||||||
|
* FILE: subsys/system/usetup/bootsup.h
|
||||||
|
* PURPOSE: Bootloader support functions
|
||||||
|
* PROGRAMMER: Eric Kohl
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __BOOTSUP_H__
|
||||||
|
#define __BOOTSUP_H__
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
CreateFreeLoaderIniForDos(PWCHAR IniPath,
|
||||||
|
PWCHAR SystemPath);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __BOOTSUP_H__ */
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: filesup.c,v 1.3 2003/01/11 16:03:55 hbirr Exp $
|
/* $Id: filesup.c,v 1.4 2003/01/17 13:18:15 ekohl Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS text-mode setup
|
* PROJECT: ReactOS text-mode setup
|
||||||
* FILE: subsys/system/usetup/filesup.c
|
* FILE: subsys/system/usetup/filesup.c
|
||||||
|
@ -276,4 +276,50 @@ CHECKPOINT1;
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
DoesFileExist(PWSTR PathName,
|
||||||
|
PWSTR FileName)
|
||||||
|
{
|
||||||
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
|
UNICODE_STRING Name;
|
||||||
|
WCHAR FullName[MAX_PATH];
|
||||||
|
HANDLE FileHandle;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
wcscpy(FullName, PathName);
|
||||||
|
if (FileName != NULL)
|
||||||
|
{
|
||||||
|
if (FileName[0] != L'\\')
|
||||||
|
wcscat(FullName, L"\\");
|
||||||
|
wcscat(FullName, FileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlInitUnicodeString(&Name,
|
||||||
|
FullName);
|
||||||
|
|
||||||
|
InitializeObjectAttributes(&ObjectAttributes,
|
||||||
|
&Name,
|
||||||
|
OBJ_CASE_INSENSITIVE,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
Status = NtOpenFile(&FileHandle,
|
||||||
|
FILE_READ_ACCESS,
|
||||||
|
&ObjectAttributes,
|
||||||
|
&IoStatusBlock,
|
||||||
|
0,
|
||||||
|
FILE_SYNCHRONOUS_IO_ALERT);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
CHECKPOINT1;
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
NtClose(FileHandle);
|
||||||
|
|
||||||
|
return(TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: filesup.h,v 1.2 2002/11/23 01:55:27 ekohl Exp $
|
/* $Id: filesup.h,v 1.3 2003/01/17 13:18:15 ekohl Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS text-mode setup
|
* PROJECT: ReactOS text-mode setup
|
||||||
* FILE: subsys/system/usetup/filesup.h
|
* FILE: subsys/system/usetup/filesup.h
|
||||||
|
@ -34,6 +34,10 @@ NTSTATUS
|
||||||
SetupCopyFile(PWCHAR SourceFileName,
|
SetupCopyFile(PWCHAR SourceFileName,
|
||||||
PWCHAR DestinationFileName);
|
PWCHAR DestinationFileName);
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
DoesFileExist(PWSTR PathName,
|
||||||
|
PWSTR FileName);
|
||||||
|
|
||||||
|
|
||||||
#endif /* __FILESUP_H__ */
|
#endif /* __FILESUP_H__ */
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: inicache.c,v 1.1 2002/11/13 18:25:18 ekohl Exp $
|
/* $Id: inicache.c,v 1.2 2003/01/17 13:18:15 ekohl Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS text-mode setup
|
* PROJECT: ReactOS text-mode setup
|
||||||
* FILE: subsys/system/usetup/inicache.c
|
* FILE: subsys/system/usetup/inicache.c
|
||||||
|
@ -53,12 +53,12 @@ IniCacheFreeKey(PINICACHEKEY Key)
|
||||||
Key->Name = NULL;
|
Key->Name = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Key->Value != NULL)
|
if (Key->Data != NULL)
|
||||||
{
|
{
|
||||||
RtlFreeHeap(ProcessHeap,
|
RtlFreeHeap(ProcessHeap,
|
||||||
0,
|
0,
|
||||||
Key->Value);
|
Key->Data);
|
||||||
Key->Value = NULL;
|
Key->Data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
RtlFreeHeap(ProcessHeap,
|
RtlFreeHeap(ProcessHeap,
|
||||||
|
@ -129,8 +129,8 @@ static PINICACHEKEY
|
||||||
IniCacheAddKey(PINICACHESECTION Section,
|
IniCacheAddKey(PINICACHESECTION Section,
|
||||||
PCHAR Name,
|
PCHAR Name,
|
||||||
ULONG NameLength,
|
ULONG NameLength,
|
||||||
PCHAR Value,
|
PCHAR Data,
|
||||||
ULONG ValueLength)
|
ULONG DataLength)
|
||||||
{
|
{
|
||||||
PINICACHEKEY Key;
|
PINICACHEKEY Key;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
@ -140,8 +140,8 @@ IniCacheAddKey(PINICACHESECTION Section,
|
||||||
if (Section == NULL ||
|
if (Section == NULL ||
|
||||||
Name == NULL ||
|
Name == NULL ||
|
||||||
NameLength == 0 ||
|
NameLength == 0 ||
|
||||||
Value == NULL ||
|
Data == NULL ||
|
||||||
ValueLength == 0)
|
DataLength == 0)
|
||||||
{
|
{
|
||||||
DPRINT("Invalid parameter\n");
|
DPRINT("Invalid parameter\n");
|
||||||
return(NULL);
|
return(NULL);
|
||||||
|
@ -180,10 +180,10 @@ IniCacheAddKey(PINICACHESECTION Section,
|
||||||
Key->Name[NameLength] = 0;
|
Key->Name[NameLength] = 0;
|
||||||
|
|
||||||
|
|
||||||
Key->Value = RtlAllocateHeap(ProcessHeap,
|
Key->Data = RtlAllocateHeap(ProcessHeap,
|
||||||
0,
|
0,
|
||||||
(ValueLength + 1) * sizeof(WCHAR));
|
(DataLength + 1) * sizeof(WCHAR));
|
||||||
if (Key->Value == NULL)
|
if (Key->Data == NULL)
|
||||||
{
|
{
|
||||||
DPRINT("RtlAllocateHeap() failed\n");
|
DPRINT("RtlAllocateHeap() failed\n");
|
||||||
RtlFreeHeap(ProcessHeap,
|
RtlFreeHeap(ProcessHeap,
|
||||||
|
@ -196,11 +196,11 @@ IniCacheAddKey(PINICACHESECTION Section,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy value data */
|
/* Copy value data */
|
||||||
for (i = 0; i < ValueLength; i++)
|
for (i = 0; i < DataLength; i++)
|
||||||
{
|
{
|
||||||
Key->Value[i] = (WCHAR)Value[i];
|
Key->Data[i] = (WCHAR)Data[i];
|
||||||
}
|
}
|
||||||
Key->Value[ValueLength] = 0;
|
Key->Data[DataLength] = 0;
|
||||||
|
|
||||||
|
|
||||||
if (Section->FirstKey == NULL)
|
if (Section->FirstKey == NULL)
|
||||||
|
@ -711,7 +711,7 @@ IniCacheGetSection(PINICACHE Cache,
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* iterate through list of sections */
|
/* Iterate through list of sections */
|
||||||
Section = Cache->FirstSection;
|
Section = Cache->FirstSection;
|
||||||
while (Section != NULL)
|
while (Section != NULL)
|
||||||
{
|
{
|
||||||
|
@ -734,17 +734,17 @@ IniCacheGetSection(PINICACHE Cache,
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
IniCacheGetKey(PINICACHESECTION Section,
|
IniCacheGetKey(PINICACHESECTION Section,
|
||||||
PWCHAR KeyName,
|
PWCHAR KeyName,
|
||||||
PWCHAR *KeyValue)
|
PWCHAR *KeyData)
|
||||||
{
|
{
|
||||||
PINICACHEKEY Key;
|
PINICACHEKEY Key;
|
||||||
|
|
||||||
if (Section == NULL || KeyName == NULL || KeyValue == NULL)
|
if (Section == NULL || KeyName == NULL || KeyData == NULL)
|
||||||
{
|
{
|
||||||
DPRINT("Invalid parameter\n");
|
DPRINT("Invalid parameter\n");
|
||||||
return(STATUS_INVALID_PARAMETER);
|
return(STATUS_INVALID_PARAMETER);
|
||||||
}
|
}
|
||||||
|
|
||||||
*KeyValue = NULL;
|
*KeyData = NULL;
|
||||||
|
|
||||||
Key = IniCacheFindKey(Section, KeyName, wcslen(KeyName));
|
Key = IniCacheFindKey(Section, KeyName, wcslen(KeyName));
|
||||||
if (Key == NULL)
|
if (Key == NULL)
|
||||||
|
@ -752,7 +752,7 @@ IniCacheGetKey(PINICACHESECTION Section,
|
||||||
return(STATUS_INVALID_PARAMETER);
|
return(STATUS_INVALID_PARAMETER);
|
||||||
}
|
}
|
||||||
|
|
||||||
*KeyValue = Key->Value;
|
*KeyData = Key->Data;
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
@ -761,12 +761,12 @@ IniCacheGetKey(PINICACHESECTION Section,
|
||||||
PINICACHEITERATOR
|
PINICACHEITERATOR
|
||||||
IniCacheFindFirstValue(PINICACHESECTION Section,
|
IniCacheFindFirstValue(PINICACHESECTION Section,
|
||||||
PWCHAR *KeyName,
|
PWCHAR *KeyName,
|
||||||
PWCHAR *KeyValue)
|
PWCHAR *KeyData)
|
||||||
{
|
{
|
||||||
PINICACHEITERATOR Iterator;
|
PINICACHEITERATOR Iterator;
|
||||||
PINICACHEKEY Key;
|
PINICACHEKEY Key;
|
||||||
|
|
||||||
if (Section == NULL || KeyName == NULL || KeyValue == NULL)
|
if (Section == NULL || KeyName == NULL || KeyData == NULL)
|
||||||
{
|
{
|
||||||
DPRINT("Invalid parameter\n");
|
DPRINT("Invalid parameter\n");
|
||||||
return(NULL);
|
return(NULL);
|
||||||
|
@ -780,7 +780,7 @@ IniCacheFindFirstValue(PINICACHESECTION Section,
|
||||||
}
|
}
|
||||||
|
|
||||||
*KeyName = Key->Name;
|
*KeyName = Key->Name;
|
||||||
*KeyValue = Key->Value;
|
*KeyData = Key->Data;
|
||||||
|
|
||||||
Iterator = (PINICACHEITERATOR)RtlAllocateHeap(ProcessHeap,
|
Iterator = (PINICACHEITERATOR)RtlAllocateHeap(ProcessHeap,
|
||||||
0,
|
0,
|
||||||
|
@ -801,11 +801,11 @@ IniCacheFindFirstValue(PINICACHESECTION Section,
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
IniCacheFindNextValue(PINICACHEITERATOR Iterator,
|
IniCacheFindNextValue(PINICACHEITERATOR Iterator,
|
||||||
PWCHAR *KeyName,
|
PWCHAR *KeyName,
|
||||||
PWCHAR *KeyValue)
|
PWCHAR *KeyData)
|
||||||
{
|
{
|
||||||
PINICACHEKEY Key;
|
PINICACHEKEY Key;
|
||||||
|
|
||||||
if (Iterator == NULL || KeyName == NULL || KeyValue == NULL)
|
if (Iterator == NULL || KeyName == NULL || KeyData == NULL)
|
||||||
{
|
{
|
||||||
DPRINT("Invalid parameter\n");
|
DPRINT("Invalid parameter\n");
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
|
@ -819,7 +819,7 @@ IniCacheFindNextValue(PINICACHEITERATOR Iterator,
|
||||||
}
|
}
|
||||||
|
|
||||||
*KeyName = Key->Name;
|
*KeyName = Key->Name;
|
||||||
*KeyValue = Key->Value;
|
*KeyData = Key->Data;
|
||||||
|
|
||||||
Iterator->Key = Key;
|
Iterator->Key = Key;
|
||||||
|
|
||||||
|
@ -838,4 +838,334 @@ IniCacheFindClose(PINICACHEITERATOR Iterator)
|
||||||
Iterator);
|
Iterator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PINICACHEKEY
|
||||||
|
IniCacheInsertKey(PINICACHESECTION Section,
|
||||||
|
PINICACHEKEY AnchorKey,
|
||||||
|
INSERTATION_TYPE InsertationType,
|
||||||
|
PWCHAR Name,
|
||||||
|
PWCHAR Data)
|
||||||
|
{
|
||||||
|
PINICACHEKEY Key;
|
||||||
|
ULONG i;
|
||||||
|
|
||||||
|
Key = NULL;
|
||||||
|
|
||||||
|
if (Section == NULL ||
|
||||||
|
Name == NULL ||
|
||||||
|
*Name == 0 ||
|
||||||
|
Data == NULL ||
|
||||||
|
*Data == 0)
|
||||||
|
{
|
||||||
|
DPRINT("Invalid parameter\n");
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate key buffer */
|
||||||
|
Key = (PINICACHEKEY)RtlAllocateHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
sizeof(INICACHEKEY));
|
||||||
|
if (Key == NULL)
|
||||||
|
{
|
||||||
|
DPRINT("RtlAllocateHeap() failed\n");
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
RtlZeroMemory(Key,
|
||||||
|
sizeof(INICACHEKEY));
|
||||||
|
|
||||||
|
/* Allocate name buffer */
|
||||||
|
Key->Name = RtlAllocateHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
(wcslen(Name) + 1) * sizeof(WCHAR));
|
||||||
|
if (Key->Name == NULL)
|
||||||
|
{
|
||||||
|
DPRINT("RtlAllocateHeap() failed\n");
|
||||||
|
RtlFreeHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
Key);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy value name */
|
||||||
|
wcscpy(Key->Name, Name);
|
||||||
|
|
||||||
|
/* Allocate data buffer */
|
||||||
|
Key->Data = RtlAllocateHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
(wcslen(Data) + 1) * sizeof(WCHAR));
|
||||||
|
if (Key->Data == NULL)
|
||||||
|
{
|
||||||
|
DPRINT("RtlAllocateHeap() failed\n");
|
||||||
|
RtlFreeHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
Key->Name);
|
||||||
|
RtlFreeHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
Key);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy value data */
|
||||||
|
wcscpy(Key->Data, Data);
|
||||||
|
|
||||||
|
/* Insert key into section */
|
||||||
|
if (Section->FirstKey == NULL)
|
||||||
|
{
|
||||||
|
Section->FirstKey = Key;
|
||||||
|
Section->LastKey = Key;
|
||||||
|
}
|
||||||
|
else if ((InsertationType == INSERT_FIRST) ||
|
||||||
|
((InsertationType == INSERT_BEFORE) && ((AnchorKey == NULL) || (AnchorKey == Section->FirstKey))))
|
||||||
|
{
|
||||||
|
/* Insert at the head of the list */
|
||||||
|
Section->FirstKey->Prev = Key;
|
||||||
|
Key->Next = Section->FirstKey;
|
||||||
|
Section->FirstKey = Key;
|
||||||
|
}
|
||||||
|
else if ((InsertationType == INSERT_BEFORE) && (AnchorKey != NULL))
|
||||||
|
{
|
||||||
|
/* Insert before the anchor key */
|
||||||
|
Key->Next = AnchorKey;
|
||||||
|
Key->Prev = AnchorKey->Prev;
|
||||||
|
AnchorKey->Prev->Next = Key;
|
||||||
|
AnchorKey->Prev = Key;
|
||||||
|
}
|
||||||
|
else if ((InsertationType == INSERT_LAST) ||
|
||||||
|
((InsertationType == INSERT_AFTER) && ((AnchorKey == NULL) || (AnchorKey == Section->LastKey))))
|
||||||
|
{
|
||||||
|
Section->LastKey->Next = Key;
|
||||||
|
Key->Prev = Section->LastKey;
|
||||||
|
Section->LastKey = Key;
|
||||||
|
}
|
||||||
|
else if ((InsertationType == INSERT_AFTER) && (AnchorKey != NULL))
|
||||||
|
{
|
||||||
|
/* Insert before the anchor key */
|
||||||
|
Key->Next = AnchorKey->Next;
|
||||||
|
Key->Prev = AnchorKey;
|
||||||
|
AnchorKey->Next->Prev = Key;
|
||||||
|
AnchorKey->Next = Key;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(Key);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PINICACHE
|
||||||
|
IniCacheCreate(VOID)
|
||||||
|
{
|
||||||
|
PINICACHE Cache;
|
||||||
|
|
||||||
|
/* Allocate inicache header */
|
||||||
|
Cache = (PINICACHE)RtlAllocateHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
sizeof(INICACHE));
|
||||||
|
if (Cache == NULL)
|
||||||
|
{
|
||||||
|
DPRINT("RtlAllocateHeap() failed\n");
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize inicache header */
|
||||||
|
RtlZeroMemory(Cache,
|
||||||
|
sizeof(INICACHE));
|
||||||
|
|
||||||
|
return(Cache);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
IniCacheSave(PINICACHE Cache,
|
||||||
|
PWCHAR FileName)
|
||||||
|
{
|
||||||
|
UNICODE_STRING Name;
|
||||||
|
PINICACHESECTION Section;
|
||||||
|
PINICACHEKEY Key;
|
||||||
|
ULONG BufferSize;
|
||||||
|
PCHAR Buffer;
|
||||||
|
PCHAR Ptr;
|
||||||
|
ULONG Len;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
|
LARGE_INTEGER Offset;
|
||||||
|
HANDLE FileHandle;
|
||||||
|
|
||||||
|
|
||||||
|
/* Calculate required buffer size */
|
||||||
|
BufferSize = 0;
|
||||||
|
Section = Cache->FirstSection;
|
||||||
|
while (Section != NULL)
|
||||||
|
{
|
||||||
|
BufferSize += (Section->Name ? wcslen(Section->Name) : 0)
|
||||||
|
+ 4; /* "[]\r\n" */
|
||||||
|
|
||||||
|
Key = Section->FirstKey;
|
||||||
|
while (Key != NULL)
|
||||||
|
{
|
||||||
|
BufferSize += wcslen(Key->Name)
|
||||||
|
+ (Key->Data ? wcslen(Key->Data) : 0)
|
||||||
|
+ 3; /* "=\r\n" */
|
||||||
|
Key = Key->Next;
|
||||||
|
}
|
||||||
|
|
||||||
|
Section = Section->Next;
|
||||||
|
if (Section != NULL)
|
||||||
|
BufferSize += 2; /* extra "\r\n" at end of each section */
|
||||||
|
}
|
||||||
|
BufferSize++; /* Null-terminator */
|
||||||
|
|
||||||
|
DPRINT1("BufferSize: %lu\n", BufferSize);
|
||||||
|
|
||||||
|
/* Allocate file buffer */
|
||||||
|
Buffer = RtlAllocateHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
BufferSize);
|
||||||
|
if (Buffer == NULL)
|
||||||
|
{
|
||||||
|
DPRINT1("RtlAllocateHeap() failed\n");
|
||||||
|
return(STATUS_INSUFFICIENT_RESOURCES);
|
||||||
|
}
|
||||||
|
RtlZeroMemory(Buffer, BufferSize);
|
||||||
|
|
||||||
|
/* Fill file buffer */
|
||||||
|
Ptr = Buffer;
|
||||||
|
Section = Cache->FirstSection;
|
||||||
|
while (Section != NULL)
|
||||||
|
{
|
||||||
|
Len = sprintf(Ptr, "[%S]\r\n", Section->Name);
|
||||||
|
Ptr += Len;
|
||||||
|
|
||||||
|
Key = Section->FirstKey;
|
||||||
|
while (Key != NULL)
|
||||||
|
{
|
||||||
|
Len = sprintf(Ptr, "%S=%S\r\n", Key->Name, Key->Data);
|
||||||
|
Ptr += Len;
|
||||||
|
Key = Key->Next;
|
||||||
|
}
|
||||||
|
|
||||||
|
Section = Section->Next;
|
||||||
|
if (Section != NULL)
|
||||||
|
{
|
||||||
|
Len = sprintf(Ptr, "\r\n");
|
||||||
|
Ptr += Len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create ini file */
|
||||||
|
RtlInitUnicodeString(&Name,
|
||||||
|
FileName);
|
||||||
|
|
||||||
|
InitializeObjectAttributes(&ObjectAttributes,
|
||||||
|
&Name,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
Status = NtCreateFile(&FileHandle,
|
||||||
|
FILE_WRITE_ACCESS,
|
||||||
|
&ObjectAttributes,
|
||||||
|
&IoStatusBlock,
|
||||||
|
NULL,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
|
0,
|
||||||
|
FILE_OVERWRITE_IF,
|
||||||
|
FILE_SYNCHRONOUS_IO_ALERT | FILE_SEQUENTIAL_ONLY,
|
||||||
|
NULL,
|
||||||
|
0);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT("NtCreateFile() failed (Status %lx)\n", Status);
|
||||||
|
RtlFreeHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
Buffer);
|
||||||
|
return(Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
Offset.QuadPart = 0LL;
|
||||||
|
Status = NtWriteFile(FileHandle,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&IoStatusBlock,
|
||||||
|
Buffer,
|
||||||
|
BufferSize,
|
||||||
|
&Offset,
|
||||||
|
NULL);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
|
||||||
|
NtClose(FileHandle);
|
||||||
|
RtlFreeHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
Buffer);
|
||||||
|
return(Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
NtClose(FileHandle);
|
||||||
|
|
||||||
|
RtlFreeHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
Buffer);
|
||||||
|
|
||||||
|
return(STATUS_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PINICACHESECTION
|
||||||
|
IniCacheAppendSection(PINICACHE Cache,
|
||||||
|
PWCHAR Name)
|
||||||
|
{
|
||||||
|
PINICACHESECTION Section = NULL;
|
||||||
|
ULONG i;
|
||||||
|
|
||||||
|
if (Cache == NULL || Name == NULL || *Name == 0)
|
||||||
|
{
|
||||||
|
DPRINT("Invalid parameter\n");
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
Section = (PINICACHESECTION)RtlAllocateHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
sizeof(INICACHESECTION));
|
||||||
|
if (Section == NULL)
|
||||||
|
{
|
||||||
|
DPRINT("RtlAllocateHeap() failed\n");
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
RtlZeroMemory(Section,
|
||||||
|
sizeof(INICACHESECTION));
|
||||||
|
|
||||||
|
/* Allocate and initialize section name */
|
||||||
|
Section->Name = RtlAllocateHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
(wcslen(Name) + 1) * sizeof(WCHAR));
|
||||||
|
if (Section->Name == NULL)
|
||||||
|
{
|
||||||
|
DPRINT("RtlAllocateHeap() failed\n");
|
||||||
|
RtlFreeHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
Section);
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy section name */
|
||||||
|
wcscpy(Section->Name, Name);
|
||||||
|
|
||||||
|
/* Append section */
|
||||||
|
if (Cache->FirstSection == NULL)
|
||||||
|
{
|
||||||
|
Cache->FirstSection = Section;
|
||||||
|
Cache->LastSection = Section;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Cache->LastSection->Next = Section;
|
||||||
|
Section->Prev = Cache->LastSection;
|
||||||
|
Cache->LastSection = Section;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(Section);
|
||||||
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
typedef struct _INICACHEKEY
|
typedef struct _INICACHEKEY
|
||||||
{
|
{
|
||||||
PWCHAR Name;
|
PWCHAR Name;
|
||||||
PWCHAR Value;
|
PWCHAR Data;
|
||||||
|
|
||||||
struct _INICACHEKEY *Next;
|
struct _INICACHEKEY *Next;
|
||||||
struct _INICACHEKEY *Prev;
|
struct _INICACHEKEY *Prev;
|
||||||
|
@ -65,6 +65,14 @@ typedef struct _PINICACHEITERATOR
|
||||||
} INICACHEITERATOR, *PINICACHEITERATOR;
|
} INICACHEITERATOR, *PINICACHEITERATOR;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
INSERT_FIRST,
|
||||||
|
INSERT_BEFORE,
|
||||||
|
INSERT_AFTER,
|
||||||
|
INSERT_LAST
|
||||||
|
} INSERTATION_TYPE;
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
@ -81,24 +89,43 @@ IniCacheGetSection(PINICACHE Cache,
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
IniCacheGetKey(PINICACHESECTION Section,
|
IniCacheGetKey(PINICACHESECTION Section,
|
||||||
PWCHAR KeyName,
|
PWCHAR KeyName,
|
||||||
PWCHAR *KeyValue);
|
PWCHAR *KeyData);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PINICACHEITERATOR
|
PINICACHEITERATOR
|
||||||
IniCacheFindFirstValue(PINICACHESECTION Section,
|
IniCacheFindFirstValue(PINICACHESECTION Section,
|
||||||
PWCHAR *KeyName,
|
PWCHAR *KeyName,
|
||||||
PWCHAR *KeyValue);
|
PWCHAR *KeyData);
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
IniCacheFindNextValue(PINICACHEITERATOR Iterator,
|
IniCacheFindNextValue(PINICACHEITERATOR Iterator,
|
||||||
PWCHAR *KeyName,
|
PWCHAR *KeyName,
|
||||||
PWCHAR *KeyValue);
|
PWCHAR *KeyData);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
IniCacheFindClose(PINICACHEITERATOR Iterator);
|
IniCacheFindClose(PINICACHEITERATOR Iterator);
|
||||||
|
|
||||||
|
|
||||||
|
PINICACHEKEY
|
||||||
|
IniCacheInsertKey(PINICACHESECTION Section,
|
||||||
|
PINICACHEKEY AnchorKey,
|
||||||
|
INSERTATION_TYPE InsertationType,
|
||||||
|
PWCHAR Name,
|
||||||
|
PWCHAR Data);
|
||||||
|
|
||||||
|
PINICACHE
|
||||||
|
IniCacheCreate(VOID);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
IniCacheSave(PINICACHE Cache,
|
||||||
|
PWCHAR FileName);
|
||||||
|
|
||||||
|
PINICACHESECTION
|
||||||
|
IniCacheAppendSection(PINICACHE Cache,
|
||||||
|
PWCHAR Name);
|
||||||
|
|
||||||
|
|
||||||
#endif /* __INICACHE_H__ */
|
#endif /* __INICACHE_H__ */
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# $Id: makefile,v 1.6 2002/12/06 21:39:03 ekohl Exp $
|
# $Id: makefile,v 1.7 2003/01/17 13:18:15 ekohl Exp $
|
||||||
|
|
||||||
PATH_TO_TOP = ../../..
|
PATH_TO_TOP = ../../..
|
||||||
|
|
||||||
|
@ -12,8 +12,8 @@ TARGET_INSTALLDIR = system32
|
||||||
|
|
||||||
TARGET_CFLAGS = -D__NTAPP__
|
TARGET_CFLAGS = -D__NTAPP__
|
||||||
|
|
||||||
TARGET_OBJECTS = $(TARGET_NAME).o console.o drivesup.o filequeue.o filesup.o \
|
TARGET_OBJECTS = $(TARGET_NAME).o bootsup.o console.o drivesup.o filequeue.o \
|
||||||
inicache.o partlist.o progress.o
|
filesup.o inicache.o partlist.o progress.o
|
||||||
|
|
||||||
include $(PATH_TO_TOP)/rules.mak
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: partlist.c,v 1.5 2002/11/28 19:20:37 ekohl Exp $
|
/* $Id: partlist.c,v 1.6 2003/01/17 13:18:15 ekohl Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS text-mode setup
|
* PROJECT: ReactOS text-mode setup
|
||||||
* FILE: subsys/system/usetup/partlist.c
|
* FILE: subsys/system/usetup/partlist.c
|
||||||
|
@ -104,6 +104,7 @@ AddPartitionList(ULONG DiskNumber,
|
||||||
PartEntry->PartSize = LayoutBuffer->PartitionEntry[i].PartitionLength.QuadPart;
|
PartEntry->PartSize = LayoutBuffer->PartitionEntry[i].PartitionLength.QuadPart;
|
||||||
PartEntry->PartNumber = LayoutBuffer->PartitionEntry[i].PartitionNumber,
|
PartEntry->PartNumber = LayoutBuffer->PartitionEntry[i].PartitionNumber,
|
||||||
PartEntry->PartType = LayoutBuffer->PartitionEntry[i].PartitionType;
|
PartEntry->PartType = LayoutBuffer->PartitionEntry[i].PartitionType;
|
||||||
|
PartEntry->Active = LayoutBuffer->PartitionEntry[i].BootIndicator;
|
||||||
|
|
||||||
PartEntry->DriveLetter = GetDriveLetter(DiskNumber,
|
PartEntry->DriveLetter = GetDriveLetter(DiskNumber,
|
||||||
LayoutBuffer->PartitionEntry[i].PartitionNumber);
|
LayoutBuffer->PartitionEntry[i].PartitionNumber);
|
||||||
|
@ -817,8 +818,8 @@ ScrollUpPartitionList(PPARTLIST List)
|
||||||
|
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
GetPartitionData(PPARTLIST List,
|
GetSelectedPartition(PPARTLIST List,
|
||||||
PPARTDATA Data)
|
PPARTDATA Data)
|
||||||
{
|
{
|
||||||
PDISKENTRY DiskEntry;
|
PDISKENTRY DiskEntry;
|
||||||
PPARTENTRY PartEntry;
|
PPARTENTRY PartEntry;
|
||||||
|
@ -873,4 +874,69 @@ GetPartitionData(PPARTLIST List,
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
GetActiveBootPartition(PPARTLIST List,
|
||||||
|
PPARTDATA Data)
|
||||||
|
{
|
||||||
|
PDISKENTRY DiskEntry;
|
||||||
|
PPARTENTRY PartEntry;
|
||||||
|
ULONG i;
|
||||||
|
|
||||||
|
if (List->CurrentDisk >= List->DiskCount)
|
||||||
|
return(FALSE);
|
||||||
|
|
||||||
|
DiskEntry = &List->DiskArray[0];
|
||||||
|
|
||||||
|
if (DiskEntry->FixedDisk == FALSE)
|
||||||
|
return(FALSE);
|
||||||
|
|
||||||
|
for (i = 0; i < DiskEntry->PartCount; i++)
|
||||||
|
{
|
||||||
|
if (DiskEntry->PartArray[i].Active)
|
||||||
|
{
|
||||||
|
PartEntry = &DiskEntry->PartArray[i];
|
||||||
|
|
||||||
|
if (PartEntry->Used == FALSE)
|
||||||
|
return(FALSE);
|
||||||
|
|
||||||
|
/* Copy disk-specific data */
|
||||||
|
Data->DiskSize = DiskEntry->DiskSize;
|
||||||
|
Data->DiskNumber = DiskEntry->DiskNumber;
|
||||||
|
Data->Port = DiskEntry->Port;
|
||||||
|
Data->Bus = DiskEntry->Bus;
|
||||||
|
Data->Id = DiskEntry->Id;
|
||||||
|
|
||||||
|
/* Copy driver name */
|
||||||
|
RtlInitUnicodeString(&Data->DriverName,
|
||||||
|
NULL);
|
||||||
|
if (DiskEntry->DriverName.Length != 0)
|
||||||
|
{
|
||||||
|
Data->DriverName.Buffer = RtlAllocateHeap(ProcessHeap,
|
||||||
|
0,
|
||||||
|
DiskEntry->DriverName.MaximumLength);
|
||||||
|
if (Data->DriverName.Buffer != NULL)
|
||||||
|
{
|
||||||
|
Data->DriverName.MaximumLength = DiskEntry->DriverName.MaximumLength;
|
||||||
|
Data->DriverName.Length = DiskEntry->DriverName.Length;
|
||||||
|
RtlCopyMemory(Data->DriverName.Buffer,
|
||||||
|
DiskEntry->DriverName.Buffer,
|
||||||
|
DiskEntry->DriverName.MaximumLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy partition-specific data */
|
||||||
|
Data->PartSize = PartEntry->PartSize;
|
||||||
|
Data->PartNumber = PartEntry->PartNumber;
|
||||||
|
Data->PartType = PartEntry->PartType;
|
||||||
|
Data->DriveLetter = PartEntry->DriveLetter;
|
||||||
|
|
||||||
|
return(TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: partlist.h,v 1.5 2002/11/28 19:20:37 ekohl Exp $
|
/* $Id: partlist.h,v 1.6 2003/01/17 13:18:15 ekohl Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS text-mode setup
|
* PROJECT: ReactOS text-mode setup
|
||||||
* FILE: subsys/system/usetup/partlist.h
|
* FILE: subsys/system/usetup/partlist.h
|
||||||
|
@ -50,6 +50,7 @@ typedef struct _PARTENTRY
|
||||||
ULONGLONG PartSize;
|
ULONGLONG PartSize;
|
||||||
ULONG PartNumber;
|
ULONG PartNumber;
|
||||||
ULONG PartType;
|
ULONG PartType;
|
||||||
|
BOOLEAN Active;
|
||||||
|
|
||||||
CHAR DriveLetter;
|
CHAR DriveLetter;
|
||||||
CHAR VolumeLabel[17];
|
CHAR VolumeLabel[17];
|
||||||
|
@ -119,8 +120,12 @@ VOID
|
||||||
ScrollUpPartitionList(PPARTLIST List);
|
ScrollUpPartitionList(PPARTLIST List);
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
GetPartitionData(PPARTLIST List,
|
GetSelectedPartition(PPARTLIST List,
|
||||||
PPARTDATA Data);
|
PPARTDATA Data);
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
GetActiveBootPartition(PPARTLIST List,
|
||||||
|
PPARTDATA Data);
|
||||||
|
|
||||||
#endif /* __PARTLIST_H__ */
|
#endif /* __PARTLIST_H__ */
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "inicache.h"
|
#include "inicache.h"
|
||||||
#include "filequeue.h"
|
#include "filequeue.h"
|
||||||
#include "progress.h"
|
#include "progress.h"
|
||||||
|
#include "bootsup.h"
|
||||||
|
|
||||||
|
|
||||||
#define START_PAGE 0
|
#define START_PAGE 0
|
||||||
|
@ -48,7 +49,8 @@
|
||||||
#define PREPARE_COPY_PAGE 7
|
#define PREPARE_COPY_PAGE 7
|
||||||
#define INSTALL_DIRECTORY_PAGE 8
|
#define INSTALL_DIRECTORY_PAGE 8
|
||||||
#define FILE_COPY_PAGE 9
|
#define FILE_COPY_PAGE 9
|
||||||
#define INIT_SYSTEM_PAGE 10
|
#define REGISTRY_PAGE 10
|
||||||
|
#define BOOT_LOADER_PAGE 11
|
||||||
|
|
||||||
#define REPAIR_INTRO_PAGE 20
|
#define REPAIR_INTRO_PAGE 20
|
||||||
|
|
||||||
|
@ -72,11 +74,18 @@ HANDLE ProcessHeap;
|
||||||
BOOLEAN PartDataValid;
|
BOOLEAN PartDataValid;
|
||||||
PARTDATA PartData;
|
PARTDATA PartData;
|
||||||
|
|
||||||
WCHAR InstallDir[51];
|
BOOLEAN ActivePartitionValid;
|
||||||
|
PARTDATA ActivePartition;
|
||||||
|
|
||||||
UNICODE_STRING SourcePath;
|
UNICODE_STRING SourcePath;
|
||||||
UNICODE_STRING SourceRootPath;
|
UNICODE_STRING SourceRootPath;
|
||||||
|
|
||||||
|
UNICODE_STRING InstallPath;
|
||||||
|
UNICODE_STRING DestinationPath;
|
||||||
|
UNICODE_STRING DestinationRootPath;
|
||||||
|
|
||||||
|
UNICODE_STRING SystemRootPath; /* Path to the active partition */
|
||||||
|
|
||||||
PINICACHE IniCache;
|
PINICACHE IniCache;
|
||||||
|
|
||||||
HSPFILEQ SetupFileQueue = NULL;
|
HSPFILEQ SetupFileQueue = NULL;
|
||||||
|
@ -627,6 +636,7 @@ InstallIntroPage(PINPUT_RECORD Ir)
|
||||||
static ULONG
|
static ULONG
|
||||||
SelectPartitionPage(PINPUT_RECORD Ir)
|
SelectPartitionPage(PINPUT_RECORD Ir)
|
||||||
{
|
{
|
||||||
|
WCHAR PathBuffer[MAX_PATH];
|
||||||
PPARTLIST PartList;
|
PPARTLIST PartList;
|
||||||
SHORT xScreen;
|
SHORT xScreen;
|
||||||
SHORT yScreen;
|
SHORT yScreen;
|
||||||
|
@ -641,6 +651,9 @@ SelectPartitionPage(PINPUT_RECORD Ir)
|
||||||
|
|
||||||
SetStatusText(" Please wait...");
|
SetStatusText(" Please wait...");
|
||||||
|
|
||||||
|
RtlFreeUnicodeString(&DestinationPath);
|
||||||
|
RtlFreeUnicodeString(&DestinationRootPath);
|
||||||
|
|
||||||
GetScreenSize(&xScreen, &yScreen);
|
GetScreenSize(&xScreen, &yScreen);
|
||||||
|
|
||||||
PartList = CreatePartitionList(2, 19, xScreen - 3, yScreen - 3);
|
PartList = CreatePartitionList(2, 19, xScreen - 3, yScreen - 3);
|
||||||
|
@ -678,8 +691,28 @@ SelectPartitionPage(PINPUT_RECORD Ir)
|
||||||
}
|
}
|
||||||
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
|
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
|
||||||
{
|
{
|
||||||
PartDataValid = GetPartitionData(PartList, &PartData);
|
PartDataValid = GetSelectedPartition(PartList,
|
||||||
|
&PartData);
|
||||||
|
ActivePartitionValid = GetActiveBootPartition(PartList,
|
||||||
|
&ActivePartition);
|
||||||
DestroyPartitionList(PartList);
|
DestroyPartitionList(PartList);
|
||||||
|
|
||||||
|
RtlFreeUnicodeString(&DestinationRootPath);
|
||||||
|
swprintf(PathBuffer,
|
||||||
|
L"\\Device\\Harddisk%lu\\Partition%lu",
|
||||||
|
PartData.DiskNumber,
|
||||||
|
PartData.PartNumber);
|
||||||
|
RtlCreateUnicodeString(&DestinationRootPath,
|
||||||
|
PathBuffer);
|
||||||
|
|
||||||
|
RtlFreeUnicodeString(&SystemRootPath);
|
||||||
|
swprintf(PathBuffer,
|
||||||
|
L"\\Device\\Harddisk%lu\\Partition%lu",
|
||||||
|
ActivePartition.DiskNumber,
|
||||||
|
ActivePartition.PartNumber);
|
||||||
|
RtlCreateUnicodeString(&SystemRootPath,
|
||||||
|
PathBuffer);
|
||||||
|
|
||||||
return(SELECT_FILE_SYSTEM_PAGE);
|
return(SELECT_FILE_SYSTEM_PAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -846,6 +879,8 @@ CheckFileSystemPage(PINPUT_RECORD Ir)
|
||||||
static ULONG
|
static ULONG
|
||||||
InstallDirectoryPage(PINPUT_RECORD Ir)
|
InstallDirectoryPage(PINPUT_RECORD Ir)
|
||||||
{
|
{
|
||||||
|
WCHAR PathBuffer[MAX_PATH];
|
||||||
|
WCHAR InstallDir[51];
|
||||||
ULONG Length;
|
ULONG Length;
|
||||||
|
|
||||||
SetTextXY(6, 8, "Setup installs ReactOS files onto the selected partition. Choose a");
|
SetTextXY(6, 8, "Setup installs ReactOS files onto the selected partition. Choose a");
|
||||||
|
@ -876,6 +911,21 @@ InstallDirectoryPage(PINPUT_RECORD Ir)
|
||||||
}
|
}
|
||||||
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
|
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
|
||||||
{
|
{
|
||||||
|
/* Create 'DestinationPath' string */
|
||||||
|
RtlFreeUnicodeString(&InstallPath);
|
||||||
|
RtlCreateUnicodeString(&InstallPath,
|
||||||
|
InstallDir);
|
||||||
|
|
||||||
|
/* Create 'DestinationPath' string */
|
||||||
|
RtlFreeUnicodeString(&DestinationPath);
|
||||||
|
wcscpy(PathBuffer,
|
||||||
|
DestinationRootPath.Buffer);
|
||||||
|
if (InstallDir[0] != L'\\')
|
||||||
|
wcscat(PathBuffer,
|
||||||
|
L"\\");
|
||||||
|
wcscat(PathBuffer, InstallDir);
|
||||||
|
RtlCreateUnicodeString(&DestinationPath,
|
||||||
|
PathBuffer);
|
||||||
|
|
||||||
return(PREPARE_COPY_PAGE);
|
return(PREPARE_COPY_PAGE);
|
||||||
}
|
}
|
||||||
|
@ -1048,14 +1098,8 @@ PrepareCopyPage(PINPUT_RECORD Ir)
|
||||||
* Install directories like '\reactos\test' are not handled yet.
|
* Install directories like '\reactos\test' are not handled yet.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Build full install directory name */
|
/* Get destination path */
|
||||||
swprintf(PathBuffer,
|
wcscpy(PathBuffer, DestinationPath.Buffer);
|
||||||
L"\\Device\\Harddisk%lu\\Partition%lu",
|
|
||||||
PartData.DiskNumber,
|
|
||||||
PartData.PartNumber);
|
|
||||||
if (InstallDir[0] != L'\\')
|
|
||||||
wcscat(PathBuffer, L"\\");
|
|
||||||
wcscat(PathBuffer, InstallDir);
|
|
||||||
|
|
||||||
/* Remove trailing backslash */
|
/* Remove trailing backslash */
|
||||||
Length = wcslen(PathBuffer);
|
Length = wcslen(PathBuffer);
|
||||||
|
@ -1095,10 +1139,7 @@ PrepareCopyPage(PINPUT_RECORD Ir)
|
||||||
{
|
{
|
||||||
DPRINT("Absolute Path: '%S'\n", KeyValue);
|
DPRINT("Absolute Path: '%S'\n", KeyValue);
|
||||||
|
|
||||||
swprintf(PathBuffer,
|
wcscpy(PathBuffer, DestinationRootPath.Buffer);
|
||||||
L"\\Device\\Harddisk%lu\\Partition%lu",
|
|
||||||
PartData.DiskNumber,
|
|
||||||
PartData.PartNumber);
|
|
||||||
wcscat(PathBuffer, KeyValue);
|
wcscat(PathBuffer, KeyValue);
|
||||||
|
|
||||||
DPRINT("FullPath: '%S'\n", PathBuffer);
|
DPRINT("FullPath: '%S'\n", PathBuffer);
|
||||||
|
@ -1106,14 +1147,7 @@ PrepareCopyPage(PINPUT_RECORD Ir)
|
||||||
else if (KeyValue[0] != L'\\')
|
else if (KeyValue[0] != L'\\')
|
||||||
{
|
{
|
||||||
DPRINT("RelativePath: '%S'\n", KeyValue);
|
DPRINT("RelativePath: '%S'\n", KeyValue);
|
||||||
swprintf(PathBuffer,
|
wcscpy(PathBuffer, DestinationPath.Buffer);
|
||||||
L"\\Device\\Harddisk%lu\\Partition%lu",
|
|
||||||
PartData.DiskNumber,
|
|
||||||
PartData.PartNumber);
|
|
||||||
|
|
||||||
if (InstallDir[0] != L'\\')
|
|
||||||
wcscat(PathBuffer, L"\\");
|
|
||||||
wcscat(PathBuffer, InstallDir);
|
|
||||||
wcscat(PathBuffer, L"\\");
|
wcscat(PathBuffer, L"\\");
|
||||||
wcscat(PathBuffer, KeyValue);
|
wcscat(PathBuffer, KeyValue);
|
||||||
|
|
||||||
|
@ -1214,7 +1248,6 @@ FileCopyCallback(PVOID Context,
|
||||||
static ULONG
|
static ULONG
|
||||||
FileCopyPage(PINPUT_RECORD Ir)
|
FileCopyPage(PINPUT_RECORD Ir)
|
||||||
{
|
{
|
||||||
WCHAR TargetRootPath[MAX_PATH];
|
|
||||||
COPYCONTEXT CopyContext;
|
COPYCONTEXT CopyContext;
|
||||||
SHORT xScreen;
|
SHORT xScreen;
|
||||||
SHORT yScreen;
|
SHORT yScreen;
|
||||||
|
@ -1232,14 +1265,9 @@ FileCopyPage(PINPUT_RECORD Ir)
|
||||||
xScreen - 7,
|
xScreen - 7,
|
||||||
yScreen - 10);
|
yScreen - 10);
|
||||||
|
|
||||||
swprintf(TargetRootPath,
|
|
||||||
L"\\Device\\Harddisk%lu\\Partition%lu",
|
|
||||||
PartData.DiskNumber,
|
|
||||||
PartData.PartNumber);
|
|
||||||
|
|
||||||
SetupCommitFileQueue(SetupFileQueue,
|
SetupCommitFileQueue(SetupFileQueue,
|
||||||
TargetRootPath,
|
DestinationRootPath.Buffer,
|
||||||
InstallDir,
|
InstallPath.Buffer,
|
||||||
(PSP_FILE_CALLBACK)FileCopyCallback,
|
(PSP_FILE_CALLBACK)FileCopyCallback,
|
||||||
&CopyContext);
|
&CopyContext);
|
||||||
|
|
||||||
|
@ -1262,7 +1290,7 @@ FileCopyPage(PINPUT_RECORD Ir)
|
||||||
}
|
}
|
||||||
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
|
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
|
||||||
{
|
{
|
||||||
return(INIT_SYSTEM_PAGE);
|
return(REGISTRY_PAGE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1272,17 +1300,14 @@ FileCopyPage(PINPUT_RECORD Ir)
|
||||||
|
|
||||||
|
|
||||||
static ULONG
|
static ULONG
|
||||||
InitSystemPage(PINPUT_RECORD Ir)
|
RegistryPage(PINPUT_RECORD Ir)
|
||||||
{
|
{
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
UNICODE_STRING KeyName;
|
UNICODE_STRING KeyName;
|
||||||
|
UNICODE_STRING ValueName;
|
||||||
HANDLE KeyHandle;
|
HANDLE KeyHandle;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
WCHAR TargetPath[MAX_PATH];
|
|
||||||
UNICODE_STRING ValueName;
|
|
||||||
|
|
||||||
|
|
||||||
SetTextXY(6, 8, "Initializing system settings");
|
SetTextXY(6, 8, "Initializing system settings");
|
||||||
|
|
||||||
|
|
||||||
|
@ -1290,7 +1315,6 @@ InitSystemPage(PINPUT_RECORD Ir)
|
||||||
|
|
||||||
SetTextXY(6, 14, "Update registry hives");
|
SetTextXY(6, 14, "Update registry hives");
|
||||||
|
|
||||||
SetTextXY(6, 16, "Install/update boot manager");
|
|
||||||
|
|
||||||
SetStatusText(" Please wait...");
|
SetStatusText(" Please wait...");
|
||||||
|
|
||||||
|
@ -1314,20 +1338,12 @@ InitSystemPage(PINPUT_RECORD Ir)
|
||||||
RtlInitUnicodeStringFromLiteral(&ValueName,
|
RtlInitUnicodeStringFromLiteral(&ValueName,
|
||||||
L"InstallPath");
|
L"InstallPath");
|
||||||
|
|
||||||
swprintf(TargetPath,
|
|
||||||
L"\\Device\\Harddisk%lu\\Partition%lu",
|
|
||||||
PartData.DiskNumber,
|
|
||||||
PartData.PartNumber);
|
|
||||||
if (InstallDir[0] != L'\\')
|
|
||||||
wcscat(TargetPath, L"\\");
|
|
||||||
wcscat(TargetPath, InstallDir);
|
|
||||||
|
|
||||||
Status = NtSetValueKey(KeyHandle,
|
Status = NtSetValueKey(KeyHandle,
|
||||||
&ValueName,
|
&ValueName,
|
||||||
0,
|
0,
|
||||||
REG_SZ,
|
REG_SZ,
|
||||||
(PVOID)TargetPath,
|
(PVOID)DestinationPath.Buffer,
|
||||||
wcslen(TargetPath) * sizeof(WCHAR));
|
DestinationPath.Length);
|
||||||
NtClose(KeyHandle);
|
NtClose(KeyHandle);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
@ -1351,6 +1367,136 @@ InitSystemPage(PINPUT_RECORD Ir)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SetStatusText(" ENTER = Continue 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.uChar.AsciiChar == 0x0D) /* ENTER */
|
||||||
|
{
|
||||||
|
return(BOOT_LOADER_PAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(REGISTRY_PAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ULONG
|
||||||
|
BootLoaderPage(PINPUT_RECORD Ir)
|
||||||
|
{
|
||||||
|
WCHAR SrcPath[MAX_PATH];
|
||||||
|
WCHAR DstPath[MAX_PATH];
|
||||||
|
PINICACHE IniCache;
|
||||||
|
PINICACHESECTION IniSection;
|
||||||
|
|
||||||
|
SetTextXY(6, 8, "Installing the boot loader");
|
||||||
|
|
||||||
|
SetStatusText(" Please wait...");
|
||||||
|
|
||||||
|
if (ActivePartitionValid == FALSE)
|
||||||
|
{
|
||||||
|
SetTextXY(6, 10, "Error: no active partition found");
|
||||||
|
for(;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ActivePartition.PartType == PARTITION_ENTRY_UNUSED)
|
||||||
|
{
|
||||||
|
SetTextXY(6, 10, "Error: active partition invalid (unused)");
|
||||||
|
for(;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ActivePartition.PartType == 0x0A)
|
||||||
|
{
|
||||||
|
/* OS/2 boot manager partition */
|
||||||
|
SetTextXY(6, 12, "Found OS/2 boot manager");
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (ActivePartition.PartType == 0x83)
|
||||||
|
{
|
||||||
|
/* Linux ext2 partition */
|
||||||
|
SetTextXY(6, 12, "Found Linux ext2 partition");
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (ActivePartition.PartType == PARTITION_IFS)
|
||||||
|
{
|
||||||
|
/* NTFS partition */
|
||||||
|
SetTextXY(6, 12, "Found NTFS partition");
|
||||||
|
|
||||||
|
}
|
||||||
|
else if ((ActivePartition.PartType == PARTITION_FAT_12) ||
|
||||||
|
(ActivePartition.PartType == PARTITION_FAT_16) ||
|
||||||
|
(ActivePartition.PartType == PARTITION_HUGE) ||
|
||||||
|
(ActivePartition.PartType == PARTITION_XINT13) ||
|
||||||
|
(ActivePartition.PartType == PARTITION_FAT32) ||
|
||||||
|
(ActivePartition.PartType == PARTITION_FAT32_XINT13))
|
||||||
|
{
|
||||||
|
/* FAT or FAT 32 partition */
|
||||||
|
PrintTextXY(6, 10, "System path: '%wZ'", &SystemRootPath);
|
||||||
|
|
||||||
|
if (DoesFileExist(SystemRootPath.Buffer, L"ntldr") == TRUE ||
|
||||||
|
DoesFileExist(SystemRootPath.Buffer, L"boot.ini") == TRUE)
|
||||||
|
{
|
||||||
|
/* Search root directory for 'ntldr' and 'boot.ini'. */
|
||||||
|
SetTextXY(6, 12, "Found Microsoft Windows NT/2000/XP boot loader");
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (DoesFileExist(SystemRootPath.Buffer, L"io.sys") == TRUE ||
|
||||||
|
DoesFileExist(SystemRootPath.Buffer, L"msdos.sys") == TRUE)
|
||||||
|
{
|
||||||
|
/* Search for root directory for 'io.sys' and 'msdos.sys'. */
|
||||||
|
SetTextXY(6, 12, "Found Microsoft DOS or Windows 9x boot loader");
|
||||||
|
|
||||||
|
/* Copy FreeLoader to the boot partition */
|
||||||
|
wcscpy(SrcPath, SourceRootPath.Buffer);
|
||||||
|
wcscat(SrcPath, L"\\loader\\freeldr.sys");
|
||||||
|
wcscpy(DstPath, SystemRootPath.Buffer);
|
||||||
|
wcscat(DstPath, L"\\freeldr.sys");
|
||||||
|
|
||||||
|
PrintTextXY(6, 14, "Copy: %S ==> %S", SrcPath, DstPath);
|
||||||
|
|
||||||
|
SetupCopyFile(SrcPath, DstPath);
|
||||||
|
|
||||||
|
/* Create freeldr.ini */
|
||||||
|
wcscpy(DstPath, SystemRootPath.Buffer);
|
||||||
|
wcscat(DstPath, L"\\freeldr.ini");
|
||||||
|
|
||||||
|
CreateFreeLoaderIniForDos(DstPath,
|
||||||
|
DestinationPath.Buffer);
|
||||||
|
|
||||||
|
/* Copy current bootsector to 'BOOTSECT.DOS' */
|
||||||
|
if ((ActivePartition.PartType == PARTITION_FAT32) ||
|
||||||
|
(ActivePartition.PartType == PARTITION_FAT32_XINT13))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
SetTextXY(6, 12, "No or unknown boot loader found");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* unknown partition */
|
||||||
|
SetTextXY(6, 12, "Unknown partition found");
|
||||||
|
}
|
||||||
|
|
||||||
SetStatusText(" ENTER = Continue F3 = Quit");
|
SetStatusText(" ENTER = Continue F3 = Quit");
|
||||||
|
|
||||||
while(TRUE)
|
while(TRUE)
|
||||||
|
@ -1370,10 +1516,11 @@ InitSystemPage(PINPUT_RECORD Ir)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return(INIT_SYSTEM_PAGE);
|
return(BOOT_LOADER_PAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static ULONG
|
static ULONG
|
||||||
QuitPage(PINPUT_RECORD Ir)
|
QuitPage(PINPUT_RECORD Ir)
|
||||||
{
|
{
|
||||||
|
@ -1445,6 +1592,15 @@ NtProcessStartup(PPEB Peb)
|
||||||
|
|
||||||
PartDataValid = FALSE;
|
PartDataValid = FALSE;
|
||||||
|
|
||||||
|
/* Initialize global unicode strings */
|
||||||
|
RtlInitUnicodeString(&SourcePath, NULL);
|
||||||
|
RtlInitUnicodeString(&SourceRootPath, NULL);
|
||||||
|
RtlInitUnicodeString(&InstallPath, NULL);
|
||||||
|
RtlInitUnicodeString(&DestinationPath, NULL);
|
||||||
|
RtlInitUnicodeString(&DestinationRootPath, NULL);
|
||||||
|
RtlInitUnicodeString(&SystemRootPath, NULL);
|
||||||
|
|
||||||
|
|
||||||
Page = START_PAGE;
|
Page = START_PAGE;
|
||||||
while (Page != REBOOT_PAGE)
|
while (Page != REBOOT_PAGE)
|
||||||
{
|
{
|
||||||
|
@ -1503,8 +1659,12 @@ NtProcessStartup(PPEB Peb)
|
||||||
Page = FileCopyPage(&Ir);
|
Page = FileCopyPage(&Ir);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INIT_SYSTEM_PAGE:
|
case REGISTRY_PAGE:
|
||||||
Page = InitSystemPage(&Ir);
|
Page = RegistryPage(&Ir);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BOOT_LOADER_PAGE:
|
||||||
|
Page = BootLoaderPage(&Ir);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue