[FREELDR]

- Use 'DiskReadBufferSize' instead of hardcoded values in hwdisk.c
- Transform reactos_arc_disk_info into a ARC_DISK_SIGNATURE_EX structure, so that its conversion into a ARC list in winldr.c becomes a bit simpler.
- In winldr.c:
  * In case we fail to either open the SYSTEM hive or scan it, bail out with an error message, instead of trying to continue loading ROS.
  * Fix an old comment related to ACPI;
- In memory.c/h: Do some cleanup (in particular, just use the MachXXX macros instead of also defining functions with the same names as the macros, and which just redirect into the virtual table).

svn path=/trunk/; revision=73606
This commit is contained in:
Hermès Bélusca-Maïto 2017-01-27 14:43:41 +00:00
parent 9bbe22afa8
commit 081ba36892
8 changed files with 154 additions and 294 deletions

View file

@ -17,9 +17,8 @@
PCONFIGURATION_COMPONENT_DATA FldrArcHwTreeRoot; PCONFIGURATION_COMPONENT_DATA FldrArcHwTreeRoot;
// ARC Disk Information // ARC Disk Information
ARC_DISK_SIGNATURE reactos_arc_disk_info[32];
ULONG reactos_disk_count = 0; ULONG reactos_disk_count = 0;
CHAR reactos_arc_strings[32][256]; ARC_DISK_SIGNATURE_EX reactos_arc_disk_info[32];
/* FUNCTIONS ******************************************************************/ /* FUNCTIONS ******************************************************************/
@ -30,11 +29,8 @@ PVOID
NTAPI NTAPI
FldrpHwHeapAlloc(IN SIZE_T Size) FldrpHwHeapAlloc(IN SIZE_T Size)
{ {
PVOID Buffer;
/* Allocate memory from generic bootloader heap */ /* Allocate memory from generic bootloader heap */
Buffer = FrLdrHeapAlloc(Size, 'pHwH'); return FrLdrHeapAlloc(Size, 'pHwH');
return Buffer;
} }
static VOID static VOID

View file

