[Front] [Prev Chapter] [Next Chapter] | [in English] |
はじめに
デバイスドライバヘッダ
リクエストパケット
BPB(BIOS パラメータブロック)
デバイスドライバファンクション
ロード可能なデバイスドライバは、付加的なハードウェアデバイスをサポートする能力を提供します。 いったんロードされたデバイスドライバは、IBMBIO.COM ファイルに結合された常駐デバイスドライバと、構造上なんら差異はありません。 ふつう、デバイスドライバは 8080 形式のメモリモデルをしており、コードセグメントとデータセグメントは同じです。 (野暮な訳注 : 8080 形式というのはつまり、インテルの 8 ビット CPU である i8080 のような、という意味なんだと思いますけど…) デバイスドライバは一般的に、.SYS 拡張子をつけています。 デバイスドライバは .COM 形式でも .EXE 形式でもかまいません。 メモリイメージは、デバイスヘッダを先頭にしなければならず、デバイスヘッダは以下のセクションで記述されるフォーマットのデータ構造です。
デバイスドライバには2つのタイプがあります。 ブロックデバイスとキャラクタデバイスです。
キャラクタデバイスはシーケンシャル入出力を扱います。 入出力を行うために、アプリケーションはキャラクタデバイスへの回線を開くことができます。 キャラクタデバイスは、たとえば MODEM といった、それぞれ個別の名前を持っています。
ブロックデバイスは、システムのディスクドライブへのランダム入出力を扱います。 ブロックデバイスは名前づけされていませんが、A:、B:、以下同様のドライブレターを割り付けられています。 単一の物理ディスクが複数の割り付けユニットに区画分けされていることもあります。 最小のブロックサイズは、デバイスの物理セクタサイズです。 たとえば、往々にしてディスケットドライブはユニット A:、B: であり、最初のハードディスクは C: と D: のふたつの区画に分かれています。 ブロックデバイスドライバは、複数の物理ユニットそれぞれを、ユニット個別の割り付けを行うことで管理します。 それぞれが多数のユニットを管理する、多数のデバイスドライバがあることになります。
オフセット | 型 | 値 | 説明 |
---|---|---|---|
00h | dword | NEXTDH | 次のデバイスドライバへのポインタ |
04h | word | ATTRIBUTE | デバイスドライバの属性 |
06h | word | STRATEGY | ストラテジコードのエントリポイント (オフセットのみ) |
08h | word | INTERRUPT | インタラプトコードのエントリポイント (オフセットのみ) |
0Ah | 8 bytes | UNIT | デバイス名(キャラクタデバイス)、 サポートするユニット数(ブロックデバイス) |
次のデバイスドライバへのダブルワードポインタです。 デバイスドライバチェーンの最後のドライバでは、NEXTDH は特別な値 FFFF:FFFFh です。
このフィールドは、デバイスドライバの特徴を記述します。 Figure 6-2 は ATTRIBUTE フィールドのビットを定義しています。
ビット | 説明 |
---|---|
15 | 1 -- キャラクタデバイス |
14 | 1 -- IOCTL ファンクションサポート |
13 | 1 -- OUTPUT UNTIL BUSY サポート |
12 | 予約 (0) |
11 | 1 -- OPEN/CLOSE/RM ファンクションサポート |
10〜7 | 予約 (0) |
6 | 1 -- GENERIC IOCTL サポート |
5 | 予約 (0) |
4 |
Special bit 1 -- INT 29h での高速文字表示サポート (訳注 : この項追加) |
3 | 1 -- カレント CLOCK デバイス |
2 | 1 -- カレント NUL デバイス |
1 | 1 -- カレント標準出力デバイス |
0 | 1 -- カレント標準入力デバイス |
ビット | 説明 |
---|---|
15 | 0 -- ブロックデバイス |
14 | 1 -- IOCTL ファンクションサポート |
13 | 1 -- NON FAT ID (BUILD BPB ファンクション参照) |
12 | 予約 (0) |
11 | 1 -- OPEN/CLOSE/RM ファンクションサポート |
10〜7 | 予約 (0) |
6 | 1 -- GENERIC IOCTL、GET/SET logical device サポート |
5〜2 | 予約 (0) |
1 | 1 -- 32 ビットセクタ番号サポート |
0 | 予約 (0) |
ドライバ中の本オフセットは、ストラテジコードのエントリーポイントです。 ストラテジコードは、ファンクションが実行されるとき、DR-DOS によって呼び出されます。 DR-DOS はリクエストパケットのポインタを(訳注 : ES:BX に)渡します。 デバイスドライバはパケットポインタをキューに格納します。 このコールの実行中、レジスタの内容は保存されていなければなりません。
(重要な訳注 : ドライバヘッダ中の STRATEGY と INTERRUPT はそれぞれワード値であり、エントリーポイントへのオフセット値のみを格納していますが、DOS はこれらのコードを FAR CALL で呼び出します。 したがって、これらのルーチンは RETF 命令で終了させなければなりません。 たとえば ArrowASM でデバイスドライバを書く場合、ArrowASM は RETF と RETN を明示的に書き分けられないので、ストラテジコードとインタラプトコードを PROC FAR 〜 ENDP の中に入れるか、RETF 命令に相当するバイナリコード (CBh) をなんらかの方法で埋め込む必要があるでしょう。 )
ドライバ中の本オフセットは、インタラプトコードのエントリーポイントです。 インタラプトコードは、その前のストラテジエントリの呼び出しでセットされたリクエストパケットを処理するため、DR-DOS によって呼び出されます。 ドライバはリクエストパケットを解釈し、ファンクションを実行して DR-DOS に戻ります。 レジスタは、ファンクションが値を返すために使うことはなく、その内容は保存されていなければなりません。
(訳注 : STRATEGY の「重要な訳注」を参照のこと)
キャラクタデバイスでは、このフィールドには、8 バイトの ASCII デバイス名を格納します。 デバイス名は 8 バイトで、8 バイト未満の場合は空白文字で残りを埋めます。 ファイル名として有効な文字のみが使えます。 ブロックデバイスでは、このフィールドの先頭バイトには、ドライバがサポートするユニット数を格納します。 ドライバが初期化(訳注 : INIT ファンクション)を行ったのち、DR-DOS はこのフィールドを埋めます。
リクエストパケットの構造体は、ファンクションに依存した可変長になっています。 最小のサイズは、以下に定義する 13 バイトです。 パケットのアドレスは、ドライバへのストラテジ呼び出しの際、ES:BX のレジスタペアに渡されます。
(Table 6-1 参照) |
オフセット | 型 | 名前 | 説明 |
---|---|---|---|
00h | byte | RPLENGTH | バイト単位でのパケット長 |
01h | byte | UNIT | ユニット番号 (ブロックデバイスのみ) |
02h | byte | FUNCTION |
ファンクション番号。
定義は以下の通り。 0 = Init 1= Media check 2 = Build BPB 3 = IOCTL input 4 = Input 5 = Non destructive input no wait 6 = Input status 7 = Input Flush 8 = Output 9 = Output with verify 10 = Output status 11 = Output flush 12 = IOCTL output 13 = Device open 14 = Device close 15 = Removable media 19 = Generic IOCTL request 23 = Get logical device 24 = Set logical device |
03h | word | STATUS | ステータス |
05h | 8 bytes | 予約 |
ビット | 内容 |
---|---|
15 |
1 -- エラー 0 -- 正常 |
14〜10 | 予約 (0) |
9 | 1 -- BUSY |
8 | 1 -- DONE (エラーで終了、もしくは正常に終了した) |
7〜0 |
エラーコード
(bit15 = 1 の場合)
00h -- ライトプロテクト違反 Write protect violation 01h -- 不明なユニット Unknown unit 02h -- デバイスの準備ができていない Device not ready 03h -- 不明なファンクション Unknown command 04h -- CRC エラー CRC failure 05h -- リクエストパケットの長さが不正 Bad request structure length 06h -- シークエラー Seek faiure 07h -- 不明なメディア Unknown media 08h -- セクタが見つからない Sector not found 09h -- プリンタ用紙切れ Printer out of paper 0Ah -- 書き込み失敗 Write failure 0Bh -- 読み込み失敗 Read failure 0Ch -- その他全般の失敗 General failure 0Dh -- (予約) 0Eh -- (予約) 0Fh -- 不正なディスク交換 Invalid disk change (訳注 : Table 3-3 の 00h〜0Ch のあたり、Table 5-1 のエラーコード 19〜31 のあたりも見てみるといいかもしれません) |
(訳注 : 元の図 (fig6-6.gif) の判読が困難なので、これは参照にとどめ、訳者の一存で記述しました。 )
オフセット | 型 | 内容 |
---|---|---|
00h | word | 1 セクタあたりのバイト数。 32の倍数 (訳注 : 「2の倍数」のような気もするが、元の図がなんとなく32に見えるので一応こうしておく) |
02h | byte | 1クラスタあたりのセクタ数。 2のべき乗でなければならない。 |
03h | word | 先頭 FAT のセクタ番号。 通常の値は 1。 |
05h | byte | FAT の数。 通常の値は 2。 |
06h | word | ルートディレクトリ中のディレクトリエントリ総数。 |
08h | word | ディスクのセクタ数。 0000h の場合はオフセット 15h の dword 値が使われる。 |
0Ah | byte | FAT ID |
0Bh | word | ひとつの FAT あたりのセクタ数。 |
0Dh | word | 1トラックあたりのセクタ数 |
0Fh | word | ヘッド数 |
11h | dword | 隠しセクタ数。 |
15h | dword |
セクタサイズでのディスク総数。 ATTRIBUTE の bit1 = 1 の場合のみ使用される。 |
DR-DOS は、デバイスドライバ構築のために、多数のファンクションを用意しています。 ファンクションは以下のサブセクション中で記述されています。
ドライバのためにハードウェアとソフトウェアの初期化を行い、リクエストヘッダにドライバの終了アドレスとステータスワードをセットします。 ブロックデバイスでは、ユニット数と BPB 配列のポインタもセットします。 終了アドレスをセットすることにより、必要とされないメモリを開放、もしくは、データ構造体やバッファのためにより多くのメモリを確保することができます。
オフセット | 型 | 名前 | 説明 |
---|---|---|---|
00h | byte | RPLENGTH | バイト単位でのパケット長 |
01h | byte | UNIT | ユニット番号 (ブロックデバイスのみ) |
02h | byte | FUNCTION | ファンクション番号。 |
03h | word | STATUS | ステータス |
05h | 8 bytes | 予約 | |
0Dh | byte | NBRUNITS | ドライバがサポートするユニット数 (ブロックデバイス) |
0Eh | dword | ENDADDR | ドライバの終了アドレス |
12h | dword | BPBPTR |
入力時、コマンドライン文字列アドレス リターン時は BPB 配列のアドレスをセット(ブロックデバイス) |
16h | byte | BLKNBR | 論理デバイス番号(ブロックデバイス) |
ドライバがサポートするユニット数をセットします(ブロックデバイスのみ)。
ドライバに続く、利用可能なメモリの先頭ポインタをセットします。 このことによりシングルドライバのメモリ空間を増加、もしくは削減でき、ドライバに割り当てたメモリ空間の最大限の活用を可能にします。 複数のドライバが1グループに結合している場合、グループ内のそれぞれのドライバが、グループのメモリ終端を示す変数を変更し、その値を ENDADDR フィールドに返します。 このようにして各ドライバがデータ空間を確保できます。 この変数は、各ドライバが初期化されるごとに ENDADDR フィールドに値を返します。 INIT ファンクションはドライバインストール時に一度だけ呼び出されるので、INIT コードは ENDADDR の値で示されるドライバ終端よりも後方に置いてかまいません。 これにより INIT ファンクション用コードは破棄されます。
( 訳注 : DEVICEHIGH でドライバを UMB に読み込んだ場合、ドライバの使用可能な最上位アドレスが ENDADDR に格納されています。 このアドレスを超えるメモリをドライバが使用したばあい、システム破壊の可能性が極めて濃厚ですので、ドライバの初期サイズよりも大容量のメモリを使用する場合はあらかじめ ENDADDR の値を確認しておいた方がよいでしょう。 しかし、DEVICEHIGH 以外の方法でドライバを読み込んだ場合の ENDADDR の初期値がどうなるのかよく知りません。 ひょっとすると不定なのかもしれません。 例えばコードセグメントの値を調べて、ドライバが UMB にロードされた時だけ ENDADDR の初期値を確認する、といった対策が必要なのかもしれません… )
ブロックデバイスで、BPB 構造体へのワードポインタ配列を指すためにセットします。 ドライバでサポートされる各ユニットにひとつづつ、ワードポインタ配列のエントリが存在します。 BPB は読み込まれるのみなので、ふたつ以上のユニットが同じ BPB を使用する場合、ワードポインタ配列の該当エントリは同じ BPB 構造体を指すことができます。
入力時、BPBPTR はオプションを格納した文字列を指しています。 この文字列は CONFIG.SYS ファイル中の "DEVICE=" 文でロードされたドライバのために使用されます。 この文字列は "DEVICE=" 以降にある、空白でない最初の文字の位置を指しています。
(訳注 : たとえば、CONFIG.SYS 中に
DEVICE=C:\myprog\hoge.sys param1 param2
という文があったとすると、hoge.sys の INIT ファンクション中の BPBPTR には
C:\myprog\hoge.sys param1 param2
を指す FAR ポインタが初期値として格納されることになります。
ただし、この文字列が「素直な」ASCIZ 文字列でない場合があります。
たとえば、微かに軟らかい某社の日本語 MS-DOS では、パラメータを区切るスペース (20h) がヌルコード (00h) に置き換えられます。
また、これは全社の DOS で基本的に共通の仕様のはずですが、文字列の内容はすべて大文字化されます。
したがって、小文字を必要とするパラメータはドライバに渡すことができず、デフォルトで日本語化されていない DOS の場合、日本語を含むパラメータは文字化けの可能性が大きいでしょう。
MS-DOS 方面の文献によると、文字列の終端は 0Dh もしくは 0Ah だそうです。
)
ドライバがサポートする先頭ユニットの論理ドライブ番号が、DR-DOS によってセットされています。 (訳注 : 0 = A:, 1 = B: ...)
最後にあった入出力ファンクション以降にメディアが交換されたか判定するため、ユニットを調べます。 このファンクションはブロックデバイスでのみ使用され、その目的はパフォーマンスの向上です。 メディアが交換されていない場合、DR-DOS が再度ドライブにログする必要はありません。
オフセット | 型 | 名前 | 説明 |
---|---|---|---|
00h | byte | RPLENGTH | バイト単位でのパケット長 |
01h | byte | UNIT | ユニット番号 (ブロックデバイスのみ) |
02h | byte | FUNCTION | ファンクション番号。 (1) |
03h | word | STATUS | ステータス |
05h | 8 bytes | 予約 | |
0Dh | byte | MDB | メディア ID (FAT ID) |
0Eh | byte | RETURN | 交換ステータス |
0Fh | dword | VOLUME | 以前のメディアのボリュームラベルを格納してあるメモリへのポインタ。 (ドライバが OPEN/CLOSE/RM をサポートしており、メディアが交換された場合) |
MDB は、DR-DOS から渡される、現在のメディア ID です。 本ファンクションは、以下の3つのうちひとつの値を RETURN フィールドに返します。
-1 (FFh) メディアは交換された 0 メディアは交換された、かもしれない
(交換されたかどうかわからない)1 メディアは交換されていない
ハードウェアのチェンジラインが利用できないドライブの場合、最後に成功したディスクアクセスの後の2秒間は「交換されていない」を返す、という簡単なタイマを使えます。 これにより、ディスクに規則的にくり返しアクセスのあるリムーバブルメディアで、パフォーマンスが向上します。
ブロックデバイスのみで使用されます。 メディアの交換が検出され、DR-DOS がディスクに再度ログすることが必要なとき、呼び出されます。 デバイスドライバは、メディアタイプ判別のためにディスクを読み取り、選択もしくは作成した BPB へのポインタを返します。
オフセット | 型 | 名前 | 説明 |
---|---|---|---|
00h | byte | RPLENGTH | バイト単位でのパケット長 |
01h | byte | UNIT | ユニット番号 (ブロックデバイスのみ) |
02h | byte | FUNCTION | ファンクション番号。 (02h) |
03h | word | STATUS | ステータス |
05h | 8 bytes | 予約 | |
0Dh | byte | MDB | メディア ID (FAT ID) |
0Eh | dword | TRFADDR | FAT 先頭セクタのバッファアドレス |
12h | dword | BPBPTR | ドライバが作成した BPB のアドレス |
デバイスドライバヘッダ中の、ATTRIBUTE フィールドの bit 13 が 0 の場合、DR-DOS は、FAT の先頭セクタを格納したセクタバッファへのポインタを TFRADDR に渡します。 (FAT の先頭セクタが、ドライバによってサポートされるすべてのディスクで、同じ位置になければならないことに注意してください) FAT ID バイトはこのバッファの先頭バイトであり、ドライバはこの値を読み込んで BPB にセットすることができます。 ATTRIBUTE フィールドの bit 13 が 1 の場合、TFRADDR はセクタバッファを指し、このセクタバッファは、ドライバがディスクを読み込んで BPB を判定するために使用できます。
BPB の構造は 6.4 BPB に記述されています。
オフセット | 型 | 名前 | 説明 |
---|---|---|---|
00h | byte | RPLENGTH | バイト単位でのパケット長 |
01h | byte | UNIT | ユニット番号 (ブロックデバイスのみ) |
02h | byte | FUNCTION |
ファンクション番号。 3 -- IOCTL input 4 -- INPUT 8 -- OUTPUT 9 -- OUTPUT with Verify 12 -- IOCTL output |
03h | word | STATUS | ステータス |
05h | 8 bytes | 予約 | |
0Dh | byte | MDB | メディア ID (FAT ID) |
0Eh | dword | TFRADDR | データを読み込む、もしくは書き込むデータの、先頭アドレス |
12h | word | COUNT |
入出力セクタ数(ブロックデバイス) 入出力バイト数(キャラクタデバイス) ※ドライバはリターン時、実際に読み書きしたセクタ(バイト)数をこのフィールドに返す。 |
14h | word |
STARTSEC | 入出力開始セクタ番号 |
16h | dword | VOLUME | 以前のメディアのボリュームラベルを格納してあるメモリへのポインタ。 (ドライバが OPEN/CLOSE/RM をサポートしており、メディアが交換された場合) |
1Ah | dword | STARTSEC32 | 入出力開始セクタ番号 (32bit) |
INPUT ファンクションは、キャラクタデバイスからは指定された文字数を、ブロックデバイスからは指定されたセクタ数を読み取ります。 デバイスドライバは実際に転送したセクタ数、もしくはバイト数を COUNT フィールドに返し、STATUS ワードの戻り値をセットします。
OUTPUT ファンクションは、キャラクタデバイスへ指定された文字数を、ブロックデバイスへ指定されたセクタ数を書き込みます。 デバイスドライバは実際に転送したセクタ数、もしくはバイト数を COUNT フィールドに返し、STATUS ワードの戻り値をセットします。
OUTPUT with VERIFY ファンクションは OUTPUT とほぼ同じですが、データが正しく書き込まれたことを確認するために、書き込み後の読み出しチェックがブロックデバイス上で行われる点が違います。 IOCTL INPUT と IOCTL OUTPUT は INPUT、OUTPUT と同じやり方で処理を行いますが、エラーチェックは行いません。
(訳注 :
デバイスヘッダの ATTRIBUTE フィールド中、bit 1 がセットされている場合、つまり32ビットセクタ番号がサポートされている場合、STARTSEC のかわりに STARTSEC32 フィールドが使用されます。
このガイドの原文によると、オフセット 14h の STARTSEC は word/dword いずれかの型であり、どちらの型かを判別するには RPLENGTH の値を調べるのだそうです。
RPLENGTH が 22 の場合は STARTSEC は word であり、24 の場合は dword です。
ちなみに STARTSEC よりも後のフィールドは未定義です。
しかしこの記述を信ずるならば、DR-DOS と MS(PC)-DOS との間には、32ビットセクタアクセスの方法に互換性がないことになります。
たとえばサードパーティ製の MO や PD のドライバを組み込むことを考えれば、これが非常にゆゆしき事態であることがおわかりいただけると思います。
気になったので OpenDOS 7.01 のカーネルソースをすこし見てみたのですが、結局のところ、MS(PC)-DOS 4.0 以降と互換性のある方式をとっているようです。
おそらく原文の記述は、DR-DOS 6.0、でなければもっと以前の DR(EZ)-DOS のものであろうと思います。
ということで、この部分のヘッダの説明は MS(PC)-DOS 方面の文献を元に作成しました。)
本ファンクションはキャラクタデバイスでのみ利用され、DR-DOS が入力バッファから除去せずに文字入力することを許します。 文字はリクエストヘッダに返され、STATUS の BUSY ビットが 0 にセットされます。 入力文字がない場合、BUSY ビットは 1 が返されます。
オフセット | 型 | 名前 | 説明 |
---|---|---|---|
00h | byte | RPLENGTH | バイト単位でのパケット長 |
01h | byte | UNIT | ユニット番号 (ブロックデバイスのみ) |
02h | byte | FUNCTION | ファンクション番号。 (5) |
03h | word | STATUS | ステータス |
05h | 8 bytes | 予約 | |
0Dh | byte | CHARAC | 文字 |
キャラクタデバイスで使われる入力、出力バッファをフラッシュさせます。 STATUS ワードはエラーなし(0100h)をセットします。
オフセット | 型 | 名前 | 説明 |
---|---|---|---|
00h | byte | RPLENGTH | バイト単位でのパケット長 |
01h | byte | UNIT | ユニット番号 (ブロックデバイスのみ) |
02h | byte | FUNCTION |
ファンクション番号。 7 -- INPUT FLUSH 11 -- OUTPUT FLUSH |
03h | word | STATUS | ステータス |
05h | 8 bytes | 予約 |
ブロックデバイス上のファイルがオープン、クローズされるたびに、あるいはキャラクタデバイスがオープン、クローズされた時に BIOS に告知するため、DR-DOS はこれらのファンクションを使います。
オフセット | 型 | 名前 | 説明 |
---|---|---|---|
00h | byte | RPLENGTH | バイト単位でのパケット長 |
01h | byte | UNIT | ユニット番号 (ブロックデバイスのみ) |
02h | byte | FUNCTION |
ファンクション番号。 13 -- DEVICE OPEN 14 -- DEVICE CLOSE |
03h | word | STATUS | ステータス |
05h | 8 bytes | 予約 |
これにより、デバイス上にオープンされているファイルがあるかどうかを BIOS が記録できるようになります。 BIOS が、リムーバブルメディアのデバイス上で、たとえばトラックバッファのようなローカルバッファを管理している場合、デバイス上の最後のファイルがクローズされた時に、BIOS はローカルバッファをフラッシュできます。 プリンタのようなキャラクタデバイスでは、デバイスがオープンされたとき、BIOS は文字フォントリセットのエスケープシーケンスを送り、紙送り(フォームフィード)することができます。
本ファンクションはブロックデバイス用で、ユニットがリムーバブル(交換可能)メディアを格納するかどうかを報告します。 メディアが固定されている場合、STATUS ワードの BUSY ビットは 1 がセットされ、リムーバブルの場合は 0 がセットされます。
オフセット | 型 | 名前 | 説明 |
---|---|---|---|
00h | byte | RPLENGTH | バイト単位でのパケット長 |
01h | byte | UNIT | ユニット番号 (ブロックデバイスのみ) |
02h | byte | FUNCTION | ファンクション番号。 (15) |
03h | word | STATUS | ステータス |
05h | 8 bytes | 予約 | |
STATUS ファンクションはキャラクタデバイス用で、出力デバイスが準備完了状態か、あるいは入力デバイスのバッファが文字を格納しているかを調べます。 本ファンクションは、これに続く INPUT もしくは OUTPUT ファンクションが、ドライバ内部でハードウェアの処理完了を待たなくてもよいことを保証するために使用されます。 デバイスが INPUT あるいは OUTPUT の準備ができている場合には STATUS ワードの BUSY ビットに 0 を返し、続く INPUT もしくは OUTPUT ファンクションがドライバ内部で処理を待たねばならない場合は 1 を返します。
オフセット | 型 | 名前 | 説明 |
---|---|---|---|
00h | byte | RPLENGTH | バイト単位でのパケット長 |
01h | byte | UNIT | ユニット番号 (ブロックデバイスのみ) |
02h | byte | FUNCTION |
ファンクション番号。 6 -- INPUT STATUS 10 -- OUTPUT STATUS |
03h | word | STATUS | ステータス |
05h | 8 bytes | 予約 | |
本ファンクションは、DR-DOS ファンクション 44h のための、対ドライバ用インターフェースです。 本ファンクションのための完全なインターフェースは Appendix Aに記述されています。 リクエストヘッダは、アプリケーションが渡すパラメータブロックを指す、ダブルワードポインタ GENPB を渡します。 CX レジスタは、アプリケーションが要求したメジャーファンクションコード、マイナーファンクションコードとして、リクエストヘッダ内に渡されます。
オフセット | 型 | 名前 | 説明 |
---|---|---|---|
00h | byte | RPLENGTH | バイト単位でのパケット長 |
01h | byte | UNIT | ユニット番号 (ブロックデバイスのみ) |
02h | byte | FUNCTION | ファンクション番号。 (19) |
03h | word | STATUS | ステータス |
05h | 8 bytes | 予約 | |
0Dh | byte | MAJOR | ジェネリック IOCTL メジャーファンクション番号 (カテゴリコード) |
0Eh | byte | MINOR | ジェネリック IOCTL マイナーファンクション番号 |
0Fh | word | SI | SI レジスタの値 |
11h | word | DI | DI レジスタの値 |
13h | dword | GENPB | パラメータブロックへのポインタ |
ふたつ以上のユニットを同一の物理デバイスに割り付けたブロックデバイスを、アプリケーションが使用できるようにします。 一例として、フロッピードライブがひとつのシステムでは、ディスクのデバイスドライバが先頭のフロッピーディスクドライブに A: と B: の両ドライブを割り付けています。 割り付けが行われていない場合、GET LOGICAL ファンクションは LOGICAL フィールドに 0 を返し、そうでない場合は 1、2、などなどの、その物理ドライブに現在割り付けられているユニット番号を返します。 SET LOGICAL ファンクションは、現行ユニットにしたい論理ユニットの番号をアプリケーションが渡せるようにします。 LOGICAL フィールドは GET LOGICAL ファンクションの場合と同様の値が返されます。
オフセット | 型 | 名前 | 説明 |
---|---|---|---|
00h | byte | RPLENGTH | バイト単位でのパケット長 |
01h | byte | UNIT / LOGICAL |
ユニット番号 リターン時は、最後に参照したユニット番号 |
02h | byte | FUNCTION |
ファンクション番号。 23 -- GET LOGICAL DEVICE 24 -- SET LOGICAL DEVICE |
03h | word | STATUS | ステータス |
05h | 8 bytes | 予約 |