ReactOS 0.4.15-dev-7089-gea8a49d
hwdisk.c File Reference
#include <freeldr.h>
#include <debug.h>
Include dependency graph for hwdisk.c:

Go to the source code of this file.

Classes

struct  tagDISKCONTEXT
 

Typedefs

typedef struct tagDISKCONTEXT DISKCONTEXT
 

Functions

 DBG_DEFAULT_CHANNEL (HWDETECT)
 
static ARC_STATUS DiskClose (ULONG FileId)
 
static ARC_STATUS DiskGetFileInformation (ULONG FileId, FILEINFORMATION *Information)
 
static ARC_STATUS DiskOpen (CHAR *Path, OPENMODE OpenMode, ULONG *FileId)
 
static ARC_STATUS DiskRead (ULONG FileId, VOID *Buffer, ULONG N, ULONG *Count)
 
static ARC_STATUS DiskSeek (ULONG FileId, LARGE_INTEGER *Position, SEEKMODE SeekMode)
 
PCHAR GetHarddiskIdentifier (UCHAR DriveNumber)
 
static VOID GetHarddiskInformation (UCHAR DriveNumber)
 
static UCHAR EnumerateHarddisks (OUT PBOOLEAN BootDriveReported)
 
static BOOLEAN DiskIsDriveRemovable (UCHAR DriveNumber)
 
static BOOLEAN DiskGetBootPath (BOOLEAN IsPxe)
 
BOOLEAN PcInitializeBootDevices (VOID)
 

Variables

static const CHAR Hex [] = "0123456789abcdef"
 
UCHAR PcBiosDiskCount = 0
 
static CHAR PcDiskIdentifier [32][20]
 
PVOID DiskReadBuffer
 
SIZE_T DiskReadBufferSize
 
static const DEVVTBL DiskVtbl
 

Typedef Documentation

◆ DISKCONTEXT

Function Documentation

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( HWDETECT  )

◆ DiskClose()

static ARC_STATUS DiskClose ( ULONG  FileId)
static

Definition at line 53 of file hwdisk.c.

54{
57 return ESUCCESS;
58}
VOID * FsGetDeviceSpecific(ULONG FileId)
Definition: fs.c:418
FORCEINLINE VOID FrLdrTempFree(PVOID Allocation, ULONG Tag)
Definition: mm.h:197
@ ESUCCESS
Definition: arc.h:32
#define TAG_HW_DISK_CONTEXT
Definition: uefidisk.c:16

◆ DiskGetBootPath()

static BOOLEAN DiskGetBootPath ( BOOLEAN  IsPxe)
static

Definition at line 417 of file hwdisk.c.

418{
419 if (*FrLdrBootPath)
420 return TRUE;
421
422 // FIXME! FIXME! Do this in some drive recognition procedure!!!!
423 if (IsPxe)
424 {
425 RtlStringCbCopyA(FrLdrBootPath, sizeof(FrLdrBootPath), "net(0)");
426 }
427 else
428 /* 0x49 is our magic ramdisk drive, so try to detect it first */
429 if (FrldrBootDrive == 0x49)
430 {
431 /* This is the ramdisk. See ArmInitializeBootDevices() too... */
432 // RtlStringCbPrintfA(FrLdrBootPath, sizeof(FrLdrBootPath), "ramdisk(%u)", 0);
433 RtlStringCbCopyA(FrLdrBootPath, sizeof(FrLdrBootPath), "ramdisk(0)");
434 }
435 else if (FrldrBootDrive < 0x80)
436 {
437 /* This is a floppy */
439 "multi(0)disk(0)fdisk(%u)", FrldrBootDrive);
440 }
441 else if (FrldrBootPartition == 0xFF)
442 {
443 /* Boot Partition 0xFF is the magic value that indicates booting from CD-ROM (see isoboot.S) */
445 "multi(0)disk(0)cdrom(%u)", FrldrBootDrive - 0x80);
446 }
447 else
448 {
449 ULONG BootPartition;
450 PARTITION_TABLE_ENTRY PartitionEntry;
451
452 /* This is a hard disk */
453 if (!DiskGetBootPartitionEntry(FrldrBootDrive, &PartitionEntry, &BootPartition))
454 {
455 ERR("Failed to get boot partition entry\n");
456 return FALSE;
457 }
458
459 FrldrBootPartition = BootPartition;
460
462 "multi(0)disk(0)rdisk(%u)partition(%lu)",
464 }
465
466 return TRUE;
467}
BOOLEAN DiskGetBootPartitionEntry(IN UCHAR DriveNumber, OUT PPARTITION_TABLE_ENTRY PartitionTableEntry, OUT PULONG BootPartition)
Definition: partition.c:367
#define ERR(fmt,...)
Definition: debug.h:110
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
CCHAR FrLdrBootPath[MAX_PATH]
Definition: freeldr.c:39
NTSTRSAFEVAPI RtlStringCbPrintfA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,...)
Definition: ntstrsafe.h:1148
NTSTRSAFEAPI RtlStringCbCopyA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCSTR pszSrc)
Definition: ntstrsafe.h:156
Definition: parttest.c:75
uint32_t ULONG
Definition: typedefs.h:59
UCHAR FrldrBootDrive
Definition: uefidisk.c:47
ULONG FrldrBootPartition
Definition: uefidisk.c:48

