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) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年05月21日

ISO9660 その3 ボリュームの要素とファイルへのアクセス

ISO9660 のボリュームは、次の要素で構成されます。

システムエリア(先頭16論理セクタ)
データエリア
 ボリューム記述子群(PVD、SVD、EVD、VDTなど)
 パステーブル
 ディレクトリ(ディレクトリ内の子ディレクトリ情報とファイル情報の列)
 ファイル本体

システムエリアは、ボリューム(トラックのIndex01)の先頭から 0〜15 論理セクタのことで、普通全てゼロです。

残りがデータエリアです。データエリアは論理ブロックで構成され、数えます。

 ファイル本体のデータを読み出すには、16 論理セクタ目にあるボリューム記述子群から始めます。ここにルートディレクトリの情報も書いてあります。そこからディレクトリを階層順に辿ってゆくわけです。

ボリューム記述子群→ルートディレクトリ→子ディレクトリ→ファイル本体

この順序です。
もう少し詳しく書くと、

先頭から16セクタ目より始まるボリューム記述子群
 →ボリューム記述子群内の PVD または SVD または EVD
  →PVD / SVD / EVD 内のルートディレクトリの情報
→ルートディレクトリ
 →ルートディレクトリ内の目的の子ディレクトリの情報
→子ディレクトリ
 →子ディレクトリ内の目的の孫ディレクトリの情報

→ディレクトリ
 →ディレクトリ内の目的のファイルの情報
→ファイル本体

もう一つ、パステーブルを経由する方法があります。パステーブルからは全てのディレクトリの情報が入っています。

ボリューム記述子群→パステーブル→ディレクトリ→ファイル

もう少し詳しく書くと、

先頭から16セクタ目より始まるボリューム記述子群
 →ボリューム記述子群内の PVD または SVD または EVD
  →PVD / SVD / EVD 内のパステーブルの情報
→パステーブル
 →パステーブル内の目的のディレクトリの情報
→ディレクトリ
 →ディレクトリ内の目的のファイルの情報
→ファイル本体

となり、ディレクトリの階層を順次辿ってゆく必要がありません。

なお、ファイルの一覧を取得したり検索するだけならば、ファイル本体までアクセスする必要はありません。各ディレクトリ内のファイル情報を読み取るだけで十分です。


パステーブル、ディレクトリ、ファイル、は、論理ブロックの最初のバイトから始まります。大抵、パステーブルとファイルでは、それが論理ブロックの大きさより大きい場合、そのまま次の論理ブロックに続きます。ディレクトリでは、一つのディレクトリレコードが論理ブロックを跨がないよう、足りない場合は余った部分に 0x00 を入れ、次の論理ブロックからディレクトリレコードを記述しなおします。いずれも、最後の論理ブロックの終わりのほうが余った場合、0x00 で埋めます。


シンプルな CD-ROM では、
ボリューム記述子群
パステーブル
ディレクトリ群
ファイル群
の順で記録されています。ディレクトリはパステーブルのルールに従って並べられており、ディレクトリ内のディレクトリレコードは識別子(名前)コード順に並べられます。多くの場合、ファイル本体もまたこれらのルールに倣って並べられています。
ですがパステーブルとディレクトリとファイルの位置に厳密なルールが存在するわけではありません。ディレクトリとファイルがごっちゃ(フルパス名でのソートや、OS上のファイルを再帰を使って検索したそのままの順序)になっている場合もあります。ファイルを先に記録し、後ろにパステーブルとディレクトリ群を置く人もいます。PVD と SVD が並存したり、UDF Bridge のように他のシステムと共存させている場合にはより複雑です。

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

2007年05月19日

ISO9660 その2 物理セクタ、論理セクタ、論理ブロック

CD-ROM などにアクセスするときは、バイト単位で読み書きするのではなく、それをまとめたセクタ単位で読み書きします。先頭からの位置もセクタで指定します。

そこでややこしいのが、物理セクタ、論理セクタ、論理ブロック、の違いです。

物理セクタは、メディア内の区切りであり、ユーザー用の実データ以外に同期信号やアドレス、CRC などの検査、復号用データを含みます。そして物理アドレスで場所を指定します。但し、ユーザーデータ以外は CD-R/W に Raw モードで書き込む時くらいしか気にする必要はありません。読み取るときにはドライブ(もしくはOS)が復号までやってくれます。

ISO9660 の論理セクタのバイト数は 2048 かそれ以上の 2 の n 乗です。物理セクタ内のユーザーデータの大きさが 2048 バイト未満であれば、論理セクタは 2048 バイトで、足りない分は次の物理セクタに続きます。物理セクタ内の実データ部が 2048 以上であれば、1 論理セクタは 1 物理セクタに収まるように n を最大に設定します。一つの論理セクタは必ず物理セクタのユーザーデータの先頭から始まります。

