EtwpRealtimeRestoreBuffer
NTSTATUS __stdcall EtwpRealtimeRestoreBuffer(_WMI_LOGGER_CONTEXT *LoggerContext, _WMI_BUFFER_HEADER *Buffer){
_LARGE_INTEGER *ByteOffset;
LONGLONG QuadPart;
NTSTATUS result;
unsigned int BufferSize;
unsigned int v8;
bool v9;
__int64 Length;
__int64 v11;
_IO_STATUS_BLOCK IoStatusBlock;
ByteOffset = &LoggerContext->RealtimeReadOffset;
QuadPart = LoggerContext->RealtimeReadOffset.QuadPart + 72;
IoStatusBlock = 0i64;
if( QuadPart > LoggerContext->RealtimeLogfileSize.QuadPart )
return -1073741566;
result = ZwReadFile(
(_HANDLE)LoggerContext->RealtimeLogfileHandle,
0,
0i64,
0i64,
&IoStatusBlock,
Buffer,
0x48u,
ByteOffset,
0i64);
if( result < 0 )
return result;
if( IoStatusBlock.Status < 0 )
return IoStatusBlock.Status;
if( IoStatusBlock.Information != 72 )
return -1073741807;
BufferSize = LoggerContext->BufferSize;
if( *(_DWORD *)Buffer != BufferSize )
return -1073741566;
v8 = *((_DWORD *)Buffer + 12);
if( v8 < 0x48 || v8 > BufferSize )
return -1073741566;
*((_WORD *)Buffer + 26) |= 0x10u;
ByteOffset->QuadPart = QuadPart;
v9 = v8 == 72;
Length = v8 - 72;
if( !v9 )
{
v11 = (unsigned int)Length;
if( Length + QuadPart <= LoggerContext->RealtimeLogfileSize.QuadPart )
{
result = ZwReadFile(
(_HANDLE)LoggerContext->RealtimeLogfileHandle,
0,
0i64,
0i64,
&IoStatusBlock,
(char *)Buffer + 72,
Length,
ByteOffset,
0i64);
if( result >= 0 )
{
result = IoStatusBlock.Status;
if( IoStatusBlock.Status >= 0 && IoStatusBlock.Information != v11 )
result = -1073741807;
}
ByteOffset->QuadPart += v11;
QuadPart = ByteOffset->QuadPart;
goto LABEL_15;
}
return -1073741566;
}
LABEL_15:
if( QuadPart >= LoggerContext->RealtimeLogfileSize.QuadPart )
ByteOffset->QuadPart = 72i64;
return result;
}Referenced by:
EtwpRealtimeFlushSavedBuffers