/*** *dpb.h - disked definitions/declarations for DOS Drive Parameter Information * *Copyright (c) 1993-1995, Gregg Jennings. All wrongs reserved. * P O Box 200, Falmouth, MA 02541-0200 * *Purpose: * For use with the diskio() functions * *Notice: * This progam may be freely used and distributed. Any distrubution * with modifications must retain the above copyright statement and * modifications noted. * No pulp-publication, in whole or in part, permitted without * permission (magazines or books). *******************************************************************************/ #ifndef GENERAL_H #include "general.h" #endif /* DOS Disk structure definitions */ #pragma pack(1) /* Format of a Boot Sector */ /* This is verbatim MS-DOS Technical Referance for DOS 3.3 */ struct BOOT { unsigned char jump[3]; /* 3 byte Near Jump to boot code */ unsigned char name[8]; /* 8 byte OEM name and version */ unsigned int sec_size; /*BPB*/ /* WORD Bytes per sector */ unsigned char secs_cluster; /* BYTE Sectors per allocation unit */ unsigned int reserved_secs; /* WORD Reserved sectors (note 1) */ unsigned char num_fats; /* BYTE Number of FATs */ unsigned int dir_entries; /* WORD Number of root dir entries */ unsigned int num_sectors; /* WORD Number of sectors in logical image or 0 (note 2) */ unsigned char media_desc; /* BYTE Media descriptor */ unsigned int secs_fat; /*BPB*/ /* WORD Number of FAT sectors */ unsigned int secs_track; /* WORD Sectors per track */ unsigned int num_heads; /* WORD Number of heads */ unsigned int hidden_sectors; /* WORD Number of hidden sectors (note 3) */ unsigned int large_sectors; /* WORD High order number of hidden sectors */ unsigned long total_sectors; /* DWORD Number of logical sectors */ /* I've added this to keep it the same as the BPB structure defined later. */ unsigned char reserved[6]; }; /* This is the text from the Technical Reference: "Although MS-DOS does not use the five fields that follow the BPB, these fields may be used by a device driver to help it understand the media. "The "Sectors per track" and "Number of heads" fields are useful for supporting different media that may have the same logical layout, but a different physical layout (for example, 40-track, double-sided versus 80-track, single-sided). "Sectors per track" tells the device driver how the logical disk format is laid out on the physical disk. "The "Number of hidden sectors" and "High order number of hidden sectors" fields may be used to support drive-partitioning schemes. The "Number of logical sectors" field tells the device driver how many sectors to reserve if the "Number of sectors in logical image" field is zero (Notice taht this is intended for supporting devices that access more than 32 megabytes.)" Note 1: Reserved sectors are the number of sectors that make up the boot record. Although usually 1 that is not always the case. Mote 2: If the num_sectors is 0, then there are more than can fit in a WORD (65535), i.e. > 32 megabytes (this is how DOS has changed to support "un-thought-of" drive sizes), and total_sectors must be used. (This is an assumption on my part.) Note 3: Hidden sectors are for hard-drives to hold Partitioning information. They are "hidden" from DOS Interrupts 25 and 26, and BIOS Interrupt 13, but can be accessed by DOS Interrupt 21/44. (Interrupt 13 may read them, but I have not tried it.) There has been a problem with 'hidden_sectors'. BPB says DWORD but BOOT says WORD (?); WORD seems to work but I've found that it also depends on the compiler and the optimizations ;-). */ /* BIOS Parameter Block definition */ /* There are more fields than described by the BPB area of the BOOT structure as defined by MS (bounded by / *BPB* / above), but they are the same except for the "reserved" bytes at the end. */ struct BPB { unsigned int sec_size; unsigned char secs_cluster; unsigned int reserved_secs; unsigned char num_fats; unsigned int dir_entries; unsigned int num_sectors; unsigned char media_desc; unsigned int secs_fat; unsigned int secs_track; unsigned int num_heads; unsigned long hidden_sectors; unsigned long total_sectors; unsigned char reserved[6]; }; /* Disk Parameter Block */ /* IOCTL Int 21/44 interface */ struct DPB { unsigned char special; unsigned char dev_type; unsigned int dev_attrib; unsigned int cylinders; unsigned char media; struct BPB bpb; }; /* Disk Control Block */ /* For drives larger than 32M */ struct DCB { unsigned long sector; unsigned int number; unsigned char _far *buffer; }; #pragma pack()