2007年09月11日

UDF1.02 1-1 導入

 UDF は Univeral Disk Format の略であり、そのバージョン UDF1.02 は DVD-ROM や DVD-VIDEO で使われるディスクフォーマットです。試しに CD-RW にこのフォーマットで焼いてみたところ、私の Windows Me で読み取れました。

 なお、Univeral Disk Format 及び UDF は OSTA の商標らしいです。

 UDF1.02 は、ISO/IEC 13346 (ECMA-167) のサブセットです。ECMA-167 は豊富な機能を持つディスクフォーマットですが、それゆえに複雑であり、DVD というメディアでは実現に無理のある機能も少なくありません。そこで、使用する文字種を規定するなど、 ECMA-167 に幾つかの制限を定めて使いやすくしたのが UDF1.02 です。

 OSTA の UDF 仕様書には、ECMA-167 で書かれている内容が既知のものであるとして書かれておりません。

 このブログでは、ECMA-167 と UDF1.02 を混ぜて説明をしてゆきます。

参考文献

Standard ECMA-167 3rd Edition
Volume and File Structure for Write-Once and Rewritable Media using Non-Sequential Recording for Information Interchange
http://www.ecma-international.org/publications/standards/Ecma-167.htm
 今回の基礎資料
 ISO/IEC 13346 が見つからないので、これを使います。
 ですから、文中では ISO/IEC 13346 ではなく ECMA167 と書きます。

OSTA UDF1.02
OSTA Univeral Disk Format Specification Revision 1.02
http://www.osta.org/specs/index.htm
 今回の基礎資料
 文中では UDF1.02 と書きます。

ECMA Technical Report TR/71
DVD Read-Only Disk - File System Specifications
http://www.ecma-international.org/publications/techreports/E-TR-071.htm
 DVD-ROM の実装方法。UDF1.02 の実際の使い方と EMCA-119 (ISO 9660) との共存、つまり UDF Bridge の作り方です。

DVD-書換形ディスクのボリューム構造及びファイル構造
http://www.y-adagio.com/public/standards/tr_dvdram/main.htm
 UDF1.50、それも DVD-RAM 用ですが、結構役に立ちます。訳語の大半はここから取りました。
 他にも、
http://www.y-adagio.com/public/standards/tr_udf15/main.htm
http://www.y-adagio.com/public/standards/tr_udf20/main.htm
 など、この Y-ADAGIO のサイトの内容を多く参考にしています。

オレンジフォーラム
http://www.cds21solutions.org/osj/j/
http://www.cds21solutions.org/osj/j/udf/index.html
 導入には便利です。

UDF の歴史
posted by 七癖 at 09:22| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年09月09日

udf1.02 マイナス1 今後の予定

ISO9660/joliet の説明から大分経ってしまいましたが、近い内に UDF1.02 の説明を始めようと思います。

取り合えず、説明する順序を決め、半分くらいの下書きを用意しました。

手間取ったのは、ECMA167 があまりに豪華なのと、UDF1.02 の方にも追記、上書きを考慮した部分が結構多かったからです。DVD-ROM だけに制限すれば楽なのですが、なぜこの変数がゼロなのかを説明するために、いろんな機能の説明が必要になって、その使われていない機能を理解しようとして、仕様書の迷宮を彷徨っていました。せっかくなので理解できた範囲で説明する予定ですが、余計こんがらがるような気がします。

まだ理解していないのが、
・ICB (え〜)
・拡張属性の多く。
・Stream (NSR03 で追加。ちなみにほとんどの DVD-ROM は NSR02。)
・PID (UDF1.02 では使用せず)
・IE、TE
・path component
・ECMA167 の Part.5 全て。(UDF1.02 ではサポートせず)
などです。ファイルシステム関係が多いですね。DVD イメージで見た事無いものも多いです。

細分したため現状で 56 回。もう少し増えそうです。年を越すかも。
posted by 七癖 at 10:45| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年07月01日

ISO9660 と Joliet の情報交換の水準

ISO9660 と Joliet の制限をまとめておきます。

ISO9660 の PVD から辿るファイルとディレクトリには、以下の水準に分けられた制限があります。

水準123
ファイル名+拡張子[BYTE]8+33030
ディレクトリ名[BYTE]83131
ファイル分割不可不可
ディレクトリ階層888
フルパス名[BYTE]255255255


Joliet の SVD から辿るファイルとディレクトリには、次の制限があります。

水準123
ファイル名〜拡張子[BYTE]128128128
ディレクトリ名[BYTE]128128128
ファイル分割不可不可
ディレクトリ階層制限なし制限なし制限なし
フルパス名[BYTE]240240240


ISO9660:1999 の(一般的な) EVD から辿るファイルとディレクトリには、次の制限があります。

水準123
ファイル識別子[BYTE]207207207
ディレクトリ識別子[BYTE]207207207
ファイル分割不可不可
ディレクトリ階層制限なし制限なし制限なし
フルパス名[BYTE]制限なし制限なし制限なし


Joliet の フルパスの最大長さが 240 バイトというのは少なすぎると思うのですが、訳し間違えているでしょうか。

posted by 七癖 at 11:16| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月29日

Joliet その4 複セッションのディスク

音楽とデータを別個のトラックに置いて一枚にまとめられる CD では、特有のややこしい問題があります。

まず、先頭の位置は最初のセッションの 00:02:00 とします。経過時間(分秒フレーム)と論理アドレスの変換式はは、
(((Minute*60)+Seconds)*75) - 150
です。

そして Joliet では、セクタフォーマットに Mode 1 か Mode 2 Form 1 のどちらかを使います。
Mode 1 は単一セッションの場合のみ使用します。
この Mode 1 と Mode 2 Form 1 のユーザーデータの容量は1セクタあたり 2048バイトなので、00:02:00 からの論理アドレスを論理ブロック番号として、SVD の パステーブルの先頭位置やディレクトリレコードのディレクトリ/ファイルの先頭位置に記録します。

