Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 905 of file file.c.
Referenced by ElfrReportEventW(), LogfReportEvent(), and ProcessPortMessage().
{ DWORD dwWritten; DWORD dwRead; SYSTEMTIME st; EVENTLOGEOF EofRec; PEVENTLOGRECORD RecBuf; LARGE_INTEGER logFileSize; ULONG RecOffSet; ULONG WriteOffSet; if (!Buffer) return FALSE; GetSystemTime(&st); SystemTimeToEventTime(&st, &((PEVENTLOGRECORD) Buffer)->TimeWritten); RtlAcquireResourceExclusive(&LogFile->Lock, TRUE); if (!GetFileSizeEx(LogFile->hFile, &logFileSize)) { RtlReleaseResource(&LogFile->Lock); return FALSE; } /* If the size of the file is over MaxSize */ if ((logFileSize.QuadPart + BufSize)> LogFile->Header.MaxSize) { ULONG OverWriteLength = 0; WriteOffSet = LogfOffsetByNumber(LogFile, LogFile->Header.OldestRecordNumber); RecBuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(EVENTLOGRECORD)); /* Determine how many records need to be overwritten */ while (TRUE) { DPRINT("EventLogFile has reached maximume size\n"); if (!RecBuf) { DPRINT1("Failed to allocate buffer for OldestRecord!\n"); HeapFree(GetProcessHeap(), 0, RecBuf); RtlReleaseResource(&LogFile->Lock); return FALSE; } /* Get the oldest record data */ RecOffSet = LogfOffsetByNumber(LogFile, LogFile->Header.OldestRecordNumber); if (SetFilePointer(LogFile->hFile, RecOffSet, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { DPRINT1("SetFilePointer() failed! %d\n", GetLastError()); HeapFree(GetProcessHeap(), 0, RecBuf); RtlReleaseResource(&LogFile->Lock); return FALSE; } if (!ReadFile(LogFile->hFile, RecBuf, sizeof(EVENTLOGRECORD), &dwRead, NULL)) { DPRINT1("ReadFile() failed!\n"); HeapFree(GetProcessHeap(), 0, RecBuf); RtlReleaseResource(&LogFile->Lock); return FALSE; } if (RecBuf->Reserved != LOGFILE_SIGNATURE) { DPRINT1("LogFile corrupt!\n"); RtlReleaseResource(&LogFile->Lock); return FALSE; } LogfDeleteOffsetInformation(LogFile,LogFile->Header.OldestRecordNumber); LogFile->Header.OldestRecordNumber++; OverWriteLength += RecBuf->Length; /* Check the size of the record as the record adding may be larger */ if (OverWriteLength >= BufSize) { DPRINT("Record will fit. Lenght %d, BufSize %d\n", OverWriteLength, BufSize); LogFile->Header.StartOffset = LogfOffsetByNumber(LogFile, LogFile->Header.OldestRecordNumber); break; } } HeapFree(GetProcessHeap(), 0, RecBuf); } else WriteOffSet = LogFile->Header.EndOffset; if (SetFilePointer(LogFile->hFile, WriteOffSet, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { DPRINT1("SetFilePointer() failed! %d\n", GetLastError()); RtlReleaseResource(&LogFile->Lock); return FALSE; } if (!WriteFile(LogFile->hFile, Buffer, BufSize, &dwWritten, NULL)) { DPRINT1("WriteFile() failed! %d\n", GetLastError()); RtlReleaseResource(&LogFile->Lock); return FALSE; } if (!LogfAddOffsetInformation(LogFile, LogFile->Header.CurrentRecordNumber, WriteOffSet)) { RtlReleaseResource(&LogFile->Lock); return FALSE; } LogFile->Header.CurrentRecordNumber++; if (WriteOffSet == LogFile->Header.EndOffset) { LogFile->Header.EndOffset += dwWritten; } if (SetFilePointer(LogFile->hFile, LogFile->Header.EndOffset, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { DPRINT1("SetFilePointer() failed! %d\n", GetLastError()); RtlReleaseResource(&LogFile->Lock); return FALSE; } EofRec.Ones = 0x11111111; EofRec.Twos = 0x22222222; EofRec.Threes = 0x33333333; EofRec.Fours = 0x44444444; EofRec.RecordSizeBeginning = sizeof(EVENTLOGEOF); EofRec.RecordSizeEnd = sizeof(EVENTLOGEOF); EofRec.CurrentRecordNumber = LogFile->Header.CurrentRecordNumber; EofRec.OldestRecordNumber = LogFile->Header.OldestRecordNumber; EofRec.BeginRecord = LogFile->Header.StartOffset; EofRec.EndRecord = LogFile->Header.EndOffset; if (!WriteFile(LogFile->hFile, &EofRec, sizeof(EVENTLOGEOF), &dwWritten, NULL)) { DPRINT1("WriteFile() failed! %d\n", GetLastError()); RtlReleaseResource(&LogFile->Lock); return FALSE; } if (SetFilePointer(LogFile->hFile, 0, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { DPRINT1("SetFilePointer() failed! %d\n", GetLastError()); RtlReleaseResource(&LogFile->Lock); return FALSE; } if (!WriteFile(LogFile->hFile, &LogFile->Header, sizeof(EVENTLOGHEADER), &dwWritten, NULL)) { DPRINT1("WriteFile failed! LastError = %d\n", GetLastError()); RtlReleaseResource(&LogFile->Lock); return FALSE; } if (!FlushFileBuffers(LogFile->hFile)) { DPRINT1("FlushFileBuffers() failed! %d\n", GetLastError()); RtlReleaseResource(&LogFile->Lock); return FALSE; } RtlReleaseResource(&LogFile->Lock); return TRUE; }