ReactOS 0.4.16-dev-2104-gb84fa49
xboxdisk.c File Reference
#include <freeldr.h>
#include <hwide.h>
#include <debug.h>
Include dependency graph for xboxdisk.c:

Go to the source code of this file.

Functions

 DBG_DEFAULT_CHANNEL (DISK)
 
LONG DiskReportError (BOOLEAN bShowError)
 
static VOID DiskError (PCSTR ErrorString, ULONG ErrorCode)
 
static VOID XboxDiskInit (VOID)
 
static PDEVICE_UNIT XboxDiskDriveNumberToDeviceUnit (UCHAR DriveNumber)
 
BOOLEAN DiskResetController (UCHAR DriveNumber)
 
CONFIGURATION_TYPE DiskGetConfigType (_In_ UCHAR DriveNumber)
 
VOID __cdecl DiskStopFloppyMotor (VOID)
 
BOOLEAN XboxDiskReadLogicalSectors (IN UCHAR DriveNumber, IN ULONGLONG SectorNumber, IN ULONG SectorCount, OUT PVOID Buffer)
 
BOOLEAN XboxDiskGetDriveGeometry (UCHAR DriveNumber, PGEOMETRY Geometry)
 
ULONG XboxDiskGetCacheableBlockCount (UCHAR DriveNumber)
 

Variables

static PDEVICE_UNIT HardDrive = NULL
 
static PDEVICE_UNIT CdDrive = NULL
 
static BOOLEAN AtaInitialized = FALSE
 
static LONG lReportError = 0
 

Function Documentation

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( DISK  )

◆ DiskError()

static VOID DiskError ( PCSTR  ErrorString,
ULONG  ErrorCode 
)
static

Definition at line 45 of file xboxdisk.c.

