- •Лекция 8
- •Внутренний формат документов ms word Введение
- •1. Общее описание. Терминология
- •2. Доступ к structured storage через ole2 api
- •3. Низкоуровневый доступ к structured storage
- •3.1. Fat "Больших Блоков"
- •3.2. Fat "Малых Блоков"
- •3.3. Структура каталога
- •4. Структура документа ms word
- •Заключение
- •Дополнение от зимы 2004 года
Дополнение от зимы 2004 года
После обнародования предыдущей версии этой статьи мне пришлось выслушать немало критики за ее неполноту, наличие многочисленых неточностей, и даже за то, что я дерзнул написать ее поперед тех "батьков", кто знает на эту тему гораздо больше, но шибко дорожит своей монополией на информацию.
К счастью, большинство читателей восприняли ту статью благожелательно. А правильней всех поступил С. Новодворский, который очень удачно углубил рассмотренную тему в своей собственной статье "Доступ к 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!) };
|
Комментарии.
Знаком "?" помечены поля, в назначении которых я не уверен.
С адреса 50h начинается массив DWORD-ов, каждый из которых непосредственно адресует очередной сектор FAT больших блоков. Поля по смещениям 40h и 50h дают возможность иметь длинные FAT.
Говорят, что MS Word, начиная с версии 2000 умеет ЧИТАТЬдокументы с секторами длиной >512 (например, 4096), но все равно не умеет ихСОЗДАВАТЬ.
Убедитесь, насколько все у Microsoft запущено!