ボリューム記述子群は、そのデータトラックの 16 セクタ目より始まります。

これらのことは、Joliet に限らず ISO9660 (の PVD) のみのディスクでも、こうなっているようです。

なお、DVD では、ユーザーデータ領域の開始位置から数えます。ユーザーデータの容量は1セクタ当たり2048 バイトです。
posted by 七癖 at 09:49| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月27日

Joliet その3 疑問

Joliet の仕様を訳してみて、疑問に思ったことを並べてみます。

1.SVD:Volume Descriptor Version の設定
大抵 Joliet 形式の CD-ROM では、SVD の Volume Descriptor Version は 1 になっています。ですが Joliet は SVD よりむしろ EVD 寄りのため、Volume Descriptor Version には 2 を設定したほうがいいのかもしれません。しかし、これは Joliet の後 ISO9660:1999 になってから作られた仕様です。Windows95 や 98 を使っている人のことを考えると、1 のままのほうが良いかもしれません。

2.ソート
パステーブルレコードやディレクトリレコードを並び替える際、ファイル名の長さの違いをどうするかという問題があります。ISO9660 では短い方を長い方に合わせる為、適当な1バイトデータを足りない分だけ後ろに追加することになっています。ISO9660 の PVD では、0x20 (半角スペース) を使います。Joliet の SVD では、0x00 を使います。
…まあ d 文字 と a 文字 を使う場合に限れば 0x20 でも 0x00 でもソートの結果は同じでしょう。VisualC++6.0に組み込まれた文字列の比較関数では、先頭の文字から順番に比較し、「abc」「abcde」の場合は短い「abc」を小さいとしますが、これも上のやり方と結果は同じでしょう。

3.FILLER (Justification of characters)
SVD には、Volume Identifier などの固定長文字列において、使わない場合や余った場所をどう設定するかという問題があります。ISO9660 の PVD では、0x20 (半角スペース) を使います。ですが、Joliet では特に書かれていません。なので CD-ROM の作成者によってまちまちです。
・ソートと同様に 0x00 を使う。
・半角スペースを UCS-2 に直した 0x00,0x20 を使う。この場合、37バイトと奇数の Copyright File Identifier、Abstract File Identifier、Bibliographic File Identifier の最後のバイトは 0x00 にする。
・ISO9660 の PVD に倣い、全て 0x20 で埋める。
などです。
posted by 七癖 at 09:43| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月25日

Joliet その2 仕様

Joliet では、ISO9660 の SVD を利用し、文字に UCS-2 を使います。 それに伴う変更点を挙げてゆきます。


1.SVD の設定

1.1 エスケープシーケンスの設定

SVD の Escape Sequences に、UCS-2 を示す 3 レベルあるエスケープシーケンスのいずれかを設定します。

StandardLevelDecimalHex BytesASCII
UCS-2Level 12/5, 2/15, 4/00x25, 0x2F, 0x40"%\@"
UCS-2Level 22/5, 2/15, 4/30x25, 0x2F, 0x43"%\C"
UCS-2Level 32/5, 2/15, 4/50x25, 0x2F, 0x45"%\E"

残りの29バイトは全て 0x00 です。
とりあえず全部扱えるレベル3に設定しておくのが無難です。

1.2 Volume Flags の設定

UCS-2 は ISO2375 に登録済のため、SVD の Volume Flags は 0 です。


2.文字

2.1 記述法

各文字は UCS-2 の文字をビッグエンディアンで使用します。

2.2 使えない文字

次の文字は使用禁止です。

コード文字意味備考
0x00,0x00〜0x00,0x90 制御文字 
0x00,0x2A*アスタリスク 
0x00,0x2F/スラッシュ 
0x00,0x3A:コロン 
0x00,0x3B;セミコロンファイル識別子のファイル名/拡張子とバージョンの区切りに使用
0x00,0x3F?疑問符 
0x00,0x5C\バックスラッシュ 

理由は書かれていませんが、 なんとなく Windows でファイル名として使えない文字は使えませんよ、と言っている気がします。

2.3 使用箇所

SVD 及び SVD から辿るファイルとディレクトリに UCS-2 の文字列を使用します。 並び立てると、

SVD : System Identifier
SVD : Volume Identifier
SVD : Volume Set Identifier
SVD : Publisher Identifier
SVD : Data Preparer Identifier
SVD : Application Identifier
SVD : Copyright File Identifier
SVD : Abstract File Identifier
SVD : Bibliographic File Identifier
ディレクトリレコード : File Identifier
パステーブル : Directory Identifier
拡張属性レコード : System Identifier

つまり a1/d1 文字を使用する箇所の全てです。


3.ファイル識別子

3.1 ファイル識別子の形

ファイル識別子は次の形を取ります。
ファイル名+0x00,0x2E+拡張子+0x00,0x3B+バージョン
0x00,0x2E = '.'
0x00,0x3B = ';'
単純に各文字をUCS-2の文字に変換しただけです。
ドットは自由に使えるので、ファイル名と拡張子の区切りは無いようなものです。

3.2 ファイル識別子の長さ

ファイル識別子はファイル名と拡張子の合計が64文字、128バイトまで使えます。


4.ディレクトリ識別子

4.1 ディレクトリ識別子の長さ

ディレクトリ識別子は64文字、128バイトまで使えます。

4.2 ルートディレクトリと自身のディレクトリ、親ディレクトリ

これらの特別なディレクトリの識別子には、 ISO9660 の PVD と同様に、 識別子の長さを 1 (バイト)と置き、 ルートディレクトリと自身のディレクトリ は 0x00、 親ディレクトリ は 0x01 と設定します。


