OFFSET
|
DIM.
|
CONTENUTO
|
00h
|
4
|
Puntatore far al device driver successivo. Deve
contenere il valore FFFFFFFFh, in quanto viene inizializzato automaticamente
dal DOS al caricamento del driver[16].
|
04h
|
2
|
Device Attribute Word. E' una coppia di byte i cui
bit sono utilizzati per descrivere alcune caratteristiche della periferica
(vedere di seguito).
|
06h
|
2
|
Puntatore near alla strategy routine.
|
08h
|
2
|
Puntatore near alla interrupt routine.
|
0Ah
|
8
|
Se la periferica che il driver gestisce è di tipo
character, il campo contiene il nome logico assegnato alla periferica stessa,
utilizzabile dalle applicazioni come un nome di file: se il nome è
lungo meno di 8 byte, lo spazio restante deve essere riempito con spazi.
Se la periferica gestita è di tipo block, il primo byte del campo
contiene il numero di unità supportate; l'uso dei restanti 7 byte
è riservato al DOS. Il programmatore non ha necessità di
inizializzare il primo byte del campo: a ciò provvede il DOS con
le informazioni restituite dal driver al termine della fase di Init.
|
Si noti che i puntatori alla strategy e interrupt routine sono
BIT
|
SIGNIFICATO
|
15
|
1 se si tratta di un character device driver
0 se è un block device driver
|
14
|
1 se il device driver supporta i servizi
IOCTL[17] di lettura e scrittura
|
13
|
1 se la periferica è un block device (disco) formattato
in modo nonIBM
|
12
|
0 (riservato)
|
11
|
1 se il drivere può gestire un block device (disco)
rimuovibile (DOS 3 e succ.)
|
7-10
|
0 (riservati)
|
6
|
1 se il device driver supporta i servizi IOCTL Generic
e Get/Set Logical Drive
|
5
|
0 (riservato)
|
4
|
1 se il device driver supporta la funzione DOS speciale di
output veloce per la periferica CON
|
3
|
1 se il device driver è il driver per il device CLOCK
|
2
|
1 se il device driver è il driver per il device NUL
|
1
|
1 se il device driver è il driver per lo standard
output
|
0
|
1 se il device driver è il driver per lo standard
input
|
Va sottolineata l'importanza del bit 15, che indica se la periferica gestita
lavora a
BIT
|
SIGNIFICATO
|
15
|
Error Flag. 1 se si è verificato
un errore, 0 altrimenti.
|
12-14
|
Riservati.
|
9
|
Busy Flag. 1 se il driver vuole impedire
al DOS di richiedere ulteriori servizi (ad esempio perché l'esecuzione
del servizio non è stata ancora portata a termine), 0 altrimenti.
|
8
|
Done Flag. 1 se il servizio è stato
completamente eseguito, 0 se l'operazione non è ancora stata completata.
|
0-7
|
Error Code (codice di errore). E' significativo
solo se il bit 15 (Error Flag) è 1:
|
|
00h
|
Tentativo di scrittura su unità protetta.
|
|
01h
|
Unità sconosciuta.
|
|
02h
|
Unità non pronta (ad es.: sportello del disk drive
aperto).
|
|
03h
|
Servizio non supportato.
|
|
04h
|
Errore di CRC.
|
|
05h
|
Lunghezza del Request Header errata[19].
|
|
06h
|
Errore di ricerca dati sull'unità (seek error).
|
|
07h
|
Tipo di unità sconosciuto.
|
|
08h
|
Settore non trovato.
|
|
09h
|
Stampante senza carta.
|
|
0Ah
|
Errore di scrittura.
|
|
0Bh
|
Errore di lettura.
|
|
0Ch
|
Errore generico, non individuato (General failure).
|
|
0Dh
|
Riservato.
|
|
0Eh
|
Riservato.
|
|
0Fh
|
Cambiamento di disco non valido (a
partire dal DOS 3.0)[20].
|
Come si è detto, la parte variabile del request header è
strutturata in dipendenza dal servizio richiesto dal DOS al driver, cioè
a seconda del valore che il campo
CODICE
|
SERVIZIO
|
00
|
Init (inizializzazione del driver).
|
01
|
Media Check (solo per block device driver)
|
02
|
Build BIOS Parameter Block (solo per block device
driver)
|
03
|
IOCTL Read
|
04
|
Read (input)
|
05
|
Nondestructive Read (solo per character device driver)
|
06
|
Input Status (solo per character device driver)
|
07
|
Flush Input Buffers (solo per character device driver)
|
08
|
Write (output)
|
09
|
Write With Verify
|
10
|
Output Status (solo per character device driver)
|
11
|
Flush Output Buffers (solo per character device driver)
|
12
|
IOCTL Write
|
13
|
Device Open
|
14
|
Device Close
|
15
|
Removable Media (solo per block device driver)
|
16
|
Output Until Busy (solo per character device driver)
|
19
|
Generic IOCTL Request
|
23
|
Get Logical Device (solo per block device driver)
|
24
|
Set Logical Device (solo per block device driver)
|
I servizi 1316 sono stati introdotti a partire dalla versione 3.0
del DOS, mentre i servizi 19 e 2324 dalla versione 3.2. Di seguito
sono analizzati nel dettaglio tutti i servizi elencati e, per ciascuno
di essi, la corrispondente struttura della parte variabile del device driver
request header.
OFF
|
DIM
|
Request Header Ricevuto
|
Request header Restituito
|
00h
|
1
|
Lunghezza del request header
|
|
01h
|
1
|
|
|
02h
|
1
|
Numero del servizio richiesto (0)
|
|
03h
|
2
|
|
Stato dell'operazione
|
05h
|
8
|
|
|
0Dh
|
1
|
|
Numero di unità supportate (solo block device driver).
|
0Eh
|
4
|
|
Puntatore far al primo byte di memoria libera oltre
il device driver.
|
12h
|
4
|
Puntatore far alla riga di comando del driver nel
file CONFIG.SYS. Punta al primo byte che segue la stringa "DEVICE=".
|
Usato solo dai block device driver. Puntatore far
all'array di puntatori ai BPB (vedere la tabella seguente). E' un array
di word, ciascuna delle quali è un puntatore near ad un
BPB. L'array contiene un elemento (word) per ogni unità logica supportata
dal device driver.
|
16h
|
1
|
Numero della prima unità disco
disponibile[22] (solo block device driver).
|
|
Bisogna tenere presente che quando i device driver vengono caricati dal
DOS, quest'ultimo non ha ancora completato
OFF
|
DIM
|
CAMPO
|
00h
|
2
|
Lunghezza del settore in byte
|
02h
|
1
|
Numero di settori per cluster (unità di allocazione)
|
03h
|
2
|
Numero di settori riservati (a partire dal settore 0)
|
05h
|
1
|
Numero di FAT (File Allocation Table) presenti sul disco
|
06h
|
2
|
Numero massimo di elementi nella directory root
|
08h
|
2
|
Numero totale di settori
|
0Ah
|
1
|
Media descriptor byte (o Media ID byte):
F0h: floppy 3.5" (2 lati, 18 sett./traccia)
F8h: hard disk
F9h: floppy 5.25" (2 lati, 15 sett./traccia)
F9h: floppy 3.5" (2 lati, 9 sett./traccia)
FCh: floppy 5.25" (1 lato, 9 sett./traccia)
FDh: floppy 5.25" (2 lati, 9 sett./traccia)
FEh: floppy 5.25" (1 lati, 8 sett./traccia)
FFh: floppy 5.25" (2 lati, 8 sett./traccia)
|
0Bh
|
2
|
Numero di settori in una FAT
|
0Dh
|
2
|
Numero di settori per traccia (dal DOS 3.0 in poi)
|
0Fh
|
2
|
Numero di testine (dal DOS 3.0 in poi)
|
11h
|
2
|
Numero di settori nascosti (dal DOS 3.0 in poi)
|
13h
|
2
|
Word più significativa del numero di settori nascosti,
a partire dal DOS 3.2 (in cui il numero settori nascosti diviene un dato
a 32 bit)
|
15
|
4
|
Se la word ad offset 08h è 0, questo
campo contiene il numero totale di settori espresso come dato a 32 bit,
onde consentire il superamento del limite di 32Mb alla dimensione delle
partizioni dei dischi fissi (dal dos 3.2 in poi).
|
OFF
|
DIM
|
Request Header Ricevuto
|
Request header Restituito
|
00h
|
1
|
Lunghezza del request header
|
|
01h
|
1
|
Numero di unità disco (0 = A:);
usato solo dai block device driver
|
|
02h
|
1
|
Numero del servizio richiesto (4)
|
|
03h
|
2
|
|
Stato dell'operazione
|
05h
|
8
|
|
|
0Dh
|
1
|
Media ID byte; usato solo dai block
device driver
|
|
0Eh
|
4
|
Puntatore far ad un buffer utilizzato per il trasferimento
dei dati
|
|
12h
|
2
|
Numero di byte (character device driver) o settori (block
device driver) di cui è richiesto il trasferimento
|
Numero di byte (character device driver) o settori (block
device driver) di cui è effettuato il trasferimento
|
14h
|
2
|
Numero del settore logico di partenza; usato solo dai block
device driver
|
|
16h
|
4
|
|
A partire dal DOS 3.0: puntatore far ad una stringa
ASCIIZ (terminata con un NULL) contenente l'etichetta di volume del disco
se si è verificato un errore 0Fh.
|
Va infine osservato che le applicazioni possono leggere e scrivere dati
da un character device solo dopo averlo "aperto", utilizzando
il nome logico come se si trattasse di un vero e proprio file: per un esempio
si veda il
OFF
|
DIM
|
Request Header Ricevuto
|
Request header Restituito
|
00h
|
1
|
Lunghezza del request header
|
|
01h
|
1
|
Numero di unità disco (0 = A:);
usato solo dai block device driver
|
|
02h
|
1
|
Numero del servizio richiesto (19)
|
|
03h
|
2
|
|
Stato dell'operazione
|
05h
|
8
|
|
|
0Dh
|
1
|
Category Code (Major Code)
|
|
0Eh
|
1
|
Function Code (Minor Code)
|
|
0Fh
|
2
|
Contenuto del registro SI
|
|
11h
|
2
|
Contenuto del registro DI
|
|
13h
|
4
|
Puntatore far ad un buffer (Generic IOCTL Data Packet)
contenente i dati necessari al servizio
|
|
L'interfaccia IOCTL supportata dal servizio 19 è di tipo aperto,
disponibile, cioè, per future implementazioni. Tutte le sue caratteristiche
e funzionalità, in ogni caso, devono essere definite dal programmatore.
Il driver riceve dal DOS Category Code e Function Code, che possono essere
utilizzati, rispettivamente, per identificare un tipo di driver e selezionare
il sottoservizio desiderato. L'utilizzo dei valori di