Referenced by PcInitializeBootDevices().

◆ DiskGetFileInformation()

static ARC_STATUS DiskGetFileInformation ( ULONG  FileId,
FILEINFORMATION Information 
)
static

Definition at line 61 of file hwdisk.c.

62{
64
66
67 /*
68 * The ARC specification mentions that for partitions, StartingAddress and
69 * EndingAddress are the start and end positions of the partition in terms
70 * of byte offsets from the start of the disk.
71 * CurrentAddress is the current offset into (i.e. relative to) the partition.
72 */
73 Information->StartingAddress.QuadPart = Context->SectorOffset * Context->SectorSize;
74 Information->EndingAddress.QuadPart = (Context->SectorOffset + Context->SectorCount) * Context->SectorSize;
75 Information->CurrentAddress.QuadPart = Context->SectorNumber * Context->SectorSize;
76
77 return ESUCCESS;
78}
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
Definition: wdfrequest.h:1049

◆ DiskIsDriveRemovable()

static BOOLEAN DiskIsDriveRemovable ( UCHAR  DriveNumber)
static

Definition at line 402 of file hwdisk.c.

403{
404 /*
405 * Hard disks use drive numbers >= 0x80 . So if the drive number
406 * indicates a hard disk then return FALSE.
407 * 0x49 is our magic ramdisk drive, so return FALSE for that too.
408 */
409 if ((DriveNumber >= 0x80) || (DriveNumber == 0x49))
410 return FALSE;
411
412 /* The drive is a floppy diskette so return TRUE */
413 return TRUE;
414}

Referenced by PcInitializeBootDevices().

◆ DiskOpen()

static ARC_STATUS DiskOpen ( CHAR Path,
OPENMODE  OpenMode,
ULONG FileId 
)
static

Definition at line 81 of file hwdisk.c.

