WmipParseSysIdTable

NTSTATUS __stdcall WmipParseSysIdTable(
        _LARGE_INTEGER PhysicalAddress,
        UINT64 NumberEntries,
        _SYSID_UUID *SysIdUuid,
        UINT64 *SysIdUuidCount,
        _SYSID_1394 *SysId1394,
        UINT64 *SysId1394Count){
  unsigned int v6; 
  int v8; 
  char *v10; 
  unsigned int v11; 
  unsigned int v12; 
  NTSTATUS v13; 
  unsigned int v14; 
  char *v16; 
  unsigned int v17; 
  __int64 v18; 
  int v19; 
  char v20; 
  _BYTE *v21; 
  __int64 v22; 
  unsigned int v24; 
  unsigned int v25; 
  int v26; 
  char *v27; 
  UINT64 NumberOfBytes; 
  unsigned int v29; 

  v29 = NumberEntries;
  v6 = 25 * NumberEntries;
  v8 = NumberEntries;
  NumberOfBytes = (unsigned int)(25 * NumberEntries);
  v10 = (char *)MmMapIoSpaceEx(PhysicalAddress, NumberOfBytes, 4ui64);
  v27 = v10;
  if( !v10 )
    return -1073741670;
  v11 = *(_DWORD *)SysIdUuidCount;
  v12 = 0;
  v13 = 0;
  v26 = 0;
  v14 = 0;
  v16 = v10;
  v24 = v11;
  v17 = *(_DWORD *)SysId1394Count;
  v25 = *(_DWORD *)SysId1394Count;
  if( v8 )
  {
    while( v6 >= 0xA )
    {
      v18 = *(unsigned __int16 *)(v16 + 7);
      if( RtlCompareMemory(v16, "_UUID_", 6) == (_SIZE_T *)6 && (_DWORD)v18 == 25 )
      {
        v19 = 1;
      }
      else
      {
        if( RtlCompareMemory(v16, "_1394_", 6) != (_SIZE_T *)6 || (_DWORD)v18 != 17 )
        {
LABEL_25:
          v11 = v24;
          break;
        }
        v19 = 2;
      }
      if( v6 < (unsigned int)v18 )
        goto LABEL_25;
      v20 = 0;
      v21 = v16;
      v22 = v18;
      do
      {
        v20 += *v21++;
        --v22;
      }
      while( v22 );
      if( v20 )
        goto LABEL_25;
      if( v19 == 1 )
      {
        v11 = v24;
        if( v6 < 0x19 )
          break;
        ++v12;
        if( SysIdUuid && v24 >= v12 )
          *SysIdUuid++ = *(_SYSID_UUID *)(v16 + 9);
      }
      else
      {
        if( v6 < 0x11 )
          goto LABEL_25;
        v11 = v24;
        ++v14;
        if( SysId1394 && v25 >= v14 )
          *SysId1394++ = *(_SYSID_1394 *)(v16 + 9);
      }
      v16 += v18;
      v6 -= v18;
      if( ++v26 >= v29 )
        goto LABEL_27;
    }
    v13 = -1073741823;
LABEL_27:
    v10 = v27;
    v17 = v25;
  }
  *(_DWORD *)SysIdUuidCount = v12;
  *(_DWORD *)SysId1394Count = v14;
  if( SysIdUuid && v11 < v12 || SysId1394 && v17 < v14 )
    v13 = -1073741789;
  MmUnmapIoSpace(v10, NumberOfBytes);
  return v13;
}

Referenced by:

WmipGetSysIds