Проблемы с анализом составного документа Microsoft - PullRequest
0 голосов
/ 12 сентября 2010

Я немного борюсь с составным форматом документов.

Я сейчас работаю в C, но у меня проблемы с поиском сектора каталогов. Я могу получить составной заголовок документа, который является тривиальным, и я знаю формулу для нахождения смещения файла с идентификатором сектора (secid + 1 << sec_size), но всякий раз, когда я использую эту формулу для преобразования secid в fileoffset для каталога I получить случайные значения.

Может ли кто-нибудь помочь мне понять, как правильно разрешить смещения secid и, возможно, также как разработать цепочки secid из таблицы распределения секторов в составном документе?

Вот пример того, что я пробовал:

  comp_doc_header* cdh((comp_doc_header*)buffer);
  printf("cdoc header:%d\n", sizeof(cd_dir_entry));
  if(cdh->rev_num == 0x003E)printf("rev match\n");
  //check magic number
  if(cdh->comp_doc_id[0] != (unsigned char)0xD0 ||
     cdh->comp_doc_id[1] != (unsigned char)0xCF ||
     cdh->comp_doc_id[2] != (unsigned char)0x11 ||
     cdh->comp_doc_id[3] != (unsigned char)0xE0 ||
     cdh->comp_doc_id[4] != (unsigned char)0xA1 ||
     cdh->comp_doc_id[5] != (unsigned char)0xB1 ||
     cdh->comp_doc_id[6] != (unsigned char)0x1A ||
     cdh->comp_doc_id[7] != (unsigned char)0xE1)
    return 0;

  buffer += 512;

  //here i try and get the first directory entry
  cd_dir_entry* cde((cd_dir_entry*)&buffer[(cdh->first_sector_id + 1) << 512]);

<ч /> РЕДАКТИРОВАТЬ: (secid + 1) * 512 должно быть (secid + 1) * sec_size

1 Ответ

0 голосов
/ 12 сентября 2010

Это C?Я не могу разобрать ваши первые или последние опубликованные строки

cd_dir_entry* cde((cd_dir_entry*)&buffer[(cdh->first_sector_id + 1) << 512]);

Похоже, вы объявляете cde как функцию, которая возвращает указатель на cd_dir_entry;но прототип параметра неверен ... поэтому вы вызываете функцию и умножаете результат на cd_dir_entry и сразу же игнорируете результат умножения.


Edit

Мое упрощение пытается понять линию

cd_dir_entry* cde(<cast>&buffer[(cdh->first_sector_id + 1) << 512]);
cd_dir_entry* cde(<cast>&buffer[<elem>]);
cd_dir_entry* cde(<parameter>);
/* this is either a function prototype */
/* or a multiplication with `cd_dir_entry` and the value returned from cde() */
/* in either case it does nothing (no side-effects present), */
/* unless cde messes with global variables */
...