⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dosio.h

📁 Due to an increase in demand for and questions about direct disk access for Micrososft platforms, a
💻 H
📖 第 1 页 / 共 2 页
字号:
/*
 * dosio.h      DOS data definitions
 *
 * This file is part of the BETA version of DISKLIB
 * Copyright (C) 1998, Gregg Jennings
 *
 * See README.TXT for information about re-distribution.
 * See DISKLIB.TXT for information about usage.
 *
 * 26-Nov-1998  greggj  MAX_FAT16_SECS
 * 04-Nov-1998  fixed the LOCK_n values
 *
 */

#ifndef DOSIO_H
#define DOSIO_H

/* Function return values */

#define DISK_OK     0
#define DEVICE_OK   0
#define DOS_ERR     (-1)
#define BIOS_ERR    (-2)
#define MEM_ERR     (-3)
#define DISK_ERR    (-4)
#define DEVICE_ERR  (-5)

/* fixed width data types for structures */

typedef unsigned char BYTE;         /* (I'm starting to dislike these...) */
typedef unsigned int UINT;
typedef short INT16;
typedef long INT32;
typedef unsigned short UINT16;
typedef unsigned long UINT32;


/* DOS Disk structure definitions */

#pragma pack(1)                 /* do not forget this! */

/* MS/PC/DR-DOS Boot Sector */

struct BOOT {
    BYTE    jump[3];            /* 3 byte Near Jump to boot code */
    BYTE    name[8];            /* 8 byte OEM name and version */
    UINT16  sec_size; /*BPB*/   /* Bytes per sector */
    BYTE    secs_cluster;       /* Sectors per allocation unit */
    UINT16  reserved_secs;      /* Reserved sectors (note 1) */
    BYTE    num_fats;           /* Number of FATs */
    UINT16  dir_entries;        /* Number of root dir entries */
    UINT16  num_sectors;        /* Number of sectors in logical image (note 2) */
    BYTE    media_desc;         /* Media descriptor */
    UINT16  secs_fat;           /* Number of FAT sectors */
    UINT16  secs_track;         /* Sectors per track */
    UINT16  num_heads;/*BPB*/   /* Number of heads */
 /* UINT16  hidden_sectors; */  /* Number of hidden sectors (note 3) */
    /* end DOS 2.0 */
 /* UINT16  large_sectors; */   /* High order number of hidden sectors */
 /* UINT32  total_sectors; */   /* Number of logical sectors */
    /* end DOS 3.0 */
    UINT32  hidden_sectors;     /* Number of hidden sectors (note 4) */
    UINT32  total_sectors;      /* Number of sectors if num_sectors == 0 */
    BYTE    drive_number;       /* 80h = harddrive else 00h */
    BYTE    reserved1;
    BYTE    signature;          /* 29h, 80h = WinNT */
    UINT32  volume_id;          /* Volume serial number */
    BYTE    volume_label[11];   /* Volume label */
    BYTE    file_system[8];/*EBPB*//* File system type */
    /* end DOS 6.0 */

    /*
       NOTES:

       1) Reserved sectors is usually the BOOT sector but can be more.
       2) If num_sectors is 0 use total_sectors.
       3) Sometime between 3.0 and 6.0 the WORD hidden_sectors entry
          merged with WORD large_sectors and became a DWORD, and
          total_sectors was renamed huge_sectors (in DOS parlance); also,
          the BPB grew in size. (I now use the name total_sectors.)
       4) Hidden sectors is usually the Partition track.
    */

};

/* FAT32 Boot sector */

struct BOOT_FAT32 {
    BYTE    jump[3];            /* 3 byte Near Jump to boot code */
    BYTE    name[8];            /* 8 byte OEM name and version */
    UINT16  sec_size;           /* Bytes per sector */
    BYTE    secs_cluster;       /* Sectors per allocation unit */
    UINT16  reserved_secs;      /* Reserved sectors (note 1) */
    BYTE    num_fats;           /* Number of FATs */
    UINT16  dir_entries;        /* 0 */
    UINT16  num_sectors;        /* 0 */
    BYTE    media_desc;         /* Media descriptor */
    UINT16  secs_fat;           /* 0 */
    UINT16  secs_track;         /* Sectors per track */
    UINT16  num_heads;          /* Number of heads */
    UINT32  hidden_sectors;     /* Number of hidden sectors */
    UINT32  total_sectors;      /* Number of sectors */
    UINT32  sectors_fat;        /* Sectors per FAT */
    UINT16  flags;
    UINT16  fs_version;         /* file system version number */
    UINT32  root_cluster;       /* cluster number of the first cluster of root */
    UINT16  info_sec;           /* file system information sector */
    UINT16  boot_sec;           /* backup boot sector sector */
    UINT16  reserved[6];
    BYTE    drive_number;       /* 80h = harddrive else 00h */
    BYTE    reserved1;
    BYTE    signature;          /* 29h */
    UINT32  volume_id;          /* Volume serial number */
    BYTE    volume_label[11];   /* Volume label */
    BYTE    file_system[8];     /* File system type */

