mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 09:34:43 +00:00
Fix harddisk detection for seriously broken BIOS
svn path=/trunk/; revision=12197
This commit is contained in:
parent
e8861acfb2
commit
2fa970d484
1 changed files with 20 additions and 0 deletions
|
@ -642,13 +642,33 @@ DetectBiosDisks(HKEY SystemKey,
|
||||||
U32 Size;
|
U32 Size;
|
||||||
U32 i;
|
U32 i;
|
||||||
S32 Error;
|
S32 Error;
|
||||||
|
BOOL Changed;
|
||||||
|
|
||||||
/* Count the number of visible drives */
|
/* Count the number of visible drives */
|
||||||
DiskReportError(FALSE);
|
DiskReportError(FALSE);
|
||||||
DiskCount = 0;
|
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))
|
while (MachDiskReadLogicalSectors(0x80 + DiskCount, 0ULL, 1, (PVOID)DISKREADBUFFER))
|
||||||
{
|
{
|
||||||
|
Changed = FALSE;
|
||||||
|
for (i = 0; ! Changed && i < 512; i++)
|
||||||
|
{
|
||||||
|
Changed = ((PUCHAR)DISKREADBUFFER)[i] != 0xcd;
|
||||||
|
}
|
||||||
|
if (! Changed)
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_HWDETECT, "BIOS reports success for disk %d but data didn't change\n",
|
||||||
|
(int)DiskCount));
|
||||||
|
break;
|
||||||
|
}
|
||||||
DiskCount++;
|
DiskCount++;
|
||||||
|
memset((PVOID) DISKREADBUFFER, 0xcd, 512);
|
||||||
}
|
}
|
||||||
DiskReportError(TRUE);
|
DiskReportError(TRUE);
|
||||||
DbgPrint((DPRINT_HWDETECT, "BIOS reports %d harddisk%s\n",
|
DbgPrint((DPRINT_HWDETECT, "BIOS reports %d harddisk%s\n",
|
||||||
|
|
Loading…
Reference in a new issue