82{
84 UCHAR DriveNumber;
85 ULONG DrivePartition, SectorSize;
88 PARTITION_TABLE_ENTRY PartitionTableEntry;
89
90 if (DiskReadBufferSize == 0)
91 {
92 ERR("DiskOpen(): DiskReadBufferSize is 0, something is wrong.\n");
94 return ENOMEM;
95 }
96
97 if (!DissectArcPath(Path, NULL, &DriveNumber, &DrivePartition))
98 return EINVAL;
99
100 if (DrivePartition == 0xff)
101 {
102 /* This is a CD-ROM device */
103 SectorSize = 2048;
104 }
105 else
106 {
107 /*
108 * This is either a floppy disk device (DrivePartition == 0) or
109 * a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF)
110 * but it doesn't matter which one because they both have 512 bytes
111 * per sector.
112 */
113 SectorSize = 512;
114 }
115
116 if (DrivePartition != 0xff && DrivePartition != 0)
117 {
118 if (!DiskGetPartitionEntry(DriveNumber, DrivePartition, &PartitionTableEntry))
119 return EINVAL;
120
121 SectorOffset = PartitionTableEntry.SectorCountBeforePartition;
122 SectorCount = PartitionTableEntry.PartitionSectorCount;
123 }
124 else
125 {
126 GEOMETRY Geometry;
127 if (!MachDiskGetDriveGeometry(DriveNumber, &Geometry))
128 return EINVAL;
129
130 if (SectorSize != Geometry.BytesPerSector)
131 {
132 ERR("SectorSize (%lu) != Geometry.BytesPerSector (%lu), expect problems!\n",
133 SectorSize, Geometry.BytesPerSector);
134 }
135
136 SectorOffset = 0;
137 SectorCount = (ULONGLONG)Geometry.Cylinders * Geometry.Heads * Geometry.Sectors;
138 }
139
141 if (!Context)
142 return ENOMEM;
143
144 Context->DriveNumber = DriveNumber;
145 Context->SectorSize = SectorSize;
146 Context->SectorOffset = SectorOffset;
147 Context->SectorCount = SectorCount;
148 Context->SectorNumber = 0;
150
151 return ESUCCESS;
152}
PRTL_UNICODE_STRING_BUFFER Path
#define EINVAL
Definition: acclib.h:90
#define ENOMEM
Definition: acclib.h:84
BOOLEAN DissectArcPath(IN PCSTR ArcPath, OUT PCSTR *Path OPTIONAL, OUT PUCHAR DriveNumber, OUT PULONG PartitionNumber)
Definition: arcname.c:25
BOOLEAN DiskGetPartitionEntry(IN UCHAR DriveNumber, IN ULONG PartitionNumber, OUT PPARTITION_TABLE_ENTRY PartitionTableEntry)
Definition: partition.c:407
VOID FsSetDeviceSpecific(ULONG FileId, VOID *Specific)
Definition: fs.c:411
#define MachDiskGetDriveGeometry(Drive, Geom)
Definition: machine.h:128
FORCEINLINE PVOID FrLdrTempAlloc(_In_ SIZE_T Size, _In_ ULONG Tag)
Definition: mm.h:188
#define SectorOffset(L)
Definition: cdprocs.h:1622
#define NULL
Definition: types.h:112
SIZE_T DiskReadBufferSize
Definition: hwdisk.c:47
#define ASSERT(a)
Definition: mode.c:44
ULONG SectorCount
Definition: part_xbox.c:31
ULONG PartitionSectorCount
Definition: parttest.c:85
ULONG SectorCountBeforePartition
Definition: parttest.c:84
Definition: disk.h:25
ULONG BytesPerSector
Definition: disk.h:29
ULONG Sectors
Definition: disk.h:28
ULONG Cylinders
Definition: disk.h:26
ULONG Heads
Definition: disk.h:27
uint64_t ULONGLONG
Definition: typedefs.h:67
_In_ ULONG SectorSize
Definition: halfuncs.h:291
unsigned char UCHAR
Definition: xmlstorage.h:181

◆ DiskRead()

static ARC_STATUS DiskRead ( ULONG  FileId,
VOID Buffer,
ULONG  N,
ULONG Count 
)
static

Definition at line 155 of file hwdisk.c.

156{
158 UCHAR* Ptr = (UCHAR*)Buffer;
159 ULONG Length, TotalSectors, MaxSectors, ReadSectors;
161 BOOLEAN ret;
162
164
165 TotalSectors = (N + Context->SectorSize - 1) / Context->SectorSize;
166 MaxSectors = DiskReadBufferSize / Context->SectorSize;
167 SectorOffset = Context->SectorOffset + Context->SectorNumber;
168
169 // If MaxSectors is 0, this will lead to infinite loop.
170 // In release builds assertions are disabled, however we also have sanity checks in DiskOpen()
171 ASSERT(MaxSectors > 0);
172
173 ret = TRUE;
174
175 while (TotalSectors)
176 {
177 ReadSectors = TotalSectors;
178 if (ReadSectors > MaxSectors)
179 ReadSectors = MaxSectors;
180
183 ReadSectors,
185 if (!ret)
186 break;
187
188 Length = ReadSectors * Context->SectorSize;
189 if (Length > N)
190 Length = N;
191
193
194 Ptr += Length;
195 N -= Length;
196 SectorOffset += ReadSectors;
197 TotalSectors -= ReadSectors;
198 }
199
201 Context->SectorNumber = SectorOffset - Context->SectorOffset;
202
203 return (!ret) ? EIO : ESUCCESS;
204}
#define N
Definition: crc32.c:57
unsigned char BOOLEAN
#define EIO
Definition: acclib.h:81
#define MachDiskReadLogicalSectors(Drive, Start, Count, Buf)
Definition: machine.h:126
Definition: bufpool.h:45
#define ULONG_PTR
Definition: config.h:101
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
PVOID DiskReadBuffer
Definition: hwdisk.c:46
int Count
Definition: noreturn.cpp:7
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
uint32_t ULONG_PTR
Definition: typedefs.h:65
int ret

