WmipGetSMBiosEventlog

NTSTATUS __stdcall WmipGetSMBiosEventlog(UINT8 *Buffer, UINT64 *BufferSize){
  NTSTATUS result; 
  unsigned __int8 *v5; 
  int v6; 
  __int128 *v7; 
  UINT64 v8; 
  int v9; 
  unsigned int v10; 
  UINT8 v11; 
  unsigned __int16 v12; 
  unsigned int v13; 
  UINT8 *v14; 
  __int128 v15; 
  VOID *v16; 
  VOID *v17; 
  VOID *StructPtr; 
  UINT64 MapSize; 
  VOID *MapPtr; 

  MapPtr = 0i64;
  StructPtr = 0i64;
  LODWORD(MapSize) = 0;
  result = WmipFindSMBiosStructure(0xFu, &StructPtr, &MapPtr, &MapSize);
  if( result < 0 )
    return result;
  v5 = (unsigned __int8 *)StructPtr;
  v6 = *((unsigned __int8 *)StructPtr + 1);
  v7 = (__int128 *)((char *)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( MapPtr )
        MmUnmapIoSpace(MapPtr, (unsigned int)MapSize);
      ExReleaseResourceLite((PERESOURCE)&ExBootDevicesRemovedEvent + 32);
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      return -1073741823;
    }
  }
  v13 = v12 + v8 + 23;
  if( *(_DWORD *)BufferSize < v13 )
  {
    if( MapPtr )
      MmUnmapIoSpace(MapPtr, (unsigned int)MapSize);
    ExReleaseResourceLite((PERESOURCE)&ExBootDevicesRemovedEvent + 32);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    result = -1073741789;
  }
  else
  {
    Buffer[3] = 0;
    v14 = &Buffer[v12 + 23];
    *(_WORD *)Buffer = v12;
    Buffer[2] = v11;
    if( v11 == 1 )
    {
      memmove(Buffer + 4, v7, v5[1] - 4);
    }
    else
    {
      v15 = *v7;
      *((_WORD *)Buffer + 10) = 0;
      *(_OWORD *)(Buffer + 4) = v15;
      Buffer[22] = 0;
    }
    if( MapPtr )
      MmUnmapIoSpace(MapPtr, (unsigned int)MapSize);
    ExReleaseResourceLite((PERESOURCE)&ExBootDevicesRemovedEvent + 32);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    if( v9
      && v9 != 1
      && v9 != 2
      && v9 == 3
      && (MapSize = v10, v16 = MmMapIoSpaceEx((_LARGE_INTEGER)v10, v8, 4ui64), v17 = v16, v14)
      && v16 )
    {
      memmove(v14, v16, v8);
      MmUnmapIoSpace(v17, v8);
      result = 0;
    }
    else
    {
      result = -1073741823;
    }
  }
  *(_DWORD *)BufferSize = v13;
  return result;
}

Referenced by:

WmipQueryWmiDataBlock