5. ディレクトリ階層

ディレクトリ階層の深さに制限はありません。8 を越えてもいいです。


6. フルパス名

各ファイルは、以下の合計が 240 バイトを越えないようにします。
・ファイル識別子の長さ
・すべての関連したディレクトリの識別子の長さ
・関連したディレクトリの数

posted by 七癖 at 10:35| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月23日

Joliet その1 導入

Joliet は、1995年にMicrosoft社が提唱した CD-ROM 用のファイルシステムであり、ISO 9660:1988 の制限を緩めたものです。

Joliet では、ISO9660 と併用させるために、ISO9660 の SVD を使用します。そして、ディレクトリやパステーブルなど、ファイルシステムの構造と使い方は、ISO9660 と同じです。
違うのは、文字列に Unicode (正確にはUCS-2)を使っていることであり、それに関わる問題を調整しているだけです。

結果として、Joliet は ISO9660:1999 の SVD と EVD の中間のようなものであり、EVD の「当事者同士の合意」とある部分を定めたものになっています。というより、Joliet のような仕様が普及したため、ISO9660:1999 の EVD が作られたのでしょう。

参考文献

Joliet Specification
http://bmrc.berkeley.edu/people/chaffee/jolspec.html
今回の基礎資料。
他にも検索すれば幾つか見つかります。
Microsoft のサイトで見つからないため、オリジナルがどれか不明です。

その他、多くの方の WebSite、ソースコード。
posted by 七癖 at 09:31| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月21日

ISO9660 その15 情報交換の水準

PVD から辿るファイルとディレクトリには、以下の水準に分けられた制限があります。

水準123
ファイル名+拡張子[BYTE]8+33030
ディレクトリ名[BYTE]83131
ファイル分割不可不可
ディレクトリ階層888
フルパス名[BYTE]255255255


EVD から辿るファイルとディレクトリには、以下の制限があります。

水準123
ファイル識別子[BYTE]207207207
ディレクトリ識別子[BYTE]207207207
ファイル分割不可不可
ディレクトリ階層制限なし制限なし制限なし
フルパス名[BYTE]制限なし制限なし制限なし


PVD のファイル名+拡張子はの 30 は、ファイル名と拡張子の長さの合計で、'.'を除きます。 また、ファイル名か拡張子のどちらかは 1 文字以上です。

ディレクトリ階層は、ルートディレクトリを1とし、2、3、と続きます。

フルパス名[BYTE]には、ドライブレターを含みません。
0/LEVEL_02/LEVEL_03/LEVEL_04/LEVEL_05/LEVEL_06/LEVEL_07/LEVEL_08/FILENAME.EXT;32767
であれば 83 文字です。(ルートを1文字と数えると思うのですが、どうなのでしょう?)
水準1ならば問題ありません。

EVD のファイル/ディレクトリ識別子の 207 バイトという数字は、 ディレクトリレコードの仕様から算出されます。
ディレクトリレコードの長さは 8 ビットで記録され、 偶数のため最大254バイトです。 ファイル識別子以外の部分で最低33バイト必要であり、 CD-ROM XA で14バイト使用する(詳しくは不明)ため、 ファイル識別子の長さは最大207バイトになります。
なお、EVD のファイル識別子の拡張子、版数などは特に規定がなく、当事者間の合意によります。

一般的には 水準 1 が使われます。

posted by 七癖 at 09:35| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月19日

ISO9660 その14 拡張属性レコード

拡張属性レコードは使ったことが無いので、表のみ掲げておきます。

位置大きさ名称内容
0〜12unsigned shortOwner Identification 所有者識別情報
2〜32unsigned short (M)Owner Identification 上に同じ
4〜52unsigned shortGroup Identification グループ識別情報
6〜72unsigned short (M)Group Identification 上に同じ
8〜92unsigned shortPermissions 許可条件
10〜2617datetime_lFile Creation Date and Time ファイル作成日時
27〜4317datetime_lFile Modification Date and Time ファイル更新日時
44〜6017datetime_lFile Expiration Date and Time ファイル失効日時
61〜7717datetime_lFile Effective Date and Time ファイル発効日時
781unsigned charRecord Format レコード形式
791unsigned charRecord Attributes レコード属性
80〜812unsigned shortRecord Length レコード長
82〜832unsigned short (M)Record Length 上に同じ
84〜11532char[32]System identifier システム識別子 (a文字)
116〜17964unsigned char[64]System Use =0
1801unsigned charExtended Attribute Record Version 拡張属性レコードの版数
1811unsigned charLength of Escape Sequences (LEN_ESC) エスケープシーケンスの長さ
182〜24564unsigned char[64]Reserved =0
246〜2472unsigned shortLength of Application Use (LEN_AU) 応用システム用欄の長さ
248〜2492unsigned short (M)Length of Application Use (LEN_AU) 上に同じ
250〜(250+LEN_AU-1)LEN_AUunsigned char[LEN_AU]Application Use 応用システム用
250+LEN_AU〜(250+LEN_AU+LEN_ESC-1)LEN_ESCchar[LEN_ESC]Escape Sequences エスケープシーケンス


Permissions は次のとおりです。

ビット実行者内容
0システム0=読み取り可能 / 1=読み取り不能
1=1
20=実行可能 / 1=実行不能
3=1
4所有者0=読み取り可能 / 1=読み取り不能
5=1
60=実行可能 / 1=実行不能
7=1
8グループ0=読み取り可能 / 1=読み取り不能
9=1
100=実行可能 / 1=実行不能
11=1
12その他0=読み取り可能 / 1=読み取り不能
13=1
140=実行可能 / 1=実行不能
15=1

posted by 七癖 at 09:36| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月15日

ISO9660 その13 パステーブル

