Ограничения ReportEvent - PullRequest
       11

Ограничения ReportEvent

0 голосов
/ 09 октября 2018

Я пытаюсь записать подробное сообщение об ошибке в системный журнал, используя функцию ReportEventW.К сожалению, я сталкиваюсь с проблемами, которые, очевидно, связаны с ограничениями внутри функции, но я не могу найти какой-либо реальной документации по ним: есть задокументированное ограничение на dwDataSize и еще одно ограничение на максимальную длину каждой строки.Я не нарушаю ни одно из этих ограничений, но я все еще получаю отчеты FALSE и GetLastError RPC_S_INVALID_BOUND.

В ходе тестирования я обнаружил, что для моего тестового случая ограничение вызвано количеством строк (wNumStrings), при этом 203 является максимальным значением, которое я могу правильно передать (кроме того, для 204-206 строк ReportEventW вернет ИСТИНА, но не будет записывать в журнал! ).Если я добавлю 1024 фиктивных символа в первую строку, я снова получу ошибку, и мне придется уменьшить количество строк, насколько я могу судить, на то же количество символов, которые я добавил ранее, что будет означать, что какой-то общий символограничение на все сообщение идет в игру.К сожалению, я не могу сопоставить его с любым задокументированным пределом, даже если я игнорирую то, к чему должны применяться ограничения - мое значение около 33300 символов близко к значению 31839 символов (макс. Длина каждой строки), но достаточно выше, чем эточтобы заставить меня отказаться от теории, что ограничение на длину отдельной строки также применяется к общей длине всего сообщения.По-видимому, если я добавлю дополнительные необработанные данные, ограничение снова уменьшится, что предполагает ограничение на размер всей записи журнала событий.

Мои вопросы:

1) Кто-нибудь знаетфактические лимиты для записи в журнал событий?

2) Изменяются ли эти лимиты в разных операционных системах?Все мои тесты были выполнены на Win10 x64, но у меня есть неприятное подозрение, что с разными ОС я столкнусь с другим ограничением.

3) Это где-то задокументировано?

Спасибо.

Фактический код (добавляется по запросу)

procedure WriteToEventLog(const Messages: array of string; const RawData: AnsiString);
const
  MaxStringCount = High(Word); // je to WORD! Realne se limit zda byt mnohem mensi
  MaxRawDataLen = 61440;
  EmptyMessage = #0#0#0#0;
type
  TPCharArray = array[0..65535] of PChar;
var
  Handle: THandle;
  Msgs: ^TPCharArray;
  MsgCount: integer;
  DataPtr: PAnsiChar;
  DataLen: integer;
  i: Integer;
begin
  MsgCount := Length(Messages);
  if MsgCount > MaxStringCount then
    MsgCount := MaxStringCount;
  Msgs := AllocMem(MsgCount * Sizeof(PChar));
  try
    for i := 0 to Pred(MsgCount) do
    begin
      if Messages[i] = ''
        then Msgs[i] := EmptyMessage
        else Msgs[i] := PChar(Messages[i]);
    end;
    if RawData = '' then
    begin
      DataPtr := nil;
      DataLen := 0;
    end
    else
    begin
      DataPtr := @RawData[1];
      DataLen := Length(RawData);
      if DataLen > MaxRawDataLen then
        DataLen := MaxRawDataLen;
    end;
    Handle := RegisterEventSource(nil, PChar(ParamStr(0)));
    if Handle <> 0 then
    begin
      try
        ReportEvent(Handle, EVENTLOG_ERROR_TYPE, 0, 0, nil, MsgCount, DataLen, Msgs, DataPtr);
      finally
        DeregisterEventSource(Handle);
      end;
    end;
  finally
    FreeMem(Msgs);
  end;
end;

Вызывается с массивом Messages, содержащим строки из отчета EurekaLog (одна строка на сообщение, около 300 строк).

...