#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