19#define MAX_DRIVES 0x100
44 case 0x00:
return "No error";
45 case 0x10:
return "Drive write protection error";
46 case 0x20:
return "DMA access across 64 kB boundary";
47 case 0x30:
return "End of cylinder";
48 case 0x40:
return "The drive name is invalid or the device have low health";
49 case 0x50:
return "Time out, data not written";
50 case 0x60:
return "Time out, drive not ready";
53 return "Illegal disk address";
55 return "Drive write protection error";
56 case 0x80:
return "Undefined error";
57 case 0x90:
return "Time out error";
58 case 0xA0:
return "CRC error in the ID section";
59 case 0xB0:
return "CRC error in the DATA section";
62 return "Seek failure";
64 return "No data (Sector not found)";
65 case 0xD0:
return "Bad cylinder";
66 case 0xE0:
return "No ID address mark was found";
67 case 0xF0:
return "No DATA address mark was found";
69 default:
return "Unknown error code";
76 CHAR ErrorCodeString[200];
81 RtlStringCbPrintfA(ErrorCodeString,
sizeof(ErrorCodeString),
"%s\n\nError Code: 0x%lx\nError: %s",
84 ERR(
"%s\n", ErrorCodeString);
128 WARN(
"DiskResetController(0x%x) DISK OPERATION FAILED -- RESETTING CONTROLLER\n", DiskDrive->DaUa);
130 Regs.
b.
al = DiskDrive->DaUa;
131 Int386(0x1B, &Regs, &Regs);
161 switch (BytesPerSector)
185 REGS RegsIn, RegsOut;
209 RegsIn.
b.
al = DiskDrive->DaUa;
212 RegsIn.
w.
cx = SectorNumber & 0xFFFF;
213 RegsIn.
w.
dx = (SectorNumber >> 16) & 0xFFFF;
218 for (RetryCount = 0; RetryCount < 3; RetryCount++)
220 Int386(0x1B, &RegsIn, &RegsOut);
233 DiskError(
"Disk Read Failed in LBA mode", RegsOut.
b.
ah);
234 ERR(
"Disk Read Failed in LBA mode: %x (%s) (DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d)\n",
248 UCHAR PhysicalSector;
252 ULONG NumberOfSectorsToRead;
253 REGS RegsIn, RegsOut;
256 DriveGeometry = DiskDrive->Geometry;
273 if (PhysicalSector > 1)
284 if ((PhysicalHead >= DriveGeometry.
Heads) ||
285 (PhysicalTrack >= DriveGeometry.
Cylinders) ||
286 ((NumberOfSectorsToRead + PhysicalSector) > (DriveGeometry.
SectorsPerTrack + 1)) ||
289 DiskError(
"Disk read exceeds drive geometry limits.", 0);
311 RegsIn.
b.
al = DiskDrive->DaUa;
314 RegsIn.
b.
cl = PhysicalTrack & 0xFFFF;
316 RegsIn.
b.
dl = PhysicalSector;
317 RegsIn.
b.
dh = PhysicalHead;
338 RegsIn.
b.
al = DiskDrive->DaUa;
341 RegsIn.
w.
cx = PhysicalTrack & 0xFFFF;
342 RegsIn.
b.
dl = PhysicalSector;
343 RegsIn.
b.
dh = PhysicalHead;
349 for (RetryCount = 0; RetryCount < 3; RetryCount++)
351 Int386(0x1B, &RegsIn, &RegsOut);
359 else if (RegsOut.
b.
ah == 0x08)
374 DiskError(
"Disk Read Failed in CHS mode, after retrying 3 times", RegsOut.
b.
ah);
375 ERR(
"Disk Read Failed in CHS mode, after retrying 3 times: %x (%s) (DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d)\n",
383 SectorNumber += NumberOfSectorsToRead;
394 REGS RegsIn, RegsOut;
395 UCHAR UnitAddress = DaUa & 0x0F;
401 if (DiskEquipment & (1 << UnitAddress))
419 Int386(0x1B, &RegsIn, &RegsOut);
422 DiskDrive->Initialized =
FALSE;
426 DiskDrive->Geometry.Cylinders = RegsOut.
w.
cx;
427 DiskDrive->Geometry.Heads = RegsOut.
b.
dh;
428 DiskDrive->Geometry.SectorsPerTrack = RegsOut.
b.
dl;
429 DiskDrive->Geometry.BytesPerSector = RegsOut.
w.
bx;
430 DiskDrive->LBASupported =
FALSE;
431 DiskDrive->IsRemovable =
FALSE;
434 else if (ScsiParameters)
441 DiskDrive->Geometry.Cylinders = 0xFFFF;
442 DiskDrive->Geometry.Heads = 0xFFFF;
443 DiskDrive->Geometry.SectorsPerTrack = 0xFFFF;
444 DiskDrive->Geometry.BytesPerSector = 2048;
446 DiskDrive->LBASupported =
TRUE;
447 DiskDrive->IsRemovable =
TRUE;
452 DiskDrive->Geometry.Cylinders = 0xFFFF;
453 DiskDrive->Geometry.Heads = 8;
454 DiskDrive->Geometry.SectorsPerTrack = 32;
455 DiskDrive->Geometry.BytesPerSector = 512;
457 DiskDrive->LBASupported =
TRUE;
458 DiskDrive->IsRemovable =
TRUE;
462 DiskDrive->Initialized =
FALSE;
468 DiskDrive->Initialized =
FALSE;
472 DiskDrive->Geometry.Sectors = (
ULONGLONG)DiskDrive->Geometry.Cylinders *
473 DiskDrive->Geometry.Heads *
474 DiskDrive->Geometry.SectorsPerTrack;
476 DiskDrive->DaUa = DaUa;
478 DiskDrive->Initialized =
TRUE;
480 TRACE(
"InitScsiDrive(0x%x) returned:\n"
483 "Sects/Track: 0x%x\n"
484 "Bytes/Sect : 0x%x\n",
486 DiskDrive->Geometry.Cylinders,
487 DiskDrive->Geometry.Heads,
488 DiskDrive->Geometry.SectorsPerTrack,
489 DiskDrive->Geometry.BytesPerSector);
504 DiskDrive->Geometry.Cylinders = DeviceUnit->
Cylinders;
505 DiskDrive->Geometry.Heads = DeviceUnit->
Heads;
506 DiskDrive->Geometry.SectorsPerTrack = DeviceUnit->
Sectors;
507 DiskDrive->Geometry.BytesPerSector = DeviceUnit->
SectorSize;
510 DiskDrive->DaUa = 0xFF;
511 DiskDrive->IdeUnitNumber = UnitNumber;
513 DiskDrive->LBASupported =
TRUE;
514 DiskDrive->IsRemovable =
TRUE;
515 DiskDrive->Initialized =
TRUE;
517 TRACE(
"InitIdeDrive(0x%x) returned:\n"
520 "Sects/Track: 0x%x\n"
521 "Bytes/Sect : 0x%x\n",
523 DiskDrive->Geometry.Cylinders,
524 DiskDrive->Geometry.Heads,
525 DiskDrive->Geometry.SectorsPerTrack,
526 DiskDrive->Geometry.BytesPerSector);
531 DiskDrive->Initialized =
FALSE;
540 REGS RegsIn, RegsOut;
550 Int386(0x1B, &RegsIn, &RegsOut);
568 Int386(0x1B, &RegsIn, &RegsOut);
571 DiskDrive->Initialized =
FALSE;
575 DiskDrive->Geometry.Cylinders = RegsOut.
w.
cx;
576 DiskDrive->Geometry.Heads = RegsOut.
b.
dh;
577 DiskDrive->Geometry.SectorsPerTrack = RegsOut.
b.
dl;
578 DiskDrive->Geometry.BytesPerSector = RegsOut.
w.
bx;
580 DiskDrive->Geometry.Sectors = (
ULONGLONG)DiskDrive->Geometry.Cylinders *
581 DiskDrive->Geometry.Heads *
582 DiskDrive->Geometry.SectorsPerTrack;
584 DiskDrive->DaUa = DaUa;
586 DiskDrive->LBASupported =
FALSE;
587 DiskDrive->IsRemovable =
FALSE;
588 DiskDrive->Initialized =
TRUE;
590 TRACE(
"InitHardDrive(0x%x) returned:\n"
593 "Sects/Track: 0x%x\n"
594 "Bytes/Sect : 0x%x\n",
596 DiskDrive->Geometry.Cylinders,
597 DiskDrive->Geometry.Heads,
598 DiskDrive->Geometry.SectorsPerTrack,
599 DiskDrive->Geometry.BytesPerSector);
609 REGS RegsIn, RegsOut;
631 Int386(0x1B, &RegsIn, &RegsOut);
634 DiskDrive->Initialized =
FALSE;
638 BytesPerSector = 128 << RegsOut.
b.
ch;
639 switch (BytesPerSector)
645 DiskDrive->Geometry.Cylinders = 80;
646 DiskDrive->Geometry.Heads = 2;
647 DiskDrive->Geometry.SectorsPerTrack = 16;
652 DiskDrive->Geometry.Cylinders = 77;
653 DiskDrive->Geometry.Heads = 2;
654 DiskDrive->Geometry.SectorsPerTrack = 26;
662 DiskDrive->Geometry.Cylinders = 80;
663 DiskDrive->Geometry.Heads = 2;
664 DiskDrive->Geometry.SectorsPerTrack = 18;
669 DiskDrive->Geometry.Cylinders = 80;
670 DiskDrive->Geometry.Heads = 2;
671 DiskDrive->Geometry.SectorsPerTrack = 8;
676 DiskDrive->Geometry.Cylinders = 80;
677 DiskDrive->Geometry.Heads = 2;
678 DiskDrive->Geometry.SectorsPerTrack = 15;
684 DiskDrive->Geometry.Cylinders = 77;
685 DiskDrive->Geometry.Heads = 2;
686 DiskDrive->Geometry.SectorsPerTrack = 8;
690 DiskDrive->Initialized =
FALSE;
694 DiskDrive->Geometry.BytesPerSector = BytesPerSector;
695 DiskDrive->Geometry.Sectors = (
ULONGLONG)DiskDrive->Geometry.Cylinders *
696 DiskDrive->Geometry.Heads *
697 DiskDrive->Geometry.SectorsPerTrack;
699 DiskDrive->DaUa = DaUa;
701 DiskDrive->LBASupported =
FALSE;
702 DiskDrive->IsRemovable =
TRUE;
703 DiskDrive->Initialized =
TRUE;
705 TRACE(
"InitFloppyDrive(0x%x) returned:\n"
708 "Sects/Track: 0x%x\n"
709 "Bytes/Sect : 0x%x\n",
711 DiskDrive->Geometry.Cylinders,
712 DiskDrive->Geometry.Heads,
713 DiskDrive->Geometry.SectorsPerTrack,
714 DiskDrive->Geometry.BytesPerSector);
724 UCHAR FakeFloppyDriveNumber = 0x30;
725 UCHAR FakeHardDriveDriveNumber = 0x80;
726 UCHAR FakeCdRomDriveNumber = 0xE0;
728 UCHAR IdeDetectedCount;
731 TRACE(
"Pc98InitializeBootDevices()\n");
744 for (
i = 0;
i < 4;
i++)
751 ++FakeFloppyDriveNumber;
755 for (
i = 0;
i < 4;
i++)
761 ++FakeFloppyDriveNumber;
765 for (
i = 0;
i < 4;
i++)
771 ++FakeFloppyDriveNumber;
777 for (
i = 0;
i < 4;
i++)
781 ++FakeHardDriveDriveNumber;
785 for (
i = 0;
i <= IdeDetectedCount;
i++)
789 ++FakeCdRomDriveNumber;
794 for (
i = 0;
i < 7;
i++)
804 ++FakeCdRomDriveNumber;
808 ++FakeHardDriveDriveNumber;
846 TRACE(
"Pc98DiskReadLogicalSectors() DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d Buffer: 0x%x\n",
859 TRACE(
"--> Using LBA\n");
865 TRACE(
"--> Using CHS\n");
875 TRACE(
"Pc98DiskGetDriveGeometry(0x%x)\n", DriveNumber);
#define DBG_DEFAULT_CHANNEL(ch)
VOID UiMessageBox(_In_ PCSTR Format,...)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
_In_ PUSB_DEVICE_HANDLE _Out_ PUSHORT DeviceAddress
BOOLEAN PcInitializeBootDevices(VOID)
PDEVICE_UNIT AtaGetDevice(IN UCHAR UnitNumber)
BOOLEAN AtaAtapiReadLogicalSectorsLBA(IN OUT PDEVICE_UNIT DeviceUnit, IN ULONGLONG SectorNumber, IN ULONG SectorCount, OUT PVOID Buffer)
BOOLEAN AtaInit(OUT PUCHAR DetectedCount)
_In_ NDIS_ERROR_CODE ErrorCode
NTSTRSAFEVAPI RtlStringCbPrintfA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,...)
ULONG Pc98DiskGetCacheableBlockCount(UCHAR DriveNumber)
static BOOLEAN InitHardDrive(IN UCHAR DaUa, IN OUT PPC98_DISK_DRIVE DiskDrive)
static PCSTR DiskGetErrorCodeString(ULONG ErrorCode)
PPC98_DISK_DRIVE Pc98DiskDriveNumberToDrive(IN UCHAR DriveNumber)
PC98_DISK_DRIVE Pc98DiskDrive[MAX_DRIVES]
static BOOLEAN Pc98DiskReadLogicalSectorsLBA(IN PPC98_DISK_DRIVE DiskDrive, IN ULONGLONG SectorNumber, IN ULONG SectorCount, OUT PVOID Buffer)
BOOLEAN DiskResetController(IN PPC98_DISK_DRIVE DiskDrive)
LONG DiskReportError(BOOLEAN bShowError)
VOID Pc98DiskPrepareForReactOS(VOID)
BOOLEAN Pc98InitializeBootDevices(VOID)
static BOOLEAN InitFloppyDrive(IN UCHAR DaUa, IN OUT PPC98_DISK_DRIVE DiskDrive)
BOOLEAN Pc98DiskReadLogicalSectors(IN UCHAR DriveNumber, IN ULONGLONG SectorNumber, IN ULONG SectorCount, OUT PVOID Buffer)
static BOOLEAN Pc98DiskReadLogicalSectorsCHS(IN PPC98_DISK_DRIVE DiskDrive, IN ULONGLONG SectorNumber, IN ULONG SectorCount, OUT PVOID Buffer)
static BOOLEAN InitIdeDrive(IN UCHAR UnitNumber, IN OUT PPC98_DISK_DRIVE DiskDrive)
static BOOLEAN InitScsiDrive(IN UCHAR DaUa, IN OUT PPC98_DISK_DRIVE DiskDrive)
static UCHAR BytesPerSectorToSectorLengthCode(IN ULONG BytesPerSector)
BOOLEAN Pc98DiskGetDriveGeometry(UCHAR DriveNumber, PGEOMETRY Geometry)
static VOID DiskError(PCSTR ErrorString, ULONG ErrorCode)
#define INT386_SUCCESS(regs)
int __cdecl Int386(int ivec, REGS *in, REGS *out)
ULONG BytesPerSector
Number of bytes per sector.
ULONG Cylinders
Number of cylinders on the disk.
ULONG SectorsPerTrack
Number of sectors per track.
ULONG Heads
Number of heads on the disk.
#define RtlZeroMemory(Destination, Length)
#define SECONDBYTE(VALUE)