Hi there,
This patch is to blame (seems to, just this) or another...
But trunk is broken: build stops with these messages:
[COPY] output-i386\livecd\reactos\system32\ntoskrnl.exe
[CC] dll\win32\shell32\shellole.cpp
[RSP] obj-i386\dll\win32\shell32\shell32_objs.rsp
[LD] output-i386\dll\win32\shell32\shell32.dll
[PEFIXUP] output-i386\dll\win32\shell32\shell32.dll
[RSYM] output-i386\dll\win32\shell32\shell32.dll
[COPY] output-i386\livecd\reactos\system32\shell32.dll
[LD] output-i386\boot\freeldr\freeldr\freeldr.sys
obj-i386\boot\freeldr\freeldr\arch\i386\hardware_freeldr_arch.o: In
function `PcHwDetect':
D:/ProgBin/ros/reactos/boot/freeldr/freeldr/arch/i386/hardware.c:1710:
undefined reference to `HwInitializeBiosDisks'
D:/ProgBin/ros/reactos/boot/freeldr/freeldr/arch/i386/hardware.c:606:
undefined reference to `PcBiosDiskCount'
D:/ProgBin/ros/reactos/boot/freeldr/freeldr/arch/i386/hardware.c:694:
undefined reference to `GetHarddiskIdentifier'
D:/ProgBin/ros/reactos/boot/freeldr/freeldr/arch/i386/hardware.c:685:
undefined reference to `PcBiosDiskCount'
make.exe: *** [output-i386\boot\freeldr\freeldr\freeldr.sys] Error 1
Total Build Time: 00:01:07
D:\ProgBin\ros\reactos>
Best regards,
M.A.
On Fri, Sep 30, 2011 at 2:12 AM, <tkreuzer(a)svn.reactos.org> wrote:
Author: tkreuzer
Date: Thu Sep 29 21:12:40 2011
New Revision: 53896
URL:
http://svn.reactos.org/svn/reactos?rev=53896&view=rev
Log:
[FREELDR]
- Move some disk related stuff that is unrelated to the registry data into a new file,
hwdisk.c
- Don't get the disk count from the size value of a structure that was previously
calculated from the disk count, but instead save it in a global variable.
- Initialize certain data in a better place
Added:
trunk/reactos/boot/freeldr/freeldr/arch/i386/hwdisk.c (with props)
Modified:
trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt
trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c
trunk/reactos/boot/freeldr/freeldr/debug.c
trunk/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild
trunk/reactos/boot/freeldr/freeldr/inifile/ini_init.c
Modified: trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/CMake…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt [iso-8859-1] Thu Sep 29 21:12:40
2011
@@ -83,6 +83,7 @@
arch/i386/hardware.c
arch/i386/hwacpi.c
arch/i386/hwapm.c
+ arch/i386/hwdisk.c
arch/i386/hwpci.c
arch/i386/i386bug.c
arch/i386/i386disk.c
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c [iso-8859-1] Thu Sep 29
21:12:40 2011
@@ -82,12 +82,16 @@
DBG_DEFAULT_CHANNEL(HWDETECT);
-static CHAR Hex[] = "0123456789abcdef";
static unsigned int delay_count = 1;
-extern ULONG reactos_disk_count;
-extern ARC_DISK_SIGNATURE reactos_arc_disk_info[];
-extern char reactos_arc_strings[32][256];
+extern UCHAR PcBiosDiskCount;
+
+PCHAR
+GetHarddiskIdentifier(
+ UCHAR DriveNumber);
+
+VOID
+HwInitializeBiosDisks(VOID);
/* FUNCTIONS ****************************************************************/
@@ -402,218 +406,6 @@
return PartialResourceList;
}
-typedef struct tagDISKCONTEXT
-{
- UCHAR DriveNumber;
- ULONG SectorSize;
- ULONGLONG SectorOffset;
- ULONGLONG SectorCount;
- ULONGLONG SectorNumber;
-} DISKCONTEXT;
-
-static LONG DiskClose(ULONG FileId)
-{
- DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
-
- MmHeapFree(Context);
- return ESUCCESS;
-}
-
-static LONG DiskGetFileInformation(ULONG FileId, FILEINFORMATION* Information)
-{
- DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
-
- RtlZeroMemory(Information, sizeof(FILEINFORMATION));
- Information->EndingAddress.QuadPart = (Context->SectorOffset +
Context->SectorCount) * Context->SectorSize;
- Information->CurrentAddress.QuadPart = (Context->SectorOffset +
Context->SectorNumber) * Context->SectorSize;
-
- return ESUCCESS;
-}
-
-static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
-{
- DISKCONTEXT* Context;
- UCHAR DriveNumber;
- ULONG DrivePartition, SectorSize;
- ULONGLONG SectorOffset = 0;
- ULONGLONG SectorCount = 0;
- PARTITION_TABLE_ENTRY PartitionTableEntry;
- CHAR FileName[1];
-
- if (!DissectArcPath(Path, FileName, &DriveNumber, &DrivePartition))
- return EINVAL;
-
- if (DrivePartition == 0xff)
- {
- /* This is a CD-ROM device */
- SectorSize = 2048;
- }
- else
- {
- /* This is either a floppy disk device (DrivePartition == 0) or
- * a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF)
but
- * it doesn't matter which one because they both have 512 bytes per sector
*/
- SectorSize = 512;
- }
-
- if (DrivePartition != 0xff && DrivePartition != 0)
- {
- if (!DiskGetPartitionEntry(DriveNumber, DrivePartition,
&PartitionTableEntry))
- return EINVAL;
- SectorOffset = PartitionTableEntry.SectorCountBeforePartition;
- SectorCount = PartitionTableEntry.PartitionSectorCount;
- }
-
- Context = MmHeapAlloc(sizeof(DISKCONTEXT));
- if (!Context)
- return ENOMEM;
- Context->DriveNumber = DriveNumber;
- Context->SectorSize = SectorSize;
- Context->SectorOffset = SectorOffset;
- Context->SectorCount = SectorCount;
- Context->SectorNumber = 0;
- FsSetDeviceSpecific(*FileId, Context);
-
- return ESUCCESS;
-}
-
-static LONG DiskRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
-{
- DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
- UCHAR* Ptr = (UCHAR*)Buffer;
- ULONG i, Length;
- BOOLEAN ret;
-
- *Count = 0;
- i = 0;
- while (N > 0)
- {
- Length = N;
- if (Length > Context->SectorSize)
- Length = Context->SectorSize;
- ret = MachDiskReadLogicalSectors(
- Context->DriveNumber,
- Context->SectorNumber + Context->SectorOffset + i,
- 1,
- (PVOID)DISKREADBUFFER);
- if (!ret)
- return EIO;
- RtlCopyMemory(Ptr, (PVOID)DISKREADBUFFER, Length);
- Ptr += Length;
- *Count += Length;
- N -= Length;
- i++;
- }
-
- return ESUCCESS;
-}
-
-static LONG DiskSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode)
-{
- DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
-
- if (SeekMode != SeekAbsolute)
- return EINVAL;
- if (Position->LowPart & (Context->SectorSize - 1))
- return EINVAL;
-
- /* FIXME: take HighPart into account */
- Context->SectorNumber = Position->LowPart / Context->SectorSize;
- return ESUCCESS;
-}
-
-static const DEVVTBL DiskVtbl = {
- DiskClose,
- DiskGetFileInformation,
- DiskOpen,
- DiskRead,
- DiskSeek,
-};
-
-static VOID
-GetHarddiskIdentifier(PCHAR Identifier,
- UCHAR DriveNumber)
-{
- PMASTER_BOOT_RECORD Mbr;
- ULONG *Buffer;
- ULONG i;
- ULONG Checksum;
- ULONG Signature;
- CHAR ArcName[256];
- PARTITION_TABLE_ENTRY PartitionTableEntry;
-
- /* Read the MBR */
- if (!MachDiskReadLogicalSectors(DriveNumber, 0ULL, 1, (PVOID)DISKREADBUFFER))
- {
- ERR("Reading MBR failed\n");
- return;
- }
-
- Buffer = (ULONG*)DISKREADBUFFER;
- Mbr = (PMASTER_BOOT_RECORD)DISKREADBUFFER;
-
- Signature = Mbr->Signature;
- TRACE("Signature: %x\n", Signature);
-
- /* Calculate the MBR checksum */
- Checksum = 0;
- for (i = 0; i < 128; i++)
- {
- Checksum += Buffer[i];
- }
- Checksum = ~Checksum + 1;
- TRACE("Checksum: %x\n", Checksum);
-
- /* Fill out the ARC disk block */
- reactos_arc_disk_info[reactos_disk_count].Signature = Signature;
- reactos_arc_disk_info[reactos_disk_count].CheckSum = Checksum;
- sprintf(ArcName, "multi(0)disk(0)rdisk(%lu)", reactos_disk_count);
- strcpy(reactos_arc_strings[reactos_disk_count], ArcName);
- reactos_arc_disk_info[reactos_disk_count].ArcName =
- reactos_arc_strings[reactos_disk_count];
- reactos_disk_count++;
-
- sprintf(ArcName, "multi(0)disk(0)rdisk(%u)partition(0)", DriveNumber -
0x80);
- FsRegisterDevice(ArcName, &DiskVtbl);
-
- /* Add partitions */
- i = 1;
- DiskReportError(FALSE);
- while (DiskGetPartitionEntry(DriveNumber, i, &PartitionTableEntry))
- {
- if (PartitionTableEntry.SystemIndicator != PARTITION_ENTRY_UNUSED)
- {
- sprintf(ArcName, "multi(0)disk(0)rdisk(%u)partition(%lu)", DriveNumber -
0x80, i);
- FsRegisterDevice(ArcName, &DiskVtbl);
- }
- i++;
- }
- DiskReportError(TRUE);
-
- /* Convert checksum and signature to identifier string */
- Identifier[0] = Hex[(Checksum >> 28) & 0x0F];
- Identifier[1] = Hex[(Checksum >> 24) & 0x0F];
- Identifier[2] = Hex[(Checksum >> 20) & 0x0F];
- Identifier[3] = Hex[(Checksum >> 16) & 0x0F];
- Identifier[4] = Hex[(Checksum >> 12) & 0x0F];
- Identifier[5] = Hex[(Checksum >> 8) & 0x0F];
- Identifier[6] = Hex[(Checksum >> 4) & 0x0F];
- Identifier[7] = Hex[Checksum & 0x0F];
- Identifier[8] = '-';
- Identifier[9] = Hex[(Signature >> 28) & 0x0F];
- Identifier[10] = Hex[(Signature >> 24) & 0x0F];
- Identifier[11] = Hex[(Signature >> 20) & 0x0F];
- Identifier[12] = Hex[(Signature >> 16) & 0x0F];
- Identifier[13] = Hex[(Signature >> 12) & 0x0F];
- Identifier[14] = Hex[(Signature >> 8) & 0x0F];
- Identifier[15] = Hex[(Signature >> 4) & 0x0F];
- Identifier[16] = Hex[Signature & 0x0F];
- Identifier[17] = '-';
- Identifier[18] = 'A';
- Identifier[19] = 0;
- TRACE("Identifier: %s\n", Identifier);
-}
-
static UCHAR
GetFloppyCount(VOID)
{
@@ -810,37 +602,8 @@
UCHAR DiskCount;
USHORT i;
ULONG Size;
- BOOLEAN Changed;
-
- /* Count the number of visible drives */
- DiskReportError(FALSE);
- DiskCount = 0;
-
- /* 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
- * harddisks. So, we set the buffer to known contents first, then try to
- * read. If the BIOS reports success but the buffer contents haven't
- * changed then we fail anyway */
- memset((PVOID) DISKREADBUFFER, 0xcd, 512);
- while (MachDiskReadLogicalSectors(0x80 + DiskCount, 0ULL, 1,
(PVOID)DISKREADBUFFER))
- {
- Changed = FALSE;
- for (i = 0; ! Changed && i < 512; i++)
- {
- Changed = ((PUCHAR)DISKREADBUFFER)[i] != 0xcd;
- }
- if (! Changed)
- {
- TRACE("BIOS reports success for disk %d but data didn't
change\n",
- (int)DiskCount);
- break;
- }
- DiskCount++;
- memset((PVOID) DISKREADBUFFER, 0xcd, 512);
- }
- DiskReportError(TRUE);
- TRACE("BIOS reports %d harddisk%s\n",
- (int)DiskCount, (DiskCount == 1) ? "": "s");
+
+ DiskCount = PcBiosDiskCount;
/* Allocate resource descriptor */
Size = sizeof(CM_PARTIAL_RESOURCE_LIST) +
@@ -900,49 +663,11 @@
return SystemKey;
}
-static UCHAR
-GetDiskCount(PCONFIGURATION_COMPONENT_DATA BusKey)
-{
- PCONFIGURATION_COMPONENT_DATA System;
- ULONG ConfigurationDataLength;
- UCHAR DiskCount = 0;
-
- //
- // Get root component
- //
- System = BusKey;
- while (System->Parent)
- System = System->Parent;
-
- //
- // Get root configuration data length
- //
- ConfigurationDataLength = System->ComponentEntry.ConfigurationDataLength;
-
- //
- // We assume that nothing wrong happened, and that configuration
- // only consists of one CM_PARTIAL_RESOURCE_LIST entry, followed
- // by n entries of CM_INT13_DRIVE_PARAMETER
- //
- if (ConfigurationDataLength > 0)
- DiskCount = (UCHAR)((ConfigurationDataLength -
sizeof(CM_PARTIAL_RESOURCE_LIST))
- / sizeof(CM_INT13_DRIVE_PARAMETER));
-
- //
- // Return number of disks
- //
- TRACE("Retrieving %lu INT13 disks\\0\n", DiskCount);
- return DiskCount;
-};
-
static VOID
DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA BusKey)
{
PCONFIGURATION_COMPONENT_DATA DiskKey, ControllerKey;
- BOOLEAN BootDriveReported = FALSE;
ULONG i;
- UCHAR DiskCount = GetDiskCount(BusKey);
- CHAR BootPath[512];
FldrCreateComponentKey(BusKey,
ControllerClass,
@@ -957,19 +682,16 @@
TRACE("Created key: DiskController\\0\n");
/* Create and fill subkey for each harddisk */
- for (i = 0; i < DiskCount; i++)
+ for (i = 0; i < PcBiosDiskCount; i++)
{
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
ULONG Size;
- CHAR Identifier[20];
+ PCHAR Identifier;
UCHAR DriveNumber = 0x80 + (UCHAR)i;
-
- if (FrldrBootDrive == DriveNumber)
- BootDriveReported = TRUE;
/* Get disk values */
PartialResourceList = GetHarddiskConfigurationData(DriveNumber, &Size);
- GetHarddiskIdentifier(Identifier, DriveNumber);
+ Identifier = GetHarddiskIdentifier(DriveNumber);
/* Create disk key */
FldrCreateComponentKey(ControllerKey,
@@ -984,40 +706,6 @@
&DiskKey);
}
- /* Get the drive we're booting from */
- MachDiskGetBootPath(BootPath, sizeof(BootPath));
-
- /* Add it, if it's a floppy or cdrom */
- if ((FrldrBootDrive >= 0x80 && !BootDriveReported) ||
- DiskIsDriveRemovable(FrldrBootDrive))
- {
- /* TODO: Check if it's really a cdrom drive */
- ULONG* Buffer;
- ULONG Checksum = 0;
-
- /* Read the MBR */
- if (!MachDiskReadLogicalSectors(FrldrBootDrive, 16ULL, 1,
(PVOID)DISKREADBUFFER))
- {
- ERR("Reading MBR failed\n");
- return;
- }
-
- Buffer = (ULONG*)DISKREADBUFFER;
-
- /* Calculate the MBR checksum */
- for (i = 0; i < 2048 / sizeof(ULONG); i++) Checksum += Buffer[i];
- Checksum = ~Checksum + 1;
- TRACE("Checksum: %x\n", Checksum);
-
- /* Fill out the ARC disk block */
- reactos_arc_disk_info[reactos_disk_count].CheckSum = Checksum;
- strcpy(reactos_arc_strings[reactos_disk_count], BootPath);
- reactos_arc_disk_info[reactos_disk_count].ArcName =
- reactos_arc_strings[reactos_disk_count];
- reactos_disk_count++;
-
- FsRegisterDevice(BootPath, &DiskVtbl);
- }
}
static VOID
@@ -2019,6 +1707,8 @@
TRACE("DetectHardware()\n");
+ HwInitializeBiosDisks();
+
/* Create the 'System' key */
SystemKey = DetectSystem();
Added: trunk/reactos/boot/freeldr/freeldr/arch/i386/hwdisk.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/hwdisk.c (added)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/hwdisk.c [iso-8859-1] Thu Sep 29
21:12:40 2011
@@ -1,0 +1,342 @@
+/*
+ * FreeLoader
+ *
+ * Copyright (C) 2003, 2004 Eric Kohl
+ * Copyright (C) 2009 Hervé Poussineau
+ *
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <freeldr.h>
+
+#define NDEBUG
+#include <debug.h>
+
+DBG_DEFAULT_CHANNEL(HWDETECT);
+
+typedef struct tagDISKCONTEXT
+{
+ UCHAR DriveNumber;
+ ULONG SectorSize;
+ ULONGLONG SectorOffset;
+ ULONGLONG SectorCount;
+ ULONGLONG SectorNumber;
+} DISKCONTEXT;
+
+extern ULONG reactos_disk_count;
+extern ARC_DISK_SIGNATURE reactos_arc_disk_info[];
+extern char reactos_arc_strings[32][256];
+
+static CHAR Hex[] = "0123456789abcdef";
+UCHAR PcBiosDiskCount = 0;
+CHAR PcDiskIdentifier[32][20];
+
+
+static LONG DiskClose(ULONG FileId)
+{
+ DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+
+ MmHeapFree(Context);
+ return ESUCCESS;
+}
+
+static LONG DiskGetFileInformation(ULONG FileId, FILEINFORMATION* Information)
+{
+ DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+
+ RtlZeroMemory(Information, sizeof(FILEINFORMATION));
+ Information->EndingAddress.QuadPart = (Context->SectorOffset +
Context->SectorCount) * Context->SectorSize;
+ Information->CurrentAddress.QuadPart = (Context->SectorOffset +
Context->SectorNumber) * Context->SectorSize;
+
+ return ESUCCESS;
+}
+
+static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
+{
+ DISKCONTEXT* Context;
+ UCHAR DriveNumber;
+ ULONG DrivePartition, SectorSize;
+ ULONGLONG SectorOffset = 0;
+ ULONGLONG SectorCount = 0;
+ PARTITION_TABLE_ENTRY PartitionTableEntry;
+ CHAR FileName[1];
+
+ if (!DissectArcPath(Path, FileName, &DriveNumber, &DrivePartition))
+ return EINVAL;
+
+ if (DrivePartition == 0xff)
+ {
+ /* This is a CD-ROM device */
+ SectorSize = 2048;
+ }
+ else
+ {
+ /* This is either a floppy disk device (DrivePartition == 0) or
+ * a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF)
but
+ * it doesn't matter which one because they both have 512 bytes per sector
*/
+ SectorSize = 512;
+ }
+
+ if (DrivePartition != 0xff && DrivePartition != 0)
+ {
+ if (!DiskGetPartitionEntry(DriveNumber, DrivePartition,
&PartitionTableEntry))
+ return EINVAL;
+ SectorOffset = PartitionTableEntry.SectorCountBeforePartition;
+ SectorCount = PartitionTableEntry.PartitionSectorCount;
+ }
+
+ Context = MmHeapAlloc(sizeof(DISKCONTEXT));
+ if (!Context)
+ return ENOMEM;
+ Context->DriveNumber = DriveNumber;
+ Context->SectorSize = SectorSize;
+ Context->SectorOffset = SectorOffset;
+ Context->SectorCount = SectorCount;
+ Context->SectorNumber = 0;
+ FsSetDeviceSpecific(*FileId, Context);
+
+ return ESUCCESS;
+}
+
+static LONG DiskRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
+{
+ DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+ UCHAR* Ptr = (UCHAR*)Buffer;
+ ULONG i, Length;
+ BOOLEAN ret;
+
+ *Count = 0;
+ i = 0;
+ while (N > 0)
+ {
+ Length = N;
+ if (Length > Context->SectorSize)
+ Length = Context->SectorSize;
+ ret = MachDiskReadLogicalSectors(
+ Context->DriveNumber,
+ Context->SectorNumber + Context->SectorOffset + i,
+ 1,
+ (PVOID)DISKREADBUFFER);
+ if (!ret)
+ return EIO;
+ RtlCopyMemory(Ptr, (PVOID)DISKREADBUFFER, Length);
+ Ptr += Length;
+ *Count += Length;
+ N -= Length;
+ i++;
+ }
+
+ return ESUCCESS;
+}
+
+static LONG DiskSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode)
+{
+ DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+
+ if (SeekMode != SeekAbsolute)
+ return EINVAL;
+ if (Position->LowPart & (Context->SectorSize - 1))
+ return EINVAL;
+
+ /* FIXME: take HighPart into account */
+ Context->SectorNumber = Position->LowPart / Context->SectorSize;
+ return ESUCCESS;
+}
+
+static const DEVVTBL DiskVtbl = {
+ DiskClose,
+ DiskGetFileInformation,
+ DiskOpen,
+ DiskRead,
+ DiskSeek,
+};
+
+PCHAR
+GetHarddiskIdentifier(
+ UCHAR DriveNumber)
+{
+ return PcDiskIdentifier[DriveNumber - 0x80];
+}
+
+VOID
+GetHarddiskInformation(
+ UCHAR DriveNumber)
+{
+ PMASTER_BOOT_RECORD Mbr;
+ ULONG *Buffer;
+ ULONG i;
+ ULONG Checksum;
+ ULONG Signature;
+ CHAR ArcName[256];
+ PARTITION_TABLE_ENTRY PartitionTableEntry;
+ PCHAR Identifier = PcDiskIdentifier[DriveNumber - 0x80];
+
+ /* Read the MBR */
+ if (!MachDiskReadLogicalSectors(DriveNumber, 0ULL, 1, (PVOID)DISKREADBUFFER))
+ {
+ ERR("Reading MBR failed\n");
+ return;
+ }
+
+ Buffer = (ULONG*)DISKREADBUFFER;
+ Mbr = (PMASTER_BOOT_RECORD)DISKREADBUFFER;
+
+ Signature = Mbr->Signature;
+ TRACE("Signature: %x\n", Signature);
+
+ /* Calculate the MBR checksum */
+ Checksum = 0;
+ for (i = 0; i < 128; i++)
+ {
+ Checksum += Buffer[i];
+ }
+ Checksum = ~Checksum + 1;
+ TRACE("Checksum: %x\n", Checksum);
+
+ /* Fill out the ARC disk block */
+ reactos_arc_disk_info[reactos_disk_count].Signature = Signature;
+ reactos_arc_disk_info[reactos_disk_count].CheckSum = Checksum;
+ sprintf(ArcName, "multi(0)disk(0)rdisk(%lu)", reactos_disk_count);
+ strcpy(reactos_arc_strings[reactos_disk_count], ArcName);
+ reactos_arc_disk_info[reactos_disk_count].ArcName =
+ reactos_arc_strings[reactos_disk_count];
+ reactos_disk_count++;
+
+ sprintf(ArcName, "multi(0)disk(0)rdisk(%u)partition(0)", DriveNumber -
0x80);
+ FsRegisterDevice(ArcName, &DiskVtbl);
+
+ /* Add partitions */
+ i = 1;
+ DiskReportError(FALSE);
+ while (DiskGetPartitionEntry(DriveNumber, i, &PartitionTableEntry))
+ {
+ if (PartitionTableEntry.SystemIndicator != PARTITION_ENTRY_UNUSED)
+ {
+ sprintf(ArcName, "multi(0)disk(0)rdisk(%u)partition(%lu)",
DriveNumber - 0x80, i);
+ FsRegisterDevice(ArcName, &DiskVtbl);
+ }
+ i++;
+ }
+ DiskReportError(TRUE);
+
+ /* Convert checksum and signature to identifier string */
+ Identifier[0] = Hex[(Checksum >> 28) & 0x0F];
+ Identifier[1] = Hex[(Checksum >> 24) & 0x0F];
+ Identifier[2] = Hex[(Checksum >> 20) & 0x0F];
+ Identifier[3] = Hex[(Checksum >> 16) & 0x0F];
+ Identifier[4] = Hex[(Checksum >> 12) & 0x0F];
+ Identifier[5] = Hex[(Checksum >> 8) & 0x0F];
+ Identifier[6] = Hex[(Checksum >> 4) & 0x0F];
+ Identifier[7] = Hex[Checksum & 0x0F];
+ Identifier[8] = '-';
+ Identifier[9] = Hex[(Signature >> 28) & 0x0F];
+ Identifier[10] = Hex[(Signature >> 24) & 0x0F];
+ Identifier[11] = Hex[(Signature >> 20) & 0x0F];
+ Identifier[12] = Hex[(Signature >> 16) & 0x0F];
+ Identifier[13] = Hex[(Signature >> 12) & 0x0F];
+ Identifier[14] = Hex[(Signature >> 8) & 0x0F];
+ Identifier[15] = Hex[(Signature >> 4) & 0x0F];
+ Identifier[16] = Hex[Signature & 0x0F];
+ Identifier[17] = '-';
+ Identifier[18] = 'A';
+ Identifier[19] = 0;
+ TRACE("Identifier: %s\n", Identifier);
+}
+
+
+VOID
+HwInitializeBiosDisks(VOID)
+{
+ UCHAR DiskCount, DriveNumber;
+ ULONG i;
+ BOOLEAN Changed;
+ CHAR BootPath[512];
+ BOOLEAN BootDriveReported = FALSE;
+
+ /* Count the number of visible drives */
+ DiskReportError(FALSE);
+ DiskCount = 0;
+ 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
+ * harddisks. So, we set the buffer to known contents first, then try to
+ * read. If the BIOS reports success but the buffer contents haven't
+ * changed then we fail anyway */
+ memset((PVOID) DISKREADBUFFER, 0xcd, 512);
+ while (MachDiskReadLogicalSectors(DriveNumber, 0ULL, 1, (PVOID)DISKREADBUFFER))
+ {
+ Changed = FALSE;
+ for (i = 0; ! Changed && i < 512; i++)
+ {
+ Changed = ((PUCHAR)DISKREADBUFFER)[i] != 0xcd;
+ }
+ if (! Changed)
+ {
+ TRACE("BIOS reports success for disk %d but data didn't
change\n",
+ (int)DiskCount);
+ break;
+ }
+
+ GetHarddiskInformation(DriveNumber);
+
+ if (FrldrBootDrive == DriveNumber)
+ BootDriveReported = TRUE;
+
+ DiskCount++;
+ DriveNumber++;
+ memset((PVOID) DISKREADBUFFER, 0xcd, 512);
+ }
+ DiskReportError(TRUE);
+ TRACE("BIOS reports %d harddisk%s\n",
+ (int)DiskCount, (DiskCount == 1) ? "": "s");
+
+ /* Get the drive we're booting from */
+ MachDiskGetBootPath(BootPath, sizeof(BootPath));
+
+ /* Add it, if it's a floppy or cdrom */
+ if ((FrldrBootDrive >= 0x80 && !BootDriveReported) ||
+ DiskIsDriveRemovable(FrldrBootDrive))
+ {
+ /* TODO: Check if it's really a cdrom drive */
+ ULONG* Buffer;
+ ULONG Checksum = 0;
+
+ /* Read the MBR */
+ if (!MachDiskReadLogicalSectors(FrldrBootDrive, 16ULL, 1,
(PVOID)DISKREADBUFFER))
+ {
+ ERR("Reading MBR failed\n");
+ return;
+ }
+
+ Buffer = (ULONG*)DISKREADBUFFER;
+
+ /* Calculate the MBR checksum */
+ for (i = 0; i < 2048 / sizeof(ULONG); i++) Checksum += Buffer[i];
+ Checksum = ~Checksum + 1;
+ TRACE("Checksum: %x\n", Checksum);
+
+ /* Fill out the ARC disk block */
+ reactos_arc_disk_info[reactos_disk_count].CheckSum = Checksum;
+ strcpy(reactos_arc_strings[reactos_disk_count], BootPath);
+ reactos_arc_disk_info[reactos_disk_count].ArcName =
+ reactos_arc_strings[reactos_disk_count];
+ reactos_disk_count++;
+
+ FsRegisterDevice(BootPath, &DiskVtbl);
+ }
+
+ PcBiosDiskCount = DiskCount;
+}
Propchange: trunk/reactos/boot/freeldr/freeldr/arch/i386/hwdisk.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/boot/freeldr/freeldr/debug.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/debug…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/debug.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/debug.c [iso-8859-1] Thu Sep 29 21:12:40 2011
@@ -289,7 +289,6 @@
}
//DECLSPEC_NORETURN
-NTKERNELAPI
VOID
NTAPI
KeBugCheckEx(
Modified: trunk/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/freel…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild [iso-8859-1] Thu Sep 29
21:12:40 2011
@@ -19,6 +19,7 @@
<file>hardware.c</file>
<file>hwacpi.c</file>
<file>hwapm.c</file>
+ <file>hwdisk.c</file>
<file>hwpci.c</file>
<file>i386bug.c</file>
<file>i386disk.c</file>
Modified: trunk/reactos/boot/freeldr/freeldr/inifile/ini_init.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/inifi…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/inifile/ini_init.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/inifile/ini_init.c [iso-8859-1] Thu Sep 29
21:12:40 2011
@@ -18,6 +18,8 @@
*/
#include <freeldr.h>
+#include <debug.h>
+DBG_DEFAULT_CHANNEL(INIFILE);
static LONG IniOpenIniFile(ULONG* FileId)
{
@@ -44,6 +46,7 @@
ULONG FreeLoaderIniFileSize, Count;
LONG ret;
BOOLEAN Success;
+ TRACE("IniFileInitialize()\n");
//
// Open freeldr.ini