パステーブルには、ボリュームが持つ全てのディレクトリの階層情報とディレクトリの場所が記されています。 つまりディレクトリを親から順に辿らなくともショートカットできるわけですが、 それにはパステーブルを全て読み込む必要があります。

パステーブルは、単純に言うと パステーブルレコードというディレクトリの情報を記した構造体をつなげて並べたものです。

一つのパステーブルレコードは一つのディレクトリに対応し、 順番に番号が割り振られます。 ルートディレクトリが 1 です。 子ディレクトリのパステーブルレコードは、親ディレクトリのパステーブルレコードの番号を持っています。

パステーブルレコードは以下の規則に従って並べられます。
1. ディレクトリ階層順。ルートから順に、親が前、子が後。
2. 同じ階層では、親ディレクトリの番号が若い方から先。
3. 親が同じならば、名前(文字コード)順。

パステーブルは、L型とM型をそれぞれ用意します。 L型では パステーブルレコードの Location of Extent と Parent Directory Number をリトルエンディアンで、 M型ではビッグエンディアンで記述します。

また、もう一つづつ予備のパステーブルを用意することも出来ます。

個々のパステーブルレコードの構造は、次のとおりです。

位置大きさ名称内容
01unsigned charLength of Directory Identifier (LEN_DI) ディレクトリ識別子の長さ
11unsigned charExtended Attribute Record Length 拡張属性レコードの長さ
2〜54unsigned long (L/M)Location of Extent ディレクトリの先頭位置 [LBN]
6〜72unsigned short (L/M)Parent Directory Number 親ディレクトリの番号
8〜(8+LEN_DI-1)LEN_FIchar[LEN_FI]File Identifier ディレクトリ識別子
8+LEN_DI1unsigned charPadding Field =0 全体を偶数にするため


Extended Attribute Record Length は、無ければ 0x00 です。

ディレクトリ識別子は、ディレクトリレコードと同様に、 ルートディレクトリでは1バイトの 0x00、 それ以外の一般的なディレクトリにはd/d1文字を使用します。

ディレクトリ識別子の長さが奇数の場合(全体の長さが奇数になってしまった場合) 終端に 1 バイト追加し、0x00 を入れます。これが Padding Field です。 ファイル名の長さが偶数ならば、必要ありません。

posted by 七癖 at 10:07| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月11日

ISO9660 その12 ディレクトリとディレクトリレコード

ディレクトリは、単純に書くとそのディレクトリが持っている ファイルやディレクトリの情報を記した構造体(ディレクトリレコード)をつなげて並べたものです。
ただ、個々のディレクトリレコードの大きさは、ファイル/ディレクトリの名前の長さによって異なります。

ディレクトリレコードは、次のようになっています。

位置大きさ名称内容
01unsigned charLength of Directory Record (LEN_DR) このディレクトリレコードの長さ [BYTE]
11unsigned charExtended Attribute Record Length 拡張属性レコードの長さ(無ければ0)
2〜54unsigned longLocation of Extent ディレクトリまたはファイル本体の先頭位置 [LBN]
6〜94unsigned long (M)Location of Extent 上に同じ
10〜134unsigned longData Length ディレクトリまたはファイル本体の大きさ [BYTE]
14〜174unsigned long (M)Data Length 上に同じ
18〜247struct datetime_sRecording Date and Time 記録日時
251unsigned charFile Flags ファイルフラグ
261unsigned charFile Unit Size ファイルユニットの大きさ
271unsigned charInterleave Gap Size インタリーブ間隙の大きさ
28〜292unsigned shortVolume Sequence Number ボリューム順序番号
30〜312unsigned short (M)Volume Sequence Number 上に同じ
321unsigned charLength of File Identifier (LEN_FI) ファイル識別子の長さ(LEN_FI)
33〜(33+LEN_FI-1)LEN_FIchar[LEN_FI]File Identifier ファイル/ディレクトリ識別子
33+LEN_FI1unsigned charPadding Field =0 全体を偶数にするため
(LEN_DR-LEN_SU)〜(LEN_DR-1)LEN_SUchar[LEN_SU]System Use システム用

ファイルの場合、Data Length はファイル本体のバイト数です。
ディレクトリの場合、Data Length は
ディレクトリが占有している論理ブロック数×論理ブロック当たりのバイト数
です
また、Data Length に拡張属性の大きさは含みません。


表中の記録日時の構造(datetime_s)は次のとおりです。

位置大きさ名称内容
01unsigned charNumber of years since 1900 西暦年 - 1900
11unsigned charMonth of the year from 1 to 12
21unsigned charDay of the month from 1 to 31
31unsigned charHour of the day from 0 to 23
41unsigned charMinute of the hour from 0 to 59
51unsigned charSecond of the minute from 0 to 59
61charOffset from Greenwich Mean Time in number of 15 min intervals from -48 (West) to +52 (East) グリニッジ標準時からの偏差(15分単位)

こちらの年月日時分秒は文字ではなく数値です。 使われていなければ、全て 0x00 です。
西暦2156年問題があります。

ファイルフラグは次のとおりです。

ビット名称内容
0Existence0=可視ファイル / 1=不可視ファイル
1Directory0=ファイル / 1=ディレクトリ
2Associated File0=主ファイル / 1=関連ファイル
3Record0=ファイルがレコード形式を持たない / 1=レコード形式を持つ
4Protection0=許可条件無効 / 1=許可条件有効
5Reserved予約(=0)
6Reserved予約(=0)
7Multi-Extent0=ファイルの最終ディレクトリレコードである / 1=ファイルの最終ディレクトリレコードでない

隠しファイルのとき、ビット0を設定します。
ビット1でファイルかディレクトリかを判別します。
他は…大抵 0 です。