    /*
        One would think that Microsoft would have put something in
        the BOOT sector to indicate that it is a FAT32/Win98 BOOT
        record. Perhaps if `secs_fat' == 0 means FAT32?
    */
};

/* NTFS Boot Sector */

struct BOOT_NTFS {
    BYTE    jump[3];            /* 3 byte Near Jump to boot code */
    BYTE    name[8];            /* 8 byte OEM name and version */
    UINT16  sec_size;           /* Bytes per sector */
    BYTE    secs_cluster;       /* Sectors per allocation unit */
    UINT16  reserved_secs;/*na*//* Reserved sectors */
    BYTE    num_fats;     /*na*//* Number of FATs */
    UINT16  dir_entries;  /*na*//* Number of root dir entries */
    UINT16  num_sectors;  /*na*//* Number of sectors in logical image */
    BYTE    media_desc;         /* Media descriptor */
    UINT16  secs_fat;     /*na*//* Number of FAT sectors */
    UINT16  secs_track;         /* Sectors per track */
    UINT16  num_heads;          /* Number of heads */
    UINT32  hidden_sectors;/*na*//* Number of hidden sectors */
    UINT32  total_sectors;/*na*//* Number of sectors if num_sectors == 0 */
    BYTE    drive_number;       /* 80h = harddrive else 00h */
    BYTE    reserved1;
    BYTE    signature;          /* 80h */
    BYTE    reserved2;
    UINT32  num_secs_lo;        /* Number of sectors in volume */
    UINT32  num_secs_hi;
    UINT32  mft_clus_lo;
    UINT32  mft_clus_hi;
    UINT32  mft2_clus_lo;
    UINT32  mft2_clus_hi;
    UINT32  rec_size;
    UINT32  buf_size;
    UINT32  volume_id;
};

/* BIOS Parameter Block definition */
/* (Part of Boot Sector) */

struct BPB {
    UINT16  sec_size; /*BPB*/   /* Bytes per sector */
    BYTE    secs_cluster;       /* Sectors per allocation unit */
    UINT16  reserved_secs;      /* Reserved sectors (note 1) */
    BYTE    num_fats;           /* Number of FATs */
    UINT16  dir_entries;        /* Number of root dir entries */
    UINT16  num_sectors;        /* Number of sectors in logical image (note 2) */
    BYTE    media_desc;         /* Media descriptor */
    UINT16  secs_fat;           /* Number of FAT sectors */
    UINT16  secs_track;         /* Sectors per track */
    UINT16  num_heads;/*BPB*/   /* Number of heads */
 /* UINT16  hidden_sectors; */  /* Number of hidden sectors (note 3) */
    /* end DOS 2.0 */
 /* UINT16  large_sectors; */   /* High order number of hidden sectors */
 /* UINT32  total_sectors; */   /* Number of logical sectors */
    /* end DOS 3.0 */
    UINT32  hidden_sectors;     /* Number of hidden sectors (note 4) */
    UINT32  total_sectors;/*BPB*//* Number of sectors if num_sectors == 0 */
};

/* Enhanced, DOS 6.0+, BIOS Parameter Block definition */

struct EBPB {
    UINT16  sec_size; /*BPB*/   /* Bytes per sector */
    BYTE    secs_cluster;       /* Sectors per allocation unit */
    UINT16  reserved_secs;      /* Reserved sectors */
    BYTE    num_fats;           /* Number of FATs */
    UINT16  dir_entries;        /* Number of root dir entries */
    UINT16  num_sectors;        /* Number of sectors in logical image */
    BYTE    media_desc;         /* Media descriptor */
    UINT16  secs_fat;           /* Number of FAT sectors */
    UINT16  secs_track;         /* Sectors per track */
    UINT16  num_heads;          /* Number of heads */
    UINT32  hidden_sectors;     /* Number of hidden sectors */
    UINT32  total_sectors;/*BPB*//* Number of sectors */
    BYTE    drive_number;       /* 80h = harddrive else 00h */
    BYTE    reserved1;
    BYTE    signature;          /* 29h */
    UINT32  volume_id;          /* Volume serial number */
    BYTE    volume_label[11];   /* Volume label */
    BYTE    file_system[8];/*EBPB*/ /* File system type */
};

/* Extended, or FAT32, BIOS Parameter Block definition */

