AFS2 ユーザーズ・マニュアル 第三版 はじめに AFS2は従来品であるAFS-68Kの発展型で、FAT12/FAT16/VFAT互換ファイルシステムで す。これまでに、多くのCPU、コンパイラ、OS下で動作実績があります。 プログラムはすべてC言語で記述されたソースファイルで提供されていますので、アプリケーション・プ ログラムと容易にリンクができます。また入出力ドライバに関しても標準化されたインタフェースが採用さ れているので、いろいろな入出力装置や記録媒体に柔軟かつ容易に対応することができます。 本マニュアルは以下の6つの章からなります。 まず第1章では、機能を概説し、OSやアプリケーション・プログラム,入出力ドライバとの関係を説明し ます。第2章では、導入に際して必要な手順を示し、ユーザがコンフィグレーションする必要のある「AFS定 義ファイル」の説明を行います。第3章では、ユーザが作成するAFSドライバ関数の仕様を詳述し、第4章で 性能および機能に関する特徴を説明します。最後に第5章で各関数ごとの仕様が記述されています 注1) VFATに対応するかどうかはコンフィグレーションに依存します。 注2) FAT32には対応していません。 著作権(C) 2003-6年 アートシステム株式会社 第三版 2006年5月 御注意 (1)本マニュアルの、一部または全部を無断で転載または複製することは禁止されています。 (2)本マニュアルの内容に関しては、予告なしに変更、更新および改訂されることがあります。 (3)本マニュアルまたは関連ソフトウェアを運用した結果の影響については、責任を負いかねます ので御了承ください。 本マニュアル中に記載されているMS-DOS、WindowsならびにVisual Studioは米国Microsoft Corporation社の 米国並びにその他の国における登録商標です。 その他、記載されている各製品名は各社の商標または登録商標です。 目次 1.概要 ......................................................................................................................................... 1 1.1 機能........................................................................................................................................ 1 1.2 構成........................................................................................................................................ 2 2.導入.............................................................................................................................................3 2.1 手順........................................................................................................................................ 3 2.2 AFS定義ファイル............................................................................................................... 4 2.3 OSインターフェースのカスタマイズ................................................................................... 6 2.4 デバイスドライバの作成........................................................................................................ 7 2.5 時刻取得関数.......................................................................................................................... 7 2.6 ドライバの登録...................................................................................................................... 8 2.6.1 ドライブレタータイプ............................................................................................................................. 8 2.6.2 ドライブ名タイプ.................................................................................................................................... 9 2.7 VFATへの対応................................................................................................................. 10 2.8 暗号化................................................................................................................................... 11 3.AFSドライバ関数................................................................................................................. 13 3.1 物理デバイスと論理ドライブ............................................................................................... 13 3.2 AFSドライバ関数............................................................................................................. 14 3.2.1 INIT................................................................................................................................................ 15 3.2.2 MEDIA CHECK....................................................................................................................... 16 3.2.3 BUILD BPB.............................................................................................................................. 16 3.2.4 READ................................................................................................................................................ 17 3.2.5 WRITE............................................................................................................................................. 17 3.2.6 FORMAT......................................................................................................................................... 17 3.2.7 関数値.................................................................................................................................................... 18 3.2.8 ドライバの機能拡張.............................................................................................................................. 18 3.3 ディスクキャッシュ............................................................................................................. 18 4.特徴 ....................................................................................................................................... 19 4.1 物理デバイスごとの排他制御............................................................................................... 19 4.2 バッファリング.................................................................................................................... 19 4.3 FATの検索........................................................................................................................ 20 4.4 タスクごとのエラー情報...................................................................................................... 20 5.関数リファレンス ................................................................................................................. 21 fsInit...................................................................................................................................... 22 fsOpen...................................................................................................................................... 23 fsClose................................................................................................................................... 25 fsFileOption................................................................................................................. 26 fsRead...................................................................................................................................... 27 fsWrite................................................................................................................................... 28 fsLseek................................................................................................................................... 29 fsTell...................................................................................................................................... 30 fsFileLength................................................................................................................. 31 fsRemove............................................................................................................................... 32 fsRename............................................................................................................................... 33 fsFindFirst.................................................................................................................... 34 fsFindNext........................................................................................................................ 36 fsFindEnd........................................................................................................................... 37 fsMkDir................................................................................................................................... 38 fsRmDir................................................................................................................................... 39 fsSetTime........................................................................................................................... 40 fsSetAttr........................................................................................................................... 41 fsSetLabel........................................................................................................................ 42 fsGetFreeSpace.......................................................................................................... 43 fsGetTotalSpace...................................................................................................... 44 fsFlush................................................................................................................................... 45 _fsGetBpb........................................................................................................................... 46 _fsReadSector............................................................................................................. 47 _fsWriteSector.......................................................................................................... 48 _fsIOC...................................................................................................................................... 49 fsFormat............................................................................................................................... 50 fsGetErrorCode.......................................................................................................... 51 fsResetErrorCode................................................................................................... 52 fsGetVersion................................................................................................................. 53 付録1 関数値及び詳細エラーコード............................................................................................ 54 付録2 制限事項............................................................................................................................ 55 付録3 _IO.H.................................................................................................................................56 付録4 ソース一覧.........................................................................................................................57 改訂履歴...........................................................................................................................................58 1.概要 AFS2はFAT12/FAT16/VFAT互換のファイルシステムを実現するための関数ライブラリです 。 本章ではAFS2の全体像を理解していただくために、その機能を概説し、OSやアプリケーション・プログラ ム,入出力ドライバとの関係を説明します。 1.1 機能 AFS2はFAT互換の階層的ディレクトリ構造をもつファイル・システムです。このため、FAT12/FA T16/VFATを解釈するコンピュータとの間でファイルを共有化することができます。AFS2はC言語で記 述されたソースライブラリですから、アプリケーションと容易にリンクでき、ほぼ低水準ファイル入出力と同等のプログ ラミング環境を提供します。 AFS2は以下のような特徴を持っています。 ①特定のOSに依存しません OSとはユーザがカスタマイズするインターフェイスを介して呼び出しを行ないます。また、使用して いるOS機能も少なく、一般的なもののみですから、特定のOSに依存しません。 ②複数のタスクから同時にアクセスできます AFS2の入出力は物理デバイスごとに排他管理されます。このため、高速なデバイスに対するアクセスが 低速なデバイスに対するアクセスの終了を待ち合わせるようなことはありません。また、異なるデバイス ならば同時にアクセスすることができます。エラー情報もタスク毎に保存されます。 ③様々な入出力に柔軟に対応しています AFS2が行う入出力は、デバイスに依存しないAFSドライバ関数群を通じて行われます。 入出力ドライバを作成する場合は、この、AFSドライバ関数の仕様に合わせて、要求された機能を記述 するので、いろいろな入出力装置や記録媒体に柔軟に対応できます。AFSドライバ関数および入出力ド ライバは、サンプルプログラムを参照して作成してください。 ④ドライブ指定方法を選択できます ドライブを指定する場合、Windowsと互換性のあるドライブレター("A:"~)で指定することもでき ますが、"FD0\"のようにドライブ名を使用することもできます。 ⑤ファイル暗号化インターフェースをサポート バージョン2.20から、暗号化インターフェースを追加しました。このインターフェースを通じて、任意 の暗号アルゴリズムを呼び出すことができます。AFS2がセクタデータの読み書きを行なうときにデータ の暗号・復号化を行なってしまうので、既存のアプリケーションをほとんど手を加えることなく簡単に ファイルを暗号化できます。 - 1 - 1.2 構成 AFS2とアプリケーション・プログラム、OSや入出力ドライバの関係を下図に示します。 ユーザアプリケーション AFS2 アプリケーションI/F AFS本体 OS I/F AFSドライバ 時刻取得 OS IOドライバ 時刻ドライバ 文字コード変換 暗号化 AFS2は図のように3層に分類することができます。第1層はアプリケーションとI/Fする部分で、第 2層が本体機能です。(この部分は更に、ファイル、ディレクトリ、FAT、バッファ、ドライブのそれぞれ の機能ごとに分化しています。) 第3層は下位層とのインターフェース部分ですので、ユーザシステム環境に合わせカスタマイズが必 要です。それぞれについては次節以降で詳述します。文字コード変換はVFATを使用する場合、ファイ ル名をUNICODEで記憶するために必要です。VFATを使用しない場合は特に必要ではありません。同 様暗号化処理もその機能を有効にした場合のみ必要になります。 - 2 - 2.導入 2.1 手順 AFS2はC言語で記述されたソース・プログラムで提供されます。導入に当たっては、以下の手順でエデ ィット,コンパイル,必要なユーザ作成プログラムを用意し、最終的にアプリケーション・プログラムとリ ンクしなければなりません。 ① ユーザシステムに合わせてAFS2定義ファイルを編集し、AFS2のコンフィグレー ションを行う ↓ ② AFS2ソース・プログラムをコンパイルする ↓ ③ OSとのCインタフェース・ライブラリをカスタマイズ後、コンパイルする ↓ ④ AFSドライバ関数に対応する入出力ドライバの仕様を決める ↓ ⑤ AFSドライバ関数を作成してコンパイルする ↓ ⑥ 時刻取得関数を作成してコンパイルする ↓ (⑦ コード変換関数を作成してコンパイルする ) 注) VFAT対応しない場合や、言語拡張を行う必要がない場合、この作業は省略できます。 ↓ (⑧ 暗号変換関数を作成してコンパイルする 注) 暗号化拡張しない場合、この作業は省略できます。 ↓ ⑨ アプリケーション・プログラムと②③⑤⑥⑦⑧をリンクする - 3 - ) 2.2 AFS定義ファイル AFS定義ファイル(afsdef.h)は、AFS2の動作環境を定義する#define定義が記述されているファイ ルです。主にバッファサイズや最大ファイル数などの定義を行いますので、AFS2が占有するメモリサイズに 影響を与えます。ユーザシステムのニーズに合わせてコンフィグレーションしてください。 ①DEVICES FD、HDなどの物理デバイス(もしくはそのコントローラ)の数を指定します。又、それ毎にデバイ スドライバが存在しますから、その数とも云えます。AFS2は物理デバイス毎にDPBを作成し管理を します。入出力の排他制御もこの単位で行います。 ②MAX_DRV 物理デバイスにはたとえばHDをパーティション分割するなどして、複数の論理ドライブをもつものが あります。本パラメータでは、システム全体で存在する論理ドライブの最大数を指定します。 ドライブレター('A'~'Z')を用いる場合、このパラメータはこの範囲(最大26)でなければなりま せん。 ③FILES 同時にアクセスするファイルの最大数です。 AFS2はファイルをFCB(ファイルコントロールブロック)を用いて管理します。ファイルを開く、検 索するなどの他、名前の変更や削除でもFCBを使用します。充分なFCB数を用意しないとエラーにな ることがあります。(fsRename、fsRemove関数使用時はFCBを2つ使用しますので注意してくださ い。) ④BUFFERS アプリケーションはバイト単位でファイルの読み書きを行います。この時、実際のドライブはセクタ単位 で入力されるため、一時的にデータを蓄積するのにこの領域を使用します。書き込みの場合、データがセ クタ長に達するまではバッファにデータをコピーするのみで実際の入出力動作は行われません。これに より入出力にかかる時間を減少させることができます。 読み書き込みサイズがセクタ長よりも大きい場合は、直接メディアからユーザ指定の領域へ(あるいは その逆に)転送が行われます。バッファへのコピーを省略することでメモリ間転送の時間が短縮されま す。AFS2では1バッファサイズは512固定です。(物理セクタサイズには依存しません。) ⑤_MAX_TASK マルチタスク環境では、タスクに最終エラーを保持する必要があります。本パラメータには、AFS2を使用 するタスクの最大数を指定してください。この数に従ってエラーを保持する領域が確保されます。 また、OSを使用しない場合は、本パラメータを1にしてください。 ⑥FILE_PATH_TYPE ドライブ名の指定形式は_DRIVE_LETTER_と_DRIVE_NAME_のいずれかから選択します。 _DRIVE_LETTER_の場合、従来同様MS-DOS互換のドライブレター(A:、C:など)を用て指定します。 _DRIVE_NAME_を選択した場合は、(ドライバ登録時に指定したデバイス名から生成される)ドライブ 名が使用できます。このとき、パスの指定は ”ドライブ名[¥ディレクトリ[¥サブディレクトリ・・・]]¥ファイル名 となります。(これについては2.6を参照してください。) - 4 - 以下の定義はユーザの環境やニーズに応じて変更してください。 ⑦_VFAT_ VFATを使用する場合、このシンボルを定義してください。(不要なら削除してください。) VFATではファイル名が最大で255文字に拡張されますから 、必然的にFCBのサイズやファイル 検索時間(ファイル名の比較時間)が増加します。また、ファイル名はUNICODEを使用するので、ローカ ル文字セットとの間で文字変換するための用意も必要になります。メモリや処理速度に余裕があるシス テムでのみ採用したほうが良いでしょう。 ⑧LITTLE_ENDIAN システムがリトルエンディアンの場合、このシンボルを定義してください。ビックエンディアンなら削除 します。 ⑨SECTORFILLCHAR ファイル書込みの際、新たに獲得したセクタ内容は不定です。このときAFS2はここで定義したキャラク タで初期化を行います。 ⑩_2N_ AFS2内部で使用します。通常は定義しておいて下さい。 ⑪NLS_TBL VFAT使用時のUNICODEとローカル文字セットとのコード変換を定義します。これについては後述し ます。 ⑫FILENAMECHARS FAT12/16のときのファイル名として使用可能な文字セットです。(VFATでは使用されませ ん。) 半角カタカナなどを使用したい場合この内容を修正してください。(通常は互換性のため変更せずに使 用してください。) ⑬CIPHER_EX 暗号化拡張を有効にする場合、このシンボルを定義してください。不要なら削除します。 ⑭CIPHERPADCHAR ブロック暗号を用いて暗号化をする場合、ファイルサイズがブロック長に満たなければパディングが必 要になります。このときここで定義されたキャラクタでパディングを行ないます。 実際にはAFS2での暗号化はセクタ単位に行ないますので、新たにセクタを確保したときにこの値でのフ ィルが行なわれます。SECTORFILLCHARとCIPHERPADCHARのどちらの値を用いるかはオープン中のフ ァイルが暗号化が必要かどうかに依存します。 - 5 - 2.3 OSインターフェースのカスタマイズ OSインターフェイスのカスタマイズは"afsosif.h"に記述をすることで行われます。 OS提供の排他制御用APIなど、AFS2が使用するOSの機能を定義します。 RTOSを使用する場合はafsosif.hで以下のマクロを記述し、必要に応じてafsosif.cにその関数の 実体を記述します。 ①_RTOSINIT() RTOSの種類に応じて、以後のマクロ等で使用する各種リソース(セマフォなど)を初期化する場合 があるとき、その初期化関数名を記述します。 通常afsosif.cの_scRtosInit()です。 ②_SETERROR(val)、_GETERROR() AFS2が検出したエラーを保存したり、取得したりする際に使用されます。 RTOSの機能として、タスク固有領域を読み書きできる場合は、その呼出しを定義してください。 そうした機能がない場合は、afsosif.cで提供している_scSetRegister()、_scGetRegister()を 利用してください。 これ等の関数ではタスク毎に固有のlong値配列を操作します。配列数は_MAX_REGISTERで またAFS2が使用する要素番号は_AFSERRREGでそれぞれ定義します。 又、_NOT_TASK_IDに無効タスクIDとして使用できる値を定義してください。 ③_GET_TID() タスクIDを返す関数又はAPIを定義してください。 本マクロは_scSetRegister()、_scGetRegister()からしか呼び出されないため、これ等を使用し ない場合は定義不要です。 ④_DCBLOCK(dcb)、DCBUNLOCK(dcb) AFS2内部で物理デバイスの排他区間は、本マクロでサンドイッチされています。セマフォやミューテッ クスなどを用いて、この間が排他制御されるようにして下さい。dcbには対応するデバイスドライバで定 義されるDCB番号が指定されます。 ※物理デバイスはAFS2ではDPB(デバイスパラメータブロック)によって管理されます。一方、デバ イスドライバはDCB(デバイスコントロールブロック)により管理されることを想定しています。呼 称は異なりますが、どちらも同じ物理デバイスを指します。 ⑤_LOCK()、_UNLOCK() AFS2内部のクリティカルな部分を排他管理するために使用されます。_DCBLOCK()などと同様 セマフォを用いるのが一般的ですが、排他期間が最小なのでディスパッチ禁止や割り込み禁止でもかま いません。 - 6 - 2.4 デバイスドライバの作成 デバイスドライバの作成については、3章で詳述します。 2.5 時刻取得関数 時刻取得関数はファイルの時間情報を設定するために必要なもので、ユーザが作成しなければなりません。 ファイルやフォルダを作成した時、それらには作成した時の日時情報が付与されます。AFS2はこの為、現在 日時の取得を目的として本関数を呼び出します。 本関数はAFS2の初期化時、デバイスドライバとともに定義します。(2.6) 時刻取得関数は"afs.h"で次のようにtypedefされています。 typedef struct { int tm_year; int tm_mon; int tm_day; int tm_hour; int tm_min; int tm_sec; } fsTIME; typedef void /* /* /* /* /* /* 年(西暦) */ 月 */ 日 */ 時 */ 分 */ 秒 */ (*fsCALENDER)(fsTIME *); 時刻取得関数では、パラメータの構造体fsTIMEに現在の日付時刻を書き込んでください。 - 7 - 2.6 ドライバの登録 AFSドライバ関数はAFS2の初期化関数であるfsInit()のパラメータとして登録されます。 ドライバの登録はAFS定義ファイルで選択したドライブ指定タイプによって2通りがあります。 2.6.1 ドライブレタータイプ MS-DOSと同様に"a:"、"c:"などとドライブを指定する方法です。 int fsInit(const fsDRIVER *driver, fsCALENDER calender); driverはAFSドライバ関数へのポインタの配列です。配列の要素数はAFS定義ファイルで定義した DEVICESです。もし実際に登録するドライバの数がDEVICESよりも少ない場合は差分にNULLをセットして ください。 fsInit()は、driverの先頭から順にDEVICES個のAFSドライバ関数にINITを要求します。INI Tが返す論理ドライブ数に従い、Aドライブから順にドライブ名が割り振られます。論理ドライブ数の総計は AFS定義ファイルで定義したMAX_DRVを越えてはいけません。もしサポートドライブ数の総計がMAX_DRV よりも少ない場合は、AFS2の中に余分なメモリがとられてしまいますが、fsInit()は正常終了します。 (例) パラメータdriverを次のように定義します。 #define DEVICES 2 #define MAX_DRV 6 const fsDRIVER driver[DEVICES] = {Fd, Hd}; AFSドライバ関数Fd,Hdが、INITに対してサポートする論理ドライブ数をそれぞれ2,4と設定し たとすると、ドライブ名は次のようになります。 Fdの論理ドライブ0=A Fdの論理ドライブ1=B Hdの論理ドライブ0=C Hdの論理ドライブ1=D Hdの論理ドライブ2=E Hdの論理ドライブ3=F - 8 - 2.6.2 ドライブ名タイプ ドライブを9文字までの文字列で指定する方式です。サブディレクトリやファイルなどと同様、"\"を用い て分離します。 int fsInit(const fsDEVICE *device, fsCALENDER calender); deviceには以下の構造体のDEVICES個の配列を指定します。 typedef struct { fsDRIVER *driver; char *device; } fsDEVICE; このとき、driverはAFSドライバ関数を、deviceにはそのドライバに付与するデバイス名を指定しま す。デバイス名は大文字/小文字のアルファベットで最大8文字までとします。(8文字を越える文字列を指 定した場合は以後を無視します。)大文字、小文字は区別されません。 ドライブ名はドライバ登録時に指定したデバイス名に、その論理ドライブ番号(0~9)を付与して生成 されます。先の例で云うと、Fd、Hd各ドライバの指定したデバイス名をそれぞれ、"FD"、"HD"とすると #define DEVICES 2 #define MAX_DRV 6 const fsDEVICE devices[DEVICES] = {{Fd, "FD"}, {Hd, "HD"}}; この場合各々のドライブ名は Fdの論理ドライブ0="FD0" Fdの論理ドライブ1="FD1" Hdの論理ドライブ0="HD0" Hdの論理ドライブ1="HD1" Hdの論理ドライブ2="HD2" Hdの論理ドライブ3="HD3" となります。また、Hd論理ドライブ0にあるreadme.txtファイルへのパスは "HD0\readme.txt" と指定します。 尚、論理番号を付与する都合上1つのドライバが管理できるのは最大10ドライブまでになります。 - 9 - 2.7 VFATへの対応 AFS定義ファイルで「_VFAT_」を定義することでVFATに対応することが出来ます。 VFATシステムでは、ファイル名をUNICODEで記述します。従ってUNICODEとローカルコードセットと のコード変換が必要になります。これらの相互変換関数は、やはりAFS定義ファイルのNLS_TBLで定義し ます。標準仕様の変換関数(default_nls)はUNICODEとASCIIとの変換のみをサポートしています。その他 の変換が必要な場合は別途ユーザで定義してください。(漢字などのサポートが不要ならば標準仕様のもの でも充分です。) ①ローカルコードセット→UNICODE変換関数 short foo(unsigned char *c, int *charlen); *cで指定されたローカル文字に対応するUNICODE値を返す関数です。このとき、ローカルコード1文字 のバイト数(1or2)を*charlenにセットします。 変換できない文字の場合は、_UNICODE_IGNOREを返します。 ②UNICODE→ローカルコードセット変換関数 unsigned short bar(unsigned char *c); *cで指定されたUNICODE文字に対応するローカルコードを関数値として返します。 変換できなかった場合は_UNICODE_IGNOREを返します。 どちらの関数も文字変換定義テーブルstruct nls_tblに登録し、AFS2にはこのテーブル名をNLS_TBL に定義します。従って、関数名は何であってもかまいません。 struct nls_tblは以下の構造です。 struct nls_tbl { unsigned short (*unicode)(unsigned char*, int*); /* convert local code to unicode */ unsigned short (*local)(unsigned char*); /* convert unicode to local code */ }; - 10 - 2.8 暗号化 AFS定義ファイルに「CIPHER_EX」を定義することで暗号化拡張機能が有効になります。 AFS2の暗号化拡張はファイルシステム層内部でファイルデータの暗号・復号化行ないます。AFS2内部でセ クタの読み書きが発生時、暗号化インターフェースを通じて任意の暗号アルゴリズムを呼び出します。 アプリケーション バッファ デ ー タはセク タ単位で 処理しま す AFS2 AFS バッファ (平文データ) 暗号化が不要なら ば そのま ま ・・・ 暗号ア ルゴ リズ ム で デ ー タを変換しま す AFS バッファ (暗号文データ) 保存メディア このため、既存のアプリケーションのアルゴリズムをほとんど変更することなく簡単に暗号化ができます。 また、暗号化をする・しないはファイル毎にオプションで設定できるので、従来のファイルも読み書き可能で す。 暗号アルゴリズム自体はユーザで任意のものをご用意ください。使用する暗号アルゴリズムは、ターゲット システムの処理能力と必要セキュリティレベルを考慮して選択されなければなりません。また、アルゴリズム を特定すること自体セキュリティ上控えるべきでしょう。 AFS2が暗号アルゴリズムを呼び出す場合、暗号化処理番号を引渡します。この番号はユーザが任意に定義、 利用するためのものですから、これを用いて複数のキーやアルゴリズムを組み込むことも可能です。 ファイルを暗号化する場合は、ファイルをオープン後、ファイルのオプションを設定します。オプション設 定には以下の関数を使用します。 int fsFileOption(int handle, int option, long value); handle ファイルハンドル option, value オプション番号及びオプション値 オプション番号 =1:暗号化 このときオプション値は暗号処理番号(≧0) 暗号処理番号=0はファイルの暗号化を停止します。その他の場合は暗号化インターフェースを通じて暗号 アルゴリズムが呼び出されます。このとき、この番号はそのまま引き渡されるので、これを用いて複数のアル ゴリズムやキーを切り分けるのに利用できます。(内部管理の都合上、負数は指定しないでください。) - 11 - 暗号化インターフェースには次の3つの関数があります。 ①void fs_cipher_init(void); 暗号アルゴリズムの初期化を行うため、AFS2の初期化時に呼び出されます。 このときAFS2自体はまだ初期化が完了していません。 ②void fs_cipher(int ci_no, int inout, char *s, char *d, int len); 実際にデータの暗号化、復号化を行なうときに呼び出されます。 ci_no inout s d len 暗号処理番号(>0) 暗号化(0)、復号化(1) 元データ 暗号・復号後データ データ長(=セクタ長) ③unsigned long fs_chipher_adjust(int ci_no, unsinged long size); ファイルサイズ調整を行なうため、ファイルクローズ時に呼び出されます。 ci_no size 暗号処理番号(>0) 現ファイルサイズ ブロック暗号を用いた場合のパディングデータ分をファイルサイズとして繰り入れるための関数です。 パディングを必要としないアルゴリズムでは元のサイズをそのままリターンします。 使用する暗号アルゴリズムは以下の条件を満たすものを使用してください。 ①暗号・復号化はセクタ単位でおこないますから、変換によってデータサイズ(=セクタ長)が変化しな いものを使用してください。 ②ファイルデータの読み書きと、実際のセクタ読み書きとは必ずしも一致しません。従って、前変換結果 が次回の変換に影響を与えるようなものは避けてください。複合化できない場合があります。 また、制約事項ではありませんが、公開鍵方式は共通鍵方式に比べ演算に時間が掛かります。処理能力に制 約の多い組み込みシステムでは避けた方が良いでしょう。共通鍵方式にしても、変換にはそれなりの時間が掛 かりますので、ターゲットシステムの処理能力に応じたものを選択してください。 変換はセクタ単位ですが、ファイルサイズは必ずしもその倍数とは限りません。暗号化をする場合、セクタ の余白部分にはCIPHERPADCHARで指定されたデータでフィルされています。ブロック暗号を使用する場合、暗 号化はそのブロック長単位で行なわれますが、ファイルサイズがブロック長の倍数でない場合、その不足分は このパディングデータとなります。このパディング分はファイルの中に繰り入れられる必要があるため、 fs_chipher_adjust()で調整されなければなりません。従って、ブロック暗号を用いたファイルのサイズは必 ずブロック長の整数倍になります。ファイルを設計する場合、このパディング分について注意が必要です。 注意 キーの管理には充分注意してください。キーが失われると復号できなくなります。 また、ひとつのファイルに複数のキーを使用することは避けてください。 - 12 - 3.AFSドライバ関数 AFSドライバ関数は、AFS2と実際の入出力ドライバの中間に位置するプログラムです。AFS2からの論理 的な入出力要求を、入出力ドライバに対する物理的な入出力要求に変換する役割を持っています。入出力装置 はシステムごとに異なるため、AFSドライバ関数はユーザが作成しなければなりません。 本章では、AFS2における入出力の特徴である物理デバイスと論理ドライブについて説明します。 3.1 物理デバイスと論理ドライブ 1つのAFSドライバには1つの物理デバイスが対応します。 1つの物理デバイスは複数の論理ドライブを持つことができます。たとえば、1つのハードディスクを4つ のパーティションに分割して使用する場合や、SCSIで複数のドライブを持つとき、物理デバイスはHDC あるいはSCSIコントローラに対して割り当て、各パーティションや各ドライブは論理ドライブになりま す(4.1参照)。 AFS2に対する入出力要求で指定するドライブ名は、論理ドライブを指します。 AFS定義ファイルでドライブレタータイプを選択すると、ドライブ名はMS-DOSと同様に'A'から順に 自動的に付与されます。(2.6.1参照) また、ドライブ名タイプが選択されている場合は、ドライバ登録時に指定されたデバイス名+論理ドライブ 番号(デバイス毎0~9)がドライブ名になります。(2.6.2参照) - 13 - 3.2 AFSドライバ関数 AFSドライバ関数は"afs.h"で次のようにtypedefされています。 typedef struct int func; int drive; union { { funcで構造が決まる共用体 } } param; fsDRVCMD; typedef int (*fsDRIVER)(fsDRVCMD *); funcはAFS2が呼び出す機能に対して割り当てられたコードで次のいずれかです。 FS_CMD_INIT INIT FS_CMD_MEDIA_CHECK MEDIA CHECK FS_CMD_BUILD_BPB BUILD BPB FS_CMD_READ READ FS_CMD_WRITE WRITE FS_CMD_FORMAT FORMAT driveは入出力を要求する論理ドライブで、0からAFSドライバ関数がサポートするドライブ数-1 (INITで決まる)の値が与えられます。 アプリケーション・プログラムからの入出力要求は次のように処理されます。 ①アプリケーション・プログラムから、AFS2にファイルレベルの入出力を要求する。 ②AFS2は論理セクタレベルの要求に変換してfsDRVCMDを作成し、AFSドライバ関数を呼び出す。 ③AFSドライバ関数は、fsDRVCMDを入出力装置の物理インタフェースに変換して入出力を実行し、 結果を関数値で返す。 以下、要求機能コードごとの説明を行います。なお、説明の中で特に断らずに表記されているラベル名は "afs.h"に#define定義されています。 - 14 - 3.2.1 INIT fsDRVCMDの共用体 struct { int int unsigned int int } init; drive_no; dcb_no; buffer_size; buffers; /* /* /* /* サポートする論理ドライブの数 */ 対応するDCB番号 */ バッファ(セクタ)の大きさ */ バッファの数 */ 解説 AFSドライバ関数を初期化するため、AFS2の初期化で1度だけ呼び出されます。AFSドライバ関数 は共用体のすべてのメンバに値を書き込まなければなりません。 ① drive_no dorive_noは各AFSドライバがサポートする論理ドライブの数です。 AFS2はこの数をもとにアクセス対象となる論理ドライブ数を決定します。 ② dcb_no dcb_noはDCB(Device Control Block)の番号です。 第4章で説明するとおりAFS2はデバイス単位で排他制御を行いますが、その際にOSに対して本番号 を用いてロックを要求します。 OSがデバイスをDCBで管理している場合は該当する物理デバイスのDCB番号を指定します。そ うでない場合はセマフォやミューテックスなどの論理資源を利用するなどし、同時期に同一デバイスへ のアクセスが行われないようにして下さい。(→2.3) OSが存在しない場合や、単一プロセスのみで排他管理の必要がない場合には何を指定してもかまい ません。 ③ buffer_size AFS2がセクタを読み書きする時の必要バッファサイズを指定します。複数のフォーマットがあり、大 きさが異なる場合は最大値を指定してください。 ④ buffers AFS2では使用しません。(従来品AFS-68Kとの互換のためのものです。) - 15 - 3.2.2 MEDIA CHECK fsDRVCMDの共用体 struct { int status; } media_check; 解説 指定された論理ドライブのメディアが交換されたか否かを調べ、その結果をstatusに次のように設定し てください。 FS_MC_CHANGED FS_MC_UNKNOWN FS_MC_NOCHANGE =交換された =交換されたかどうか不明 =交換されていない 3.2.3 BUILD BPB fsDRVCMDの共用体 struct { fsBPB bpb; } build_bpb; 解説 指定された論理ドライブのBPB(BIOS Parameter Block)を作成します。 AFSドライバ関数はbpbに指定された論理ドライブのBPBの内容を設定してください。 BPBの構造は"afs.h"に次のように定義されています。 typedef struct { int byte_sector; /* バイト数/セクタ */ int sector_cluster; /* セクタ数/クラスタ */ int reserve_sector; /* 予備のセクタの数 */ int fat; /* FATの数 */ int directory; /* ディレクトリの数 */ long sector; /* セクタの総数 */ int sector_fat; /* 1つのFATの占めるセクタの数 */ } fsBPB; セクタ,クラスタ,ディレクトリ,FATはMS-DOSと同様です。 - 16 - 3.2.4 READ fsDRVCMDの共用体 struct { long sector; int count; void *data_ptr; } read_write; 解説 指定された論理ドライブのセクタ番号sectorから、count個のセクタのデータをdata_ptrに読み込み ます。 (注)セクタ番号は0からはじまる論理ブロックで、メディアの物理セクタ番号とは異なります。 AFSドライバで両者の整合を取る必要があります。 3.2.5 WRITE fsDRVCMDの共用体 READと同じ 解説 指定された論理ドライブのセクタ番号sectorから、count個のセクタにdata_ptrのデータを書き込み ます。 3.2.6 FORMAT fsDRVCMDの共用体 struct { int format_type; int fat_id; fsBPB bpb; } format; 解説 指定された論理ドライブの、物理フォーマットを行います。format_typeは、AFSドライバ関数がフォ ーマットする媒体の種別(たとえば2DD,2HD)を識別するために定める任意の数値です。 fsFormat関数のパラメータがそのまま渡されます。 fat_idはAFSドライバ関数が設定する値です。AFS2は論理フォーマットを行うときに、その下位1バ イトをFAT IDとしてFATの先頭に書き込みます。 bpbはAFSドライバ関数が設定するBPBです。 FORMATコマンドが正常終了すれば、AFS2はAFSドライバ関数が設定したBPBにしたがって、 FAT互換の論理フォーマットを行います。 (注)AFS2本体ではリザーブドセクタ(ブートセクタ)の内容については関知しません。 ブートセクタの内容についてはAFSドライバ関数で処理して下さい。 - 17 - 3.2.7 関数値 AFSドライバ関数は、"afs.h"に定義されている次のいずれかのエラーコードを返さなければなりませ ん(参照 付録1関数値及び詳細エラーコード)。 FS_NORMAL以外のエラーコードはそのままAFS2の詳細リターンコードとして処理されます。 3.2.8 ドライバの機能拡張 アプリケーションから直接ドライバを使用したい場合もあります。たとえば、ハードディスクはパーティシ ョン分割されて論理 ドライブ 単位でAFS2 によって管理されています。ところが、 AFS2 の提供する _fsReadSector()、_fsWriteSector()は、パーティション先頭からの論理セクタ番号ですから、パーティ ションの外にあるマスタブートセクタなどはアクセスできません。こうした場合、ドライバの機能拡張をする ことで対処することができます。 こうした目的のため、AFS.Hに追加ファンクション番号FS_IOCTL_CHECK,FS_IOCT L_READ,FS_IOCTL_WRITEを予約しています。(必須な機能ではないので代表的と思わ れるものの定義のみ行なっています。)実際の実装はドライバごとにアプリケーションニーズに応じて行っ てください。 また、アプリケーションが直接ドライバを呼び出した場合、マルチタスク環境下ではドライブの排他制御が 必要になるかもしれません。このため、AFS2ではドライバ呼び出し用関数_fsIOC()を用意しています。 3.3 ディスクキャッシュ 従来品のAFS-68Kでは各物理デバイス毎のバッファリングをAFS内部で行っていました。ところが、そ の後ATAカードやコンパクトフラッシュ、SDカードなどメディアの記憶容量は飛躍的に増加しています。 こうした各種メディアの差異をAFS内部で一元管理することは、逆にシステム全体のパフォーマンスの低 下を招くことになってしまいました。 この為、AFS2ではAFS2内部バッファとは別に必要に応じて各デバイスドライバ側にディスクキャッシュ を設けることにしました。このキャッシュはメディアが小容量・高速ならば不要ですし、仮に大容量メディア であったとしても(パフォーマンスは低下しますが)AFS2は正しくメディアをアクセスします。従って、必 須ということではありません。 FATファイルシステムでもっとも頻繁にアクセスされているのはFAT領域です。この領域をキャッシ ュし、そのコピーをドライバ内にもつことで実際のIO量は大幅に低減できます。ただし、メディアによって はかなりのメモリを消費しますのでシステムにある全メモリ量に応じて適切な値を決定してください。 - 18 - 4.特徴 本章では、AFS2の特徴である、マルチタスク対応,物理デバイスごとの排他制御,内部バッファリングに ついて解説します。 4.1 物理デバイスごとの排他制御 AFS2は、リエントラントな関数です。しかし入出力の実行は、同じ入出力装置に対して排他的に行わなけれ ばなりません。またAFS2内部のバッファなど、共用資源の排他制御も必要です(バッファについては次節を 参照)。AFS2では物理デバイスごとに排他制御を行っています。 物理デバイスごとに排他制御されていることによって、次のような利点があります。 もしAFS2をリエントラントでなく、完全に排他的に動作させたとします。ここでファイルを扱うタスクを 2つ考えます。1つはフロッピーディスクにアクセスし、もう1つはRAMディスクにアクセスするとします 入出力装置としてこの2つが独立して同時にアクセスできても、2つのタスクは同時にはAFS2を使用できま せん。一方のタスクがフロッピィディスクにアクセスしているときに、もう一つのタスクからのRAMディス クに対するアクセスは待たされることになります。高速な入出力装置と低速な入出力装置を同時にアクセス するとき、そのアクセス速度が低速な入出力装置の速度に規定されてしまうわけです。 この場合、排他制御が物理デバイスごとであれば、RAMディスクとフロッピィディスクに対する入出力を 同時に行うことができます。この意味で、物理デバイスは入出力チャネルといえます。 4.2 バッファリング AFS2のバッファリングは、BUFFERSパラメータによって静的に確保された領域から必要量を切り出して 使用し、不要になったら開放するという単純なものです。ただし、使用目的に応じて若干の相違点もあります。 ファイルデータに使用されたバッファは、開放時に削除されます。一方、FATやディレクトリに使用され たものは、内部の解放待ちキューに一時保存され、再利用に備えます。AFS2の上位層が、あるFATセクタを 必要とした時、そのセクタデータがこのキュー上にあればそれが再利用されます。これは、実際の読み書き量 を低減することを目的としています。 大容量メディアの場合、BUFFERSで定義する20とか40とかのバッファ数では全てのFATセクタをカ バーすることはできません。こうした場合はそれをサポートするデバイスドライバ側にディスクキャッシュ を設けることにより、処理速度を向上させることができます。(→3.3) - 19 - 4.3 FATの検索 FATシステムでは、FATの検索アルゴリズムがファイルアクセス速度に大きな影響を与えます。 AFS2ではFATの検索を高速に行うため、次の2つのアルゴリズムを採用しています。 (1)簡易 Fast Seek ファイルの、ある位置をアクセスするためには、その先頭クラスタから順にFATをたどって、目的の位置 のクラスタ番号を得る必要があります。ファイルポインタがその時アクセスしていたクラスタの範囲外にな ったとき、この処理を行わなければなりません。サイズの大きなファイルの場合、この処理にかなりの時間が かかってしまいます。 AFS2では、FATのチェインをたどる時間を短縮するために、ファイルごとにアクセスしたファイルポイ ンタとFAT番号を記憶しています。現在のファイルポインタより先へのアクセスは、記憶しているFAT番 号から検索します。したがって順次アクセスでは、FATの検索が高速に行えます。 (2)空きFATの記憶 空きFATの検索は、ファイルを新しく作成するときや、ファイルへの追加更新書き込みを行うときに発生 します。ディスクの大容量化に伴い、FATが管理するクラスタの数も大きくなっています。そのため大容量 ディスクでは、空きFATをFATの先頭から検索すると非常に効率が悪くなってしまいます。 AFS2では空きFATの検索を、直前に検索した空きクラスタ番号、または直前に解放したクラスタ番号か ら行います。したがって、空きFATをFATの先頭から検索することがほとんど無くなり、ファイルの作成 や追加更新が高速に行えます。 4.4 タスクごとのエラー情報 AFS2の関数は、関数値として正常終了または異常終了を返します。異常終了の場合の詳細エラーコードは、 AFS2を使っているタスクごとに独立して保存され、fsGetErrorCode関数によって最新のものを参照でき ます。 - 20 - 5.関数リファレンス 本章では、AFS2がサポートする関数について、具体的な仕様を関数ごとに説明します。個々の説明を行う前 に、共通する事柄について説明しておきます。 □インクルード・ファイル 関数のプロトタイプや関数値などの定数は、"afs.h"で宣言および定義されています。したがってAFS 2の関数を使用するときは、"afs.h"をインクルードしなければなりません。 □詳細エラーコード AFS2の関数が異常終了した場合、その詳細エラーコードはfsGetErrorCode関数で参照することができ ます。詳細エラーコードは、AFS2を使用しているタスクごとに最新のものが保存されています。 各エラーコードの説明は付録に示します。 □関数形式 AFS定義ファイル"afsdef.h"で定義したドライブ名の指定の方式(ドライブレター/パス)によって 関数形式が2通り存在するものがあります。従来通りドライブレターを使用するものを形式1、ドライブ名タ イプのものを形式2で示しています。 - 21 - fsInit 機能 AFS2の初期化 形式 形式1: int fsInit(const fsDRIVER *driver, const fsCALENDER calender); 形式2: int fsInit(const fsDEVICE *device, fsCALENDER calender); プロトタイプ afs.h <パラメータ><説明> driver AFSドライバ関数のポインタの配列へのポインタ device AFSドライバ定義構造体配列へのポインタ calender 時刻取得関数のポインタ 解説 ファイルシステムを初期化します。ファイルシステムを使用するに先立って必ず一度実行してください。 AFSドライバ関数は物理デバイス毎にユーザが作成します。配列の要素数は、 AFS定義ファイル"afsdef.h"で定義されているDEVICESと一致しなければいけません。 形式1では配列dirverの先頭から順番に、AFSドライバ関数のINITが実行され、それぞれがサポー トするドライブ数に対応して、ドライブ名がAから順番に割り振られます。 形式2でも配列deviceの先頭から順にドライバのINITが実行され、そのドライブ数に対応してドライ ブ名(デバイス名+0~9)が作成されます。 ドライブ数の合計は、"afsdef.h"で定義されるMAX_DRVを越えてはいけません。 AFSドライバ関数が返すバッファサイズとバッファ数に従って、それぞれのデバイスに対しメモリプー ルからバッファが割り当てられます。 時刻取得関数の詳細は第2章、AFSドライバ関数については第3章を参照してください。 戻り値 FS_NORMAL FS_INIT_ERR1 FS_INIT_ERR2 FS_INIT_ERR3 正常終了 メモリが獲得できない ドライブ数がMAX_DRVを越えている AFSドライバ関数でエラーが発生した 関連項目 なし - 22 - fsOpen 機能 ファイルのオープン 形式 int fsOpen(const char *path, int oflag, int pmode); <パラメータ><説明> path ファイルのパス名へのポインタ oflag アクセスフラグ pmode 新規ファイルのアクセス許可フラグ プロトタイプ afs.h 解説 ファイルをオープンします。 pathで指定されたファイルをoflagの内容に従ってオープンします。 アクセスフラグoflagは、既に存在しているファイルに対してどのようにアクセスするかを指定するフラ グ情報です。oflagは、"afs.h"で定義されている定数もしくはそれらを論理和で組み合わせた値を与えて 下さい。 pmodeは、pathで指定されたファイルが新規に作成するファイルのとき、そのファイルをどのようなアク セス許可を持ったファイルとして登録するか指定するフラグ情報です。 pmodeも、"afs.h"で定義されている定数もしくはそれらを論理和で組み合わせた値を与えて下さい。た だしpmodeは、oflagでFS_O_CREATが指定されたとき、つまり開かれたファイルが新規ファイルである場合 にだけ参照されます。ファイルがすでに存在していれば、 pmodeは無視されます。 書き込みが許可されていないファイルは、自動的に読み込み専用としてオープンされます。 - 23 - --- oflagで使用される定数とその意味 ---------------------------------- FS_O_APPEND オープンした後、ファイルポインタをファイルの終わりに移動させる。 FS_O_CREAT 新規ファイルをオープンする。 (だたしpathで指定したファイルが存在している場合は無効) FS_O_EXCL pathで指定したファイルが既に存在している場合エラーを返す。 (FS_O_CREATと共に指定したときのみ有効) FS_O_RDONLY 読み込み専用でファイルをオープンする。 FS_O_RDWR 読み書き可能でファイルをオープンする。 FS_O_TRUNC すでに存在しているファイルをオープンし、これまでの内容を放棄する。 ファイルのサイズは0となり、内容は失われる。 (書き込み可能ファイルでなければ無効) FS_O_WRONLY 書き込み専用でファイルをオープンする。 必ず読み書き区分(FS_O_RDONLY,FS_O_RDWR,FS_O_WRONLY)のいずれか1つは指定してください。 --- pmode で使用される定数とその意味 --------------------------------- FS_S_IREAD 読み込み可能ファイルとして新規にオープンする FS_S_IWRITE 書き込み可能ファイルとして新規にオープンする pmodeはFS_O_CREATと組み合わせた場合のみ、有意となります。 同指定がない場合は使用されません。 戻り値 正常終了の場合、ハンドル番号を返します。 異常終了の場合、FS_ERRORを返します。 関連項目 fsClose, fsRead, fsWrite, fsLseek, fsTell, fsFileLength - 24 - fsClose 機能 ファイルのクローズ 形式 int fsClose(int handle); <パラメータ><説明> handle オープンされているファイルのハンドル プロトタイプ afs.h 解説 ファイルをクローズします。 オープンに成功したファイルは必ずクローズしてください。ファイルを読み書きしている最中に何等かの エラーが発生しても、クローズは必要です。また、書き込みを行ったファイルではクローズ時にディレクトリ の更新を行ないます。またFAT領域の更新も行ないますので、クローズが行なわれないと、メディア状態が不 定となり、その後の書き込みでクロスリンクが発生するなど障害の元となります。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 fsOpen, fsRead, fsWrite, fsLseek, fsTell, fsFileLength - 25 - fsFileOption 機能 ファイルオプションの設定 形式 int fsFileOption(int handle, int option, long value); <パラメータ><説明> handle オープンされているファイルのハンドル option オプション番号 value オプション値 プロトタイプ afs.h 解説 ファイルオプションを設定します。 optionによってオプションを振り分け、valueでそのパラメータを与えます。 ①_OPT_CIPHER(=1)のとき、暗号化条件を設定します。 このとき、valueには暗号化処理番号を指定します。暗号化処理番号は0で暗号化なし、暗号化を有効に する場合は任意の正数を指定してください。(内部管理の都合上負数は正常に動作しません。) 暗号化を行なうとき、この値はそのまま引数としてユーザが作成した暗号化関数に引き渡されます。従っ て、ユーザ関数側でこの値をアルゴリズムとかキーを選択するのに利用することができます。 本条件の設定はファイルのオープン直後に行なって以後は変更しないでください。 尚、ファイルをオープンしたときはデフォルトで「暗号化なし(=0)」になっています。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 fsOpen, fsRead, fsWrite, fsLseek, fsTell, fsFileLength (注)現状では本関数は暗号化拡張が有効なときのみ利用可能です。 - 26 - fsRead 機能 ファイルからのデータ読み込み 形式 long fsRead(int handle, void *buff, long count); <パラメータ><説明> handle オープンされているファイルのハンドル buff データ格納領域へのポインタ count 読み込みバイト数 プロトタイプ afs.h 解説 ファイルからデータを読み込みます。 handleで参照されるファイルからcountバイトを読みだして、buffの指し示す領域にデータを格納しま す。 読み込みは、指定したファイルのファイルポインタから開始されます。 読み込み後のファイルポインタは、次のまだ読まれていないデータを指します。 戻り値 正常終了の場合は、読み込んだバイト数を返します。ファイルポインタが既にEOFの時は0を返します。 異常終了の場合は、FS_ERRORを返します。 関連項目 fsOpen, fsClose, fsWrite, fsLseek, fsTell, fsFileLength - 27 - fsWrite 機能 ファイルへのデータ書き込み 形式 long fsWrite(int handle, void *buff, long count); <パラメータ><説明> handle オープンされているファイルのハンドル buff データ格納領域へのポインタ count 書き込みバイト数 プロトタイプ afs.h 解説 ファイルにデータを書き込みます。 buffで指し示したデータ領域から、handleで参照されるファイルへcountバイトのデータを書き込みま す。 書き込みは、指定したファイルのファイルポインタから開始されます。 書き込み後のファイルポインタは、countバイト進みます。 戻り値 正常終了の場合は、書き込んだバイト数を返します。 異常終了の場合は、FS_ERRORを返します。 関連項目 fsOpen, fsClose, fsRead, fsLseek, fsTell, fsFileLength - 28 - fsLseek 機能 ファイルポインタの移動 形式 long fsLseek(int handle, long offset, int origin); <パラメータ><説明> handle オープンされているファイルのハンドル offset 初期位置からのバイト数 origin 初期位置 プロトタイプ afs.h 解説 ファイルポインタを移動します。 handleで参照されるファイルのファイルポインタを、originで指定される初期位置からoffsetバイト 分だけ先に移動します。 originで指定される初期位置は、"afs.h"で以下のように定義されています。 FS_SEEK_SET ファイルの先頭 FS_SEEK_CUR ファイルポインタの現在位置 FS_SEEK_END ファイルの終わり ファイルポインタは、ファイルの終わりより後には移動できますが、ファイルの先頭より前には移動できま せん。 戻り値 正常終了の場合、移動後のファイルポインタを返します。 異常終了の場合、FS_ERRORを返します。 関連項目 fsOpen, fsClose, fsRead, fsWrite, fsTell, fsFileLength - 29 - fsTell 機能 ファイルポインタの取得 形式 long fsTell(int handle); <パラメータ><説明> handle オープンされているファイルのハンドル プロトタイプ afs.h 解説 指定ファイルの現在のファイルポインタを取得します。 戻り値 正常終了の場合、現在のファイルポインタを返します。 異常終了の場合、FS_ERRORを返します。 関連項目 fsOpen, fsClose, fsRead, fsWrite, fsLseek, fsFileLength - 30 - fsFileLength 機能 ファイルサイズの取得 形式 long fsFileLength(int handle); <パラメータ><説明> handle オープンされているファイルのハンドル プロトタイプ afs.h 解説 現在のファイルサイズを取得します。 戻り値 正常終了の場合、ファイルサイズを返します。 異常終了の場合、FS_ERRORを返します。 関連項目 fsOpen, fsClose, fsRead, fsWrite, fsLseek, fsTell - 31 - fsRemove 機能 ファイルの削除 形式 int fsRemove(const char *path); <パラメータ><説明> path 削除するファイルのパス名へのポインタ プロトタイプ afs.h 解説 pathで指定されたファイルを削除します。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 なし - 32 - fsRename 機能 ファイル名の変更 形式 int fsRename(const char *old_path, const char *new_name); <パラメータ><説明> old_path 名前を変更するファイルのパス名へのポインタ new_name 新しい名前へのポインタ プロトタイプ afs.h 解説 old_pathで指定されたファイルまたはディレクトリの名前を、new_nameで指定された名前に変更します 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 なし - 33 - fsFindFirst 機能 ファイルの検索開始 形式 int fsFindFirst(const char *path, fsFIND *buff); <パラメータ><説明> path 検索するファイル名へのポインタ buff ファイル情報を格納する構造体へのポインタ プロトタイプ afs.h 解説 ファイルの検索を開始します。 pathで指定された内容に該当するファイルを検索し、最初に該当したファイルに関する情報を、buffが指 し示すfsFIND構造体("afs.h"で定義)に格納します。 pathにはワイルドカード('*','?')が使用できます。 該当ファイルが複数存在し、続いて検索するときは、関数値の検索ハンドル番号で fsFindNext関数を使います。 fsFIND構造体は、ひとつのファイルが持つ情報を記憶するデータブロックです。検索したファイルの情報 が入ります。 fsFIND構造体は"afsdef.h"においてVFAT拡張を指定する定義が行われているかどうかに依存して条件コ ンパイルされ、内容が異なったものとなります。 ・VFAT拡張を行わない場合 typedef struct { int attribute; /* fsTIME wr_time; /* long size; /* char name[13]; /* } fsFIND; ・VFAT拡張を行った場合 typedef struct { int attribute; fsTIME wr_time; fsTIME cr_time; fsDATE ac_time; long size; char name[_MAX_PATH]; } fsFIND; /* /* /* /* /* /* ファイルの属性 */ ファイルの作成更新日時(2.5参照) */ ファイルのサイズ */ ファイルの名前 */ VFAT拡張しない場合と同様 */ 更新日時*/ 作成日時 */ 最終アクセス日 */ VFAT拡張しない場合と同様*/ ファイルの名前 */ - 34 - attributeは"afs.h"で定義される定数を論理和によって組み合わせた値で、ファイルの属性を表してい ます。 FS_A_NORMAL FS_A_RDONLY FS_A_HIDDEN FS_A_SYSTEM FS_A_VOLID FS_A_SUBDIR FS_A_ARCH 通常のファイル リードオンリーファイル 隠しファイル システムファイル ボリュームID サブディレクトリ アーカイブ 本関数は指定されたパス名に一致したものの情報を提供します。 本関数呼出し後、アプリケーションで属性をチェックし、ファイル/ディレクトリ/ボリュームIDの判別 を行ってください。 戻り値 正常終了の場合、検索ハンドル番号を返します。 異常終了の場合、FS_ERRORを返します。 関連項目 fsFindNext 、fsFindEnd 付記 AFS2では日時はfsTIME、fsDATE構造体で管理します。このため、time_t型を用いた場合に起こるオーバ ーフローの問題が発生しません。 - 35 - fsFindNext 機能 ファイル検索の継続 形式 int fsFindNext(int find_handle, fsFIND *buff); <パラメータ><説明> find_handle fsFindFirst関数で取得した検索ハンドル番号 buff ファイルの情報を格納する構造体へのポインタ プロトタイプ afs.h 解説 ファイルの検索を継続します。 fsFindFirst関数で開始した検索を継続します。 fsFindFirst関数のパラメータpathで指定され、かつ内容に該当する2番目以降の検索ファイルについ て、呼び出されるたびに順次buffで示される構造体fsFIND ("afs.h"で定義)に格納していきます。 本関数の呼び出しに先だって、fsFindFirst関数で検索ハンドル番号を取得しておく必要があります。 該当ファイルが残っていない場合はエラーになります。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 fsFindFirst, fsFindEnd - 36 - fsFindEnd 機能 ファイルの検索終了 形式 int fsFindEnd(int find_handle); <パラメータ><説明> find_handle fsFindFirst関数で取得した検索ハンドル番号 プロトタイプ afs.h 解説 検索ハンドル番号を解放し、fsFindFirst,fsFindNext関数の検索を終了します。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 fsFindFirst, fdFindNext - 37 - fsMkDir 機能 ディレクトリの作成 形式 int fsMkDir(const char *path); <パラメータ><説明> path 新しいディレクトリのパス名へのポインタ プロトタイプ afs.h 解説 pathで指定されたディレクトリを作成します。 本関数は、pathの最後尾に指定された名前のディレクトリのみを作成します。 ディレクトリの階層構造を作る場合は、ルート側から順にひとつづつディレクトリを作成して下さい。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 fsRmdir - 38 - fsRmDir 機能 ディレクトリの削除 形式 int fsRmDir(const char *path); <パラメータ><説明> path 削除するディレクトリのパス名へのポインタ プロトタイプ afs.h 解説 pathで指定されたディレクトリを削除します。 削除するディレクトリは空でなければなりません。 ルートディレクトリは削除できません。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 fsMkDir - 39 - fsSetTime 機能 ファイル作成更新日時の変更 形式 int fsSetTime(const char *path, const fsTIME *wr_time); <パラメータ><説明> path 作成更新日時を変更するファイルのパス名へのポインタ wr_time 新しい作成更新日時 プロトタイプ afs.h 解説 pathで指定されたファイルの作成更新日時を変更します。 fsTIME構造体は、"afs.h"で定義されています(2.5参照)。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 fsSetAttr - 40 - fsSetAttr 機能 ファイルの属性変更 形式 int fsSetAttr(const char *path, int attribute); <パラメータ><説明> path 作成更新日時を変更するファイルのパス名へのポインタ attribute 新しい属性 プロトタイプ afs.h 解説 pathで指定されたファイルの属性を変更します。 attributeは、"afs.h"で定義される定数を論理式で組み合わせた値です。 attributeの定数は、fsFindFirst関数を参照してください。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 fsSetTime (注)本関数を用いることであらゆるファイル属性を変更することができますが、誤ってファイルにディレ クトリ属性を付与してしまった場合、以後正常なファイルアクセスが出来なくなってしまいますので注意し て下さい。 - 41 - fsSetLabel 機能 ドライブのラベル設定 形式 形式1: int fsSetLabel(char drive_name, const char *name); 形式2: int fsSetLabel(const char *drive_name, const char *name); <パラメータ><説明> drive_name ドライブ名 形式1の場合、'A','B', ...とドライブレターで指定します。 形式2の場合、"FD0"、"HD1"などと指定します。 name ラベル(11文字以内) プロトタイプ afs.h 解説 drive_nameで指定された論理ドライブにラベルを書き込みます。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 なし (注)ボリュームラベルはMS-DOSとの互換のために存在します。ここで設定されたラベル名は、ルートディ レクトリ上のエントリーとして記憶されます。MS-DOSの後期バージョンではルートディレクトリではなくブ ートセクタ上にボリュームラベルを記憶するようになっていますので注意して使用してください。 - 42 - fsGetFreeSpace 機能 ドライブの空き領域のサイズの取得 形式 形式1: fsize_t fsGetFreeSpace(char drive_name); 形式2: fsize_t fsGetFreeSpace(const char *drive_name); <パラメータ><説明> drive_name ドライブ名 形式1の場合、'A','B', ...とドライブレターで指定します。 形式2の場合、"FD0"、"HD1"などと指定します。 プロトタイプ afs.h 解説 drive_nameで指定された論理ドライブの空き領域の大きさを、バイト数で取得します。 (空き領域) = (使用可能なクラスタ数)×(1クラスタのバイト数) 戻り値 正常終了の場合、空き領域のバイト数を返します。 異常終了の場合、FS_ERRORを返します。 関連項目 fsGetTotalSpace - 43 - fsGetTotalSpace 機能 ドライブの全領域のサイズの取得 形式 形式1: fsize_t fsGetTotalSpace(char drive_name); 形式2: fsize_t fsGetTotalSpace(const char *drive_name); <パラメータ><説明> drive_name ドライブ名 形式1の場合、'A','B', ...とドライブレターで指定します。 形式2の場合、"FD0"、"HD1"などと指定します。 プロトタイプ afs.h 解説 drive_nameで指定された論理ドライブの全領域の大きさを、バイト数で取得します。 (全領域) = (全クラスタ数)×(1クラスタのバイト数) 戻り値 正常終了の場合、全領域のバイト数を返します。 異常終了の場合、FS_ERRORを返します。 関連項目 fsGetFreeSpace - 44 - fsFlush 機能 バッファのフラッシュ 形式 形式1: int fsFlush(char dirve_name); 形式2: int fsFlush(const char *dirve_name); <パラメータ><説明> drive_name ドライブ名 形式1の場合、'A','B', ...とドライブレターで指定します。 形式2の場合、"FD0"、"HD1"などと指定します。 プロトタイプ afs.h 解説 dirve_nameで指定された論理ドライブのバッファを、書き出します。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 なし - 45 - _fsGetBpb 機能 指定ドライブのBPBの取得 形式 形式1: int _fsGetBpb(char drive_name, fsBPB *bpb); 形式2: int _fsGetBpb(const char *drive_name, fsBPB *bpb); <パラメータ><説明> drive_name ドライブ名 形式1の場合、'A','B', ...とドライブレターで指定します。 形式2の場合、"FD0"、"HD1"などと指定します。 bpb BPB(fsBPB構造体)へのポインタ プロトタイプ afs.h 解説 drive_nameで指定されたドライブのBPBを取得します。 BPB(BIOS Parameter Block)は、外部記憶媒体のフォーマット形式を記憶するデ ータブロックです。 fsBPB構造体は、"afs.h"で定義されています(3.2参照)。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 _fsReadSector, _fsWriteSector - 46 - _fsReadSector 機能 指定ドライブからセクタ単位の読み込み 形式 形式1: int _fsReadSector(char drive_name, long sector, int count, void *buff); 形式2: int _fsReadSector(const char *drive_name, long sector, int count, void *buff); <パラメータ><説明> drive_name ドライブ名 形式1の場合、'A','B', ...とドライブレターで指定します。 形式2の場合、"FD0"、"HD1"などと指定します。 sector 読み込みを開始するセクタ番号 count 読み込むセクタ数 buff データ格納領域へのポインタ プロトタイプ afs.h 解説 drive_nameで指定された論理ドライブの論理セクタ番号sectorから、count個のセクタ のデータを、buffで示される領域へ読み込みます。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 _fsGetBpb, _fsWriteSector - 47 - _fsWriteSector 機能 指定ドライブへのセクタ単位の書き込み 形式 形式1: int _fsWriteSector(char drive_name, long sector, int count, void *buff); 形式2: int _fsWriteSector(const char *drive_name, long sector, int count, void *buff); <パラメータ><説明> drive_name ドライブ名 形式1の場合、'A','B', ...とドライブレターで指定します。 形式2の場合、"FD0"、"HD1"などと指定します。 sector 書き込みを開始するセクタ番号 count 書き込むセクタ数 buff 書き込みデータ格納領域へのポインタ プロトタイプ afs.h 解説 buffで示される領域のデータを、drive_nameで指定された論理ドライブの論理セクタ番 号sectorから、count個のセクタ分だけ書き込みます。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 _fsGetBpb, _fsReadSector - 48 - _fsIOC 機能 指定ドライブのドライバ機能呼び出し 形式 形式1: int _fsIOC(char drive_name, fsDRVCMD *cmd); 形式2: int _fsIOC(const char *drive_name, fsDRVCMD *cmd); <パラメータ><説明> drive_name ドライブ名 形式1の場合、'A','B', ...とドライブレターで指定します。 形式2の場合、"FD0"、"HD1"などと指定します。 cmd ドライバに引き渡すパラメータ(詳細は3章参照) プロトタイプ afs.h 解説 指定ドライブのドライバを呼び出し、特殊機能を実行します。 実行する機能はドライバ固有に定義され、AFS2は仲介をするだけです。 ドライブアクセスのための排他制御を行ないますので、安全にアクセスできます。但し、 オープン中のファイルとの整合は取りませんので、本関数でメディアの書き換えなどを行 なう場合は一旦全てのファイルをクローズしておくほうが良いでしょう。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 なし - 49 - fsFormat 機能 指定ドライブのメディアのフォーマット 形式 形式1: int fsFormat(char drive_name, int format_type); 形式2: int fsFormat(const char *drive_name, int format_type); <パラメータ><説明> drive_name ドライブ名 形式1の場合、'A','B', ...とドライブレターで指定します。 形式2の場合、"FD0"、"HD1"などと指定します。 format_type フォーマット種別 プロトタイプ afs.h 解説 drive_nameで指定された論理ドライブのメディアを、指定したフォーマット種別のフォーマットでフォ ーマットします。 format_typeは、該当ドライブのAFSドライバ関数または入出力ドライバで定義されているものを指定 してください。ドライバで複数のフォーマットをサポートしていない場合は何を指定してもかまいません。 戻り値 FS_NORMAL FS_ERROR 正常終了 異常終了 関連項目 なし - 50 - fsGetErrorCode 機能 詳細エラーコードの取得 形式 int fsGetErrorCode(void); プロトタイプ afs.h 解説 AFS2の関数が異常終了(FS_ERROR)したときの、最新の詳細エラーコードを取得します。詳細エラーコ ードはタスク毎に保存されています。 詳細エラーコードの内容については付録を参照してください。 戻り値 詳細エラーコードを返します。 関連項目 fsResetErrorCode - 51 - fsResetErrorCode 機能 詳細エラーコードのクリア 形式 int fsResetErrorCode(void); プロトタイプ afs.h 解説 本関数を発行したタスクの詳細エラーコードをクリアします。 戻り値 FS_NORMAL 関連項目 fsGetErrorCode - 52 - fsGetVersion 機能 AFS2のバージョン番号の取得 形式 int fsGetVersion(void); プロトタイプ afs.h 解説 AFS2のバージョン番号を取得します。 バージョン番号は100倍値で、Version1.00 なら 100 が返されます。 戻り値 バージョン番号 関連項目 なし - 53 - 付録1 関数値及び詳細エラーコード <関数値> *FS_NORMAL FS_ERROR 正常終了 異常終了 <fsInit関数の関数値> FS_INIT_ERR1 FS_INIT_ERR2 FS_INIT_ERR3 メモリが確保できない ドライブ数がMAX_DRVを越えている 入出力インタフェース関数でエラーがあった <詳細エラーコード> *FS_IO_ERR FS_FILE_EXIST FS_NO_FILE FS_NO_HANDLE FS_INVALID_PATH FS_INVALID_ACCESS_MODE *FS_PROTECTED *FS_NOT_READY *FS_CRC_ERR *FS_SEEK_ERR *FS_NO_SECTOR *FS_READ_ERR *FS_WRITE_ERR *FS_VERIFY_ERR FS_FAT_ERR *FS_INVALID_FORMAT *FS_INVALID_DRIVE FS_INVALID_HANDLE FS_DIRECTORY_FULL FS_NO_SPACE FS_NO_MORE_FILE FS_ALREADY_OPEN FS_INVALID_PARAMETER FS_NO_BUFFER I/Oエラー ファイルが既に存在する ファイルが存在しない ハンドル番号が取得できない パス名が不正である アクセスモードが不正である 書き込み禁止 ドライブの準備ができてない CRCエラー シークエラー セクタが見つからない 読み込みエラー 書き込みエラー ベリファイエラー FATエラー フォーマット形式が不正である ドライブ名が不正である ハンドル番号が不正である ディレクトリに空きが無い ディスクに空きが無い これ以上ファイルを検索できない すでにファイルがオープンされている パラメータが不正である バッファ領域が不足している *はAFSドライバ関数のリターンコードとして使用可能です。 - 54 - 付録2 制限事項 (1)開発環境 AFS2はANSI規格標準のC言語で記述されたソースプログラムで供給されます。動作確認済みのCコン パイラは次のものです。 MCC68K (Microtec Research. Inc.) CrossCode C (SOFTWARE DEVELOPMENT SYSTEM. INC.) SH用Cコンパイラ(Renesas Technology Corp.) Visual C++6.0 service pack5 (Microsoft Corporation) WindRiver Diab 4.3 (2)実行上の制限 ファイルアクセス中のタスクを外部から強制終了しないで下さい。AFSは関数ライブラリのみで動作す るため、メディアの論理構造を保証することが出来なくなってしまいます。 - 55 - 付録3 _IO.H AFS2は低水準ファイル入出力を行なう関数群とほぼ互換性を持っています。このため、 MS-DOSや Windowsなどで開発したソフトを移植したりする場合、アルゴリズムを変更するなどの必要はほとんどあり ません。ただ、AFS2が持つ独自の関数名をANSI準拠な一般的なものと置き換える作業が必要ですが、この ためにソースを2重化したり、条件コンパイルを用いるなどの方法は煩雑です。 _IO.HはVisual Cの関数をAFS2の関数に置き換えるマクロを提供しています。提供する関数は以下の通 りです。 _findfirst FsFindFirst _findnext fsFindNext _findclose fsFindEnd _open fsOpen _close fsClose _read fsRead _write fsWrite _lseek fsLseek _tell fsTell _filelength fsFileLength _utime fsSetTime _chmod fsSetAttr _mkdir fsMkDir _rmdir fsRmDir rename fsRename remove fsRemove errno fsGetError このマクロは完全な互換を保証するものではありません。ファイル日時などは通常time_tが用いられます が、AFS2はオーバーフローの問題を考慮して構造体形式で日時を管理するようになっています。移植後はユ ーザー毎に確認を行なってください。 - 56 - 付録4 ソース一覧 afs.h AFS2とアプリケーションで共有する構造体/定数の定義および、 アプリケーションに提供される関数の プロトタイプ宣言が記述されています。 _afs.h AFS2内部において使用する構造体/定数の定義および、 関数のプロトタイプ宣言が記述されています。 _drvdef.h MS-DOSでのブートセクタ構造に即した構造体の定義。 AFSドライバが使用するものです。 afsdef.h AFS定義ファイル(2.2参照)。 本ソースに#define定義されている定数の内容を変更することでコンフィグレーションを行うことがで きます。 afsosif.h/afsosif.c OSインターフェイスに関する定義および関数が記述されています。 本ソースに#define定義されている定数の内容を変更することでOSインターフェイスのカスタマイズ (2.3参照)を行うことが出来ます。 afs1.c アプリケーションに提供される関数インターフェースが記述されています。 afs2.c ファイルに対する処理関数が記述されています。 afs3.c FCB(ファイル制御ブロック)やディレクトリを管理するための関数が記述されています。 afs4.c FATを管理するための関数が記述されています。 afs5.c 内部バッファを管理するための関数が記述されています。 afs6.c DCB(デバイス制御ブロック)、DPB(デバイスパラメータブロック)といった、デバイスを制御する ための情報を管理するため関数が記述されています。 afs3v.c VFAT時のFCB操作やディレクトリ操作を行うためのものです。VFAT対応しない場合は不要です。 local.c VFAT時のデフォルトのコード変換処理を記述したものです。VFAT対応しない場合や、ユーザ独自の 変換を作成した場合は不要です。 _io.h Visual C等を用いて作成されたコードをAFS2に切り換える際にラッパーとして使用するためのマクロ 類が記述されています。ユーザー環境ごとに修正してしようして下さい。 - 57 - 改訂履歴 2003.10 初版作成 2005. 1 第二版(2.13) ①パス形式でのドライブの指定に対応 これまで通りのドライブレター形式とを条件コンパイルで切替え AFSDEF.Hに定義を追加 fsInit()でのドライバ定義方法を変更 ②関数の追加 ・fsTell() ・fsFileLength() ・_fsIOC() :現在位置の取得 :ファイルサイズの取得 :ドライバ拡張機能の呼び出し ③ラッパーの追加 Visual Cなどを用いて作成されたコードからAFS2の関数への切り換えを容易にするためのラッパー 層としてマクロを追加 2006. 5 第三版(2.20) ①暗号化拡張のための機能追加分 暗号化のためのコンフィグレーション、暗号化ルーチンインターフェースの定義の追加 ②また今回の改定に際し、全文の見直しと誤記訂正、不足分の説明の追加を行なった。 - 58 -
© Copyright 2024 Paperzz