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