Примечание : в ответе я буду предполагать, что у вас есть указатель на эту структуру, подобную этой:
EVENTLOGRECORD * elr;
чтобы сократить фрагменты кода.
Так может кто-нибудь объяснить, как определить длину "SourceName" из структуры EVENTLOGRECORD
Нет поля, которое бы указывало, как долго это будет, но вы можете определить его довольно легко: это первое поле записи после хорошо определенных полей, поэтому вы можете просто сделать:
WCHAR * SourceName=(WCHAR *)((unsigned char *)elr + sizeof(*elr));
Теперь, в SourceName
у вас есть указатель на эту строку; Вы можете легко определить его длину с помощью обычных строковых функций.
Кстати, после терминатора SourceName
должна быть строка ComputerName
.
и объясни, что такое StringLength
Там нет StringLength
участника, о чем ты говоришь?
DataLength и DataOffset - это?
Журнал событий также состоит из произвольных двоичных данных, включенных в запись.
Элемент DataOffset
указывает смещение таких данных от начала записи, а DataLength
указывает, как долго эти данные. Если бы вы скопировали эти данные в буфер (при условии, что он достаточно большой), вы бы сделали:
memcpy(targetBuffer,(unsigned char *)elr + elr->DataOffset,elr->DataLength);
<ч />
Кстати, вместо того, чтобы читать непосредственно включаемые файлы, вы должны прочитать документацию , это гораздо легче понять.
<ч />
Приложение о StringOffset
Поле StringOffset
указывает смещение строк, связанных с событием, с начала записи.
Поле StringOffset
работает очень похоже на поле DataOffset
, описанное выше, но нет соответствующего поля StringLength
, поскольку длину каждой строки можно легко определить с помощью обычных строковых функций (на самом деле строковый раздел просто состоит из нескольких NUL
определенных строк, расположенных одна за другой).
Кроме того, место, где заканчивается секция строк, может быть легко определено с помощью элемента DataOffset
, в действительности секция строк заканчивается там, где начинается блок данных. Структура EVENTLOGRECORD
также предоставляет поле NumStrings
для определения количества строк, содержащихся в разделе строк (спасибо Реми Лебо).
Если бы вы поместили эти строки в vector<wstring>
, вы бы сделали что-то вроде этого (осторожный, непроверенный код):
vector<wstring> strings;
for(
wchar_t * ptr=(wchar_t *)((unsigned char *)elr + elr->StringOffset);
strings.size()<elr->NumStrings;
ptr+=strings.back().length() + 1
)
strings.push_back(wstring(ptr));