ReactOS 0.4.15-dev-8052-gc0e3179
disk.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _DISK_INFO
 
struct  _DISK_IMAGE
 

Typedefs

typedef struct _DISK_INFO DISK_INFO
 
typedef struct _DISK_INFOPDISK_INFO
 
typedef struct _DISK_IMAGE DISK_IMAGE
 
typedef struct _DISK_IMAGEPDISK_IMAGE
 
typedef enum _DISK_TYPE DISK_TYPE
 

Enumerations

enum  _DISK_TYPE { FLOPPY_DISK , HARD_DISK , MAX_DISK_TYPE }
 

Functions

BOOLEAN IsDiskPresent (IN PDISK_IMAGE DiskImage)
 
BYTE SeekDisk (IN PDISK_IMAGE DiskImage, IN WORD Cylinder, IN BYTE Head, IN BYTE Sector)
 
BYTE ReadDisk (IN PDISK_IMAGE DiskImage, IN WORD Cylinder, IN BYTE Head, IN BYTE Sector, IN BYTE NumSectors)
 
BYTE WriteDisk (IN PDISK_IMAGE DiskImage, IN WORD Cylinder, IN BYTE Head, IN BYTE Sector, IN BYTE NumSectors)
 
PDISK_IMAGE RetrieveDisk (IN DISK_TYPE DiskType, IN ULONG DiskNumber)
 
BOOLEAN MountDisk (IN DISK_TYPE DiskType, IN ULONG DiskNumber, IN PCWSTR FileName, IN BOOLEAN ReadOnly)
 
BOOLEAN UnmountDisk (IN DISK_TYPE DiskType, IN ULONG DiskNumber)
 
BOOLEAN DiskCtrlInitialize (VOID)
 
VOID DiskCtrlCleanup (VOID)
 

Typedef Documentation

◆ DISK_IMAGE

◆ DISK_INFO

◆ DISK_TYPE

◆ PDISK_IMAGE

◆ PDISK_INFO

Enumeration Type Documentation

◆ _DISK_TYPE

Enumerator
FLOPPY_DISK 
HARD_DISK 
MAX_DISK_TYPE 

Definition at line 42 of file disk.h.

43{
47} DISK_TYPE;
@ HARD_DISK
Definition: disk.h:45
@ MAX_DISK_TYPE
Definition: disk.h:46
@ FLOPPY_DISK
Definition: disk.h:44
enum _DISK_TYPE DISK_TYPE

Function Documentation

◆ DiskCtrlCleanup()

VOID DiskCtrlCleanup ( VOID  )

Definition at line 624 of file disk.c.

625{
626 ULONG DiskNumber;
627
628 /* Unmount all the present floppy disk drives */
629 for (DiskNumber = 0; DiskNumber < DiskMountInfo[FLOPPY_DISK].NumDisks; ++DiskNumber)
630 {
631 if (IsDiskPresent(&DiskMountInfo[FLOPPY_DISK].DiskArray[DiskNumber]))
632 UnmountDisk(FLOPPY_DISK, DiskNumber);
633 }
634
635 /* Unmount all the present hard disk drives */
636 for (DiskNumber = 0; DiskNumber < DiskMountInfo[HARD_DISK].NumDisks; ++DiskNumber)
637 {
638 if (IsDiskPresent(&DiskMountInfo[HARD_DISK].DiskArray[DiskNumber]))
639 UnmountDisk(HARD_DISK, DiskNumber);
640 }
641}
ULONG NumDisks
Definition: disk.c:474
static DISK_MOUNT_INFO DiskMountInfo[MAX_DISK_TYPE]
Definition: disk.c:478
BOOLEAN UnmountDisk(IN DISK_TYPE DiskType, IN ULONG DiskNumber)
Definition: disk.c:589
BOOLEAN IsDiskPresent(IN PDISK_IMAGE DiskImage)
Definition: disk.c:321
uint32_t ULONG
Definition: typedefs.h:59

Referenced by EmulatorCleanup().

◆ DiskCtrlInitialize()

BOOLEAN DiskCtrlInitialize ( VOID  )

Definition at line 619 of file disk.c.

620{
621 return TRUE;
622}
#define TRUE
Definition: types.h:120