◆ DiskSeek()

static ARC_STATUS DiskSeek ( ULONG  FileId,
LARGE_INTEGER Position,
SEEKMODE  SeekMode 
)
static

Definition at line 207 of file hwdisk.c.

208{
210 LARGE_INTEGER NewPosition = *Position;
211
212 switch (SeekMode)
213 {
214 case SeekAbsolute:
215 break;
216 case SeekRelative:
217 NewPosition.QuadPart += (Context->SectorNumber * Context->SectorSize);
218 break;
219 default:
220 ASSERT(FALSE);
221 return EINVAL;
222 }
223
224 if (NewPosition.QuadPart & (Context->SectorSize - 1))
225 return EINVAL;
226
227 /* Convert in number of sectors */
228 NewPosition.QuadPart /= Context->SectorSize;
229
230 /* HACK: CDROMs may have a SectorCount of 0 */
231 if (Context->SectorCount != 0 && NewPosition.QuadPart >= Context->SectorCount)
232 return EINVAL;
233
234 Context->SectorNumber = NewPosition.QuadPart;
235 return ESUCCESS;
236}
@ SeekRelative
Definition: arc.h:60
@ SeekAbsolute
Definition: arc.h:59
static COORD Position
Definition: mouse.c:34
LONGLONG QuadPart
Definition: typedefs.h:114

◆ EnumerateHarddisks()

static UCHAR EnumerateHarddisks ( OUT PBOOLEAN  BootDriveReported)
static

Definition at line 342 of file hwdisk.c.

343{
344 UCHAR DiskCount, DriveNumber;
345 ULONG i;
346 BOOLEAN Changed;
347
348 *BootDriveReported = FALSE;
349
350 /* Count the number of visible harddisk drives */
352 DiskCount = 0;
353 DriveNumber = 0x80;
354
356
357 /*
358 * There are some really broken BIOSes out there. There are even BIOSes
359 * that happily report success when you ask them to read from non-existent
360 * harddisks. So, we set the buffer to known contents first, then try to
361 * read. If the BIOS reports success but the buffer contents haven't
362 * changed then we fail anyway.
363 */
365 while (MachDiskReadLogicalSectors(DriveNumber, 0ULL, 1, DiskReadBuffer))
366 {
367 Changed = FALSE;
368 for (i = 0; !Changed && i < DiskReadBufferSize; i++)
369 {
370 Changed = ((PUCHAR)DiskReadBuffer)[i] != 0xcd;
371 }
372 if (!Changed)
373 {
374 TRACE("BIOS reports success for disk %d (0x%02X) but data didn't change\n",
375 (int)DiskCount, DriveNumber);
376 break;
377 }
378
379 /* Cache the BIOS hard disk information for later use */
380 GetHarddiskInformation(DriveNumber);
381
382 /* Check if we have seen the boot drive */
383 if (FrldrBootDrive == DriveNumber)
384 *BootDriveReported = TRUE;
385
386 DiskCount++;
387 DriveNumber++;
389 }
391
392 PcBiosDiskCount = DiskCount;
393 TRACE("BIOS reports %d harddisk%s\n",
394 (int)DiskCount, (DiskCount == 1) ? "" : "s");
395
396 return DiskCount;
397}
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
Definition: glfuncs.h:248
static VOID GetHarddiskInformation(UCHAR DriveNumber)
Definition: hwdisk.c:255
UCHAR PcBiosDiskCount
Definition: hwdisk.c:43
#define ULL(a, b)
Definition: format_msg.c:27
LONG DiskReportError(BOOLEAN bShowError)
Definition: pcdisk.c:120
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
unsigned char * PUCHAR
Definition: typedefs.h:53

Referenced by PcInitializeBootDevices().

◆ GetHarddiskIdentifier()

PCHAR GetHarddiskIdentifier ( UCHAR  DriveNumber)

Definition at line 249 of file hwdisk.c.

250{
251 return PcDiskIdentifier[DriveNumber - 0x80];
252}
static CHAR PcDiskIdentifier[32][20]
Definition: hwdisk.c:44

◆ GetHarddiskInformation()

static VOID GetHarddiskInformation ( UCHAR  DriveNumber)
static

Definition at line 255 of file hwdisk.c.

256{
259 ULONG i;
260 ULONG Checksum;
262 BOOLEAN ValidPartitionTable;
263 CHAR ArcName[MAX_PATH];
264 PARTITION_TABLE_ENTRY PartitionTableEntry;
265 PCHAR Identifier = PcDiskIdentifier[DriveNumber - 0x80];
266
267 /* Detect disk partition type */
268 DiskDetectPartitionType(DriveNumber);
269
270 /* Read the MBR */
271 if (!MachDiskReadLogicalSectors(DriveNumber, 0ULL, 1, DiskReadBuffer))
272 {
273 ERR("Reading MBR failed\n");
274 /* We failed, use a default identifier */
275 sprintf(Identifier, "BIOSDISK%d", DriveNumber - 0x80 + 1);
276 return;
277 }
278
281
282 Signature = Mbr->Signature;
283 TRACE("Signature: %x\n", Signature);
284
285 /* Calculate the MBR checksum */
286 Checksum = 0;
287 for (i = 0; i < 512 / sizeof(ULONG); i++)
288 {
289 Checksum += Buffer[i];
290 }
291 Checksum = ~Checksum + 1;
292 TRACE("Checksum: %x\n", Checksum);
293
294 ValidPartitionTable = (Mbr->MasterBootRecordMagic == 0xAA55);
295
296 /* Fill out the ARC disk block */
297 sprintf(ArcName, "multi(0)disk(0)rdisk(%u)", DriveNumber - 0x80);
298 AddReactOSArcDiskInfo(ArcName, Signature, Checksum, ValidPartitionTable);
299
300 sprintf(ArcName, "multi(0)disk(0)rdisk(%u)partition(0)", DriveNumber - 0x80);
301 FsRegisterDevice(ArcName, &DiskVtbl);
302
303 /* Add partitions */
304 i = 1;
306 while (DiskGetPartitionEntry(DriveNumber, i, &PartitionTableEntry))
307 {
308 if (PartitionTableEntry.SystemIndicator != PARTITION_ENTRY_UNUSED)
309 {
310 sprintf(ArcName, "multi(0)disk(0)rdisk(%u)partition(%lu)", DriveNumber - 0x80, i);
311 FsRegisterDevice(ArcName, &DiskVtbl);
312 }
313 i++;
314 }
316
317 /* Convert checksum and signature to identifier string */
318 Identifier[0] = Hex[(Checksum >> 28) & 0x0F];
319 Identifier[1] = Hex[(Checksum >> 24) & 0x0F];
320 Identifier[2] = Hex[(Checksum >> 20) & 0x0F];
321 Identifier[3] = Hex[(Checksum >> 16) & 0x0F];
322 Identifier[4] = Hex[(Checksum >> 12) & 0x0F];
323 Identifier[5] = Hex[(Checksum >> 8) & 0x0F];
324 Identifier[6] = Hex[(Checksum >> 4) & 0x0F];
325 Identifier[7] = Hex[Checksum & 0x0F];
326 Identifier[8] = '-';
327 Identifier[9] = Hex[(Signature >> 28) & 0x0F];
328 Identifier[10] = Hex[(Signature >> 24) & 0x0F];
329 Identifier[11] = Hex[(Signature >> 20) & 0x0F];
330 Identifier[12] = Hex[(Signature >> 16) & 0x0F];
331 Identifier[13] = Hex[(Signature >> 12) & 0x0F];
332 Identifier[14] = Hex[(Signature >> 8) & 0x0F];
333 Identifier[15] = Hex[(Signature >> 4) & 0x0F];
334 Identifier[16] = Hex[Signature & 0x0F];
335 Identifier[17] = '-';
336 Identifier[18] = (ValidPartitionTable ? 'A' : 'X');
337 Identifier[19] = 0;
338 TRACE("Identifier: %s\n", Identifier);
339}
VOID AddReactOSArcDiskInfo(IN PSTR ArcName, IN ULONG Signature, IN ULONG Checksum, IN BOOLEAN ValidPartitionTable)
Definition: archwsup.c:77
@ Identifier
Definition: asmpp.cpp:95
VOID DiskDetectPartitionType(IN UCHAR DriveNumber)
Definition: partition.c:314
#define PARTITION_ENTRY_UNUSED
Definition: disk.h:86
struct _MASTER_BOOT_RECORD * PMASTER_BOOT_RECORD
VOID FsRegisterDevice(CHAR *Prefix, const DEVVTBL *FuncTable)
Definition: fs.c:385
#define MAX_PATH
Definition: compat.h:34
static const WCHAR Signature[]
Definition: parser.c:141
static const DEVVTBL DiskVtbl
Definition: hwdisk.c:238
static const CHAR Hex[]
Definition: hwdisk.c:40
#define sprintf(buf, format,...)
Definition: sprintf.c:55
UCHAR SystemIndicator
Definition: parttest.c:80
USHORT MasterBootRecordMagic
Definition: disk.h:78
ULONG Signature
Definition: disk.h:75
uint32_t * PULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
char CHAR
Definition: xmlstorage.h:175

