windows-nt/Source/XPSP1/NT/base/mvdm/dos/dem/demdasd.h
2020-09-26 16:20:57 +08:00

318 lines
8.6 KiB
C

#pragma pack(1)
#if defined(NEC_98)
#define MAX_FLOPPY_TYPE 7
#else // !NEC_98
#define MAX_FLOPPY_TYPE 5
#endif // !NEC_98
typedef struct A_DISKIO {
DWORD StartSector;
WORD Sectors;
WORD BufferOff;
WORD BufferSeg;
} DISKIO, * PDISKIO;
// Bios Parameter Block (BPB)
typedef struct A_BPB {
WORD SectorSize; // sector size in bytes
BYTE ClusterSize; // cluster size in sectors
WORD ReservedSectors; // number of reserved sectors
BYTE FATs; // number of FATs
WORD RootDirs; // number of root directory entries
WORD Sectors; // number of sectors
BYTE MediaID; // media descriptor
WORD FATSize; // FAT size in sectors
WORD TrackSize; // track size in sectors;
WORD Heads; // number of heads
DWORD HiddenSectors; // number of hidden sectors
DWORD BigSectors; // number of sectors for big media
} BPB, *PBPB;
typedef struct A_DPB {
BYTE DriveNum; // driver numer, 0 - A, 1 -B and so on
BYTE Unit; // unit number of DPB in the driver
WORD SectorSize; // sector size in bytes
BYTE ClusterMask; // cluster mask
BYTE ClusterShift; // cluster shift count
WORD FATSector; // starting sector of FAT
BYTE FATs; // number of FAT
WORD RootDirs; // number of root directory entries
WORD FirstDataSector; // first sector for the first cluster
WORD MaxCluster; // number of cluster + 1
WORD FATSize; // FAT size in sectors
WORD DirSector; // starting sector of directory
DWORD DriveAddr; // address of the corresponding driver
BYTE MediaID; // media ID
BYTE FirstAccess; // 0xFF if this DPB is first accessed
struct A_DPB * Next; // next DPB
WORD FreeCluster; // cluster # of the last allocated
WORD FreeClusters; // number of free clusters, 0xFFFF
// if unknown
} DPB, * PDPB;
typedef struct A_DEVICEPARAMETERS {
BYTE Functions;
BYTE DeviceType;
WORD DeviceAttrs;
WORD Cylinders;
BYTE MediaType;
BPB bpb;
} DEVICEPARAMETERS, *PDEVICE_PARAMETERS;
#define LABEL_LENGTH 11
#define FILESYSTYPE_LENGTH 8
typedef struct _DISK_LABEL {
CHAR Name[LABEL_LENGTH];
} DISK_LABEL, *PDISK_LABEL;
typedef struct _FILESYSTYPE {
CHAR Name[FILESYSTYPE_LENGTH];
} FILESYSTYPE, * PFILESYSTYPE;
// Functions for Get Device Parameters
#define BUILD_DEVICE_BPB 0x01
// Functions for Set Device Parameters
#define INSTALL_FAKE_BPB 0x01
#define ONLY_SET_TRACKLAYOUT 0x02
#define TRACK_LAYOUT_IS_GOOD 0x04
// Functions for Format Track
#define STATUS_FOR_FORMAT 0x01
// error code from format status call
#define FORMAT_NO_ROM_SUPPORTED 0x01
#define FORMAT_COMB_NOT_SUPPORTED 0x02
// read and write block
typedef struct _RWBLOCK {
BYTE Functions;
WORD Head;
WORD Cylinder;
WORD StartSector;
WORD Sectors;
WORD BufferOff;
WORD BufferSeg;
} RW_BLOCK, *PRW_BLOCK;
// format and verify track block
typedef struct _FMT_BLOCK{
BYTE Functions;
WORD Head;
WORD Cylinder;
} FMT_BLOCK, *PFMT_BLOCK;
// media id block
typedef struct _MID {
WORD InfoLevel;
DWORD SerialNum;
DISK_LABEL Label;
FILESYSTYPE FileSysType;
} MID, *PMID;
// access flage
typedef struct _ACCESSCTRL {
BYTE Functions;
BYTE AccessFlag;
} ACCESSCTRL, * PACCESSCTRL;
// bit definitions for flags
// definitions for misc flags
#define NON_REMOVABLE 0x01
#define HAS_CHANGELINE 0x02
#define RETURN_FAKE_BPB 0x04
#define GOOD_TRACKLAYOUT 0x08
#define MULTI_OWNER 0x10
#define PHYS_OWNER 0x20
#define MEDIA_CHANGED 0x40
#define CHANGED_BY_FORMAT 0x100
#define UNFORMATTED_MEDIA 0x200
#define FIRSTACCESS 0x8000
#define EXT_BOOTSECT_SIG 0x29
typedef struct _BOOTSECTOR {
BYTE Jump;
BYTE Target[2];
BYTE OemName[8];
BPB bpb;
BYTE DriveNum;
BYTE Reserved;
BYTE ExtBootSig;
DWORD SerialNum;
DISK_LABEL Label;
FILESYSTYPE FileSysType;
} BOOTSECTOR, * PBOOTSECTOR;
// Bios Data Structure (BDS)
typedef struct A_BDS {
struct A_BDS *Next; //pointer to next bds
BYTE DrivePhys; //physical drive number, 0 based
BYTE DriveLog; //logical drive number, 0 based
BPB bpb;
BYTE FatSize;
WORD OpenCount;
BYTE MediaType;
WORD Flags;
WORD Cylinders;
BPB rbpb;
BYTE LastTrack;
DWORD Time;
DWORD SerialNum;
DISK_LABEL Label;
FILESYSTYPE FileSysType;
BYTE FormFactor;
// the fllowing fields are dedicated for the drive itself
WORD DriveType;
WORD Sectors;
HANDLE fd;
DWORD TotalSectors;
} BDS, *PBDS;
#pragma pack()
// drive type
#define DRIVETYPE_NULL 0
#define DRIVETYPE_360 1
#define DRIVETYPE_12M 2
#define DRIVETYPE_720 3
#define DRIVETYPE_144 4
#define DRIVETYPE_288 5
#define DRIVETYPE_FDISK 0xff
// FORM FACTOR
#define FF_360 0
#define FF_120 1
#define FF_720 2
#define FF_FDISK 5
#define FF_144 7
#define FF_288 9
#if defined(NEC_98)
#define FF_125 4
#define FF_640 2
#endif // NEC_98
#define DOS_DIR_ENTRY_LENGTH 32
#define DOS_DIR_ENTRY_LENGTH_SHIFT_COUNT 5
// bios diskette i/o functions
#define DISKIO_RESET 0
#define DISKIO_GETSTATUS 1
#define DISKIO_READ 2
#define DISKIO_WRITE 3
#define DISKIO_VERIFY 4
#define DISKIO_FORMAT 5
#define DISKIO_GETPARAMS 8
#define DISKIO_DRIVETYPE 0x15
#define DISKIO_DISKCHANGE 0x16
#define DISKIO_SETTYPE 0x17
#define DISKIO_SETMEDIA 0x18
#define DISKIO_INVALID 0xff
// Block device generic IOCTL(RAWIO) subfunction code
#define IOCTL_SETDPM 0x40
#define IOCTL_WRITETRACK 0x41
#define IOCTL_FORMATTRACK 0x42
#define IOCTL_SETMEDIA 0x46
#define IOCTL_SETACCESS 0x47
#define IOCTL_GETDPM 0x60
#define IOCTL_READTRACK 0x61
#define IOCTL_VERIFYTRACK 0x62
#define IOCTL_GETMEDIA 0x66
#define IOCTL_GETACCESS 0x67
#define IOCTL_SENSEMEDIA 0x68
#define IOCTL_GENERIC_MIN IOCTL_SETDPM
#define IOCTL_GENERIC_MAX IOCTL_SENSEMEDIA
// dos error code
#define DOS_WRITE_PROTECTION 0
#define DOS_UNKNOWN_UNIT 1
#define DOS_DRIVE_NOT_READY 2
#define DOS_CRC_ERROR 4
#define DOS_SEEK_ERROR 6
#define DOS_UNKNOWN_MEDIA 7
#define DOS_SECTOR_NOT_FOUND 8
#define DOS_WRITE_FAULT 10
#define DOS_READ_FAULT 11
#define DOS_GEN_FAILURE 12
#define DOS_INVALID_MEDIA_CHANGE 15
//BIOS disk io error code
#define BIOS_INVALID_FUNCTION 0x01
#define BIOS_BAD_ADDRESS_MARK 0x02
#define BIOS_WRITE_PROTECTED 0x03
#define BIOS_BAD_SECTOR 0x04
#define BIOS_DISK_CHANGED 0x05
#define BIOS_DMA_OVERRUN 0x06
#define BIOS_DMA_BOUNDARY 0x08
#define BIOS_NO_MEDIA 0x0C
#define BIOS_CRC_ERROR 0x10
#define BIOS_FDC_ERROR 0x20
#define BIOS_SEEK_ERROR 0x40
#define BIOS_TIME_OUT 0x80
// dos disk generic io control error code
#define DOS_INVALID_FUNCTION 1
#define DOS_FILE_NOT_FOUND 2
#define DOS_ACCESS_DENIED 5
#define BIOS_DISKCHANGED 6
#if defined(NEC_98)
#define BYTES_PER_SECTOR 1024
#else // !NEC_98
#define BYTES_PER_SECTOR 512
#endif // !NEC_98
VOID demDasdInit(VOID);
VOID demFloppyInit(VOID);
VOID demFdiskInit(VOID);
VOID demAbsReadWrite(BOOL IsWrite);
DWORD demDasdRead(PBDS pbds, DWORD StartSector, DWORD Sectors,
WORD BufferOff, WORD BufferSeg);
DWORD demDasdWrite(PBDS pbds, DWORD StartSector, DWORD Sectors,
WORD BufferOff, WORD BufferSeg);
BOOL demDasdFormat(PBDS pbds, DWORD Head, DWORD Cylinder, MEDIA_TYPE * Media);
BOOL demDasdVerify(PBDS pbds, DWORD Cylinder, DWORD Head);
PBDS demGetBDS(BYTE Drive);
BOOL demGetBPB(PBDS pbds);
WORD demWinErrorToDosError(DWORD LastError);
VOID diskette_io(VOID);
DWORD BiosErrorToNTError(BYTE BiosError);
DWORD demBiosDiskIoRW(PBDS pbds, DWORD StartSector, DWORD Sectors,
WORD BufferOff, WORD BufferSeg, BOOL IsWrite);
VOID sas_loadw(DWORD, WORD *);
// imported from host floppy support module
BOOL nt_floppy_close(BYTE drive);
ULONG nt_floppy_read(BYTE drive, ULONG offset, ULONG size, PBYTE buffer);
ULONG nt_floppy_write(BYTE drive, ULONG offset, ULONG size, PBYTE buffer);
ULONG nt_floppy_format(BYTE drive, WORD cylinder, WORD head, MEDIA_TYPE media);
BOOL nt_floppy_media_check(BYTE drive);
MEDIA_TYPE nt_floppy_get_media_type(BYTE Drive, WORD Cylinders, WORD Sectors, WORD Heads);
BOOL nt_floppy_verify(BYTE drive, DWORD offset, DWORD size);
BOOL nt_fdisk_init(BYTE drive, PBPB bpb, PDISK_GEOMETRY disk_geometry);
ULONG nt_fdisk_read(BYTE drive, PLARGE_INTEGER offset, ULONG size, PBYTE buffer);
ULONG nt_fdisk_write(BYTE drive,PLARGE_INTEGER offset, ULONG size, PBYTE buffer);
BOOL nt_fdisk_verify(BYTE drive, PLARGE_INTEGER offset, ULONG size);
BOOL nt_fdisk_close(BYTE drive);
extern PBDS demBDS;
extern BYTE NumberOfFloppy, NumberOfFdisk;
#if defined(NEC_98)
BOOL demIsDriveFloppy(BYTE DriveLog); // defined in demdasd.c
#else // !NEC_98
#define demIsDriveFloppy(DriveLog) (DriveLog < NumberOfFloppy)
#endif // !NEC_98