318 lines
8.6 KiB
C
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
|