Внутренний формат документов MS WORD
Страница 8. Заключение


 

 

Заключение

  В этой статье для меня все ясно, за исключением упоминаний о сепульках, трансме и хмепе. Увы, последний вышедший в свет том энциклопедии кончался статьей "Соус грибной", значит, ни о трансме, ни о хмепе ничего нет.

С. Лем. Звездные дневники Ийона Тихого. Путешествие четырандцатое.

Конечно, в статье рассмотрено далеко не все, что хотелось бы. И не всему вышенаписанному стоит беспрекословно доверять: например, весьма вероятно, что в случае огромных DOC-файлов структурированное хранилище может быть образовано из "секторов" с размерами большими, чем 512 байтов. Но теперь любознательный читатель может не только проверить информацию, но и продолжить собственные иследования двоичного формата документов WinWord.

Кому-то может показаться излишним приведенное выше подробное описание формата структурированных хранилищ. Но мне, например, оно сильно пригодилась, когда необходимо было вытаскивать текст из DOC-файлов, записанных на поцарапанную дискету. Функции OLE2 API в этой ситуации просто отказывались работать.

Кроме того, знание подробностей организации этого формата позволяет существенно ускорить работу с составным файлом: можно, например, напрямую искать в файле заголовочные сигнатуры отдельных компонентов (главного потока, вирусных макросов и т.п.) по смещениям, кратным 512.

Возможны и иные применения для информации, приведенной в этой статье. Желаю успехов!

Дополнение от зимы 2004 года

После обнародования предыдущей версии этой статьи мне пришлось выслушать немало критики за ее неполноту, наличие многочисленых неточностей, и даже за то, что я дерзнул написать ее поперед тех "батьков", кто знает на эту тему гораздо больше, но шибко дорожит своей монополией на информацию. J

К счастью, большинство читателей восприняли ту статью благожелательно. А правильней всех поступил С. Новодворский, который очень удачно углубил рассмотренную тему в своей собственной статье "Доступ к MD-файлам при помощи VBA", попутно исправив самые крупные мои неточности и дописав иллюстрирующий софт. Спасибо, Сергей, и так держать!

Итак, самая крупная неточность в моей статье касалась формата заголовка структурированного хранилища. Часть полей я тогда намеренно не описал (посчитав не важными), одно поле описал ошибочно, а о назначении некоторых полей в то время лишь смутно догадывался. Теперь я имею возможность привести новый, уточненный формат заголовка структурированного хранилища:

struct DOC_FILE_HEADER
{
DWORD Сигнатура; // +00h - "магическое" число E011CFD0h
DWORD КодВерсииOLE; // +04h - "магическое" число E11AB1A2h
DWORD НеИспользуется; // +08h
WORD НеИспользуется; // +0Ch
WORD РазмерСектора; // +0Eh - Log2(512)=9 (new!)
DWORD НеИспользуется; // +10h
DWORD НеИспользуется; // +14h
WORD НомерРевизии; // +18h - ? (new!)
WORD НомерВерсии; // +1Ah - ? (new!)
DWORD НеИспользуется; // +1Ch
DWORD НеИспользуется; // +20h
DWORD НеИспользуется; // +24h
DWORD НеИспользуется; // +28h
DWORD РазмерBBD; // +2Сh - количество секторов в BBD
DWORD НачалоКаталога; // +30h - стартовый сектор каталога
DWORD НеИспользуется; // +34h
DWORD НеИспользуется; // +38h
DWORD НачалоSBD; // +3Сh - стартовый сектор SBD
DWORD ПродолжениеSBD; // +40h - ? (new!)
DWORD ОкончаниеBBD; // +44h - стартовый сектор окончания BBD (new!)
DWORD НеИспользуется; // +48h
DWORD НачалоBBD; // +4Сh - стартовый сектор BBD
DWORD ПродолжениеBBD[108];// +50h - адреса секторов продолжения BBD (new!)
};

Комментарии.

  1. Знаком "?" помечены поля, в назначении которых я не уверен.
  2. С адреса 50h начинается массив DWORD-ов, каждый из которых непосредственно адресует очередной сектор FAT больших блоков. Поля по смещениям 40h и 50h дают возможность иметь длинные FAT.
  3. Говорят, что MS Word, начиная с версии 2000 умеет ЧИТАТЬ документы с секторами длиной >512 (например, 4096), но все равно не умеет их СОЗДАВАТЬ.
  4. Убедитесь, насколько все у Microsoft запущено! J

Не исключено, что и это еще не конец...

 
« Предыдущая статья   Следующая статья »