@ -30,8 +30,7 @@ ULONG SecondLevelIcacheSize;
ULONG SecondLevelIcacheFillSize; ULONG SecondLevelIcacheFillSize;
extern ULONG reactos_disk_count; extern ULONG reactos_disk_count;
extern ARC_DISK_SIGNATURE reactos_arc_disk_info[]; extern ARC_DISK_SIGNATURE_EX reactos_arc_disk_info[];
extern CHAR reactos_arc_strings[32][256];
ULONG SizeBits[] = ULONG SizeBits[] =
{ {
@ -144,11 +143,11 @@ ArmHwDetect(VOID)
RamDiskInitialize(); RamDiskInitialize();
/* Fill out the ARC disk block */ /* Fill out the ARC disk block */
reactos_arc_disk_info[reactos_disk_count].Signature = 0xBADAB00F; reactos_arc_disk_info[reactos_disk_count].DiskSignature.Signature = 0xBADAB00F;
reactos_arc_disk_info[reactos_disk_count].CheckSum = 0xDEADBABE; reactos_arc_disk_info[reactos_disk_count].DiskSignature.CheckSum = 0xDEADBABE;
strcpy(reactos_arc_strings[reactos_disk_count], "ramdisk(0)"); strcpy(reactos_arc_disk_info[reactos_disk_count].ArcName, "ramdisk(0)");
reactos_arc_disk_info[reactos_disk_count].ArcName = reactos_arc_disk_info[reactos_disk_count].DiskSignature.ArcName =
reactos_arc_strings[reactos_disk_count]; reactos_arc_disk_info[reactos_disk_count].ArcName;
reactos_disk_count++; reactos_disk_count++;
ASSERT(reactos_disk_count == 1); ASSERT(reactos_disk_count == 1);

View file

@ -36,8 +36,7 @@ typedef struct tagDISKCONTEXT
} DISKCONTEXT; } DISKCONTEXT;
extern ULONG reactos_disk_count; extern ULONG reactos_disk_count;
extern ARC_DISK_SIGNATURE reactos_arc_disk_info[]; extern ARC_DISK_SIGNATURE_EX reactos_arc_disk_info[];
extern CHAR reactos_arc_strings[32][256];
static CHAR Hex[] = "0123456789abcdef"; static CHAR Hex[] = "0123456789abcdef";
UCHAR PcBiosDiskCount = 0; UCHAR PcBiosDiskCount = 0;
@ -190,11 +189,11 @@ GetHarddiskInformation(
UCHAR DriveNumber) UCHAR DriveNumber)
{ {
PMASTER_BOOT_RECORD Mbr; PMASTER_BOOT_RECORD Mbr;
ULONG *Buffer; PULONG Buffer;
ULONG i; ULONG i;
ULONG Checksum; ULONG Checksum;
ULONG Signature; ULONG Signature;
CHAR ArcName[256]; CHAR ArcName[MAX_PATH];
PARTITION_TABLE_ENTRY PartitionTableEntry; PARTITION_TABLE_ENTRY PartitionTableEntry;
PCHAR Identifier = PcDiskIdentifier[DriveNumber - 0x80]; PCHAR Identifier = PcDiskIdentifier[DriveNumber - 0x80];
@ -208,12 +207,12 @@ GetHarddiskInformation(
Buffer = (ULONG*)DiskReadBuffer; Buffer = (ULONG*)DiskReadBuffer;
Mbr = (PMASTER_BOOT_RECORD)DiskReadBuffer; Mbr = (PMASTER_BOOT_RECORD)DiskReadBuffer;
Signature = Mbr->Signature; Signature = Mbr->Signature;
TRACE("Signature: %x\n", Signature); TRACE("Signature: %x\n", Signature);
/* Calculate the MBR checksum */ /* Calculate the MBR checksum */
Checksum = 0; Checksum = 0;
for (i = 0; i < 128; i++) for (i = 0; i < 512 / sizeof(ULONG); i++)
{ {
Checksum += Buffer[i]; Checksum += Buffer[i];
} }
@ -221,12 +220,12 @@ GetHarddiskInformation(
TRACE("Checksum: %x\n", Checksum); TRACE("Checksum: %x\n", Checksum);
/* Fill out the ARC disk block */ /* Fill out the ARC disk block */
reactos_arc_disk_info[reactos_disk_count].Signature = Signature; reactos_arc_disk_info[reactos_disk_count].DiskSignature.Signature = Signature;
reactos_arc_disk_info[reactos_disk_count].CheckSum = Checksum; reactos_arc_disk_info[reactos_disk_count].DiskSignature.CheckSum = Checksum;
sprintf(ArcName, "multi(0)disk(0)rdisk(%lu)", reactos_disk_count); sprintf(ArcName, "multi(0)disk(0)rdisk(%lu)", reactos_disk_count);
strcpy(reactos_arc_strings[reactos_disk_count], ArcName); strcpy(reactos_arc_disk_info[reactos_disk_count].ArcName, ArcName);
reactos_arc_disk_info[reactos_disk_count].ArcName = reactos_arc_disk_info[reactos_disk_count].DiskSignature.ArcName =
reactos_arc_strings[reactos_disk_count]; reactos_arc_disk_info[reactos_disk_count].ArcName;
reactos_disk_count++; reactos_disk_count++;
sprintf(ArcName, "multi(0)disk(0)rdisk(%u)partition(0)", DriveNumber - 0x80); sprintf(ArcName, "multi(0)disk(0)rdisk(%u)partition(0)", DriveNumber - 0x80);
@ -277,36 +276,39 @@ HwInitializeBiosDisks(VOID)
UCHAR DiskCount, DriveNumber; UCHAR DiskCount, DriveNumber;
ULONG i; ULONG i;
BOOLEAN Changed; BOOLEAN Changed;
CHAR BootPath[512];
BOOLEAN BootDriveReported = FALSE; BOOLEAN BootDriveReported = FALSE;
CHAR BootPath[MAX_PATH];
/* Count the number of visible drives */ /* Count the number of visible drives */
DiskReportError(FALSE); DiskReportError(FALSE);
DiskCount = 0; DiskCount = 0;
DriveNumber = 0x80; DriveNumber = 0x80;
/* There are some really broken BIOSes out there. There are even BIOSes /*
* that happily report success when you ask them to read from non-existent * There are some really broken BIOSes out there. There are even BIOSes
* harddisks. So, we set the buffer to known contents first, then try to * that happily report success when you ask them to read from non-existent
* read. If the BIOS reports success but the buffer contents haven't * harddisks. So, we set the buffer to known contents first, then try to
* changed then we fail anyway */ * read. If the BIOS reports success but the buffer contents haven't
memset(DiskReadBuffer, 0xcd, 512); * changed then we fail anyway.
*/
memset(DiskReadBuffer, 0xcd, DiskReadBufferSize);
while (MachDiskReadLogicalSectors(DriveNumber, 0ULL, 1, DiskReadBuffer)) while (MachDiskReadLogicalSectors(DriveNumber, 0ULL, 1, DiskReadBuffer))
{ {
Changed = FALSE; Changed = FALSE;
for (i = 0; ! Changed && i < 512; i++) for (i = 0; !Changed && i < DiskReadBufferSize; i++)
{ {
Changed = ((PUCHAR)DiskReadBuffer)[i] != 0xcd; Changed = ((PUCHAR)DiskReadBuffer)[i] != 0xcd;
} }
if (! Changed) if (!Changed)
{ {
TRACE("BIOS reports success for disk %d but data didn't change\n", TRACE("BIOS reports success for disk %d but data didn't change\n",
(int)DiskCount); (int)DiskCount);
break; break;
} }
GetHarddiskInformation(DriveNumber); GetHarddiskInformation(DriveNumber);
/* Check if we have seen the boot drive */
if (FrldrBootDrive == DriveNumber) if (FrldrBootDrive == DriveNumber)
BootDriveReported = TRUE; BootDriveReported = TRUE;
@ -323,18 +325,25 @@ HwInitializeBiosDisks(VOID)
if ((FrldrBootDrive >= 0x80 && !BootDriveReported) || if ((FrldrBootDrive >= 0x80 && !BootDriveReported) ||
DiskIsDriveRemovable(FrldrBootDrive)) DiskIsDriveRemovable(FrldrBootDrive))
{ {
/* TODO: Check if it's really a cdrom drive */ /* TODO: Check if it's really a CDROM drive */
ULONG* Buffer;
PMASTER_BOOT_RECORD Mbr;
PULONG Buffer;
ULONG Checksum = 0; ULONG Checksum = 0;
ULONG Signature;
/* Read the MBR */ /* Read the MBR */
if (!MachDiskReadLogicalSectors(FrldrBootDrive, 16ULL, 1, DiskReadBuffer)) if (!MachDiskReadLogicalSectors(FrldrBootDrive, 16ULL, 1, DiskReadBuffer))
{ {
ERR("Reading MBR failed\n"); ERR("Reading MBR failed\n");
return FALSE; return FALSE;
} }
Buffer = (ULONG*)DiskReadBuffer; Buffer = (ULONG*)DiskReadBuffer;
Mbr = (PMASTER_BOOT_RECORD)DiskReadBuffer;
Signature = Mbr->Signature;
TRACE("Signature: %x\n", Signature);
/* Calculate the MBR checksum */ /* Calculate the MBR checksum */
for (i = 0; i < 2048 / sizeof(ULONG); i++) Checksum += Buffer[i]; for (i = 0; i < 2048 / sizeof(ULONG); i++) Checksum += Buffer[i];
@ -342,10 +351,11 @@ HwInitializeBiosDisks(VOID)
TRACE("Checksum: %x\n", Checksum); TRACE("Checksum: %x\n", Checksum);
/* Fill out the ARC disk block */ /* Fill out the ARC disk block */
reactos_arc_disk_info[reactos_disk_count].CheckSum = Checksum; reactos_arc_disk_info[reactos_disk_count].DiskSignature.Signature = Signature;
strcpy(reactos_arc_strings[reactos_disk_count], BootPath); reactos_arc_disk_info[reactos_disk_count].DiskSignature.CheckSum = Checksum;
reactos_arc_disk_info[reactos_disk_count].ArcName = strcpy(reactos_arc_disk_info[reactos_disk_count].ArcName, BootPath);
reactos_arc_strings[reactos_disk_count]; reactos_arc_disk_info[reactos_disk_count].DiskSignature.ArcName =
reactos_arc_disk_info[reactos_disk_count].ArcName;
reactos_disk_count++; reactos_disk_count++;
FsRegisterDevice(BootPath, &DiskVtbl); FsRegisterDevice(BootPath, &DiskVtbl);

View file

@ -27,8 +27,7 @@ static CHAR Hex[] = "0123456789ABCDEF";
//static unsigned int delay_count = 1; //static unsigned int delay_count = 1;
extern ULONG reactos_disk_count; extern ULONG reactos_disk_count;
extern ARC_DISK_SIGNATURE reactos_arc_disk_info[]; extern ARC_DISK_SIGNATURE_EX reactos_arc_disk_info[];
extern CHAR reactos_arc_strings[32][256];
static static
PCM_PARTIAL_RESOURCE_LIST PCM_PARTIAL_RESOURCE_LIST
@ -249,11 +248,11 @@ GetHarddiskIdentifier(PCHAR Identifier,
UCHAR DriveNumber) UCHAR DriveNumber)
{ {
PMASTER_BOOT_RECORD Mbr; PMASTER_BOOT_RECORD Mbr;
ULONG *Buffer; PULONG Buffer;
ULONG i; ULONG i;
ULONG Checksum; ULONG Checksum;
ULONG Signature; ULONG Signature;
CHAR ArcName[256]; CHAR ArcName[MAX_PATH];
PARTITION_TABLE_ENTRY PartitionTableEntry; PARTITION_TABLE_ENTRY PartitionTableEntry;
/* Read the MBR */ /* Read the MBR */
@ -266,12 +265,12 @@ GetHarddiskIdentifier(PCHAR Identifier,
Buffer = (ULONG*)DiskReadBuffer; Buffer = (ULONG*)DiskReadBuffer;
Mbr = (PMASTER_BOOT_RECORD)DiskReadBuffer; Mbr = (PMASTER_BOOT_RECORD)DiskReadBuffer;
Signature = Mbr->Signature; Signature = Mbr->Signature;
TRACE("Signature: %x\n", Signature); TRACE("Signature: %x\n", Signature);
/* Calculate the MBR checksum */ /* Calculate the MBR checksum */
Checksum = 0; Checksum = 0;
for (i = 0; i < 128; i++) for (i = 0; i < 512 / sizeof(ULONG); i++)
{ {
Checksum += Buffer[i]; Checksum += Buffer[i];
} }
@ -279,12 +278,12 @@ GetHarddiskIdentifier(PCHAR Identifier,
TRACE("Checksum: %x\n", Checksum); TRACE("Checksum: %x\n", Checksum);
/* Fill out the ARC disk block */ /* Fill out the ARC disk block */
reactos_arc_disk_info[reactos_disk_count].Signature = Signature; reactos_arc_disk_info[reactos_disk_count].DiskSignature.Signature = Signature;
reactos_arc_disk_info[reactos_disk_count].CheckSum = Checksum; reactos_arc_disk_info[reactos_disk_count].DiskSignature.CheckSum = Checksum;
sprintf(ArcName, "multi(0)disk(0)rdisk(%lu)", reactos_disk_count); sprintf(ArcName, "multi(0)disk(0)rdisk(%lu)", reactos_disk_count);
strcpy(reactos_arc_strings[reactos_disk_count], ArcName); strcpy(reactos_arc_disk_info[reactos_disk_count].ArcName, ArcName);
reactos_arc_disk_info[reactos_disk_count].ArcName = reactos_arc_disk_info[reactos_disk_count].DiskSignature.ArcName =
reactos_arc_strings[reactos_disk_count]; reactos_arc_disk_info[reactos_disk_count].ArcName;
reactos_disk_count++; reactos_disk_count++;
sprintf(ArcName, "multi(0)disk(0)rdisk(%u)partition(0)", DriveNumber - 0x80); sprintf(ArcName, "multi(0)disk(0)rdisk(%u)partition(0)", DriveNumber - 0x80);

View file

@ -32,100 +32,103 @@
typedef enum tagVIDEODISPLAYMODE typedef enum tagVIDEODISPLAYMODE
{ {
VideoTextMode, VideoTextMode,
VideoGraphicsMode VideoGraphicsMode
} VIDEODISPLAYMODE, *PVIDEODISPLAYMODE; } VIDEODISPLAYMODE, *PVIDEODISPLAYMODE;
typedef struct tagMACHVTBL typedef struct tagMACHVTBL
{ {
VOID (*ConsPutChar)(int Ch); VOID (*ConsPutChar)(int Ch);
BOOLEAN (*ConsKbHit)(VOID); BOOLEAN (*ConsKbHit)(VOID);
int (*ConsGetCh)(VOID); int (*ConsGetCh)(VOID);
VOID (*VideoClearScreen)(UCHAR Attr); VOID (*VideoClearScreen)(UCHAR Attr);
VIDEODISPLAYMODE (*VideoSetDisplayMode)(char *DisplayMode, BOOLEAN Init); VIDEODISPLAYMODE (*VideoSetDisplayMode)(char *DisplayMode, BOOLEAN Init);
VOID (*VideoGetDisplaySize)(PULONG Width, PULONG Height, PULONG Depth); VOID (*VideoGetDisplaySize)(PULONG Width, PULONG Height, PULONG Depth);
ULONG (*VideoGetBufferSize)(VOID); ULONG (*VideoGetBufferSize)(VOID);
VOID (*VideoSetTextCursorPosition)(UCHAR X, UCHAR Y); VOID (*VideoSetTextCursorPosition)(UCHAR X, UCHAR Y);
VOID (*VideoHideShowTextCursor)(BOOLEAN Show); VOID (*VideoHideShowTextCursor)(BOOLEAN Show);
VOID (*VideoPutChar)(int Ch, UCHAR Attr, unsigned X, unsigned Y); VOID (*VideoPutChar)(int Ch, UCHAR Attr, unsigned X, unsigned Y);
VOID (*VideoCopyOffScreenBufferToVRAM)(PVOID Buffer); VOID (*VideoCopyOffScreenBufferToVRAM)(PVOID Buffer);
BOOLEAN (*VideoIsPaletteFixed)(VOID); BOOLEAN (*VideoIsPaletteFixed)(VOID);
VOID (*VideoSetPaletteColor)(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue); VOID (*VideoSetPaletteColor)(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue);
VOID (*VideoGetPaletteColor)(UCHAR Color, UCHAR* Red, UCHAR* Green, UCHAR* Blue); VOID (*VideoGetPaletteColor)(UCHAR Color, UCHAR* Red, UCHAR* Green, UCHAR* Blue);
VOID (*VideoSync)(VOID); VOID (*VideoSync)(VOID);
VOID (*Beep)(VOID); VOID (*Beep)(VOID);
VOID (*PrepareForReactOS)(IN BOOLEAN Setup); VOID (*PrepareForReactOS)(IN BOOLEAN Setup);
FREELDR_MEMORY_DESCRIPTOR* (*GetMemoryDescriptor)(FREELDR_MEMORY_DESCRIPTOR* Current); // NOTE: Not in the machine.c ...
PFREELDR_MEMORY_DESCRIPTOR (*GetMemoryMap)(PULONG MaxMemoryMapSize); FREELDR_MEMORY_DESCRIPTOR* (*GetMemoryDescriptor)(FREELDR_MEMORY_DESCRIPTOR* Current);
PFREELDR_MEMORY_DESCRIPTOR (*GetMemoryMap)(PULONG MaxMemoryMapSize);
BOOLEAN (*DiskGetBootPath)(char *BootPath, unsigned Size); BOOLEAN (*DiskGetBootPath)(char *BootPath, unsigned Size);
BOOLEAN (*DiskReadLogicalSectors)(UCHAR DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer); BOOLEAN (*DiskReadLogicalSectors)(UCHAR DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer);
BOOLEAN (*DiskGetDriveGeometry)(UCHAR DriveNumber, PGEOMETRY DriveGeometry); BOOLEAN (*DiskGetDriveGeometry)(UCHAR DriveNumber, PGEOMETRY DriveGeometry);
ULONG (*DiskGetCacheableBlockCount)(UCHAR DriveNumber); ULONG (*DiskGetCacheableBlockCount)(UCHAR DriveNumber);
TIMEINFO* (*GetTime)(VOID); // NOTE: In the machine.c under the name of "ArcGetXXXTime"
ULONG (*GetRelativeTime)(VOID); TIMEINFO* (*GetTime)(VOID);
ULONG (*GetRelativeTime)(VOID);
BOOLEAN (*InitializeBootDevices)(VOID); // NOTE: Not in the machine.c ...
PCONFIGURATION_COMPONENT_DATA (*HwDetect)(VOID); BOOLEAN (*InitializeBootDevices)(VOID);
VOID (*HwIdle)(VOID); PCONFIGURATION_COMPONENT_DATA (*HwDetect)(VOID);
VOID (*HwIdle)(VOID);
} MACHVTBL, *PMACHVTBL; } MACHVTBL, *PMACHVTBL;
VOID MachInit(const char *CmdLine);
extern MACHVTBL MachVtbl; extern MACHVTBL MachVtbl;
VOID MachConsPutChar(int Ch); /* NOTE: Implemented by each architecture */
BOOLEAN MachConsKbHit(VOID); VOID MachInit(const char *CmdLine);
int MachConsGetCh(VOID);
VOID MachVideoClearScreen(UCHAR Attr);
VIDEODISPLAYMODE MachVideoSetDisplayMode(char *DisplayMode, BOOLEAN Init);
VOID MachVideoGetDisplaySize(PULONG Width, PULONG Height, PULONG Depth);
ULONG MachVideoGetBufferSize(VOID);
VOID MachVideoSetTextCursorPosition(UCHAR X, UCHAR Y);
VOID MachVideoHideShowTextCursor(BOOLEAN Show);
VOID MachVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y);
VOID MachVideoCopyOffScreenBufferToVRAM(PVOID Buffer);
BOOLEAN MachVideoIsPaletteFixed(VOID);
VOID MachVideoSetPaletteColor(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue);
VOID MachVideoGetPaletteColor(UCHAR Color, UCHAR *Red, UCHAR *Green, UCHAR *Blue);
VOID MachVideoSync(VOID);
VOID MachBeep(VOID);
BOOLEAN MachDiskGetBootPath(char *BootPath, unsigned Size);
BOOLEAN MachDiskNormalizeSystemPath(char *SystemPath, unsigned Size);
BOOLEAN MachDiskReadLogicalSectors(UCHAR DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer);
BOOLEAN MachDiskGetDriveGeometry(UCHAR DriveNumber, PGEOMETRY DriveGeometry);
ULONG MachDiskGetCacheableBlockCount(UCHAR DriveNumber);
VOID MachPrepareForReactOS(IN BOOLEAN Setup);
VOID MachHwIdle(VOID);
#define MachConsPutChar(Ch) MachVtbl.ConsPutChar(Ch) #define MachConsPutChar(Ch) \
#define MachConsKbHit() MachVtbl.ConsKbHit() MachVtbl.ConsPutChar(Ch)
#define MachConsGetCh() MachVtbl.ConsGetCh() #define MachConsKbHit() \
#define MachVideoClearScreen(Attr) MachVtbl.VideoClearScreen(Attr) MachVtbl.ConsKbHit()
#define MachVideoSetDisplayMode(Mode, Init) MachVtbl.VideoSetDisplayMode((Mode), (Init)) #define MachConsGetCh() \
#define MachVideoGetDisplaySize(W, H, D) MachVtbl.VideoGetDisplaySize((W), (H), (D)) MachVtbl.ConsGetCh()
#define MachVideoGetBufferSize() MachVtbl.VideoGetBufferSize() #define MachVideoClearScreen(Attr) \
#define MachVideoSetTextCursorPosition(X, Y) MachVtbl.VideoSetTextCursorPosition((X), (Y)) MachVtbl.VideoClearScreen(Attr)
#define MachVideoHideShowTextCursor(Show) MachVtbl.VideoHideShowTextCursor(Show) #define MachVideoSetDisplayMode(Mode, Init) \
#define MachVideoPutChar(Ch, Attr, X, Y) MachVtbl.VideoPutChar((Ch), (Attr), (X), (Y)) MachVtbl.VideoSetDisplayMode((Mode), (Init))
#define MachVideoCopyOffScreenBufferToVRAM(Buf) MachVtbl.VideoCopyOffScreenBufferToVRAM(Buf) #define MachVideoGetDisplaySize(W, H, D) \
#define MachVideoIsPaletteFixed() MachVtbl.VideoIsPaletteFixed() MachVtbl.VideoGetDisplaySize((W), (H), (D))
#define MachVideoSetPaletteColor(Col, R, G, B) MachVtbl.VideoSetPaletteColor((Col), (R), (G), (B)) #define MachVideoGetBufferSize() \
#define MachVideoGetPaletteColor(Col, R, G, B) MachVtbl.VideoGetPaletteColor((Col), (R), (G), (B)) MachVtbl.VideoGetBufferSize()
#define MachVideoSync() MachVtbl.VideoSync() #define MachVideoSetTextCursorPosition(X, Y) \
#define MachBeep() MachVtbl.Beep() MachVtbl.VideoSetTextCursorPosition((X), (Y))
#define MachPrepareForReactOS(a) MachVtbl.PrepareForReactOS(a) #define MachVideoHideShowTextCursor(Show) \
#define MachDiskGetBootPath(Path, Size) MachVtbl.DiskGetBootPath((Path), (Size)) MachVtbl.VideoHideShowTextCursor(Show)
#define MachDiskNormalizeSystemPath(Path, Size) MachVtbl.DiskNormalizeSystemPath((Path), (Size)) #define MachVideoPutChar(Ch, Attr, X, Y) \
#define MachDiskReadLogicalSectors(Drive, Start, Count, Buf) MachVtbl.DiskReadLogicalSectors((Drive), (Start), (Count), (Buf)) MachVtbl.VideoPutChar((Ch), (Attr), (X), (Y))
#define MachDiskGetDriveGeometry(Drive, Geom) MachVtbl.DiskGetDriveGeometry((Drive), (Geom)) #define MachVideoCopyOffScreenBufferToVRAM(Buf) \
#define MachDiskGetCacheableBlockCount(Drive) MachVtbl.DiskGetCacheableBlockCount(Drive) MachVtbl.VideoCopyOffScreenBufferToVRAM(Buf)
#define MachInitializeBootDevices() MachVtbl.InitializeBootDevices() #define MachVideoIsPaletteFixed() \
#define MachHwDetect() MachVtbl.HwDetect() MachVtbl.VideoIsPaletteFixed()
#define MachHwIdle() MachVtbl.HwIdle() #define MachVideoSetPaletteColor(Col, R, G, B) \
MachVtbl.VideoSetPaletteColor((Col), (R), (G), (B))
#define MachVideoGetPaletteColor(Col, R, G, B) \
MachVtbl.VideoGetPaletteColor((Col), (R), (G), (B))
#define MachVideoSync() \
MachVtbl.VideoSync()
#define MachBeep() \
MachVtbl.Beep()
#define MachPrepareForReactOS(Setup) \
MachVtbl.PrepareForReactOS(Setup)
#define MachDiskGetBootPath(Path, Size) \
MachVtbl.DiskGetBootPath((Path), (Size))
#define MachDiskReadLogicalSectors(Drive, Start, Count, Buf) \
MachVtbl.DiskReadLogicalSectors((Drive), (Start), (Count), (Buf))
#define MachDiskGetDriveGeometry(Drive, Geom) \
MachVtbl.DiskGetDriveGeometry((Drive), (Geom))
#define MachDiskGetCacheableBlockCount(Drive) \
MachVtbl.DiskGetCacheableBlockCount(Drive)
#define MachInitializeBootDevices() \
MachVtbl.InitializeBootDevices()
#define MachHwDetect() MachVtbl.HwDetect()
#define MachHwIdle() MachVtbl.HwIdle()
/* ARC FUNCTIONS **************************************************************/ /* ARC FUNCTIONS **************************************************************/

View file

@ -18,156 +18,8 @@
#include <freeldr.h> #include <freeldr.h>
#undef MachConsPutChar
#undef MachConsKbHit
#undef MachConsGetCh
#undef MachVideoClearScreen
#undef MachVideoSetDisplayMode
#undef MachVideoGetDisplaySize
#undef MachVideoGetBufferSize
#undef MachVideoSetTextCursorPosition
#undef MachVideoHideShowTextCursor
#undef MachVideoPutChar
#undef MachVideoCopyOffScreenBufferToVRAM
#undef MachVideoIsPaletteFixed
#undef MachVideoSetPaletteColor
#undef MachVideoGetPaletteColor
#undef MachVideoSync
#undef MachBeep
#undef MachPrepareForReactOS
#undef MachDiskGetBootPath
#undef MachDiskReadLogicalSectors
#undef MachDiskGetDriveGeometry
#undef MachDiskGetCacheableBlockCount
MACHVTBL MachVtbl; MACHVTBL MachVtbl;
VOID
MachConsPutChar(int Ch)
{
MachVtbl.ConsPutChar(Ch);
}
BOOLEAN
MachConsKbHit(VOID)
{
return MachVtbl.ConsKbHit();
}
int
MachConsGetCh(VOID)
{
return MachVtbl.ConsGetCh();
}
VOID
MachVideoClearScreen(UCHAR Attr)
{
MachVtbl.VideoClearScreen(Attr);
}
VIDEODISPLAYMODE
MachVideoSetDisplayMode(char *DisplayMode, BOOLEAN Init)
{
return MachVtbl.VideoSetDisplayMode(DisplayMode, Init);
}
VOID
MachVideoGetDisplaySize(PULONG Width, PULONG Height, PULONG Depth)
{
MachVtbl.VideoGetDisplaySize(Width, Height, Depth);
}
ULONG
MachVideoGetBufferSize(VOID)
{
return MachVtbl.VideoGetBufferSize();
}
VOID
MachVideoSetTextCursorPosition(UCHAR X, UCHAR Y)
{
MachVtbl.VideoSetTextCursorPosition(X, Y);
}
VOID
MachVideoHideShowTextCursor(BOOLEAN Show)
{
MachVtbl.VideoHideShowTextCursor(Show);
}
VOID
MachVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y)
{
MachVtbl.VideoPutChar(Ch, Attr, X, Y);
}
VOID
MachVideoCopyOffScreenBufferToVRAM(PVOID Buffer)
{
MachVtbl.VideoCopyOffScreenBufferToVRAM(Buffer);
}
BOOLEAN
MachVideoIsPaletteFixed(VOID)
{
return MachVtbl.VideoIsPaletteFixed();
}
VOID
MachVideoSetPaletteColor(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue)
{
MachVtbl.VideoSetPaletteColor(Color, Red, Green, Blue);
}
VOID
MachVideoGetPaletteColor(UCHAR Color, UCHAR *Red, UCHAR *Green, UCHAR *Blue)
{
MachVtbl.VideoGetPaletteColor(Color, Red, Green, Blue);
}
VOID
MachVideoSync(VOID)
{
MachVtbl.VideoSync();
}
VOID
MachBeep(VOID)
{
MachVtbl.Beep();
}
VOID
MachPrepareForReactOS(IN BOOLEAN Setup)
{
MachVtbl.PrepareForReactOS(Setup);
}
BOOLEAN
MachDiskGetBootPath(char *BootPath, unsigned Size)
{
return MachVtbl.DiskGetBootPath(BootPath, Size);
}
BOOLEAN
MachDiskReadLogicalSectors(UCHAR DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer)
{
return MachVtbl.DiskReadLogicalSectors(DriveNumber, SectorNumber, SectorCount, Buffer);
}
BOOLEAN
MachDiskGetDriveGeometry(UCHAR DriveNumber, PGEOMETRY DriveGeometry)
{
return MachVtbl.DiskGetDriveGeometry(DriveNumber, DriveGeometry);
}
ULONG
MachDiskGetCacheableBlockCount(UCHAR DriveNumber)
{
return MachVtbl.DiskGetCacheableBlockCount(DriveNumber);
}
/* ARC FUNCTIONS **************************************************************/ /* ARC FUNCTIONS **************************************************************/

View file

@ -27,9 +27,9 @@
#include <debug.h> #include <debug.h>
DBG_DEFAULT_CHANNEL(WINDOWS); DBG_DEFAULT_CHANNEL(WINDOWS);
//FIXME: Find a better way to retrieve ARC disk information // FIXME: Find a better way to retrieve ARC disk information
extern ULONG reactos_disk_count; extern ULONG reactos_disk_count;
extern ARC_DISK_SIGNATURE reactos_arc_disk_info[]; extern ARC_DISK_SIGNATURE_EX reactos_arc_disk_info[];
extern ULONG LoaderPagesSpanned; extern ULONG LoaderPagesSpanned;
extern BOOLEAN AcpiPresent; extern BOOLEAN AcpiPresent;
@ -148,14 +148,10 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
ArcDiskSig = FrLdrHeapAlloc(sizeof(ARC_DISK_SIGNATURE_EX), 'giSD'); ArcDiskSig = FrLdrHeapAlloc(sizeof(ARC_DISK_SIGNATURE_EX), 'giSD');
/* Copy the data over */ /* Copy the data over */
ArcDiskSig->DiskSignature.Signature = reactos_arc_disk_info[i].Signature; RtlCopyMemory(ArcDiskSig, &reactos_arc_disk_info[i], sizeof(ARC_DISK_SIGNATURE_EX));
ArcDiskSig->DiskSignature.CheckSum = reactos_arc_disk_info[i].CheckSum;
/* Copy the ARC Name */ /* Set the ARC Name pointer and mark the partition table as valid */
strncpy(ArcDiskSig->ArcName, reactos_arc_disk_info[i].ArcName, MAX_PATH);
ArcDiskSig->DiskSignature.ArcName = PaToVa(ArcDiskSig->ArcName); ArcDiskSig->DiskSignature.ArcName = PaToVa(ArcDiskSig->ArcName);
/* Mark partition table as valid */
ArcDiskSig->DiskSignature.ValidPartitionTable = TRUE; ArcDiskSig->DiskSignature.ValidPartitionTable = TRUE;
/* Insert into the list */ /* Insert into the list */
@ -176,8 +172,7 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
/* Convert all DTE into virtual addresses */ /* Convert all DTE into virtual addresses */
List_PaToVa(&LoaderBlock->LoadOrderListHead); List_PaToVa(&LoaderBlock->LoadOrderListHead);
/* this one will be converted right before switching to /* This one will be converted right before switching to virtual paging mode */
virtual paging mode */
//List_PaToVa(&LoaderBlock->MemoryDescriptorListHead); //List_PaToVa(&LoaderBlock->MemoryDescriptorListHead);
/* Convert list of boot drivers */ /* Convert list of boot drivers */
@ -190,11 +185,12 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
Extension->MinorVersion = VersionToBoot & 0xFF; Extension->MinorVersion = VersionToBoot & 0xFF;
Extension->Profile.Status = 2; Extension->Profile.Status = 2;
/* Check if ACPI is present */ /* Check if FreeLdr detected a ACPI table */
if (AcpiPresent) if (AcpiPresent)
{ {
/* See KiRosFrldrLpbToNtLpb for details */ /* Set the pointer to something for compatibility */
Extension->AcpiTable = (PVOID)1; Extension->AcpiTable = (PVOID)1;
// FIXME: Extension->AcpiTableSize;
} }
#ifdef _M_IX86 #ifdef _M_IX86
@ -700,10 +696,16 @@ LoadAndBootWindows(IN OperatingSystemItem* OperatingSystem,
UiDrawProgressBarCenter(15, 100, "Loading system hive..."); UiDrawProgressBarCenter(15, 100, "Loading system hive...");
Success = WinLdrInitSystemHive(LoaderBlock, BootPath); Success = WinLdrInitSystemHive(LoaderBlock, BootPath);
TRACE("SYSTEM hive %s\n", (Success ? "loaded" : "not loaded")); TRACE("SYSTEM hive %s\n", (Success ? "loaded" : "not loaded"));
/* Bail out if failure */
if (!Success)
return;
/* Load NLS data, OEM font, and prepare boot drivers list */ /* Load NLS data, OEM font, and prepare boot drivers list */
Success = WinLdrScanSystemHive(LoaderBlock, BootPath); Success = WinLdrScanSystemHive(LoaderBlock, BootPath);
TRACE("SYSTEM hive %s\n", (Success ? "scanned" : "not scanned")); TRACE("SYSTEM hive %s\n", (Success ? "scanned" : "not scanned"));
/* Bail out if failure */
if (!Success)
return;
/* Finish loading */ /* Finish loading */
LoadAndBootWindowsCommon(OperatingSystemVersion, LoadAndBootWindowsCommon(OperatingSystemVersion,

View file

@ -179,7 +179,6 @@ BOOLEAN WinLdrScanSystemHive(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
/* TODO: Load OEM HAL font */ /* TODO: Load OEM HAL font */
return TRUE; return TRUE;
} }