struct EXT_BPB {
    UINT16  sec_size;           /* Bytes per sector */
    BYTE    secs_cluster;       /* Sectors per allocation unit */
    UINT16  reserved_secs;      /* Reserved sectors */
    BYTE    num_fats;           /* Number of FATs */
    UINT16  dir_entries;        /* Number of root dir entries */
    UINT16  num_sectors;        /* Number of sectors in logical image */
    BYTE    media_desc;         /* Media descriptor */
    UINT16  secs_fat;           /* Number of FAT sectors */
    UINT16  secs_track;         /* Sectors per track */
    UINT16  num_heads;          /* Number of heads */
    UINT32  hidden_sectors;     /* Number of hidden sectors */
    UINT32  total_sectors;      /* Number of sectors */
    UINT32  sectors_fat;        /* Sectors per FAT */
    UINT16  flags;
    UINT16  fs_version;         /* file system version number */
    UINT32  root_cluster;       /* cluster number of the first cluster of root */
    UINT16  info_sec;           /* file system information sector */
    UINT16  boot_sec;           /* backup boot sector sector */
    UINT16  reserved[6];

    /*
        One would think that Microsoft would have put something in
        the Ext BPB to indicate that it is an Ext BPB...
    */

};

/* MS-DOS Disk Parameter Block */
/* Int 21h 1Fh/32h - Get DPB */

struct DPB {
    BYTE    drive_num;          /* drive number */
    BYTE    unit_num;           /* for driver */
    UINT16  sec_size;           /* bytes per sector */
    BYTE    secs_cluster;       /* sectors per cluster */
    BYTE    secs_cluster2;      /* sectors per cluster as pow(2) */
    UINT16  fat_sector;         /* first FAT sector */
    BYTE    num_fats;           /* number of FATs */
    UINT16  dir_entries;        /* number of directory entries */
    UINT16  cluster_sec;        /* first sector of first cluster */
    UINT16  num_clusters;       /* number of clusters + 1 */
    UINT16  secs_fat;           /* sectors per FAT */
    UINT16  dir_sector;         /* first sector of ROOT directory */
    UINT32  driver_addr;        /* device driver address */
    BYTE    media_desc;         /* media descriptor */
    BYTE    first_access;       /* access of drive */
    UINT32  next_dpb;           /* next DPB */
    UINT16  last_cluster;       /* last allocated cluster */
    UINT16  free_clusters;      /* availible clusters */
};

/* MS-DOS Disk Parameter Block, FAT32 */
/* Int 21h 7302h - Get ExtDPB */

struct EXT_DPB {
  /*UINT16  size;*/             /* size of the structure minus this member */
    BYTE    drive_num;          /* drive number (A: = 0) */
    BYTE    unit_num;           /* for driver */
    UINT16  sec_size;           /* bytes per sector */
    BYTE    secs_cluster;       /* sectors per cluster */
    BYTE    secs_cluster2;      /* sectors per cluster as pow(2) */
    UINT16  fat_sector;         /* first FAT sector */
    BYTE    num_fats;           /* number of FATs */
    UINT16  dir_entries;        /* number of directory entries */
    UINT16  cluster_sec;        /* first sector of first cluster */
    UINT16  num_clusters;       /* number of clusters + 1 */
    UINT16  secs_fat;           /* sectors per FAT */
    UINT16  dir_sector;         /* first sector of ROOT directory */
    UINT32  driver_addr;        /* device driver address */
    BYTE    media_desc;         /* media descriptor */
    BYTE    first_access;       /* access of drive */
    UINT32  next_dpb;           /* next DPB */
    UINT16  last_cluster;       /* last allocated cluster */
    UINT32  free_clusters;      /* availible clusters */
    UINT16  flags;
    UINT16  info_sec;           /* file system information sector */
    UINT16  boot_sec;           /* backup boot sector sector */
    UINT32  cluster_sector;     /* first sector of first cluster */
    UINT32  max_clusters;       /* number of clusters + 1 */
    UINT32  sectors_fat;        /* sectors per FAT */
    UINT32  root_cluster;       /* cluster number of the first cluster of root */
    UINT32  next_free_cluster;  /* most recently allocated cluster */

    /*
        When making the call to fill this structure the buffer must be
        preceded by a WORD which will receive the size of the ExtDPB.
        Which begs the question: Should that size field be part of the
        structure?
    */
};

/* MS-DOS Device Parameter Block */
/* IOCTL Int 21h 440Dh/60h - Get Device Parameters */

struct DEVICEPARAMS {
    BYTE    special;
    BYTE    dev_type;
    UINT16  dev_attrib;
    UINT16  cylinders;
    BYTE    media;
    UINT16  sec_size;       /*BPB*/
    BYTE    secs_cluster;
    UINT16  reserved_secs;
    BYTE    num_fats;
    UINT16  dir_entries;
    UINT16  num_sectors;
    BYTE    media_desc;
    UINT16  secs_fat;
    UINT16  secs_track;
    UINT16  num_heads;
    UINT32  hidden_sectors;
    UINT32  total_sectors;  /*BPB*/
};

/* MS-DOS Device Parameter Block, FAT32 */
/* IOCTL Int 21h 440Dh/60h, Category 48h - Get Device Parameters */

struct EXT_DEVICEPARAMS {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -