282 lines
8.4 KiB
C
282 lines
8.4 KiB
C
#define FF_CAPMASK 0x00FF
|
|
#define FF_SAVED 0x0100
|
|
#define FF_MAKESYS 0x0200
|
|
#define FF_QUICK 0x0400
|
|
#define FF_HIGHCAP 0x0800
|
|
#define FF_ONLYONE 0x1000
|
|
|
|
#define MS_720 0
|
|
#define MS_144 4
|
|
#define MS_288 6
|
|
|
|
#define SS48 2 // indexs into bpbList[] and cCluster[]
|
|
#define DS48 3
|
|
#define DS96 4
|
|
#define DS720KB 5
|
|
#define DS144M 6
|
|
#define DS288M 7
|
|
|
|
#define FAT_READ 1
|
|
#define FAT_WRITE 2
|
|
|
|
#define BOOTSECSIZE 512
|
|
|
|
/* FormatTrackHead() Error Codes */
|
|
#define DATAERROR 0x1000
|
|
#define ADDMARKNOTFOUND 0x0200
|
|
#define SECTORNOTFOUND 0x0400
|
|
|
|
#define IOCTL_FORMAT 0x42
|
|
#define IOCTL_SETFLAG 0x47
|
|
#define IOCTL_MEDIASSENSE 0x68
|
|
#define IOCTL_GET_DPB 0x60
|
|
#define IOCTL_SET_DPB 0x40
|
|
#define IOCTL_READ 0x61
|
|
#define IOCTL_WRITE 0x41
|
|
|
|
/* Media descriptor values for different floppy drives */
|
|
// NOTE: these are not all unique!
|
|
#define MEDIA_160 0xFE /* 160KB */
|
|
#define MEDIA_320 0xFF /* 320KB */
|
|
#define MEDIA_180 0xFC /* 180KB */
|
|
#define MEDIA_360 0xFD /* 360KB */
|
|
#define MEDIA_1200 0xF9 /* 1.2MB */
|
|
#define MEDIA_720 0xF9 /* 720KB */
|
|
#define MEDIA_1440 0xF0 /* 1.44M */
|
|
#define MEDIA_2880 0xF0 /* 2.88M */
|
|
|
|
#define DOS_320 0x314 /* DOS version # 3.20 */
|
|
|
|
#define DRIVEID(path) ((path[0] - 'A')&31)
|
|
|
|
|
|
/* IOCTL_Functions() error codes */
|
|
#define NOERROR 0
|
|
#define SECNOTFOUND 0x1B
|
|
#define CRCERROR 0x17
|
|
#define GENERALERROR 0x1F
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* BIOS Parameter Block Structure - */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct tagBPB
|
|
{
|
|
WORD cbSec; /* Bytes per sector */
|
|
BYTE secPerClus; /* Sectors per cluster */
|
|
WORD cSecRes; /* Reserved sectors */
|
|
BYTE cFAT; /* FATS */
|
|
WORD cDir; /* Root Directory Entries */
|
|
WORD cSec; /* Total number of sectors in image */
|
|
BYTE bMedia; /* Media descriptor */
|
|
WORD secPerFAT; /* Sectors per FAT */
|
|
WORD secPerTrack; /* Sectors per track */
|
|
WORD cHead; /* Heads */
|
|
WORD cSecHidden; /* Hidden sectors */
|
|
} BPB;
|
|
typedef BPB *PBPB;
|
|
typedef BPB FAR *LPBPB;
|
|
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* Drive Parameter Block Structure - */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct tagDPB
|
|
{
|
|
BYTE drive;
|
|
BYTE unit;
|
|
WORD sector_size;
|
|
BYTE cluster_mask;
|
|
BYTE cluster_shift;
|
|
WORD first_FAT;
|
|
BYTE FAT_count;
|
|
WORD root_entries;
|
|
WORD first_sector;
|
|
WORD max_cluster;
|
|
BYTE FAT_size;
|
|
WORD dir_sector;
|
|
LONG reserved1;
|
|
BYTE media;
|
|
BYTE first_access;
|
|
BYTE reserved2[4];
|
|
WORD next_free;
|
|
WORD free_cnt;
|
|
BYTE DOS4_Extra; /* FAT_size field is a WORD in DOS 4.X.
|
|
* To compensate for it, we have one extra byte
|
|
*/
|
|
} DPB;
|
|
typedef DPB *PDPB;
|
|
typedef DPB FAR *LPDPB;
|
|
|
|
#define MAX_SEC_PER_TRACK 40
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* Device Parameter Block Structure - */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct tagDevPB
|
|
{
|
|
CHAR SplFunctions;
|
|
CHAR devType;
|
|
CHAR reserved1[2];
|
|
INT NumCyls;
|
|
CHAR bMediaType; /* 0=>1.2MB and 1=>360KB */
|
|
BPB BPB;
|
|
CHAR reserved3[MAX_SEC_PER_TRACK * 4 + 2];
|
|
} DevPB, NEAR *PDevPB, FAR *LPDevPB;
|
|
|
|
#define TRACKLAYOUT_OFFSET (7+31) /* Offset of tracklayout
|
|
* in a Device Parameter Block */
|
|
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* Disk Base Table Structure - */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct tagDBT
|
|
{
|
|
CHAR SRHU;
|
|
CHAR HLDMA;
|
|
CHAR wait;
|
|
CHAR bytespersec;
|
|
CHAR lastsector;
|
|
CHAR gaplengthrw;
|
|
CHAR datalength;
|
|
CHAR gaplengthf;
|
|
CHAR datavalue;
|
|
CHAR HeadSettle;
|
|
CHAR MotorStart;
|
|
} DBT;
|
|
typedef DBT *PDBT;
|
|
typedef DBT FAR *LPDBT;
|
|
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* Directory Entry Structure - */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct tagDIRTYPE
|
|
{
|
|
CHAR name[11];
|
|
BYTE attr;
|
|
CHAR pad[10];
|
|
WORD time;
|
|
WORD date;
|
|
WORD first;
|
|
LONG size;
|
|
} DIRTYPE;
|
|
typedef DIRTYPE FAR *LPDIRTYPE;
|
|
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* MS-DOS Boot Sector Structure - */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct tagBOOTSEC
|
|
{
|
|
BYTE jump[3]; /* 3 byte jump */
|
|
CHAR label[8]; /* OEM name and version */
|
|
BPB BPB; /* BPB */
|
|
BYTE bootdrive; /* INT 13h indicator for boot device */
|
|
BYTE dontcare[BOOTSECSIZE-12-3-sizeof(BPB)];
|
|
BYTE phydrv;
|
|
WORD signature;
|
|
} BOOTSEC;
|
|
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* Disk Information Structure - */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct tagDISKINFO
|
|
{
|
|
WORD wDrive;
|
|
WORD wCylinderSize;
|
|
WORD wLastCylinder;
|
|
WORD wHeads;
|
|
WORD wSectorsPerTrack;
|
|
WORD wSectorSize;
|
|
} DISKINFO;
|
|
typedef DISKINFO *PDISKINFO;
|
|
typedef DISKINFO FAR *LPDISKINFO;
|
|
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* DOS Disk Transfer Area Structure - */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct tagDOSDTA
|
|
{
|
|
BYTE Reserved[21]; /* 21 */
|
|
BYTE Attrib; /* 22 */
|
|
WORD Time; /* 24 */
|
|
WORD Date; /* 26 */
|
|
DWORD Length; /* 30 */
|
|
CHAR szName[MAXDOSFILENAMELEN]; /* 43 */
|
|
CHAR dummy[1]; /* 44 */
|
|
// we do WORD move of 22 words so pad this out by 1 byte
|
|
} DOSDTA;
|
|
typedef DOSDTA *PDOSDTA;
|
|
typedef DOSDTA FAR *LPDOSDTA;
|
|
|
|
|
|
// this is the structure used to store file information in the
|
|
// directory window. these are variable length blocks. the
|
|
// first entry is a dummy that holds the number of entries in
|
|
// the whole block in the Length field. use the wSize field
|
|
// to give you a pointer to the next block
|
|
|
|
typedef struct tagMYDTA
|
|
{
|
|
WORD wSize; // size of this structure (cFileName is variable)
|
|
SHORT iBitmap;
|
|
INT nIndex;
|
|
|
|
DWORD my_dwAttrs; // must match WIN32_FIND_DATA from here down!
|
|
FILETIME my_ftCreationTime;
|
|
FILETIME my_ftLastAccessTime;
|
|
FILETIME my_ftLastWriteTime;
|
|
DWORD my_nFileSizeHigh;
|
|
DWORD my_nFileSizeLow;
|
|
CHAR my_cFileName[];
|
|
} MYDTA;
|
|
typedef MYDTA *PMYDTA;
|
|
typedef MYDTA FAR *LPMYDTA;
|
|
|
|
#define IMPORTANT_DTA_SIZE \
|
|
(sizeof(MYDTA) - \
|
|
sizeof(INT) - \
|
|
sizeof(WORD) - \
|
|
sizeof(SHORT))
|
|
|
|
#define GETDTAPTR(lpStart, offset) ((LPMYDTA)((LPSTR)lpStart + offset))
|
|
|
|
// stuff used by the search window
|
|
|
|
typedef struct tagDTASEARCH {
|
|
DWORD sch_dwAttrs; // must match WIN32_FIND_DATA
|
|
FILETIME sch_ftCreationTime;
|
|
FILETIME sch_ftLastAccessTime;
|
|
FILETIME sch_ftLastWriteTime;
|
|
DWORD sch_nFileSizeHigh;
|
|
DWORD sch_nFileSizeLow;
|
|
} DTASEARCH, FAR *LPDTASEARCH;
|
|
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* DOS Extended File Control Block Structure - */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct tagEFCB
|
|
{
|
|
BYTE Flag;
|
|
BYTE Reserve1[5];
|
|
BYTE Attrib;
|
|
BYTE Drive;
|
|
BYTE Filename[11];
|
|
BYTE Reserve2[5];
|
|
BYTE NewName[11];
|
|
BYTE Reserve3[9];
|
|
} EFCB;
|