WmipFindSMBiosStructure
INT64 __fastcall WmipFindSMBiosStructure(UINT8 Type, VOID **StructPtr, VOID **MapPtr, UINT64 *MapSize){
VOID **v6;
_ETHREAD *CurrentThread;
int v9;
VOID *v10;
_BYTE *v11;
_BYTE *v12;
_WORD *i;
int v15;
v6 = StructPtr;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
LOBYTE(StructPtr) = 1;
ExAcquireResourceSharedLite(&WmipSMBiosLock, (BOOL)StructPtr);
v9 = 0;
v15 = 0;
if( WmipSMBiosTablePhysicalAddress.QuadPart )
{
MmMapIoSpaceEx(WmipSMBiosTablePhysicalAddress, (unsigned int)WmipSMBiosTableLength, 4ui64);
*MapPtr = v10;
if( v10 )
{
*(_DWORD *)MapSize = WmipSMBiosTableLength;
v11 = *MapPtr;
goto LABEL_7;
}
v9 = -1073741670;
}
else
{
v9 = -1073741823;
}
v11 = 0i64;
v15 = v9;
LABEL_7:
if( v9 < 0 )
{
LABEL_20:
ExReleaseResourceLite(&WmipSMBiosLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return(unsigned int)v15;
}
*v6 = 0i64;
v12 = &v11[(unsigned int)WmipSMBiosTableLength];
v15 = -1073741823;
while( v11 < v12 )
{
if( *v11 == Type )
{
*v6 = v11;
v15 = 0;
break;
}
for( i = &v11[(unsigned __int8)v11[1]]; *i && i < (_WORD *)v12; i = (_WORD *)((char *)i + 1) )
;
v11 = i + 1;
}
if( v15 < 0 )
{
if( *MapPtr )
MmUnmapIoSpace(*MapPtr, *(unsigned int *)MapSize);
goto LABEL_20;
}
return(unsigned int)v15;
}Referenced by:
WmipGetSMBiosEventlog
WmipGetSysIds