勝手な推測
- ファイルはヘッダ部とデータ部に分かれるだろう
- 昔のワープロなのでそんなに機能はないだろう。
- 文字ごとにプロパティを設定する訳じゃない。あってせいぜい行単位
- 2倍角とか3倍角とかあるかも
- 半角漢字とかもあるよね。扱いはどうしようか。
- 文字罫線だったような気がする
- 同じデータが2種類箇所にある可能性はあるよね
あとここでは特に記載が無い限りbig endianとする。
未確定
- C:\Program Files\OASYS2002\Viewer\OASPROP\FMLBPQP.DLL がファイルを右クリックてプロパティをみたときに呼ばれる。これに文書のフォーマットの情報がすべて載っている。ということはこれを解析すればヘッダ情報が分かるだろう。OASYS1,2,3すべて同じファイルが呼ばれる。ここまでは分かった。
- ヘッダは2ffまで
- 300からデータ
- ヘッダは000-0ff, 100-1ffで同様な組がある
- 2f24(/$)が行の前のスペースを表す---前インデント
- その次データがある
- 2f22(/")が改行を表す
- 改行の後を21(!)でpadding 正しくは1区1点の全角スペースを入れている
- 2f25(/%)が行の後のスペースを表す---後インデント
- 行の後に00(nul)でpadding(5個だがこれはレイアウトの桁数によりそう)=>ここが違う。行の後に0001が来たら次の行の文字の修飾を表すことを示し、7Dまでを修飾として扱う。どのように扱われるかは解析中。
- 最後の改行の後にも完全に空白な行がデータとしてある。データとしては行単位で処理しており、最後の空白行でデータが最後という処理をしていそう
- 空白行の後に06ffまで0でpadding => 多分 0x300分ヘッダがあり、以降0x400ずつセグメントがある。
- 勘違いしていることに気がついた。完全に行指向のエディタとして考えなければならない
- 単位は2バイトごとの文字半角英数の後に全角文字を入力すると自動的にA0でpaddingされる =>これはスペース20の7ビット目を立てたもの
- 英数一部の記号のみ半角単位で打てる。半角でできる記号は何か、全角の記号は何かを要調査
- なんかラインプリンタにどのようにデータを流し込むかを考えていけばできそうな気がしてきた。
- 2バイトごとに読み込み0x0080との ANDをとる。もし trueなら ASCII falseならOASYS区点
なんか違ったな。1行分のデータ(桁数x2) byteを読む。次の5byte を読む。0x0000000000なら次の行が始まる。 0x0001000000なら装飾情報が入っているので続いた後1行分のデータ(桁数x2)を読み込む。その次に
0x7d0000の装飾情報終了文字があり、次の行が始まる。
データ・修飾方法の長さには前インデント、後インデントを含む
0x7d0000の装飾情報終了文字があり、次の行が始まる。
データ・修飾方法の長さには前インデント、後インデントを含む
半角文字と全角文字で書式データの処理方法が異なるかもしれない。
全角文字の場合
1byte目の先頭bitが立っていたら修飾情報あり、無かったら修飾情報無し。(先頭bitを0にして修飾情報を加えても表示には反映されなかった)
1byte目の先頭bitが立っていたら修飾情報あり、無かったら修飾情報無し。(先頭bitを0にして修飾情報を加えても表示には反映されなかった)
修飾情報
0x8000 => 細下線
0x8338 => 点線下線
0x8339 => 太線下線
0x833A => 二重線下線
0x833B => 波線下線
0x8336 => 網掛け状下線
0x833F => 細下線付き黒丸傍点
0x8335 => 細下線付き句点型傍点
0x033F => 黒丸傍点
0x0335 => 句点型傍点
0x8000 => 細下線
0x8338 => 点線下線
0x8339 => 太線下線
0x833A => 二重線下線
0x833B => 波線下線
0x8336 => 網掛け状下線
0x833F => 細下線付き黒丸傍点
0x8335 => 細下線付き句点型傍点
0x033F => 黒丸傍点
0x0335 => 句点型傍点
OASYS形式では細下線と傍点は同時につけられるが、それ以外の下線と傍点では下線が優先される。
網掛けとか取消線をつけると一気にヘッダが増える0x。これから考えると、文字を重ねる場合には、データフォーマットの
変更が行われると思われる。
変更が行われると思われる。
ファイル形式
0x1ffまでがWindowsとかUNIX用に加えられた部分
0x200からがOASYSのフォーマットそのまま
のような気がする。
0x200からがOASYSのフォーマットそのまま
のような気がする。
確定っぽい
文字コード
文字コードについてはOASYS区点コードを参照
ヘッダー部
アドレス(サイズ) | タイプ | 内容 | 値の範囲:(範囲外の時の値) | 備考 |
0x0204 (0x02) | uword-be | 文書の総ページ数 | 0 <= uword <= 0xffff | |
0x0206 | ubyte | 版数 | 0<= ubyte < 100 :(0) | |
0x0207 | ubyte | 書き込み保護 | 0<=ubyte<=1 :(0) | 0: なし, 1:あり |
0x0208 | ubyte | 1ページの行数 | 1<= ubyte <= 254 : (30) | |
0x020b (0x32) | ubyte | 題名 | OASYS区点コードの文字列 | |
0x023d | ubyte | 文字間隔 | 1<= ubyte <=7 : (1) | 1: "3.81mm" 2:"5.08mm" (分岐あり) 3:"3.18mm" 4:"4.45mm" 5:"その他" 6:"定型" 7:"字間", インチ表示とか混ざっていてなんか処理をしている。sub_10002096 要再解析 |
0x023e | ubyte | 行間隔 | ubyte ==4 だったら ubyte = 2 | 2:6.35mm 3:4.23mm 5:その他 6:8.89mm 7:定型 else:8.47mm , 定型は.OASにはなし |
0x0248 | ubyte | 用紙の向き | 1<= ubyte <=2 | 0x025fを参照 |
0x025c | ubyte | 用紙サイズ | 1 <= ubyte <= 10 | 1:A4 2:B4 3:A5 4:B5 5:その他 6:はがき 7:A3 8:B3 9:レター 10:リーガル 11:レジャー(.OASにはなし) |
0x025d(0x02) | uword-be | 用紙サイズその他の時の縦(mm) | ||
0x025f | ubyte | 用紙の向き | 1<=ubyte<=2 | [0x025f]==[0x0248]の場合は横長, [0x025f]!=[0x0248]の場合は縦長 |
0x0260 (0x02) | uword-be | 上部余白 | 1<= uword-be <= 0x3e7:(10) | 上部余白か右側余白かは多分書く方向による。要再解析 |
0x0262 (0x02) | uword-be | 左側余白 | 1<= uword-be <= 0x3e7:(10) | 左側余白か下側余白かは多分書く方向による。要再解析 |
0x0275 | ubyte | 行内文字数 | OASYSの書式設定では10-200 | |
0x0283(0x02) | uword-be | 用紙サイズその他の時の横(mm) | ||
0x02c0 | ubyte | 縦書き/横書き | 0 <= ubyte <= 1 | [0x0248]==1の場合--横書きのみ, [0x0248]==2の場合--0:印刷時のみ縦書き 1:縦書き |
0x20d8 (0x05) | ubyte[5] | 更新日付(yymmddhhMM) | sub_10004725関数で2000年問題の日付の処理をしている。要解析。2進化10進のデータの場合と16進のデータの場合がある。 | |
0x20dd (0x05) | ubyte[5] | 作成日付(yymmddhhMM) | sub_10004725関数で2000年問題の日付の処理をしている。要解析。2進化10進のデータの場合と16進のデータの場合がある。 |
0x0008: 32byte 文書名 (EUCで記述) 最初の32byte分か? しかも半角文字が全角に変換される。
0x0208: 1byte 行数
0x0274: 1byte 行内文字数
0x0275: 1byte 行内文字数 0x274と同じ。なぜか同じデータが2個
0x0275: 1byte 行内文字数 0x274と同じ。なぜか同じデータが2個
????日時 => 作成か?
0x02d3: 1byte 年(2桁)
0x02d4: 1byte 月(1-12)
0x02d5: 1byte 日(1-31)
0x02d6: 1byte 時(1-24)
0x02d7: 1byte 分(0-59)
0x02d3: 1byte 年(2桁)
0x02d4: 1byte 月(1-12)
0x02d5: 1byte 日(1-31)
0x02d6: 1byte 時(1-24)
0x02d7: 1byte 分(0-59)
更新日時
0x02d8: 1byte 年(2桁)
0x02d9: 1byte 月(1-12)
0x02da: 1byte 日(1-31)
0x02db: 1byte 時(1-24)
0x02dc: 1byte 分(0-59)
0x02d8: 1byte 年(2桁)
0x02d9: 1byte 月(1-12)
0x02da: 1byte 日(1-31)
0x02db: 1byte 時(1-24)
0x02dc: 1byte 分(0-59)
データの実装
解析
拡張子が
.OAS => hObject+400h =2 .OA2 => hObject+400h = 3 .FMT => hObject+400h = 4 .OA3 => hObject+400h = 5
最初の8バイトを読み込む
{Buffer[0],Buffer[1],Buffer[2],Buffer[3],var_64,var_63,var_62,var_61}
{Buffer[0],Buffer[1],Buffer[2],Buffer[3],var_64,var_63,var_62,var_61}
Buffer[0] == 0xf0;
Buffer[1] == 0xf2;
がマジック
Buffer[1] == 0xf2;
がマジック
//ここもうちょっと整理
switch (var_62) {
case 0xf0:
if (var_61 == 0xf0) {
if (Buffer[3] == 0xd6 && var_64 == 0xc1) {
switch (var_63) {
case 0xc6:
var_62 = 0xf1;
var_61 = 0xf1;
[esi + 401 h] = 2;
lDistanceToMove = 0x200
break;
case 0xc5:
var_62 = 0xf0;
var_61 = 0xf5;
[esi + 401 h] = 2;
lDistanceToMove = 0x200
break;
case 0xb8:
var_62 = 0xf1;
var_61 = 0xf2;
[esi + 401 h] = 2;
lDistanceToMove = 0x200;
break;
case 0xb7:
var_62 = 0xf1;
var_61 = 0xf3;
[esi + 401 h] = 2;
lDistanceToMove = 0x200;
break;
case 0xb3:
var_62 = 0xf0;
var_61 = 0xf0;
[esi + 401 h] = 2;
lDistanceToMove = 0x200;
break;
case 0xa5:
var_62 = 0xf3;
var_61 = 0xf1;
[esi + 401 h] = 1;
lDistanceToMove = 0x200;
break;
case 0xa3:
var_62 = 0xf1;
var_61 = 0xf5;
[esi + 401 h] = 1;
lDistanceToMove = 0x200;
break;
default:
var_62 = 0xf3;
var_61 = 0xf1;
[esi + 401 h] = 1;
lDistanceToMove = 0x200;
break;
}
break;
} else {
goto_error();
}
} else { // to loc_1000510f
if (var_61 >= 0xf6 && var_61 <= 0xf9) {
[esi + 401 h] = 2;
lDistanceToMove = 0x200;
break;
}
}
// ここにbreakなし
case 0xf1:
if (var_61 >= 0xf0 && var_61 <= 0xf3) {
[esi + 401 h] = 2;
lDistanceToMove = 0x200;
break;
}
// ここにbreakなし
case 0xf2:
if (var_61 >= 0xf1 && var_61 <= 0xf4) {
[esi + 401 h] = 2;
lDistanceToMove = 0x200;
break;
}
// ここにbreakなし
default:
[esi + 401 h] = 1;
lDistanceToMove = 0x200;
break;
}
200h byte に飛ぶ
hObjectに 400h byte読み込む
hObjectに 400h byte読み込む
var_Cを0クリア
var_CにhObject 7D (27Dh) から4バイトコピーする
var_CにhObject 7D (27Dh) から4バイトコピーする
hObject 88h から hObject 7D へ4バイトコピーする
var_cから 88hへ4byteコピーする
=> i.e 27Dh と 288hの値を4byte分 swapする
esp += 30h (スタックを30hbyte解放)
hObjectをpushして call sub_1000483F
sub_1000483Fの処理
ここで word の処理は signed, byteの処理はunsigned
if(hObject[0] <1 || hObject[0] > 16) { hObject[0] = 1;}
if (hObject[1] > 0x7D) { hObject[1] = 0;}
if (hObject[2] > 0x7C ) { hObject[2] = 4;}
if (hObject[3] < 1 || hObject[3] > 0x7d) { hObject[3] = 0x2b; }
if (hObject[1] > 0x7D) { hObject[1] = 0;}
if (hObject[2] > 0x7C ) { hObject[2] = 4;}
if (hObject[3] < 1 || hObject[3] > 0x7d) { hObject[3] = 0x2b; }
if (hObject[6] > 0x63 ) {hObject[6] = 0;}
if (hObject[7] != 1) {hObject[7] = 0;}
if (hObject[8] < 1 || hObject[8] > 0xfe) {hObject[8] = 0x1e;}
if (hObject[9] < 1 || hObject[9] > 4) { hObject[9] = 1;} else if (hObject[9] == 0) {hObject[9] = 1;} 1の時のメモリ書き換えよりレジスタ比較の方が早くて最適化された?
if (hObject[7] != 1) {hObject[7] = 0;}
if (hObject[8] < 1 || hObject[8] > 0xfe) {hObject[8] = 0x1e;}
if (hObject[9] < 1 || hObject[9] > 4) { hObject[9] = 1;} else if (hObject[9] == 0) {hObject[9] = 1;} 1の時のメモリ書き換えよりレジスタ比較の方が早くて最適化された?
hObject[0x0a]からhObject[0x3c]はなし
if( hObject[0x3d] <1 || hObject[0x3d] > 7) { hObject[0x3d] = 1;}
if( hObject[0x3e] < 1 || hObject[0x3e] > 7) { hObject[0x3e] = 1;}
if( hObject[0x3e] == 4 ) { hObject[0x3e] = 2 };
if( hObject[0x3e] == 4 ) { hObject[0x3e] = 2 };
hObject[0x3f]からhObject[0x40]はなし
if( hObject[0x41] < 1 || hObject[0x41] > 4) { hObject[0x41] = 2 };
if( hObject[0x42]hObject[0x43] < 0xfc19(-999) || hObject[0x42]hObject[0x43] > 0x270f(9999) ) { hObject[0x42] = 0; hObject[0x43] = 1;}
hObject[0x44] は複雑なので後で解析
if(hObject[0x45] < 1 || hObject[0x45] > 3) { hObject[0x45] = 3;}
hObject[0x46], hObject[0x47]はなし
if(hObject[0x48] != 2 ) {hObject[0x48] = 1;}
if(hObject[0x49] > 0x80){ hObject[0x49] = 0;}
if(hObject[0x4A] < 1 || hObject[0x4A] > 4 ) { hObject[0x4A] = 1;}
if(hObject[0x4B] < 1 || hObject[0x4B} > 3 ) { hObject[0x4B] = 1;}
if(hObject[0x49] > 0x80){ hObject[0x49] = 0;}
if(hObject[0x4A] < 1 || hObject[0x4A] > 4 ) { hObject[0x4A] = 1;}
if(hObject[0x4B] < 1 || hObject[0x4B} > 3 ) { hObject[0x4B] = 1;}
if(hObject[0x4d] != 2) {hObject[0x4d] = 1;}
if(hObject[0x4f] != 2) {hObject[0x4f] = 1;}
if(hObject[0x50] < 1 || xObject[0x50] > 3) {hObject[0x50] = 1;}
if(hObject[0x4f] != 2) {hObject[0x4f] = 1;}
if(hObject[0x50] < 1 || xObject[0x50] > 3) {hObject[0x50] = 1;}
if(hObject[0x52] != 1) {hObject[0x52] = 2;}
if(hObject[0x53] != 2) {hObject[0x53] = 1;}
if(hObject[0x53] != 2) {hObject[0x53] = 1;}
if(hObject[0x55] > 0x80) {hObject[0x55] = 0;}
if(hObject[0x59] > 2) {hObject[0x59] = 0;}
if(hObject[0x5a] < 1 || hObject[0x5a] > 5) { hObject[0x5a] = 1;}
if(hObject[0x5b] != 2) { hObject[0x5b] = 1;}
if(hObject[0x5c] < 1 || hObject[0x5c] > 0x0a) { hObject[0x5c] = 1;}
if( hObject[0x5d]hObject[0x5e] < 0 || hObject[0x5d]hObject[0x5e] > 0x270f (9999) ) { hObject[0x5d] = 2; hObject[0x5e] = 0x61;} なぜ609?
if( hObject[0x5f] != 2) { hObject[0x5f] = 1;}
if(hObject[0x60]hObject[0x61] < 0 || hObject[0x60]hObject[0x61] > 0x3e7 ) { hObject[0x60] = 0; hObject[0x61] = 0x0d;}
if(hObject[0x62]hObject[0x63] < 0 || hObject[0x62]hObject[0x63] > 0x3e7 ) { hObject[0x62] = 0; hObject[0x63] = 0x0d;} (0x3e7 = 999)
if(hObject[0x64]hObject[0x65] < 0 || hObject[0x64]hObject[0x65] > 0x3e7 ) { hObject[0x64] = 0; hObject[0x65] = 0x7f;}
if(hObject[0x66]hObject[0x67] < 0 || hObject[0x66]hObject[0x67] > 0x3e7 ) { hObject[0x66] = 0; hObject[0x67] = 0x1b;}
if(hObject[0x68]hObject[0x69] < 0 || hObject[0x68]hObject[0x69] > 0x3e7 ) { hObject[0x68] = 0; hObject[0x69] = 0x1b;}
if(hObject[0x6a]hObject[0x6b] < 0 || hObject[0x6a]hObject[0x6b] > 0x3e7 ) { hObject[0x6a] = 0; hObject[0x6b] = 0x96;} (0x96 = 150)
if(hObject[0x6c]hObject[0x6d] < 0 || hObject[0x6c]hObject[0x6d] > 0x3e7 ) { hObject[0x6c] = 0; hObject[0x6d] = 0x96;} (0x96 = 150)
if(hObject[0x6e]hObject[0x6f] < 0 || hObject[0x6e]hObject[0x6f] > 0x3e7 ) { hObject[0x6e] = 0; hObject[0x6f] = 0x5A;} (0x5a = 90)
if(hObject[0x70]hObject[0x71] < 0 || hObject[0x70]hObject[0x71] > 0x3e7 ) { hObject[0x70] = 0; hObject[0x71] = 5;}
if(hObject[0x5a] < 1 || hObject[0x5a] > 5) { hObject[0x5a] = 1;}
if(hObject[0x5b] != 2) { hObject[0x5b] = 1;}
if(hObject[0x5c] < 1 || hObject[0x5c] > 0x0a) { hObject[0x5c] = 1;}
if( hObject[0x5d]hObject[0x5e] < 0 || hObject[0x5d]hObject[0x5e] > 0x270f (9999) ) { hObject[0x5d] = 2; hObject[0x5e] = 0x61;} なぜ609?
if( hObject[0x5f] != 2) { hObject[0x5f] = 1;}
if(hObject[0x60]hObject[0x61] < 0 || hObject[0x60]hObject[0x61] > 0x3e7 ) { hObject[0x60] = 0; hObject[0x61] = 0x0d;}
if(hObject[0x62]hObject[0x63] < 0 || hObject[0x62]hObject[0x63] > 0x3e7 ) { hObject[0x62] = 0; hObject[0x63] = 0x0d;} (0x3e7 = 999)
if(hObject[0x64]hObject[0x65] < 0 || hObject[0x64]hObject[0x65] > 0x3e7 ) { hObject[0x64] = 0; hObject[0x65] = 0x7f;}
if(hObject[0x66]hObject[0x67] < 0 || hObject[0x66]hObject[0x67] > 0x3e7 ) { hObject[0x66] = 0; hObject[0x67] = 0x1b;}
if(hObject[0x68]hObject[0x69] < 0 || hObject[0x68]hObject[0x69] > 0x3e7 ) { hObject[0x68] = 0; hObject[0x69] = 0x1b;}
if(hObject[0x6a]hObject[0x6b] < 0 || hObject[0x6a]hObject[0x6b] > 0x3e7 ) { hObject[0x6a] = 0; hObject[0x6b] = 0x96;} (0x96 = 150)
if(hObject[0x6c]hObject[0x6d] < 0 || hObject[0x6c]hObject[0x6d] > 0x3e7 ) { hObject[0x6c] = 0; hObject[0x6d] = 0x96;} (0x96 = 150)
if(hObject[0x6e]hObject[0x6f] < 0 || hObject[0x6e]hObject[0x6f] > 0x3e7 ) { hObject[0x6e] = 0; hObject[0x6f] = 0x5A;} (0x5a = 90)
if(hObject[0x70]hObject[0x71] < 0 || hObject[0x70]hObject[0x71] > 0x3e7 ) { hObject[0x70] = 0; hObject[0x71] = 5;}
if(hObject[0x77] > 2) {hObject[0x77] = 0;}
if(hObject[0x78]hObject[0x79] < 0 || hObject[0x78]hObject[0x79] > 0x3e7 ) { hObject[0x78] = 0; hObject[0x79] = 0;}
if(hObject[0x7a] > 2) {hObject[0x7a] = 0;}
if(hObject[0x78]hObject[0x79] < 0 || hObject[0x78]hObject[0x79] > 0x3e7 ) { hObject[0x78] = 0; hObject[0x79] = 0;}
if(hObject[0x7a] > 2) {hObject[0x7a] = 0;}
hObject[0x7c]は複雑なので後で解析
if(hObject[0x7d] != 1) {hOjbect[0x7d] = 0;}
if(hObject[0x7e] > 7 ) {hObject[0x7e} = 0;}
if(hObject[0x7f] != 1 ) {hObject[0x7f] = 0;}
if(hObject[0x80] != 1 ) {hObject[0x80] = 0;}
if(hObject[0x81] > 3) {hObject[0x81] = 0;}
if(hObject[0x82]hObject[0x83] < 0 || hObject[0x82]hObject[0x83] > 0x3e7 ) { hObject[0x82] = 0; hObject[0x83] = 0;}
if(hObject[0x7e] > 7 ) {hObject[0x7e} = 0;}
if(hObject[0x7f] != 1 ) {hObject[0x7f] = 0;}
if(hObject[0x80] != 1 ) {hObject[0x80] = 0;}
if(hObject[0x81] > 3) {hObject[0x81] = 0;}
if(hObject[0x82]hObject[0x83] < 0 || hObject[0x82]hObject[0x83] > 0x3e7 ) { hObject[0x82] = 0; hObject[0x83] = 0;}
if(hObject[0x8c] > 2) {hObject[0x8c] = 0;}
if(hObject[0x8d] != 1) {hObject[0x8d] = 0;}
if(hObject[0x8F]hObject[0x90] < 0 || hObject[0x8F]hObject[0x90]> 0x270f) {hObject[0x8f] = hObject[0x90] = 0;} (0x270f = 9999)
if(hObject[0x91] != 1) {hObject[0x91] = 0;}
if(hObject[0x92] != 2) {hObject[0x92] = 1;}
if(hObject[0x93] < 1 || hObject[0x93] > 0xff) {hObject[0x93] = 1;} このケースよくわからない。なぜ hObject[0x93]>0xffの比較が必要か?
if(hObject[0x94]hObject[0x95] < 1 || hObject[0x94]hObject[0x95] > 0x3e7 ) { hObject[0x94] = 0; hObject[0x95] = 1;}
if(hObject[0x96] < 1 || hObject[0x96] > 0xff) {hObject[0x96] = 1;} このケースよくわからない
if(hObject[0x97]hObject[0x98] < 1 || hObject[0x97]hObject[0x98] > 0x3e7 ) { hObject[0x97] = 0; hObject[0x98] = 1;}
if(hObject[0x8d] != 1) {hObject[0x8d] = 0;}
if(hObject[0x8F]hObject[0x90] < 0 || hObject[0x8F]hObject[0x90]> 0x270f) {hObject[0x8f] = hObject[0x90] = 0;} (0x270f = 9999)
if(hObject[0x91] != 1) {hObject[0x91] = 0;}
if(hObject[0x92] != 2) {hObject[0x92] = 1;}
if(hObject[0x93] < 1 || hObject[0x93] > 0xff) {hObject[0x93] = 1;} このケースよくわからない。なぜ hObject[0x93]>0xffの比較が必要か?
if(hObject[0x94]hObject[0x95] < 1 || hObject[0x94]hObject[0x95] > 0x3e7 ) { hObject[0x94] = 0; hObject[0x95] = 1;}
if(hObject[0x96] < 1 || hObject[0x96] > 0xff) {hObject[0x96] = 1;} このケースよくわからない
if(hObject[0x97]hObject[0x98] < 1 || hObject[0x97]hObject[0x98] > 0x3e7 ) { hObject[0x97] = 0; hObject[0x98] = 1;}
if(hObject[0x9b]! != 1) {hObject[0x9b] = 0;}
if(hObject[0x9c]hObject[0x9d] <0 || hObject[0x9c]hObject[0x9d] > 0x63 ) { hObject[0x9c] = hObject[0x9d] = 0;}
if(hObject[0x9c]hObject[0x9d] <0 || hObject[0x9c]hObject[0x9d] > 0x63 ) { hObject[0x9c] = hObject[0x9d] = 0;}
if(hObject[0x9f] != 1) {hObject[0x9f] = 0;}
if(hObject[0xa3] > 2) {hObject[0xa3] = 0;}
if(hObject[0xa4] != 1) {hObject[0xa4] =0;}
if(hObject[0xa4] != 1) {hObject[0xa4] =0;}
if(hObject[0xa6] != 1) {hObject[0xa6] = 0;}
if(hObject[0xa7] != 1) {hObject[0xa7] = 0;}
if(hObject[0xa8] != 1) {hObject[0xa8] = 0;}
if(hObject[0xa9] != 1) {hObject[0xa9] = 0;}
if(hObject[0xaa] < 1 || hObject[0xaa] > 0x63) {hObject[0xaa] = 1;}
if(hObject[0xab] < 1 || hObject[0xab] > 0x63) {hObject[0xab] = 1;}
if(hObject[0xac] != 1) {hObject[0xac] = 0;}
if(hObject[0xa7] != 1) {hObject[0xa7] = 0;}
if(hObject[0xa8] != 1) {hObject[0xa8] = 0;}
if(hObject[0xa9] != 1) {hObject[0xa9] = 0;}
if(hObject[0xaa] < 1 || hObject[0xaa] > 0x63) {hObject[0xaa] = 1;}
if(hObject[0xab] < 1 || hObject[0xab] > 0x63) {hObject[0xab] = 1;}
if(hObject[0xac] != 1) {hObject[0xac] = 0;}
if(hObject[0xb1] > 2) {hObject[0xb1] = 0;}
if(hObject[0xb4] != 1) {hObject[0xb4] = 0;}
if(hObject[0xb5] > 3) {hObject[0xb5] = 0;}
if(hObject[0xb6] > 4) {hObject[0xb6] = 0;}
if(hObject[0xb7] > 3) {hObject[0xb7] = 0;}
if(hObject[0xb8] != 1) {hObject[0xb8] = 0;}
if(hObject[0xb9] > 0x2d || hObject[0xb9] != 0xff) hObject[0xb9] = 0;}
if(hObject[0xba] != 1) {hObject[0xba] = 0;}
if(hObject[0xbb] > 9) {hObject[0xbb] = 0:}
if(hObject[0xbc] > 9) {hObject[0xbc] = 0:}
if(hObject[0xbd] != 1) {hObject[0xbd] = 0;}
if(hObject[0xbe] > 9) {hObject[0xbe] = 0:}
if(hObject[0xbf] != 1) {hObject[0xbf] = 0;}
if(hObject[0xc0] != 1) {hObject[0xc0] = 0;}
if(hObject[0xc1]hObject[0xc2] <0 || hObject[0xc1]hObject[0xc2] > 0x270f) {hObject[0xc1]=hObject[0xc2]=0}
if(hObject[0xc3]> 0x63) {hObject[0xc3]=0;}
if(hObject[0xc4] != 1) {hObject[0xc4] = 0;}
if(hObject[0xc5] != 1) {hObject[0xc5] = 0;}
if(hObject[0xc6] != 1) {hObject[0xc6] = 0;}
if(hObject[0xc7] > 0xff ) {hObject[0xc7] = 0;}
if(hObject[0xc8] > 0xff ) {hObject[0xc8] = 0;}
if(hObject[0xc9] > 3) {hObject[0xc9] = 0;}
if(hObject[0xca] != 1) {hObject[0xca] = 0;}
if(hObject[0xcb] > 7) {hObject[0xcb] = 0;}
if(hObject[0xcc] > 0xff) {hObject[0xcc] = 0;}
return;
if(hObject[0xb5] > 3) {hObject[0xb5] = 0;}
if(hObject[0xb6] > 4) {hObject[0xb6] = 0;}
if(hObject[0xb7] > 3) {hObject[0xb7] = 0;}
if(hObject[0xb8] != 1) {hObject[0xb8] = 0;}
if(hObject[0xb9] > 0x2d || hObject[0xb9] != 0xff) hObject[0xb9] = 0;}
if(hObject[0xba] != 1) {hObject[0xba] = 0;}
if(hObject[0xbb] > 9) {hObject[0xbb] = 0:}
if(hObject[0xbc] > 9) {hObject[0xbc] = 0:}
if(hObject[0xbd] != 1) {hObject[0xbd] = 0;}
if(hObject[0xbe] > 9) {hObject[0xbe] = 0:}
if(hObject[0xbf] != 1) {hObject[0xbf] = 0;}
if(hObject[0xc0] != 1) {hObject[0xc0] = 0;}
if(hObject[0xc1]hObject[0xc2] <0 || hObject[0xc1]hObject[0xc2] > 0x270f) {hObject[0xc1]=hObject[0xc2]=0}
if(hObject[0xc3]> 0x63) {hObject[0xc3]=0;}
if(hObject[0xc4] != 1) {hObject[0xc4] = 0;}
if(hObject[0xc5] != 1) {hObject[0xc5] = 0;}
if(hObject[0xc6] != 1) {hObject[0xc6] = 0;}
if(hObject[0xc7] > 0xff ) {hObject[0xc7] = 0;}
if(hObject[0xc8] > 0xff ) {hObject[0xc8] = 0;}
if(hObject[0xc9] > 3) {hObject[0xc9] = 0;}
if(hObject[0xca] != 1) {hObject[0xca] = 0;}
if(hObject[0xcb] > 7) {hObject[0xcb] = 0;}
if(hObject[0xcc] > 0xff) {hObject[0xcc] = 0;}
return;
とりあえず印刷形式タブまでは解析できた。不明な点がいくつかあるが。重複あるが下記にメモ
5e7c => 7090 => 7a3c => MSVCRT.dll_??2@YAPAXI@Z_name:
F100010bb => ローカルの関数
引数なし?
L10009e98 のカウントを1増やす
L10009e98 => 値を1増やしたり減らしたりしているので参照のカウンタ
L10007608 =>
L10007608: 10007608 times 008h db 0
10007610 db 0,0,0,0,0,0,0,0, 0c0h,000h,000h,000h,000h,000h,000h,046h
関数の戻り値は AL(8bit) AX(16bit) EAX (32bit)に入る
拡張子が
.OAS => hObject+400h =2
.OA2 => hObject+400h = 3
.FMT => hObject+400h = 4
.OA3 => hObject+400h = 5
.OASの場合 ( i.e. [esi+400h] == 2)
8byte読み込む
最初の2byte = 0xf0f2
Buffer[0] == 0xf0
Buffer[1] == 0xf2
Buffer[2] == Unspecified;
switch (var_62) {
case 0xf0:
if( var_61 == 0xf0) {
if(Buffer[3] == 0xd6 && var_64 == 0xc1) {
//ここは 10005094の処理を解析
switch(var_63) {
case 0xc6:
var_62 = 0xf1;
var_61 = 0xf1;
[esi+401h] = 2;
lDistanceToMove = 0x200
break;
case 0xc5:
var_62 = 0xf0;
var_61 = 0xf5;
[esi+401h] = 2;
lDistanceToMove = 0x200
break;
case 0xb8:
var_62 = 0xf1;
var_61 = 0xf2;
[esi+401h] = 2;
lDistanceToMove = 0x200;
break;
case 0xb7:
var_62 = 0xf1;
var_61 = 0xf3;
[esi+401h] = 2;
lDistanceToMove = 0x200;
break;
case 0xb3:
var_62 = 0xf0;
var_61 = 0xf0;
[esi+401h] = 2;
lDistanceToMove = 0x200;
break;
case 0xa5:
var_62 = 0xf3;
var_61 = 0xf1;
[esi+401h] = 1;
lDistanceToMove = 0x200;
break;
case: 0xa3:
var_62 = 0xf1;
var_61 = 0xf5;
[esi+401h] = 1;
lDistanceToMove = 0x200;
break;
default:
var_62 = 0xf3;
var_61 = 0xf1;
[esi+401h] = 1;
lDistanceToMove = 0x200;
break;
}
break;
} else {
goto_error;
}
} else { // to loc_1000510f
if( var_61 >= 0xf6 && var_61 <= 0xf9 ) {
[esi+401h] = 2;
lDistanceToMove = 0x200
break;
}
}
// ここにbreakなし
case 0xf1:
if( var_61 >= 0xf0 && var_61<= 0xf3) {
[esi+401h] = 2;
lDistanceToMove = 0x200
break;
}
// ここにbreakなし
case 0xf2:
if (var_61 >= 0xf1 && var_61 <= 0xf4) {
[esi+401h] = 2;
lDistanceToMove = 0x200
break;
}
//ここにbreakなし
default:
[esi+401h] = 1;
lDistanceToMove = 0x200
break;
}
ここからfseekをする処理
}
3Dhの処理
if [3dh] = 2 then arg_c=1
if [3dh] = 3 then [8eh と 5ah の処理 arg_c= 7 分岐処理が沢山
if [3dh] = 4 then arg_c = 3
if [3dh] = 5 then arg_c = 4
if [3dh] = 6 then arg_c = 5
if [3dh] = 7 then arg_c = 6
else arg_c = 0
行間隔
if [3eh] == 2 then arg_c = 1
if [3eh] == 3 then arg_c = 0
if [3eh] == 5 then arg_c = 5
if [3eh] == 6 then arg_c = 3
if [3eh] == 7 then arg_c = 4
else arg_c = 2
if[0x5c] == 5 その他
if[0x5c] &&0x8000 不明
if[0x5c] >= 0ch 不明
[0x5f] 2 or 1
[0x48] 2 or 1
if [0x5f] ==2 && [0x48] == 2 横長
if [0x5f] ==2 && [0x48] == 1 縦長
if [0x5f] ==1 && [0x48] == 2 縦長
if [0x5f] ==1 && [0x48] == 1 横長
0x028e なんかのフラグ
if [0x8e] == 0x20
if [0x5a] ==0 || [0x5a] == 1 標準9ポイント
if [0x5a] == 2 標準10.5ポイント
if [0x5a] == 3 縮小
if [0x5a] == 4 && (if [0xc3] == 9 標準9ポイント else その他の処理)
if [0x5a] == 5 標準9ポイント
endif
if [0x8e] != 0x20
if [0x8e] == 0 || [0x8e] == 1 標準10.5ポイント
if [0x8e] == 2 大文字
if [0x8e] == 3 縮小
if [0x8e] == 4 その他の処理
if [0x8e] == 5 標準9ポイント
else その他の処理
その他の処理の内容
[0xc3] ポイント数が入る
[0xb9] 書体が入る 28通り、後で解析
[0x8e], [0xa5], [0xcb] ---- 20通り 縮小英文字の種類、後で解析
[0xca] 縮小文字の向き 1: 横向き それ以外:縦向き(2文字単位)
[0x77] 添え字の文字種 2: カタカナ それ以外: ひらがな
[0x92] 添え字/欧文文字: 1:欧文文字 それ以外 添え字数字
===============================================
禁則/揃え
[0xa9] 字詰め範囲 1: 行単位 それ以外:文書全体
[0xa8] 制御記号の扱い 0: 空白置き換え それ以外:詰める
[0x7c] 罫線位置ずれ 下位2ビットでマスク 0:半角詰め/制御記号 1:制御記号のみ 2: なし
[0xc9] 文字揃え 0:標準 1:下端[左端] 2:中央 3:上端[右端] それ以外:標準
[0x4a] 禁則処理 0:なし 1:Aランク 2:Bランク 3:Cランク それ以外:なし =>ここでarg_cに何かを入れている
[0xc6] ぶら下げ禁則文字(ぶら下げがあるとき) 0:送り出し それ以外:ぶら下げ
[0x7a] 英文禁則 0:なし 1:ワードラップ それ以外:ハイフネーション
[0x9f] 登録縮小文字 0:禁則、英文禁則指定無効 1:禁則、英文禁則指定有効
[0x7f] 禁則、英文均等 0:なし それ以外:あり
[0xa4] 行末行頭空白数 0:半角空白1個対象 それ以外:半角空白2個対象
===================================================
印刷形式
[0x41] 頁番号印刷 1:なし 2:頁 3:-頁- 4: 頁/総ページ数 それ以外:頁
[0x8f][0x90] word-be 総ページ数 0:文書のページ数に従う それ以外:itoaの結果
[0x42][0x43] signed word-be 番号初期値
[0x6e][0x6f] word-be 番号位置(左右) mm 印刷開始位置からの長さ
[0x70][0x71] word-be 番号位置(上下) mm 用紙下端からの長さ
[0x4b] 印刷形式 0:標準 1:袋とじ 2:中央空け それ以外:標準
[0x4d] ページ番号付け 0:一箇所 1: 2箇所(左右) 2: 2箇所(上下)
[0x6a][0x6b] word-be 右ページ開始位置(中央空けの場合) mm [0x48]==2と併せてみる
[0x66][0x67] word-be 右ページ開始位置(袋とじの場合) 桁数 [0x48]==2と併せてみる
[0x6c][0x6d] word-be ページ番号までの長さ(中央あけの場合) mm [0x48]==2と併せて見る
[0x68][0x69] word-be ページ番号までの長さ(袋とじの場合)桁数 [0x48]==2と併せて見る
[0xc7] 多段組印刷 0:なし 1:あり 1から9 が段数 1という値をとることはプログラム的には無い?
[0xc8] 段組印刷位置 桁
======================================================
印刷情報
[0x44]