WmipGetSMBiosEventlog

INT64 __fastcall WmipGetSMBiosEventlog(UINT8 *Buffer, UINT64 *BufferSize){
  INT64 result; 
  unsigned __int8 *v5; 
  int v6; 
  UINT8 *v7; 
  UINT64 v8; 
  int v9; 
  unsigned int v10; 
  UINT8 v11; 
  unsigned __int16 v12; 
  unsigned int v13; 
  UINT8 *v14; 
  __int128 v15; 
  UINT8 *v16; 
  UINT8 *v17; 
  VOID *StructPtr; 
  SIZE_T NumberOfBytes; 
  PVOID BaseAddress; 
  BaseAddress = 0i64;
  StructPtr = 0i64;
  LODWORD(NumberOfBytes) = 0;
  result = WmipFindSMBiosStructure(0xFu, &StructPtr, &BaseAddress, &NumberOfBytes);
  if( (int)result < 0 )
    return result;
  v5 = (unsigned __int8 *)StructPtr;
  v6 = *((unsigned __int8 *)StructPtr + 1);
  v7 = (UINT8 *)StructPtr + 4;
  v8 = *((unsigned __int16 *)StructPtr + 2);
  v9 = *((unsigned __int8 *)StructPtr + 10);
  v10 = *((_DWORD *)StructPtr + 4);
  if( (unsigned __int8)v6 < 0x17u )
  {
    v12 = 0;
    v11 = 0;
  }
  else
  {
    v11 = 1;
    v12 = *((unsigned __int8 *)StructPtr + 21) * *((unsigned __int8 *)StructPtr + 22);
    if( v6 != v12 + 23 )
    {
      if( BaseAddress )
        MmUnmapIoSpace(BaseAddress, (unsigned int)NumberOfBytes);
      ExReleaseResourceLite(&WmipSMBiosLock);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      return 3221225473i64;
    }
  }
  v13 = v12 + v8 + 23;
  if( *(_DWORD *)BufferSize < v13 )
  {
    if( BaseAddress )
      MmUnmapIoSpace(BaseAddress, (unsigned int)NumberOfBytes);
    ExReleaseResourceLite(&WmipSMBiosLock);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    result = 3221225507i64;
  }
  else
  {
    Buffer[3] = 0;
    v14 = &Buffer[v12 + 23];
    *(_WORD *)Buffer = v12;
    Buffer[2] = v11;
    if( v11 == 1 )
    {
      memmove(Buffer + 4, v7, v5[1] - 4i64);
    }
    else
    {
      v15 = *(_OWORD *)v7;
      *((_WORD *)Buffer + 10) = 0;
      *(_OWORD *)(Buffer + 4) = v15;
      Buffer[22] = 0;
    }
    if( BaseAddress )
      MmUnmapIoSpace(BaseAddress, (unsigned int)NumberOfBytes);
    ExReleaseResourceLite(&WmipSMBiosLock);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    if( v9
      && v9 != 1
      && v9 != 2
      && v9 == 3
      && (NumberOfBytes = v10, MmMapIoSpaceEx((_LARGE_INTEGER)v10, v8, 4ui64), v17 = v16, v14)
      && v16 )
    {
      memmove(v14, v16, v8);
      MmUnmapIoSpace(v17, v8);
      result = 0i64;
    }
    else
    {
      result = 3221225473i64;
    }
  }
  *(_DWORD *)BufferSize = v13;
  return result;
}

Referenced by:

WmipQueryWmiDataBlock