работа с указателем на буфер, заполненный обычным текстом utf 16 - PullRequest
0 голосов
/ 03 июля 2019

возникли проблемы при работе над проектом c ++.я получил функцию из фреймворка, которая заполняет «буфер памяти либо нулевым символом UTF-16 с нулевым символом в конце, либо HTML-кодом ASCII с нулевым символом в конце и возвращает указатель на него» (информация из документации).

Я не очень знаком с темой указателя, поэтому я попытался сделать что-то вроде этого:

WCHAR* pointerToMetaData[1024] = (WCHAR[]*) XWF_GetMetadataEx(hItem, 0);
currentFile.metaData = *pointerToMetaData;

Я знаю, что возвращаемое значение является LPVOID, поэтому я должен преобразовать возвращаемое значение в правильный тип данных ...но, к сожалению, это работает не совсем хорошо ...

может быть, какой-то более уверенный пользователь мог бы помочь мне решить эту проблему?!

1 Ответ

0 голосов
/ 05 июля 2019

XWF_GetMetadataEx() возвращает LPVOID (он же void*), поскольку он может возвращать один из двух разных форматов данных: простой текст UTF-16 (обрабатывается с помощью wchar_t*) или HTML ASCII (обрабатывается с помощью char*) , Согласно документации для XWF_GetMetadataEx():

LPVOID XWF_GetMetadataEx(
  HANDLE hItem,
  PDWORD lpnFlags
);    

Доступно в версии 18.9 и новее. Может извлекать обширные внутренние метаданные файлов различных типов, точно так же, как в режиме «Подробности» в X-Ways Forensics, как правило, гораздо больше, чем GetMetadata. Заполняет буфер памяти либо открытым текстом UTF-16 с нулевым символом в конце, либо HTML-кодом ASCII с нулевым символом в конце и возвращает указатель на него. Вы можете проанализировать буфер для получения определенных метаданных, которые вам нужны. Формат может теоретически измениться с одной версии на другую. Вы должны освободить выделенную память, передав этот указатель в XWF_ReleaseMem, когда он вам больше не нужен. Если метаданные не извлекаются, вместо этого возвращается NULL.

В отличие от XWF_GetMetadata, эта функция является поточно-ориентированной. В отличие от XWF_GetExtractedMetadata, файл должен быть открыт с помощью XWF_OpenItem, поскольку эта функция читает содержимое файла, а не данные, сохраненные в моментальном снимке тома. Метаданные берутся из самого файла, в котором они содержатся, например, в случае документов Office в формате zip из файлов XML.

lpnFlags указывает на флаги для ввода и вывода. Единственный в настоящее время определенный флаг ввода - 0x01. В нем говорится, что X-Ways Forensics извлекает только подмножество доступных метаданных, как показано в программном обеспечении в столбце Метаданные. Результирующий буфер в настоящее время всегда содержит обычный текст UTF-16. Если флаг не установлен, извлекаются полные метаданные, отображаемые в режиме «Подробности». Полученный буфер может иметь любой из вышеупомянутых форматов.

Единственный в настоящее время определенный выходной флаг - 0x01 (указывающий, если установлен, что результирующий буфер имеет формат ASCII в формате HTML вместо обычного текста UTF-16). Если какой-либо из 8 старших битов установлен, вы не должны касаться результирующего буфера, просто отпустите его с помощью XWF_ReleaseMem. Выходные флаги действительны, только если функция была успешной, то есть если она вернула указатель.

Итак, вам нужно либо:

  1. явно запрашивают желаемый формат вывода и приводят к этому конкретному типу:

    DWORD flags = 1; // <-- want UTF-16 only
    wchar_t *Utf16PlainTextMetaData = (wchar_t*) XWF_GetMetadataEx(hItem, &flags);
    if (Utf16PlainTextMetaData)
    {
        if ((flags & 0xFF000000) == 0) // is the buffer usable?
        {
            // use Utf16PlainTextMetaData as needed...
        }
    
        XWF_ReleaseMem(Utf16PlainTextMetaData);
    }
    
  2. определить, какой формат выводится, и затем преобразовать его соответствующим образом:

    DWORD flags = 0; // <-- want either format
    LPVOID pointerToMetaData = XWF_GetMetadataEx(hItem, &flags);
    if (pointerToMetaData)
    {
        if ((flags & 0xFF000000) == 0) // is the buffer usable?
        {
            if (flags & 1)
            {
                char *HtmlAsciiMetaData = (char*) pointerToMetaData;
                // use HtmlAsciiMetaData as needed...
            }
            else
            {
                wchar_t *Utf16PlainTextMetaData = (wchar_t*) pointerToMetaData;
                // use Utf16PlainTextMetaData as needed...
            }
        }
    
        XWF_ReleaseMem(pointerToMetaData);
    }
    
...