File Unit Size と Interleave Gap Size は、ファイルが分割されている時に使います。 ファイルが分割されていなければ 0 です。

Volume Sequence Number は、普通一つのボリューム内に全て記入するので、その場合 1 です。


ファイル/ディレクトリ識別子は、いわゆるファイル/ディレクトリ名です。

PVD から辿る場合、ファイル識別子は、次のようになっています。
ファイル名+0x2E+拡張子+0x3B+バージョン
0x2E = '.'
0x3B = ';'
拡張子は無い場合もあります。
バージョンは、1〜32767の数値を文字で記述します。 windows では 1 です。
各文字はd文字を使用します。
よって、
FILENAME.EXT;1
のように書かれています。
(文字数の制限は後まわし。)

EVD から辿る場合、文字はd1文字を使用します。
拡張子、版数などはありません。(当事者間の合意によります。)

ディレクトリでは、最初に自身のディレクトリレコードを、 次に親のディレクトリレコードを記録します。 自分自身のディレクトリ識別子には、1バイトの 0x00 を、 親ディレクトリのディレクトリ識別子には、1バイトの 0x01 を使います。 文字に Unicode のような2バイト文字を使う場合でも、 ファイル識別子の長さ(LEN_FI)を 1 と置き、 単一バイトの 0x00 と 0x01 を使用します。
なお、ルートディレクトリの識別子にも1バイトの 0x00 を使います。 ルートディレクトリ内の親ディレクトリ(0x01)もルートディレクトリ自身を示します。 (無いこともあります。)
それ以外の一般的なディレクトリの識別子にはd/d1文字を使用します。


ファイル識別子の長さが偶数の場合(全体の長さが奇数になってしまった場合) 終端に 1 バイト追加し、0x00 を入れます。これが Padding Field です。 ファイル名の長さが奇数ならば、必要ありません。

System Use は、ファイル名の長さにかかわらず ディレクトリレコードの長さを同じにしたい場合(たまにある)など、 ディレクトリレコード間に隙間を空ける時に使います。
なお、ディレクトリレコードが論理ブロックを跨がないように、 論理ブロックの終わりのほうを 0x00 で埋める必要があります。
 
posted by 七癖 at 09:20| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月07日

ISO9660 その11 VDT

Volume Descriptor Set Terminator (VDT)(ボリューム記述子集合終端子)は、 ボリューム記述子群の終端を示すもので、ISO9660及びその派生、拡張形式には 必ず一つは存在します。その構造は、次のとおりです。

位置大きさ名称内容
01unsigned charVolume Descriptor Type=255
1〜55char[5]Standard Identifier="CD001"
61unsigned charVolume Descriptor Version大抵 =1
7〜20472041unsigned char[2041](Reserved for future standardization)=0

最初のバイトが 255 ならば、ボリューム記述子群はここまで、ということです。

posted by 七癖 at 11:01| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月05日

ISO9660 その10 Boot Record

Boot Record (BR)(ブートレコード)は使ったことがないので、 表のみ書いておきます。

位置大きさ名称内容
01charVolume Descriptor Type=0
1〜55char[5]Standard Identifier="CD001"
61unsigned charVolume Descriptor Version大抵 =1
7〜3832char[32]Boot System Identifier起動システム識別子 (a文字)
39〜7032char[32]Boot Identifier起動識別子 (a文字)
71〜20471977unsigned char[1977]Boot System Use起動システム用

posted by 七癖 at 09:44| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月03日

ISO9660 その9 VPD

Volume Partition Descriptor (VPD)(ボリューム区画記述子)は使ったことがないので、 表のみ書いておきます。

位置大きさ名称内容
01unsigned charVolume Descriptor Type=3
1〜55char[5]Standard Identifier="CD001"
61unsigned charVolume Descriptor Version大抵 =1
71unsigned charUnused Field=0
8〜3932char[32]System identifierシステム識別子 (a文字)
40〜7132char[32]Volume Partition Identifierボリューム区画識別子 (d文字)
72〜754unsigned longVolume Partition Locationボリューム区画の先頭位置 [LBN]
76〜794unsigned long (M)Volume Partition Location上に同じ
80〜834unsigned longVolume Partition Sizeボリューム区画の大きさ [Blocks]
84〜874unsigned long (M)Volume Partition Size上に同じ
88〜20471960unsigned char[1960]System Useシステム用

posted by 七癖 at 10:09| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月01日

ISO9660 その8 SVD/EVD

Supplementary Volume Descriptor (SVD)(副ボリューム記述子) と Enhanced Volume Descriptor (EVD)(拡張ボリューム記述子)の構造は PVD と同じですが、入れる値が異なります。