論理ブロックのバイト数は 512 かそれ以上の 2 の n 乗です。論理ブロックのバイト数は論理セクタのバイト数以下です。そのサイズは PVD/SVD/EVD に書かれています。

ただ、通常は物理セクタ内のユーザーデータ=論理セクタ=論理ブロック=2048 バイトでして、この違いを気にすることはあまりありません。

アドレスに相当する、先頭からの位置を論理ブロックで数えたものを論理ブロック番号 (LBN) と呼びます。
posted by 七癖 at 09:08| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

実は一周年


このブログを始めて、今日で一年が経ちました。

休み休みですし、ときどきとんでもない間違いを書くこともありますが、これからもよろしくお願いします。
posted by 七癖 at 09:04| Comment(0) | TrackBack(0) | 雑記 | このブログの読者になる | 更新情報をチェックする

2007年05月17日

ISO9660 その1 導入

ディスクには、ファイルの本体以外にファイルの名前、時刻やディスク上の位置と大きさ、フォルダ構造上のファイルの位置などが書かれています。その読み方、もしくは書き込む仕様を決めている規格の一つがISO9660です。

ISO9660 は、CD-ROM 用の国際規格です。DVD-ROM でも使われていることがよくあります。

ISO9660 は、読み取り専用の規格です。追記、上書きなどは考えられていません。空き領域の情報なんてものは始めからありません。そのかわり、データを速く読み取れるよう簡単な構成になっています。これは、ディスクの物理的な読み取り速度がそれほど速くないためでもあります。

こういった規格の例にもれず、ISO9660 もまた私達が半ば惰性で使用している数々の用語や数の表し方をきちんと定義し、文中で統一しています。
ビットとバイト、10進法と16進法表記、ファイル、アドレス、などです。

このブログでは、なるべく Windows 用 C++ 言語での表記に直します。

他、気になる用語や表記法については次回以降に説明します。

(にしても、こういった当たり前のことを文章にすると小難しくてわかりにくいのは何故だろう…。)
posted by 七癖 at 09:28| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年05月15日

ファイルシステムの話を始める前に

これからしばらく、ブログに何を書こうか迷っていたのですが、結局、CD-ROM や DVD-ROM のファイルシステムの話を少ししようと思います。

まず ISO9660 から始めようと思います。その後 joliet そして UDF1.02 と続ける予定です。

とはいえ、JIS の仕様書は高くて買っていません。これまで、日本語の解説サイトや他の方のソースコード、そして ROM イメージをいくつも見て理解していたのですが、もう少し正確を期すために、とりあえずここの ISO9660:1999 を Google 翻訳で訳してみました。が、いやあわからないこと。予備知識がある分、英文を眺めたほうがなんとなく理解できてしまいます。
というわけで、ここでの話は仕様の正確な訳ではありません、迷ったときには私がイメージを見てきた結果を書いてゆきます。あしからず。

また、ISO9660 の分割ファイルや関連ファイルは Windows 用 CD-ROM イメージばかり見ている為か全く見たことが無いので、説明しないか表だけ掲げて終わると思います。

参考文献(ISO9660編)

ECMA-119 http://www.ecma-international.org/publications/standards/Ecma-119.htm
公式。ISO9660:1980 と技術的に同一。

ISO9660:1999 http://www.y-adagio.com/public/standards/iso_cdromr/tocont.htm
今回の基礎資料。

ISO 9660 CD-ROMファイルシステムの概要 http://euc.jp/periphs/iso9660.ja.html
日本語訳はここから取得。
ここがあるから改めて書く必要はまあ無いのですが、私がプログラムを作っていてはまったことなどをそれとなく書き添えられればと思います。

オレンジフォーラム http://www.cds21solutions.org/osj/j/
ISO9660 ファイルシステム http://www.cds21solutions.org/osj/j/iso9660/index.html
導入には最適。

その他、多くの方の WebSite、ソースコード。

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

2007年05月09日

せんべえの生地作り ver.0.003 公開

せんべえの生地作り ver.0.003 のダウンロード

ソースコードのダウンロード

フォルダ内のファイルを、ISO9660/JOLIET/UDF イメージファイルにまとめるツール
「せんべえの生地作り」の修正版です。

変更点:

・重大な欠陥の修正
・その他、規格を勘違いしていた箇所の修正

続き…
posted by 七癖 at 18:46| Comment(0) | TrackBack(1) | 自作フリーウェア | このブログの読者になる | 更新情報をチェックする