Referenced by EmulatorInitialize().

◆ IsDiskPresent()

BOOLEAN IsDiskPresent ( IN PDISK_IMAGE  DiskImage)

Definition at line 321 of file disk.c.

322{
323 ASSERT(DiskImage);
324 return (DiskImage->hDisk != INVALID_HANDLE_VALUE && DiskImage->hDisk != NULL);
325}
#define NULL
Definition: types.h:112
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define ASSERT(a)
Definition: mode.c:44

Referenced by BiosDiskService(), DiskCtrlCleanup(), MountDisk(), and UnmountDisk().

◆ MountDisk()

BOOLEAN MountDisk ( IN DISK_TYPE  DiskType,
IN ULONG  DiskNumber,
IN PCWSTR  FileName,
IN BOOLEAN  ReadOnly 
)

Definition at line 500 of file disk.c.

504{
506 PDISK_IMAGE DiskImage;
508
510
511 ASSERT(DiskType < MAX_DISK_TYPE);
512
513 if (DiskNumber >= DiskMountInfo[DiskType].NumDisks)
514 {
515 DisplayMessage(L"MountDisk: Disk number %d:%d invalid.", DiskType, DiskNumber);
516 return FALSE;
517 }
518
519 DiskImage = &DiskMountInfo[DiskType].DiskArray[DiskNumber];
520 if (IsDiskPresent(DiskImage))
521 {
522 DPRINT1("MountDisk: Disk %d:%d:0x%p already in use, recycling...\n", DiskType, DiskNumber, DiskImage);
523 UnmountDisk(DiskType, DiskNumber);
524 }
525
526 /* Try to open the file */
527 SetLastError(0); // For debugging purposes
531 NULL,
534 NULL);
535 DPRINT1("File '%S' opening %s ; GetLastError() = %u\n",
536 FileName, hFile != INVALID_HANDLE_VALUE ? "succeeded" : "failed", GetLastError());
537
538 /* If we failed, bail out */
540 {
541 DisplayMessage(L"MountDisk: Error when opening disk file '%s' (Error: %u).", FileName, GetLastError());
542 return FALSE;
543 }
544
545 /* OK, we have a handle to the file */
546
547 /*
548 * Check that it is really a file, and not a physical drive.
549 * For obvious security reasons, we do not want to be able to
550 * write directly to physical drives.
551 *
552 * Redundant checks
553 */
554 SetLastError(0);
557 {
558 /* Objects other than real files are not supported */
559 DisplayMessage(L"MountDisk: '%s' is not a valid disk file.", FileName);
560 goto Quit;
561 }
562 SetLastError(0);
565 {
566 /* Objects other than real files are not supported */
567 DisplayMessage(L"MountDisk: '%s' is not a valid disk file.", FileName);
568 goto Quit;
569 }
570
571 /* Success, mount the image */
572 if (!DiskMountInfo[DiskType].MountDiskHelper(DiskImage, hFile))
573 {
574 DisplayMessage(L"MountDisk: Failed to mount disk file '%s' in 0x%p.", FileName, DiskImage);
575 goto Quit;
576 }
577
578 /* Update its read/write state */
579 DiskImage->ReadOnly = ReadOnly;
580
581 Success = TRUE;
582
583Quit:
584 if (!Success) FileClose(hFile);
585 return Success;
586}
unsigned char BOOLEAN
#define DPRINT1
Definition: precomp.h:8
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
#define FALSE
Definition: types.h:117
#define OPEN_EXISTING
Definition: compat.h:775
#define SetLastError(x)
Definition: compat.h:752
#define GENERIC_READ
Definition: compat.h:135
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define FILE_SHARE_READ
Definition: compat.h:136
BOOL WINAPI GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation)
Definition: fileinfo.c:458
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
@ Success
Definition: eventcreate.c:712
static OUT PIO_STATUS_BLOCK OUT PVOID FileInformation
Definition: pipe.c:75
_In_ HANDLE hFile
Definition: mswsock.h:90
#define GENERIC_WRITE
Definition: nt_native.h:90
#define L(x)
Definition: ntvdm.h:50
void DisplayMessage(BOOL bConsole, BOOL bSilent, LPCTSTR lpMessage, LPCTSTR lpTitle, UINT uType)
Definition: regsvr32.c:239
@ ReadOnly
Definition: arc.h:80
BOOLEAN ReadOnly
Definition: disk.h:37
PDISK_IMAGE DiskArray
Definition: disk.c:473
VOID FileClose(IN HANDLE FileHandle)
Definition: utils.c:21
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define INVALID_FILE_SIZE
Definition: winbase.h:548