位置大きさ名称内容
01unsigned charVolume Descriptor Type=2
1〜55char[5]Standard Identifier="CD001"
61unsigned charVolume Descriptor Version=1(SVD), =2(EVD)
71unsigned charVolume Flagsビット0 : 0=ISO2375登録のエスケープシーケンスのみ / 1=ISO2375登録外のエスケープシーケンスが含まれる
8〜3932char[32]System identifierシステム識別子 (a1文字)
40〜7132char[32]Volume Identifierボリュームラベル (d1文字)
72〜798char[8]Unused Field=0
80〜834unsigned longVolume Space Sizeボリュームの大きさ [Blocks]
84〜874unsigned long (M)Volume Space Size上に同じ
88〜11932char[32]Escape Sequencesエスケープシーケンス
120〜1212unsigned shortVolume Set Sizeボリューム集合の大きさ
122〜1232unsigned short (M)Volume Set Size上に同じ
124〜1252unsigned shortVolume Sequence Numberボリューム順序番号
126〜1272unsigned short (M)Volume Sequence Number上に同じ
128〜1292unsigned shortLogical Block Size論理ブロックの大きさ [BYTE] 大抵2048
130〜1312unsigned short (M)Logical Block Size上に同じ
132〜1354unsigned longPath Table Sizeパステーブルの大きさ [BYTE]
136〜1394unsigned long (M)Path Table Size上に同じ
140〜1434unsigned longLocation of Occurrence of Type L Path TableL形パステーブルの先頭位置 [LBN]
144〜1474unsigned longLocation of Optional Occurrence of Type L Path Table任意L形パステーブルの先頭位置 [LBN]
148〜1514unsigned long (M)Location of Occurrence of Type M Path TableM形パステーブルの先頭位置 [LBN]
152〜1554unsigned long (M)Location of Optional Occurrence of Type M Path Table任意M形パステーブルの先頭位置 [LBN]
156〜18934struct directory_recordDirectory Record for Root Directoryルートディレクトリのディレクトリレコード
190〜317128char[128]Volume Set Identifierボリューム集合識別子 (d1文字)
318〜445128char[128]Publisher Identifier出版者識別子 (a1文字)
446〜573128char[128]Data Preparer Identifierデータ編集者識別子 (a1文字)
504〜701128char[128]Application Identifier応用システム識別子 (a1文字)
702〜73837char[37]Copyright File Identifier著作権ファイル識別子 (d1文字)
739〜77537char[37]Abstract File Identifier抄録ファイル識別子 (d1文字)
776〜81237char[37]Bibliographic File Identifier書誌ファイル識別子 (d1文字)
813〜82917struct datetime_lVolume Creation Date and Timeボリューム作成日時
830〜84617struct datetime_lVolume Modification Date and Timeボリューム更新日時
847〜86317struct datetime_lVolume Expiration Date and Timeボリューム失効日時
864〜88017struct datetime_lVolume Effective Date and Timeボリューム発効日時
8811unsigned charFile Structure Versionファイル構造版数 =1
8821unsigned charReserved=0
883〜1394512unsigned char[512]Application Use=0
1395〜2047653unsigned char[653]Reserved=0

Escape Sequences には、ISO/IEC 2022 のエスケープシーケンスを入れます。 これがあると、ファイル名などに多種の文字が使用できるようになりますが、 読み取る側がそのエスケープシーケンスに対応していないと無駄です。
全て 0 であれば ISO/IEC 646 となり、a 文字と d 文字しか使えません。

各日時は、PVD と同じです。つまり、年月日時分秒1/100秒にはd文字を使います。

System identifier、Publisher Identifier、Data Preparer Identifier、Application Identifier が a 文字から a1 文字に、 Volume Identifier、Volume Set Identifier、Copyright File Identifier、Abstract File Identifier、Bibliographic File Identifier が d 文字から d1 文字に、 それぞれ変更されています。

エスケープシーケンスの補足と疑問
posted by 七癖 at 09:57| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年05月29日

ISO9660 その7 PVD

Primary Volume Descriptor (PVD)(基本ボリューム記述子)の構造は、次のとおりです。

位置大きさ名称内容
01unsigned charVolume Descriptor Type=1
1〜55char[5]Standard Identifier="CD001"
61unsigned charVolume Descriptor Version大抵 =1
71unsigned charUnused Field=0
8〜3932char[32]System identifierシステム識別子 (a文字)
40〜7132char[32]Volume Identifierボリュームラベル (d文字)
72〜798char[8]Unused Field=0
80〜834unsigned longVolume Space Sizeボリュームの大きさ [Blocks]
84〜874unsigned long (M)Volume Space Size上に同じ
88〜11932char[32]Escape Sequences=0
120〜1212unsigned shortVolume Set Sizeボリューム集合の大きさ
122〜1232unsigned short (M)Volume Set Size上に同じ
124〜1252unsigned shortVolume Sequence Numberボリューム順序番号
126〜1272unsigned short (M)Volume Sequence Number上に同じ
128〜1292unsigned shortLogical Block Size論理ブロックの大きさ [BYTE] 大抵2048
130〜1312unsigned short (M)Logical Block Size上に同じ
132〜1354unsigned longPath Table Sizeパステーブルの大きさ [BYTE]
136〜1394unsigned long (M)Path Table Size上に同じ
140〜1434unsigned longLocation of Occurrence of Type L Path TableL形パステーブルの先頭位置 [LBN]
144〜1474unsigned longLocation of Optional Occurrence of Type L Path Table任意L形パステーブルの先頭位置 [LBN]
148〜1514unsigned long (M)Location of Occurrence of Type M Path TableM形パステーブルの先頭位置 [LBN]
152〜1554unsigned long (M)Location of Optional Occurrence of Type M Path Table任意M形パステーブルの先頭位置 [LBN]
156〜18934struct directory_recordDirectory Record for Root Directoryルートディレクトリのディレクトリレコード
190〜317128char[128]Volume Set Identifierボリューム集合識別子 (d文字)
318〜445128char[128]Publisher Identifier出版者識別子 (a文字)
446〜573128char[128]Data Preparer Identifierデータ編集者識別子 (a文字)
504〜701128char[128]Application Identifier応用システム識別子 (a文字)
702〜73837char[37]Copyright File Identifier著作権ファイル識別子 (d文字)
739〜77537char[37]Abstract File Identifier抄録ファイル識別子 (d文字)
776〜81237char[37]Bibliographic File Identifier書誌ファイル識別子 (d文字)
813〜82917struct datetime_lVolume Creation Date and Timeボリューム作成日時
830〜84617struct datetime_lVolume Modification Date and Timeボリューム更新日時
847〜86317struct datetime_lVolume Expiration Date and Timeボリューム失効日時
864〜88017struct datetime_lVolume Effective Date and Timeボリューム発効日時
8811unsigned charFile Structure Versionファイル構造版数 =1
8821unsigned charReserved=0
883〜1394512unsigned char[512]Application Use=0
1395〜2047653unsigned char[653]Reserved=0

