220 lines
7.4 KiB
C
220 lines
7.4 KiB
C
;/*
|
|
;***************************************************************************;
|
|
;* Microsoft MS-DOS CDROM Extensions *;
|
|
;* Copyright (C) Microsoft Corporation, 1992 - 1999*;
|
|
;***************************************************************************;
|
|
;* :ts=4 ; tab-size=4 *;
|
|
|
|
;**
|
|
;* DEVSYM.H
|
|
;*
|
|
;* DESCRIPTION:
|
|
;*
|
|
;* HISTORY:
|
|
;*
|
|
;**
|
|
|
|
;------------------------------ INCLUDES -----------------------------------;
|
|
include redir\devsym.inc
|
|
;---------------------------------------------------------------------------;
|
|
|
|
SYSDEV2 STRUC
|
|
SDEVREC DB size SYSDEV dup (?)
|
|
SDEVRSVD DW ?
|
|
SDEVLET DB ?
|
|
SDEVUNITS DB ?
|
|
SYSDEV2 ENDS
|
|
|
|
|
|
DEVRDL = 128 ; Read long
|
|
DEVRDLNB = 129 ; Read long non blocking
|
|
DEVRDLPRE = 130 ; Read long prefetch
|
|
DEVSEEK = 131 ; Seek long
|
|
DEVPLAY = 132 ; Device Play
|
|
DEVSTOP = 133 ; Stop device play
|
|
DEVWRTL = 134 ; Write long
|
|
DEVWRTLNB = 135 ; Write long nonblocking
|
|
DEVWRTLV = 136 ; Write long verify
|
|
|
|
;*/
|
|
|
|
/* Device table and SRH definition */
|
|
|
|
/* The device table list has the form: */
|
|
|
|
typedef struct SYSDEV {
|
|
struct SYSDEV far *sdevnext; /* Pointer to next dev header */
|
|
unsigned short sdevatt; /* Attributes of the device */
|
|
void (*sdevstrat)(); /* Strategy entry point */
|
|
void (*sdevint)(); /* Interrupt entry point */
|
|
unsigned char sdevname[8]; /* Name of device (only first byte used for block) */
|
|
unsigned short sdevrsvd; /* Reserved word */
|
|
unsigned char sdevlet; /* Drive letter of first unit */
|
|
unsigned char sdevunits; /* Number of units handled */
|
|
} SYSDEV;
|
|
|
|
/*
|
|
** Attribute bit masks
|
|
**
|
|
** Character devices:
|
|
**
|
|
** Bit 15 -> must be 1
|
|
** 14 -> 1 if the device understands IOCTL control strings
|
|
** 13 -> 1 if the device supports output-until-busy
|
|
** 12 -> unused
|
|
** 11 -> 1 if the device understands Open/Close
|
|
** 10 -> must be 0
|
|
** 9 -> must be 0
|
|
** 8 -> unused
|
|
** 7 -> unused
|
|
** 6 -> unused
|
|
** 5 -> unused
|
|
** 4 -> 1 if device is recipient of INT 29h
|
|
** 3 -> 1 if device is clock device
|
|
** 2 -> 1 if device is null device
|
|
** 1 -> 1 if device is console output
|
|
** 0 -> 1 if device is console input
|
|
**
|
|
** Block devices:
|
|
**
|
|
** Bit 15 -> must be 0
|
|
** 14 -> 1 if the device understands IOCTL control strings
|
|
** 13 -> 1 if the device determines media by examining the FAT ID byte.
|
|
** This requires the first sector of the fat to *always* reside in
|
|
** the same place.
|
|
** 12 -> unused
|
|
** 11 -> 1 if the device understands Open/Close/removable media
|
|
** 10 -> must be 0
|
|
** 9 -> must be 0
|
|
** 8 -> unused
|
|
** 7 -> unused
|
|
** 6 -> if device has support for GetMap/SetMap of Logical Drives.
|
|
** if the device understands Generic IOCTL function calls.
|
|
** 5 -> unused
|
|
** 4 -> unused
|
|
** 3 -> unused
|
|
** 2 -> unused
|
|
** 1 -> unused
|
|
** 0 -> unused
|
|
*/
|
|
|
|
#define DevTyp 0x8000 /* Bit 15 - 1 if Char, 0 if block */
|
|
#define CharDev 0x8000
|
|
#define DevIOCtl 0x4000 /* Bit 14 - CONTROL mode bit */
|
|
#define ISFATBYDEV 0x2000 /* Bit 13 - Device uses FAT ID bytes, */
|
|
/* comp media. */
|
|
#define OutTilBusy 0x2000 /* Output until busy is enabled */
|
|
#define ISNET 0x1000 /* Bit 12 - 1 if a NET device, 0 if */
|
|
/* not. Currently block only. */
|
|
#define DEVOPCL 0x0800 /* Bit 11 - 1 if this device has */
|
|
/* OPEN,CLOSE and REMOVABLE MEDIA */
|
|
/* entry points, 0 if not */
|
|
|
|
#define EXTENTBIT 0x0400 /* Bit 10 - Currently 0 on all devs */
|
|
/* This bit is reserved for future use */
|
|
/* to extend the device header beyond */
|
|
/* its current form. */
|
|
|
|
/* NOTE Bit 9 is currently used on IBM systems to indicate "drive is shared".
|
|
** See IOCTL function 9. THIS USE IS NOT DOCUMENTED, it is used by some
|
|
** of the utilities which are supposed to FAIL on shared drives on server
|
|
** machines (FORMAT,CHKDSK,RECOVER,..).
|
|
*/
|
|
|
|
#define DEV320 0x0040 /* Bit 6 - For block devices, this */
|
|
/* device supports Set/Get Map of */
|
|
/* logical drives, and supports */
|
|
/* Generic IOCTL calls. */
|
|
/* For character devices, this */
|
|
/* device supports Generic IOCTL. */
|
|
/* This is a DOS 3.2 device driver. */
|
|
#define ISSPEC 0x0010 /* Bit 4 - This device is special */
|
|
#define ISCLOCK 0x0008 /* Bit 3 - This device is the clock device. */
|
|
#define ISNULL 0x0004 /* Bit 2 - This device is the null device. */
|
|
#define ISCOUT 0x0002 /* Bit 1 - This device is the console output. */
|
|
#define ISCIN 0x0001 /* Bit 0 - This device is the console input. */
|
|
|
|
/* Static Request Header */
|
|
typedef struct SRHEAD {
|
|
unsigned char REQLEN; /* Length in bytes of request block */
|
|
unsigned char REQUNIT; /* Device unit number */
|
|
unsigned char REQFUNC; /* Type of request */
|
|
unsigned short REQSTAT; /* Status Word */
|
|
unsigned char REQQLNK[8]; /* Reserved for queue links */
|
|
} SRHEAD;
|
|
|
|
/* Status word masks */
|
|
#define STERR 0x8000 /* Bit 15 - Error */
|
|
#define STBUI 0x0200 /* Bit 9 - Busy */
|
|
#define STDON 0x0100 /* Bit 8 - Done */
|
|
#define STECODE 0x00FF /* Error code */
|
|
|
|
/* Function codes */
|
|
#define DEVINIT 0 /* Initialization */
|
|
#define DINITHL 26 /* Size of init header */
|
|
#define DEVMDCH 1 /* Media check */
|
|
#define DMEDHL 15 /* Size of media check header */
|
|
#define DEVBPB 2 /* Get BPB */
|
|
#define DEVRDIOCTL 3 /* IOCTL read */
|
|
#define DBPBHL 22 /* Size of Get BPB header */
|
|
#define DEVRD 4 /* Read */
|
|
#define DRDWRHL 22 /* Size of RD/WR header */
|
|
#define DEVRDND 5 /* Non destructive read no wait (char devs) */
|
|
#define DRDNDHL 14 /* Size of non destructive read header */
|
|
#define DEVIST 6 /* Input status */
|
|
#define DSTATHL 13 /* Size of status header */
|
|
#define DEVIFL 7 /* Input flush */
|
|
#define DFLSHL 15 /* Size of flush header */
|
|
#define DEVWRT 8 /* Write */
|
|
#define DEVWRTV 9 /* Write with verify */
|
|
#define DEVOST 10 /* Output status */
|
|
#define DEVOFL 11 /* Output flush */
|
|
#define DEVWRIOCTL 12 /* IOCTL write */
|
|
#define DEVOPN 13 /* Device open */
|
|
#define DEVCLS 14 /* Device close */
|
|
#define DOPCLHL 13 /* Size of OPEN/CLOSE header */
|
|
#define DEVRMD 15 /* Removable media */
|
|
#define REMHL 13 /* Size of Removable media header */
|
|
#define GENIOCTL 19
|
|
/* The next three are used in DOS 4.0
|
|
** 20
|
|
** 21
|
|
** 22
|
|
*/
|
|
#define DEVGETOWN 23 /* Get Device Owner */
|
|
#define DEVSETOWN 24 /* Set Device Owner */
|
|
#define OWNHL 13 /* Size of Device Owner header */
|
|
|
|
#define DevOUT 16 /* output until busy. */
|
|
#define DevOutL DevWrt /* length of output until busy */
|
|
|
|
#define DEVRDL 128 /* Read long */
|
|
#define DEVRDLNB 129 /* Read long non blocking */
|
|
#define DEVRDLPRE 130 /* Read long prefetch */
|
|
#define DEVSEEK 131 /* Seek long */
|
|
#define DEVPLAY 132 /* Device Play */
|
|
#define DEVSTOP 133 /* Stop device play */
|
|
#define DEVWRTL 134 /* Write long */
|
|
#define DEVWRTLNB 135 /* Write long nonblocking */
|
|
#define DEVWRTLV 136 /* Write long verify */
|
|
|
|
/* Generic IOCTL Request structure
|
|
** See the DOS 4.0 Device Driver Spec for Further elaboration.
|
|
*/
|
|
typedef struct IOCTL_Req {
|
|
struct SRHEAD ReqHdr;
|
|
/* Generic IOCTL addition. */
|
|
unsigned char MajorFunction; /* Function Code */
|
|
unsigned char MinorFunction; /* Function Category */
|
|
unsigned short Reg_SI;
|
|
unsigned short Reg_DI;
|
|
unsigned char far *GenericIOCTL_Packet; /* Pointer to Data Buffer */
|
|
} IOCTL_Req;
|
|
|
|
/* Definitions for IOCTL_Req.MinorFunction */
|
|
#define GEN_IOCTL_WRT_TRK 0x40
|
|
#define GEN_IOCTL_RD_TRK 0x60
|
|
#define GEN_IOCTL_FN_TST 0x20 /* Used to diff. bet reads and wrts */
|
|
|
|
\
|