Referenced by EmulatorInitialize(), and MountFloppy().

◆ ReadDisk()

BYTE ReadDisk ( IN PDISK_IMAGE  DiskImage,
IN WORD  Cylinder,
IN BYTE  Head,
IN BYTE  Sector,
IN BYTE  NumSectors 
)

Definition at line 359 of file disk.c.

364{
365 BYTE Result;
366 DWORD BytesToRead;
367
368 PVOID LocalBuffer;
369 BYTE StaticBuffer[1024];
370
371 /* Read the sectors */
372 Result = SeekDisk(DiskImage, Cylinder, Head, Sector);
373 if (Result != 0x00)
374 return Result;
375
376 BytesToRead = (DWORD)NumSectors * DiskImage->DiskInfo.SectorSize;
377
378 // FIXME: Consider just looping around filling each time the buffer...
379
380 if (BytesToRead <= sizeof(StaticBuffer))
381 {
382 LocalBuffer = StaticBuffer;
383 }
384 else
385 {
386 LocalBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, BytesToRead);
387 ASSERT(LocalBuffer != NULL);
388 }
389
390 if (ReadFile(DiskImage->hDisk, LocalBuffer, BytesToRead, &BytesToRead, NULL))
391 {
392 /* Write to the memory */
394 TO_LINEAR(getES(), getBX()),
395 LocalBuffer,
396 BytesToRead);
397
398 Result = 0x00;
399 }
400 else
401 {
402 Result = 0x04;
403 }
404
405 if (LocalBuffer != StaticBuffer)
406 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalBuffer);
407
408 /* Return success or error */
409 return Result;
410}
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:590
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:608
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define TO_LINEAR(seg, off)
Definition: emulator.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
if(dx< 0)
Definition: linetemp.h:194
#define DWORD
Definition: nt_native.h:44
FAST486_STATE EmulatorContext
Definition: cpu.c:39
BYTE SeekDisk(IN PDISK_IMAGE DiskImage, IN WORD Cylinder, IN BYTE Head, IN BYTE Sector)
Definition: disk.c:328
VOID FASTCALL EmulatorWriteMemory(PFAST486_STATE State, ULONG Address, PVOID Buffer, ULONG Size)
Definition: memory.c:186
USHORT WINAPI getBX(VOID)
Definition: registers.c:170
USHORT WINAPI getES(VOID)
Definition: registers.c:522
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
unsigned char BYTE
Definition: xxhash.c:193

Referenced by BiosDiskService().

◆ RetrieveDisk()

PDISK_IMAGE RetrieveDisk ( IN DISK_TYPE  DiskType,
IN ULONG  DiskNumber 
)

Definition at line 485 of file disk.c.

487{
488 ASSERT(DiskType < MAX_DISK_TYPE);
489
490 if (DiskNumber >= DiskMountInfo[DiskType].NumDisks)
491 {
492 DisplayMessage(L"RetrieveDisk: Disk number %d:%d invalid.", DiskType, DiskNumber);
493 return NULL;
494 }
495
496 return &DiskMountInfo[DiskType].DiskArray[DiskNumber];
497}

Referenced by DiskBios32Initialize().

◆ SeekDisk()

BYTE SeekDisk ( IN PDISK_IMAGE  DiskImage,
IN WORD  Cylinder,
IN BYTE  Head,
IN BYTE  Sector 
)

Definition at line 328 of file disk.c.

