📄 dosio.h
字号:
/*
* 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 + -