Metropoli BBS
VIEWER: dpb.h MODE: TEXT (ASCII)
/***
*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()
[ RETURN TO DIRECTORY ]