332{
333 DWORD FilePointer;
334
335 /* Check that the sector number is 1-based */
336 // FIXME: Or do it in the caller?
337 if (Sector == 0)
338 {
339 /* Return error */
340 return 0x01;
341 }
342
343 /* Set position */
344 // Compute the offset
345 FilePointer = (DWORD)((DWORD)((DWORD)Cylinder * DiskImage->DiskInfo.Heads + Head)
346 * DiskImage->DiskInfo.Sectors + (Sector - 1))
347 * DiskImage->DiskInfo.SectorSize;
348 FilePointer = SetFilePointer(DiskImage->hDisk, FilePointer, NULL, FILE_BEGIN);
349 if (FilePointer == INVALID_SET_FILE_POINTER)
350 {
351 /* Return error */
352 return 0x40;
353 }
354
355 return 0x00;
356}
#define FILE_BEGIN
Definition: compat.h:761
#define INVALID_SET_FILE_POINTER
Definition: compat.h:732
#define SetFilePointer
Definition: compat.h:743

Referenced by BiosDiskService(), ReadDisk(), and WriteDisk().

◆ UnmountDisk()

BOOLEAN UnmountDisk ( IN DISK_TYPE  DiskType,
IN ULONG  DiskNumber 
)

Definition at line 589 of file disk.c.

591{
592 PDISK_IMAGE DiskImage;
593
594 ASSERT(DiskType < MAX_DISK_TYPE);
595
596 if (DiskNumber >= DiskMountInfo[DiskType].NumDisks)
597 {
598 DisplayMessage(L"UnmountDisk: Disk number %d:%d invalid.", DiskType, DiskNumber);
599 return FALSE;
600 }
601
602 DiskImage = &DiskMountInfo[DiskType].DiskArray[DiskNumber];
603 if (!IsDiskPresent(DiskImage))
604 {
605 DPRINT1("UnmountDisk: Disk %d:%d:0x%p is already unmounted\n", DiskType, DiskNumber, DiskImage);
606 return FALSE;
607 }
608
609 /* Flush the image and unmount it */
610 FlushFileBuffers(DiskImage->hDisk);
611 FileClose(DiskImage->hDisk);
612 DiskImage->hDisk = NULL;
613 return TRUE;
614}
BOOL WINAPI FlushFileBuffers(IN HANDLE hFile)
Definition: fileinfo.c:25
HANDLE hDisk
Definition: disk.h:36

Referenced by DiskCtrlCleanup(), EjectFloppy(), and MountDisk().

◆ WriteDisk()

BYTE WriteDisk ( IN PDISK_IMAGE  DiskImage,
IN WORD  Cylinder,
IN BYTE  Head,
IN BYTE  Sector,
IN BYTE  NumSectors 
)

Definition at line 413 of file disk.c.

418{
419 BYTE Result;
420 DWORD BytesToWrite;
421
422 PVOID LocalBuffer;
423 BYTE StaticBuffer[1024];
424
425 /* Check for write protection */
426 if (DiskImage->ReadOnly)
427 {
428 /* Return error */
429 return 0x03;
430 }
431
432 /* Write the sectors */
433 Result = SeekDisk(DiskImage, Cylinder, Head, Sector);
434 if (Result != 0x00)
435 return Result;
436
437 BytesToWrite = (DWORD)NumSectors * DiskImage->DiskInfo.SectorSize;
438
439 // FIXME: Consider just looping around filling each time the buffer...
440
441 if (BytesToWrite <= sizeof(StaticBuffer))
442 {
443 LocalBuffer = StaticBuffer;
444 }
445 else
446 {
447 LocalBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, BytesToWrite);
448 ASSERT(LocalBuffer != NULL);
449 }
450
451 /* Read from the memory */
453 TO_LINEAR(getES(), getBX()),
454 LocalBuffer,
455 BytesToWrite);
456
457 if (WriteFile(DiskImage->hDisk, LocalBuffer, BytesToWrite, &BytesToWrite, NULL))
458 Result = 0x00;
459 else
460 Result = 0x04;
461
462 if (LocalBuffer != StaticBuffer)
463 RtlFreeHeap(RtlGetProcessHeap(), 0, LocalBuffer);
464
465 /* Return success or error */
466 return Result;
467}
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
VOID FASTCALL EmulatorReadMemory(PFAST486_STATE State, ULONG Address, PVOID Buffer, ULONG Size)
Definition: memory.c:142

Referenced by BiosDiskService().