戻る
<< BACK  2019年6月  NEXT >>
 FDやHDDのパーティションにフリーエリアを超えるデータを詰め込む  かかっくん  2019年6月6日(木) 1:45
とりあえずファイルシステムはDOSフォーマットを対象にします
先ずはフリーエリアを1バイトも余らせず埋める事から。ただしフリーエリア一杯の1ファイルででは
なくですよ
リクエストがあれば方法を披露します。

FDの場合はやり方によってDISKCOPYできる物とできない物(レベルによってはアインでしかデュプリ
できない物も)に分かれますがとりあえずは前者から。
# 然うです後者はプロテクトと似たやうな手法です。だから具体的な方法はカツアイ!
# 抑抑、後者はDOSフォーマットとは云い難い

 スキマ収納名人  まりも  2019年6月6日(木) 23:33
>リクエストがあれば方法を披露
一応リクエストしておきますが、下記以外でお願いしときます(殴

HDのパーティションにということなら、98パーティション形式がBIOSシリンダ境界厳守であることから、FAT上の最大クラスタ以降、そのパーティションのシリンダ境界のエンドまでの未使用セクタにこっそりデータを置けますね。

純粋にFATファイルシステムでということなら、フォーマット時に予約セクタをやたら多く取ってそこにこっそりデータを置くということはできます。そもそもが予約セクタというのはその目的のものなので汎用的です(そののぶん見破られたり壊されたりしやすい)。

>プロテクトと似たやうな手法
FDの場合2HD 1232KB/8sect フォーマットなら77トラック以上80未満のトラックにこっそりデータ(*)は置けます(DISK BIOS利用でも可)。2DD,2HCや2HD 1440KBのときはどうするのかわからないのでリクエストします。80トラック以上にシークさせて(DISK BIOSでは不可能)FDDが壊れたりしないかどうか。

(*)意図して置かなくても、以前に1232KBフォーマット以外で書き込んだデータが残っていることがあり、FDを人に渡したときに、そこから情報がリークするリスクがあるんですよね。

 1バイトどころか1bitも無駄にしない  かかっくん  2019年6月7日(金) 11:17
> FDの場合2HD 1232KB/8sect フォーマットなら77トラック以上80未満のトラックにこっそりデータ(*)は置けます(DISK BIOS利用でも可)。2DD,2HCや2HD 1440KBのときはどうするのかわからないのでリクエストします。80トラック以上にシークさせて(DISK BIOSでは不可能)FDDが壊れたりしないかどうか。

前者ですが、2HDなら通用しますが8インチには通用しない(FD1165Aには77+1シリンダ位しかマージンが
無い)ので不可としています。同様の理由で8インチを2HCフォーマットすると不完全な物になります。
ちなみにみいそ(純正)の113x系/115x系なら80+2シリンダ位ならオーバートラックを使えるやうです
Wizard98のFreiaではDuplicateとAnalyzeの初期値は1MBが157(V3/1.1以降は159)迄、640KBが163迄、
V3/1.1以降の1.44MBは159迄になっています。


まずはフリーエリアを埋める方から。一見普通のDOSのFDの様に見せかけて、MSDOS.SYSやCOMMAND.
COMの様に実質R/Oなファイルの末尾〜クラスタ末尾の隙間を利用してデータを埋め込みます。
配布用のやうにロックするのなら全ファイルがR/Oになりますから全ファイルの末尾以降が全部使えて
フリーエリアを全部埋める事もできます。こんなインストーラを作った事も有りました。

次にフリーエリア外を埋めて本来の容量を超えるデータを書き込みつつDISKCOPYできる方法。
此れにはFATや¥の隙間を利用します(FATの隙間は数十バイト程度しか有りませんが¥はファイル数が
少なければ結構空いています)。
FATの最終クラスタのエントリの後はセクタ末尾迄は未使用になっていてDEFRAG等しない限り内容が
保存されます。SCANDISKでは消されるかも知れませんがDOSのCHKDSKなら通ります。此の方式の
インストーラを作った事も有ります。

此処迄ならDOSのファンクションで読めますし、DISKCOPYも通ります。HDDに応用できる方法も
有ります。

最後にプロテクトのやうな方法。此れは普通の方法では書き込めないCRCやGAPにデータを埋め込みます。
普通にREAD DATAではCRC errorになります(目的のデータとCRCが一致(1バイトなので1/256)してエラーが
出ない事は有る)からREAD DIAGでしか読めません。GAPからデータを拾い出すには当然READ DIAGしか
有りません。CRCやGAPへの書き込み方法はプロテクトを破る方法に応用できる(方法自体は掛ける側の
技術ですが)のでカツアイ!
どうせDISKCOPYできないのですからオーバートラックとの併用で結構な容量になります。
勿論此の方式のインストーラを作った事も。
500kbps/360rpmでは内周は1024バイト(N=3)の9セクタは無理なので(外周だけ9セクタにはできそう
ですが)、セクタ9は256バイト(N=1)にするとか?
# CAVだから外でも内でも同じだろうは間違いで内ほど密度が上がる分信頼性が下がります
オーバーセクタはオーバートラックと違いBIOSで読めるので此の方がプログラミングが楽ですね

# 哀しい哉30年くらい同じやうな事やっているなぁ
# どの方法もプロテクト紛いでは?と云うツッコミは無しの方向で

> (*)意図して置かなくても、以前に1232KBフォーマット以外で書き込んだデータが残っていることがあり、FDを人に渡したときに、そこから情報がリークするリスクがあるんですよね。

メーカによってはフォーマット済FD(256フォーマット含)のデータ領域よりも内周にメーカ名などを記録して
いる場合が有り、ツールを使うと読める場合が有ります。MAXELLとかTDKとか書いてありました。

1bitも無駄にしないと云えば、IPLwareはローダがもう一杯なのでこれ以上の拡張は無理そうですが、
テーブルの各エントリのフラグが6bit空いているので此れをセクタ先頭からのオフセットとして指定する事で
8バイト単位での指定ができるやうになりそうです。或いはテーブルを別のセクタに置いてローダの方を
拡張するとか?

 データ漏洩  まりも  2019年6月16日(日) 19:10
>ファイルの末尾〜クラスタ末尾の隙間を利用してデータを埋め込みます。
これも意図的埋め込みではなくても起こりえるデータ漏洩リスクなんですよね。OSのバッファがファイルをクローズやバッファをフラッシュするとき、クラスタ単位の端数バイトぶんのデータにメモリ上のゴミが書かれることがありえます。それが可読な平文のASCII文字列だったりするとヤバイわけです。
これはMS-DOSだとかなりひどいですし、Windows APIのCreateFile/WriteFile/CloseHandleを使った場合でも起こるという話だったような?

>IPLware:テーブルの各エントリのフラグが6bit空いているので此れをセクタ先頭からのオフセットとして指定する
その手があったですね。ひとつのIPLWARE内で、サブルーチンを使い分けるとか、ユーザが将来拡張するための場所の予約などに利用できそうです。どうせ16バイト境界ぐらいに置くでしょうからビット数不足は問題ないです。

 FDに何ファイル入る?  かかっくん  2019年7月9日(火) 21:49
↑では¥にデータを埋め込む話でしたが、データ領域をディレクトリとして使うのがサブディレクトリです。
ではFD1枚に何ファイルまで入るでしょう?ファイルサイズは不問とします(←ポイント)
各FDの¥エントリ数とクラスタ数、クラスタ長、FATの空き(実際は此の倍)は↓の通り。
2HD/8 192 1221 1024 213.5
2HC 224 2371 512 24.5
2HD/18 224 2847 512 335
2DD/8 112 634 1024 70.5
2DD/9 112 713 1024 463.5

  数学苦手なので実験してみる?  まりも  2019年7月18日(木) 22:02
出題の意図がよくわからないのですが、FD一枚にサブディレクトリだけを最大いくつ作れるかという意味ですか?
それともバイト数0の空ファイルが最大何個作れる(ディレクトリに記述できる)かという意味でしょうか?

前者のほうが難しそうです。とりあえずルートディレクトリ数には固定的な上限があるのでサブディレクトリを使うしかないですが、階層をどこまで堀下げるかで変わります。1サブディレクトリ掘ったらその下に1個掘る・・・とやると階層ばかり深くて(垂直的)1ディレクトリあたり1個しか記述しないので無駄になりそうです。これに対して1サブディレクトリの下に多数作る(水平的)のも、作った先のサブ・サブディレクトリは1個しか書かないので無駄は多くなります。たぶん、1サブディレクトリに、1クラスタサイズに書ける個数ぶんは書いて、サブ・サブも同様にして、、、という「バランスの良いtree」で掘ると最大化できるのではないかと思います。実験的にでなく数学的に求まりそうな気もしますがわたしにはちょっと思いつきません。

後者でも同様なことは言えるでしょうけど、ディレクトリの階層制限をどう設定するかによるので条件が不足かも?
勝手に、2HD/8の場合で¥ディレクトリとサブ1階層までとして考えてみます。1エントリは32バイトなので1クラスタサイズを1024バイトとすると1024÷32=32個書けます。2HD/8では¥に192個書けるので、(1)サブディレクトリ不可とすると¥をファイルで無駄なく埋めて192個しか書けません。いっぽう(2)サブディレクトリ可の場合、192個全てをサブディレクトリすると、サブディレクトリに1ディレクトリあたり32個×192ディレクトリで6144個書けます。サブ・サブまで認めればもっと増やせますが前者のような問題になるので、どういうtree構造が最大になるのかは答えが見つけにくいところです。

どう頑張っても、空きクラスタ数を埋めるよりは多くできないので、2HD/の場合1221×32個=39072個よりは大きくできず、それ以内での最大化問題ということになりそうです。

ちなみに、話はちょっと変わりますが、「ディレクトリエントリもテキスト情報には違いない」ということで、「テキストファイルの内容を8バイトずつ切ってサブディレクトリ名/ファイル名を作り続ける」というオバカなプログラムを作ってみたことはあります。作成/削除不可能な文字を排除しないとうまく行かない点はありますが、「ディレクトリエントリに文書を保存する」ということは一応できました。1つのサブディレクトリ内に空ファイルのエントリを作った場合、dirコマンドを打つと文書を延々と全角4文字ずつ表示し続けるものになるというお笑いアプリです。
(・_・):般若心経とか打ち込んでおくと、ユーザは気ぃ狂うんちゃうかな?

 実は引っ掛け問題  かかっくん  2019年7月20日(土) 1:27
後者を意図したクイズでしたが、答えは2HD/8の場合で1221x32=39072ではなく、¥に191エントリ置けて、
dirには.と..が有るので2を引きます(は設問に無かったので違っても可)
で、正解は
2HD/8 192-1+1221x32(-2)=39263 (39261)
2HC 224-1+2371x16(-2)=38159 (38157)
2HD/18 224-1+2847x16(-2)=45775 (45773)
2DD/9 112-1+634x32(-2)=20399 (20397)
2DD/8 112-1+713x32(-2)=22927 (22925)
でした。
しかし、DIRコマンドで一覧を見ようとしても全部表示されない事が多いやうです。
普通に考えても1dirが1MiBを超えたり32768エントリを超えたりする事は想定外なのでせう

では0バイトでなく意味のあるデータの入ったファイルは何エントリ記録できるでしょう?
サブディレクトリの.と..は有るものとします。
各ファイルのデータの内容は0バイトでなければ不問とします(←↑ポイント)。
正解は
2HD/8 192-1+1220x32-2=39229
2HC 224-1+2370x16-2=38141
2HD/18 224-1+2846x16-2=45757
2DD/9 112-1+633x32-2=20365
2DD/8 112-1+712x32-2=22893
インチキするなとは無いのがポイントです。つまりインチキ前提
各ファイルの内容が同じではいけないとは無いので、各ファイルが同じクラスタを参照する(クロスリンク)
やうにすれば幾らでも同じ内容のファイル(エントリ)を作れます。

FD1枚に何バイトのファイルを幾つ置けるでしょう?とか?
各ファイルのデータの内容は0バイトでなければ不問とします(←ポイント)。
正解は約4GiBのファイルを↑の数です。
此れもインチキするなとは無いのでインチキ前提
FATのチェインを循環させれば幾らでも大きいファイルに見せかけられます。
たった1MiB前後のFDから数十TiB〜百数十TiBを読み出せる(しかも1クラスタしか参照しないのでファイルを
読んでいる間は殆どシークしない)ワケですな
# dirの場合はチェインの循環は同じファイルを何度も参照する事になり意味ありません

まぁFATやdirの仕組みを勉強するときのクイズ(しかも引っ掛け問題)ですな
此れ等もプロテクトの一環としてデータの埋め込みとともに仕掛けた事がありました。

> ちなみに、話はちょっと変わりますが、「ディレクトリエントリもテキスト情報には違いない」ということで、「テキストファイルの内容を8バイトずつ切ってサブディレクトリ名/ファイル名を作り続ける」というオバカなプログラムを作ってみたことはあります。作成/削除不可能な文字を排除しないとうまく行かない点はありますが、「ディレクトリエントリに文書を保存する」ということは一応できました。1つのサブディレクトリ内に空ファイルのエントリを作った場合、dirコマンドを打つと文書を延々と全角4文字ずつ表示し続けるものになるというお笑いアプリです。

いちいち0バイトのファイルを作るよりもdirエントリの形式に整えたデータを直接セクタに書き込んだ
方が速いですね
あと1エントリ8バイトではなく9〜11バイトにもできそうですね

ところでCHKDSK/SCANDISKでdirの内容がおかしいと判断するのは何処でしょうね?
.と..が無い事かな?其れともクラスタのエントリ値がおかしい(総クラスタ数より大きいとか)
場合とか?