46{
47 CHAR ErrorCodeString[200];
48
49 if (lReportError < 0)
50 return;
51
52#if 0 // TODO: ATA/IDE error code descriptions.
53 sprintf(ErrorCodeString, "%s\n\nError Code: 0x%lx\nError: %s",
55#else
57 sprintf(ErrorCodeString, "%s", ErrorString);
58#endif
59
60 ERR("%s\n", ErrorCodeString);
61 UiMessageBox(ErrorCodeString);
62}
#define ERR(fmt,...)
Definition: precomp.h:57
VOID UiMessageBox(_In_ PCSTR Format,...)
Definition: ui.c:359
#define sprintf
Definition: sprintf.c:45
_In_ NDIS_ERROR_CODE ErrorCode
Definition: ndis.h:4436
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
static PCSTR DiskGetErrorCodeString(ULONG ErrorCode)
Definition: pcdisk.c:144
static LONG lReportError
Definition: xboxdisk.c:25
char CHAR
Definition: xmlstorage.h:175

Referenced by XboxDiskReadLogicalSectors().

◆ DiskGetConfigType()

CONFIGURATION_TYPE DiskGetConfigType ( _In_ UCHAR  DriveNumber)

Definition at line 129 of file xboxdisk.c.

131{
132 PDEVICE_UNIT DeviceUnit;
133
134 DeviceUnit = XboxDiskDriveNumberToDeviceUnit(DriveNumber);
135 if (!DeviceUnit)
136 return -1; // MaximumType;
137
138 if (DeviceUnit == CdDrive) // (DeviceUnit->Flags & ATA_DEVICE_ATAPI)
139 return CdromController;
140 else // if (DeviceUnit == HardDrive)
141 return DiskPeripheral;
142}
@ DiskPeripheral
Definition: arc.h:138
@ CdromController
Definition: arc.h:128
Data structure for the ATA device.
Definition: hwide.h:12
static PDEVICE_UNIT XboxDiskDriveNumberToDeviceUnit(UCHAR DriveNumber)
Definition: xboxdisk.c:101
static PDEVICE_UNIT CdDrive
Definition: xboxdisk.c:20

◆ DiskReportError()

LONG DiskReportError ( BOOLEAN  bShowError)

Definition at line 27 of file xboxdisk.c.

28{
29 /* Set the reference count */
30 if (bShowError) ++lReportError;
31 else --lReportError;
32 return lReportError;
33}

◆ DiskResetController()

BOOLEAN DiskResetController ( UCHAR  DriveNumber)

Definition at line 121 of file xboxdisk.c.

122{
123 WARN("DiskResetController(0x%x) DISK OPERATION FAILED -- RESETTING CONTROLLER\n", DriveNumber);
124 /* No-op on XBOX */
125 return TRUE;
126}
#define WARN(fmt,...)
Definition: precomp.h:61
#define TRUE
Definition: types.h:120

◆ DiskStopFloppyMotor()

VOID __cdecl DiskStopFloppyMotor ( VOID  )

Definition at line 145 of file xboxdisk.c.

146{
147 /* No-op on XBOX */
148}

◆ XboxDiskDriveNumberToDeviceUnit()

static PDEVICE_UNIT XboxDiskDriveNumberToDeviceUnit ( UCHAR  DriveNumber)
inlinestatic

Definition at line 101 of file xboxdisk.c.

102{
103 /* Xbox has only 1 IDE controller and no floppy */
104 if (DriveNumber < 0x80 || (DriveNumber & 0x0F) >= 2)
105 return NULL;
106
107 if (!AtaInitialized)
108 XboxDiskInit();
109
110 /* HDD */
111 if ((DriveNumber == 0x80) && HardDrive)
112 return HardDrive;
113
114 /* CD */
115 if (((DriveNumber & 0xF0) > 0x80) && CdDrive)
116 return CdDrive;
117
118 return NULL;
119}
#define NULL
Definition: types.h:112
static PDEVICE_UNIT HardDrive
Definition: xboxdisk.c:19
static BOOLEAN AtaInitialized
Definition: xboxdisk.c:21
static VOID XboxDiskInit(VOID)
Definition: xboxdisk.c:68

Referenced by DiskGetConfigType(), XboxDiskGetCacheableBlockCount(), XboxDiskGetDriveGeometry(), and XboxDiskReadLogicalSectors().

◆ XboxDiskGetCacheableBlockCount()

ULONG XboxDiskGetCacheableBlockCount ( UCHAR  DriveNumber)

Definition at line 194 of file xboxdisk.c.

195{
196 PDEVICE_UNIT DeviceUnit;
197
198 DeviceUnit = XboxDiskDriveNumberToDeviceUnit(DriveNumber);
199 if (!DeviceUnit)
200 return 1; // Unknown count.
201
202 /*
203 * If LBA is supported then the block size will be 64 sectors (32k).
204 * If not then the block size is the size of one track.
205 */
206 if (DeviceUnit->Flags & ATA_DEVICE_LBA)
207 return 64;
208 else
209 return DeviceUnit->SectorsPerTrack;
210}
#define ATA_DEVICE_LBA
Definition: hwide.h:31
ULONG SectorsPerTrack
Definition: hwide.h:20
ULONG Flags
Definition: hwide.h:29

Referenced by MachInit().

◆ XboxDiskGetDriveGeometry()

BOOLEAN XboxDiskGetDriveGeometry ( UCHAR  DriveNumber,
PGEOMETRY  Geometry 
)

Definition at line 174 of file xboxdisk.c.

175{
176 PDEVICE_UNIT DeviceUnit;
177
178 TRACE("XboxDiskGetDriveGeometry(0x%x)\n", DriveNumber);
179
180 DeviceUnit = XboxDiskDriveNumberToDeviceUnit(DriveNumber);
181 if (!DeviceUnit)
182 return FALSE;
183
184 Geometry->Cylinders = DeviceUnit->Cylinders;
185 Geometry->Heads = DeviceUnit->Heads;
186 Geometry->SectorsPerTrack = DeviceUnit->SectorsPerTrack;
187 Geometry->BytesPerSector = DeviceUnit->SectorSize;
188 Geometry->Sectors = DeviceUnit->TotalSectors;
189
190 return TRUE;
191}
#define FALSE
Definition: types.h:117
#define TRACE(s)
Definition: solgame.cpp:4
ULONG Cylinders
Definition: hwide.h:14
ULONG SectorSize
Definition: hwide.h:23
ULONG64 TotalSectors
Definition: hwide.h:26
ULONG Heads
Definition: hwide.h:17
ULONG BytesPerSector
Number of bytes per sector.
Definition: disk.h:30
ULONG Cylinders
Number of cylinders on the disk.
Definition: disk.h:27
ULONGLONG Sectors
Total number of disk sectors/LBA blocks.
Definition: disk.h:31
ULONG SectorsPerTrack
Number of sectors per track.
Definition: disk.h:29
ULONG Heads
Number of heads on the disk.
Definition: disk.h:28

Referenced by MachInit(), and XboxGetHarddiskConfigurationData().

◆ XboxDiskInit()

static VOID XboxDiskInit ( VOID  )
static

Definition at line 68 of file xboxdisk.c.

69{
70 UCHAR DetectedCount;
71 UCHAR UnitNumber;
72 PDEVICE_UNIT DeviceUnit = NULL;
73
75
77
78 /* Find first HDD and CD */
79 AtaInit(&DetectedCount);
80 for (UnitNumber = 0; UnitNumber <= DetectedCount; UnitNumber++)
81 {
82 DeviceUnit = AtaGetDevice(UnitNumber);
83 if (DeviceUnit)
84 {
85 if (DeviceUnit->Flags & ATA_DEVICE_ATAPI)
86 {
87 if (!CdDrive)
88 CdDrive = DeviceUnit;
89 }
90 else
91 {
92 if (!HardDrive)
93 HardDrive = DeviceUnit;
94 }
95 }
96 }
97}
PDEVICE_UNIT AtaGetDevice(_In_ UCHAR UnitNumber)
Definition: hwide.c:1254
BOOLEAN AtaInit(_Out_ PUCHAR DetectedCount)
Definition: hwide.c:1264
#define ATA_DEVICE_ATAPI
Definition: hwide.h:30
#define ASSERT(a)
Definition: mode.c:44
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by XboxDiskDriveNumberToDeviceUnit().

◆ XboxDiskReadLogicalSectors()

BOOLEAN XboxDiskReadLogicalSectors ( IN UCHAR  DriveNumber,
IN ULONGLONG  SectorNumber,
IN ULONG  SectorCount,
OUT PVOID  Buffer 
)

Definition at line 151 of file xboxdisk.c.

156{
157 PDEVICE_UNIT DeviceUnit;
159
160 TRACE("XboxDiskReadLogicalSectors() DriveNumber: 0x%x SectorNumber: %I64u SectorCount: %u Buffer: 0x%x\n",
161 DriveNumber, SectorNumber, SectorCount, Buffer);
162
163 DeviceUnit = XboxDiskDriveNumberToDeviceUnit(DriveNumber);
164 if (!DeviceUnit)
165 return FALSE;
166
167 Success = AtaReadLogicalSectors(DeviceUnit, SectorNumber, SectorCount, Buffer);
168 if (!Success)
169 DiskError("Disk Read Failed", -1);
170 return Success;
171}
unsigned char BOOLEAN
Definition: bufpool.h:45
@ Success
Definition: eventcreate.c:712
BOOLEAN AtaReadLogicalSectors(_In_ PDEVICE_UNIT DeviceUnit, _In_ ULONG64 SectorNumber, _In_ ULONG SectorCount, _Out_writes_bytes_all_(SectorCount *DeviceUnit->SectorSize) PVOID Buffer)
Definition: hwide.c:1215
ULONG SectorCount
Definition: part_xbox.c:31
static VOID DiskError(PCSTR ErrorString, ULONG ErrorCode)
Definition: xboxdisk.c:45

Referenced by MachInit().

Variable Documentation

◆ AtaInitialized

BOOLEAN AtaInitialized = FALSE
static

Definition at line 21 of file xboxdisk.c.

Referenced by XboxDiskDriveNumberToDeviceUnit(), and XboxDiskInit().

◆ CdDrive

PDEVICE_UNIT CdDrive = NULL
static

Definition at line 20 of file xboxdisk.c.

Referenced by DiskGetConfigType(), XboxDiskDriveNumberToDeviceUnit(), and XboxDiskInit().

◆ HardDrive

PDEVICE_UNIT HardDrive = NULL
static

Definition at line 19 of file xboxdisk.c.

Referenced by XboxDiskDriveNumberToDeviceUnit(), and XboxDiskInit().

◆ lReportError

LONG lReportError = 0
static

Definition at line 25 of file xboxdisk.c.

Referenced by DiskError(), and DiskReportError().