Referenced by EnumerateHarddisks().

◆ PcInitializeBootDevices()

BOOLEAN PcInitializeBootDevices ( VOID  )

Definition at line 470 of file hwdisk.c.

471{
472 UCHAR DiskCount;
473 BOOLEAN BootDriveReported = FALSE;
474 ULONG i;
475
476 DiskCount = EnumerateHarddisks(&BootDriveReported);
477
478 /* Initialize FrLdrBootPath, the boot path we're booting from (the "SystemPartition") */
480
481 /* Add it, if it's a floppy or cdrom */
482 if ((FrldrBootDrive >= 0x80 && !BootDriveReported) ||
484 {
485 /* TODO: Check if it's really a CDROM drive */
486
489 ULONG Checksum = 0;
491
492 /* Read the MBR */
494 {
495 ERR("Reading MBR failed\n");
496 return FALSE;
497 }
498
501
502 Signature = Mbr->Signature;
503 TRACE("Signature: %x\n", Signature);
504
505 /* Calculate the MBR checksum */
506 for (i = 0; i < 2048 / sizeof(ULONG); i++)
507 {
508 Checksum += Buffer[i];
509 }
510 Checksum = ~Checksum + 1;
511 TRACE("Checksum: %x\n", Checksum);
512
513 /* Fill out the ARC disk block */
515
517 DiskCount++; // This is not accounted for in the number of pre-enumerated BIOS drives!
518 TRACE("Additional boot drive detected: 0x%02X\n", (int)FrldrBootDrive);
519 }
520
521 return (DiskCount != 0);
522}
BOOLEAN PxeInit(VOID)
Definition: pxe.c:346
static BOOLEAN DiskGetBootPath(BOOLEAN IsPxe)
Definition: hwdisk.c:417
static BOOLEAN DiskIsDriveRemovable(UCHAR DriveNumber)
Definition: hwdisk.c:402
static UCHAR EnumerateHarddisks(OUT PBOOLEAN BootDriveReported)
Definition: hwdisk.c:342

Referenced by MachInit(), and Pc98InitializeBootDevices().

Variable Documentation

◆ DiskReadBuffer

PVOID DiskReadBuffer

◆ DiskReadBufferSize

SIZE_T DiskReadBufferSize

Definition at line 47 of file hwdisk.c.

Referenced by DiskOpen(), DiskRead(), EnumerateHarddisks(), and PcMemFinalizeMemoryMap().

◆ DiskVtbl

const DEVVTBL DiskVtbl
static
Initial value:
=
{
}
static ARC_STATUS DiskGetFileInformation(ULONG FileId, FILEINFORMATION *Information)
Definition: hwdisk.c:61
static ARC_STATUS DiskRead(ULONG FileId, VOID *Buffer, ULONG N, ULONG *Count)
Definition: hwdisk.c:155
static ARC_STATUS DiskOpen(CHAR *Path, OPENMODE OpenMode, ULONG *FileId)
Definition: hwdisk.c:81
static ARC_STATUS DiskSeek(ULONG FileId, LARGE_INTEGER *Position, SEEKMODE SeekMode)
Definition: hwdisk.c:207
static ARC_STATUS DiskClose(ULONG FileId)
Definition: hwdisk.c:53

Definition at line 238 of file hwdisk.c.

Referenced by GetHarddiskInformation(), and PcInitializeBootDevices().

◆ Hex

const CHAR Hex[] = "0123456789abcdef"
static

Definition at line 40 of file hwdisk.c.

Referenced by GetHarddiskInformation().

◆ PcBiosDiskCount

UCHAR PcBiosDiskCount = 0

Definition at line 43 of file hwdisk.c.

Referenced by EnumerateHarddisks().

◆ PcDiskIdentifier

CHAR PcDiskIdentifier[32][20]
static

Definition at line 44 of file hwdisk.c.

Referenced by GetHarddiskIdentifier(), and GetHarddiskInformation().