Внутренний формат документов MS WORD
Страница 3. Низкоуровневый доступ к STRUCTURED STORAGE


 

3. Низкоуровневый доступ к STRUCTURED STORAGE

  Вокруг разобранной автомашины моментально собралась толпа коротышек. Каждому было интересно взглянуть на устройство механизма.

Н. Носов. Незнайка в Солнечном городе

Широко известен народный персонаж по имени Чукча, который служил "писателем" и по этой причине не считал для себя нужным учиться читать. Наверное, имеются автомобилисты, которые никогда не заглядывали под капот своего четырехколесного друга. Не исключено, что существуют нежно любящие друг друга супруги, которые ни разу в жизни... гм... надеюсь, мы к их числу не относимся?

Давайте же приоткроем "кошмарную тайну кровавой фирмы Microsoft": посмотрим на составной файл невооруженными глазками и пощупаем его голыми ручками. Впрочем, "программисты", которые умеют только кликать по иконкам и таскать мышом картинки между окошкам, могут этот раздел с чистой совестью пропустить.

Составной файл состоит из целого числа "больших блоков" (big blocks), размер каждого из которых соответствует одному дисковому сектору, т.е. 512 байт. Поэтому, в отличие от англоязычной документации, мы будем называть их просто секторами. Все сектора в файле пронумерованы следующим образом: -1, 0, 1, 2... и т.д.

Сектор с номером -1 содержит заголовок составного файла:

struct DOC_FILE_HEADER
{
DWORD Сигнатура; // +00h - "магическое" число E011CFD0h
DWORD КодВерсииOLE; // +04h - "магическое" число E11AB1A2h
DWORD НеИспользуется1[9];
DWORD РазмерBBD; // +2Ch - количество секторов в BBD
DWORD НачалоКаталога; // +30h - стартовый сектор каталога
DWORD НеИспользуется2[2];
DWORD НачалоSBD; // +3Сh - стартовый сектор SBD
DWORD РазмерСектора; // +40h - обычно имеет значение 1
DWORD НеИспользуется3[2];
DWORD НачалоBBD; // +4Ch - стартовый сектор BBD
};

Примечание. Есть предположние, что по смещению 40h располагается поле, описывающее размер сектора. В подавляющем большинстве DOC-файлов длиной до 1 Мб в этом поле содержится значение 1 (т.е. размер сектора равен 512), но изредка встречается 2 (т.е. размер сектора равен 1024). Вероятно, возможны 3, 4, и так далее. В этом случае лучше говорить не о "секторах", но о "кластерах". Но идеология организации составного файла от этого не меняется.

Теперь очень легко проверить, организован ли какой-нибудь файл по правилам структурированного хранилища: достаточно проверить его первые 4 байта. Они должны быть: 0D0h, 0CFh, 11h, E0h.

Все остальное, не занятое заголовком, пространство составного файла разбито на четыре (не обязательно непрерывных!) области:

  • область каталогов;
  • FAT данных, организованных в виде 512-байтовых больших блоков (в оригинале это BBD - big blocks depot);
  • FAT даных, организованных в виде 64-байтовых малых блоков (в оригинале это SBD - small blocks depot);
  • область собственно данных.

 

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