文字を入れる System identifier、Volume Identifier、 Volume Set Identifier、Publisher Identifier、Data Preparer Identifier、Application Identifier、 Copyright File Identifier、Abstract File Identifier、Bibliographic File Identifier は全て先詰で、 余った部分には半角スペース (0x20) を入れます。 使わない場合は全て半角スペース (0x20) です。
ただ、中には最後のバイトが 0 であったり、余った部分が 0 であるディスクもあったような気がします。

Volume Set Size と Volume Sequence Number は、 例えばCD-ROM何枚組の百科辞典があるとき、 辞典のディスク枚数を Volume Set Size に、そのディスク番号を Volume Sequence Number に それぞれ入れます。ただ複数枚組のゲームでも使われているのを見たことは無く、 どちらも大抵 0x01 が入っています。

Path Table Size はパステーブルの先端から終端までのバイト数です。 パステーブルでは一つのパステーブルレコードが論理ブロックを跨いでも大丈夫です。

任意パステーブルを使わない場合 Location of Occurrence of Type L/M Path Table に 0 を入れます。

Directory Record for Root Directory には、 ルートディレクトリのディレクトリレコード(後述)が丸ごと入っています。 ディレクトリ識別子は 0x00 で、識別子の長さは 1 バイトです。

Volume Set Identifier には、例えばCD-ROM何枚組の百科辞典があるとき、 その百科辞典名を入れます。 ただ使われているのを見たことはあまり無く、 ボリュームラベルと同じか、半角スペース(0x20)で埋まっています。NOT_SET と書かれるソフトもあったような気がします。

Publisher Identifier、Data Preparer Identifier、Application Identifier が使われる場合で、 最初のバイトがアンダーバー (0x5F '_') のとき、ファイル名が入っており、 そのファイルがルートディレクトリに置かれています。 その場合、ディレクトリレコードのファイル記述子と同じ構造です。他、普通の文字列が入っている場合もあります。

Copyright File Identifier、Abstract File Identifier、Bibliographic File Identifier が使われるとき、 ファイル名が入っており、 そのファイルがルートディレクトリに置かれています。

作成、更新、失効、発行日時の構造(datetime_l)は、次のとおりです。

位置大きさ名称内容
04char[4]Year from 1 to 9999 西暦年 (d文字)
42char[2]Month of the year from 1 to 12 月 (d文字)
62char[2]Day of the month from 1 to 31 日 (d文字)
82char[2]Hour of the day from 0 to 23 時 (d文字)
102char[2]Minute of the hour from 0 to 59 分 (d文字)
122char[2]Second of the minute from 0 to 59 秒 (d文字)
142char[2]Hundredths of a second 1/100 秒 (d文字)
161charOffset from Greenwich Mean Time in number of 15 min intervals from -48 (West) to +52 (East) グリニッジ標準時からの偏差(15分単位)

年月日時分秒1/100秒は、数値ではなくd文字です。1月の場合'0x30''0x31'、12月の場合'0x31''0x32'となります。偏差のみ数値です。 偏差は、日本の場合 0x24=36=9×4 になります。
使われていない場合、年月日時分秒1/100秒にd文字の 0 (0x30) 、偏差に数値の 0x00 がそれぞれ入っています。 たまに全て数値の 0x00 になっているディスクもあります。
なお、西暦1万年問題があります。

Application Use や 最後の Reserved には、プロテクトがかけられたディスクなどで 何かしらの文字などが入っている場合があります。

posted by 七癖 at 09:49| Comment(2) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年05月27日

ISO9660 その6 ボリューム記述子

ボリューム記述子群は、読み取りのスタート地点であり、 トラックの先頭より16論理セクタ目から始まり、数論理セクタ続きます。
この中に、ボリューム、ファイルシステムの情報が書かれています。
個々のボリューム記述子の大きさは1論理セクタです。

ボリューム記述子には、次の種類があります。
番号名称適当訳備考
0Boot Record起動レコード 
1Primary Volume Descriptor (PVD)基本ボリューム記述子本当は厳密なISO9660用
2Supplementary Volume Descriptor (SVD)
Enhanced Volume Descriptor (EVD)
副ボリューム記述子
拡張ボリューム記述子
文字種、文字数などの制限を緩めたい場合
joliet など
3Volume Partition Descriptorボリューム区画記述子 
255Volume Descriptor Set Terminator (VDT)ボリューム記述子集合終端子ボリューム記述子群の最後を示す


ボリューム記述子群は、最低2論理セクタ続きます。
16 PVD
17 VDT
です。

多くの windows 用 CD-ROM では、
16 PVD
17 SVD
18 VDT
となっています。この場合、PVD用のパステーブルとディレクトリ群とは別に、 SVD用のパステーブルとディレクトリ群があります。ファイル本体は共通です。

拡張ボリューム記述子(EVD)は、ISO9660:1999 から加えられた仕様です。

個々のボリューム記述子は、次のようになっています。

位置大きさ名称内容
01unsigned charVolume Descriptor Typeボリューム記述子の種類
1〜55char[5]Standard Identifier="CD001"
61unsigned charVolume Descriptor Versionバージョン
7〜20472041--ボリューム記述子の種類によって異なる

posted by 七癖 at 09:49| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年05月25日

ISO9660 その5 d文字とa文字

ISO9660 では、OS 間の互換性を保つため、使える文字の制限が厳しいです。
PVD および PVD を起点に読み取るファイル/ディレクトリ識別子では次の d 文字と a 文字しか使えません。

d 文字

DECHEXCHAR
00x00 
10x01 
20x02 
30x03 
40x04 
50x05 
60x06 
70x07 
80x08 
90x09 
100x0A 
110x0B 
120x0C 
130x0D 
140x0E 
150x0F 
160x10 
170x11 
180x12 
190x13 
200x14 
210x15 
220x16 
230x17 
240x18 
250x19 
260x1A 
270x1B 
280x1C 
290x1D 
300x1E 
310x1F 
DECHEXCHAR
320x20 
330x21 
340x22 
350x23 
360x24 
370x25 
380x26 
390x27 
400x28 
410x29 
420x2A 
430x2B 
440x2C 
450x2D 
460x2E 
470x2F 
480x300
490x311
500x322
510x333
520x344
530x355
540x366
550x377
560x388
570x399
580x3A 
590x3B 
600x3C 
610x3D 
620x3E 
630x3F 
DECHEXCHAR
640x40 
650x41A
660x42B
670x43C
680x44D
690x45E
700x46F
710x47G
720x48H
730x49I
740x4AJ
750x4BK
760x4CL
770x4DM
780x4EN
790x4FO
800x50P
810x51Q
820x52R
830x53S
840x54T
850x55U
860x56V
870x57W
880x58X
890x59Y
900x5AZ
910x5B 
920x5C 
930x5D 
940x5E 
950x5F_
DECHEXCHAR
960x60 
970x61 
980x62 
990x63 
1000x64 
1010x65 
1020x66 
1030x67 
1040x68 
1050x69 
1060x6A 
1070x6B 
1080x6C 
1090x6D 
1100x6E 
1110x6F 
1120x70 
1130x71 
1140x72 
1150x73 
1160x74 
1170x75 
1180x76 
1190x77 
1200x78 
1210x79 
1220x7A 
1230x7B 
1240x7C 
1250x7D 
1260x7E 
1270x7F 


a 文字

DECHEXCHAR
00x00 
10x01 
20x02 
30x03 
40x04 
50x05 
60x06 
70x07 
80x08 
90x09 
100x0A 
110x0B 
120x0C 
130x0D 
140x0E 
150x0F 
160x10 
170x11 
180x12 
190x13 
200x14 
210x15 
220x16 
230x17 
240x18 
250x19 
260x1A 
270x1B 
280x1C 
290x1D 
300x1E 
310x1F 
DECHEXCHAR
320x20SP
330x21!
340x22"
350x23 
360x24 
370x25%
380x26&
390x27'
400x28(
410x29)
420x2A*
430x2B+
440x2C,
450x2D-
460x2E.
470x2F/
480x300
490x311
500x322
510x333
520x344
530x355
540x366
550x377
560x388
570x399
580x3A:
590x3B;
600x3C<
610x3D=
620x3E>
630x3F?
DECHEXCHAR
640x40 
650x41A
660x42B
670x43C
680x44D
690x45E
700x46F
710x47G
720x48H
730x49I
740x4AJ
750x4BK
760x4CL
770x4DM
780x4EN
790x4FO
800x50P
810x51Q
820x52R
830x53S
840x54T
850x55U
860x56V
870x57W
880x58X
890x59Y
900x5AZ
910x5B 
920x5C 
930x5D 
940x5E 
950x5F_
DECHEXCHAR
960x60 
970x61 
980x62 
990x63 
1000x64 
1010x65 
1020x66 
1030x67 
1040x68 
1050x69 
1060x6A 
1070x6B 
1080x6C 
1090x6D 
1100x6E 
1110x6F 
1120x70 
1130x71 
1140x72 
1150x73 
1160x74 
1170x75 
1180x76 
1190x77 
1200x78 
1210x79 
1220x7A 
1230x7B 
1240x7C 
1250x7D 
1260x7E 
1270x7F 

0x20 の"SP"は"半角スペース"のことです。 空白部分は、半角スペースではなく、使えないコードです。

この他に、0x2E'.'、0x3B';'、0x20' '(半角スペース) を使います。 '.'はファイル名と拡張子の区切りに、';'はファイル識別子の拡張子と版数の区切りに使われます。 半角スペースはPVD内などの文字列を入れる場所で余ったバイトを埋めるために使われます。 また、ディレクトリ識別子では、単一の 0x00 を自身のディレクトリ、 0x01 を親ディレクトリの識別子として使います。

SVD/EVD および SVD/EVD を起点に読み取るファイル/ディレクトリ識別子では d 文字の替わりに d1 文字、a 文字の替わりに a1 文字を使います。 d1、a1 文字セットの内容は当事者間の合意によります。
posted by 七癖 at 09:12| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年05月23日

ISO9660 その4 数値の表記

ISO9660 ではシステムの違いによって、2、4バイトの数値がリトルエンディアン、ビッグエンディアンのどちらにも対応できるよう、両方書いてある箇所が多くあります。それは、リトルエンディアンの値を先に、ビッグエンディアンの値を後に続けます。

例えば、2 バイトの数値(short、unsigned short)の数値
4660 = 0x1234
の場合、4 バイト使用して、
0x34 0x12 0x12 0x34
の順で記録されます。

例えば、4 バイトの数値(long、unsigned long)の数値
305419896 = 0x12345678
の場合、8 バイト使用して順に、
0x78 0x56 0x34 0x12 0x12 0x34 0x56 0x78
の順で記録されます。

ただ、このブログでは windows でプログラムを作ることを考えて、公式の表では一つにまとめて書いてあるこれらを分離し、ビッグエンディアンの方に (M) と付けることにします。(M = most significant byte first)
unsigned short
unsigned short (M)
あるいは
unsigned long
unsigned long (M)
です。
また、リトルエンディアンとビッグエンディアンのどちらかをとる場合には (L/M) を付けます。
unsigned short (L/M)
あるいは
unsigned long (L/M)
です。

なお、8 バイトの数値はありません。
posted by 七癖 at 10:45| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。