Как сохранить DateTime в EventSource через WriteEventCore

Это мой текущий код:

[NonEvent]
    unsafe void InsertViaWriteEventCore(
        int eventId,
        DateTime startDateTime,
        DateTime endDateTime)
    {
        const int eventDataCount = 2;
        {
            EventData* data = stackalloc EventData[eventDataCount];
            data->DataPointer = (IntPtr)(&startDateTime);
            data->Size = sizeof(DateTime);
            data[1].DataPointer = (IntPtr)(&endDateTime);
            data[1].Size = sizeof(DateTime);

            WriteEventCore(eventId, eventDataCount, data);
        }
    }

Но, наконец, в генерируемых событиях я вижу "30.083617:00:00" как startDateTime, если я предоставляю startDateTime "30.08.2017 17:00:00" для метода. Это всегда добавляет 1600 к году.

Я попытался предоставить 8 как размер вместо sizeof(DateTime), и я все еще получил тот же результат. Я получаю правильные значения даты, если я изменю даты на строку и передам writeeventcore в виде строки, как показано в примере здесь. Что я здесь не так делаю? Как правильно передать DateTime через WriteEventCore?

1 ответ

Решение

Когда вы используете EventData, вы должны использовать то, что ETW ожидает для dateTime. Это происходит в формате Windows FileTime (это длинный, который является числом секунд от 1600)

Таким образом, чтобы передать DateTime в EventData, вы должны сделать что-то вроде этого.

long startFileTime = startDateTime.ToFileTime();
data->DataPointer = (IntPtr)(& startFileTime);
data->Size = sizeof(long);
Другие вопросы по тегам