BcdEnumerateObjects
INT64 __fastcall BcdEnumerateObjects(__int64 a1, _DWORD *a2, GUID *a3, unsigned int *a4, unsigned int *a5){
unsigned int *v5;
GUID *v6;
UINT8 v8;
INT64 result;
WCHAR **v10;
int v11;
PVOID v12;
unsigned int v13;
int v14;
unsigned int v15;
__int64 v16;
WCHAR **v17;
int ObjectDescription;
unsigned __int64 v19;
UINT64 *v20;
unsigned __int64 v21;
unsigned int v22;
unsigned int v23;
unsigned int v24;
int v25;
WCHAR v26;
UINT64 v27;
UINT8 IsOfflineHandle;
char SubKeyCount[12];
WCHAR **SubKeyList;
UINT64 PackedObjectType;
PVOID Handle;
unsigned int v33;
struct _UNICODE_STRING DestinationString;
GUID *Guid;
Guid = a3;
PackedObjectType = 0i64;
v5 = a4;
v6 = a3;
memset(SubKeyCount, 0, sizeof(SubKeyCount));
DestinationString = 0i64;
if( !a3 && *a4 || !a5 || !*a2 )
return 3221225485i64;
IsOfflineHandle = BiIsOfflineHandle((_HHIVE *)a1, (UINT64)a2, (_UNICODE_STRING *)a3, (_UNICODE_STRING *)a4);
v8 = IsOfflineHandle;
result = BiAcquireBcdSyncMutant(IsOfflineHandle);
if( (int)result >= 0 )
{
Handle = 0i64;
SubKeyList = 0i64;
v10 = 0i64;
v11 = BiOpenKey((PVOID)a1, (WCHAR *)L"Objects", 0x20019ui64, &Handle);
v12 = Handle;
v13 = v11;
if( v11 >= 0 )
{
v14 = BiEnumerateSubKeys(Handle, &SubKeyList, (UINT64 *)SubKeyCount);
v10 = SubKeyList;
v13 = v14;
if( v14 >= 0 )
{
v15 = 0;
if( *(_DWORD *)SubKeyCount )
{
v16 = *(unsigned int *)SubKeyCount;
v17 = SubKeyList;
do
{
if( (int)BiOpenKey(v12, *v17, 0x20019ui64, (PVOID *)&SubKeyCount[4]) >= 0 )
{
ObjectDescription = BiGetObjectDescription(*(__int64 *)&SubKeyCount[4], &PackedObjectType);
BiCloseKey(*(PVOID *)&SubKeyCount[4]);
if( ObjectDescription >= 0 )
{
if( BiIsEnumerateMatch((unsigned int)a2[1], HIDWORD(PackedObjectType)) )
++v15;
}
}
++v17;
--v16;
}
while( v16 );
v5 = a4;
v6 = Guid;
}
v19 = 24i64 * v15;
if( v19 > 0xFFFFFFFF
|| (v20 = (UINT64 *)((char *)&v6->Data1 + (unsigned int)v19), v21 = 8i64 * v15, v21 > 0xFFFFFFFF)
|| (v22 = v21 + v19, LODWORD(SubKeyList) = v21 + v19, (int)v21 + (int)v19 < (unsigned int)v19) )
{
v13 = -1073741675;
}
else if( v22 <= *v5 )
{
v33 = 0;
v23 = 0;
if( *(_DWORD *)SubKeyCount )
{
v24 = v33;
do
{
if( v23 >= v15 )
break;
if( (int)BiOpenKey(Handle, v10[v24], 0x20019ui64, (PVOID *)&SubKeyCount[4]) >= 0 )
{
v25 = BiGetObjectDescription(*(__int64 *)&SubKeyCount[4], &PackedObjectType);
BiCloseKey(*(PVOID *)&SubKeyCount[4]);
if( v25 >= 0 )
{
if( BiIsEnumerateMatch((unsigned int)a2[1], HIDWORD(PackedObjectType)) )
{
RtlInitUnicodeString(&DestinationString, v10[v24], v26);
if( RtlGUIDFromString(&DestinationString, Guid) >= 0 )
{
v27 = PackedObjectType;
*(_QWORD *)&Guid[1].Data1 = v20;
*v20++ = v27;
++v23;
Guid = (GUID *)((char *)Guid + 24);
}
}
}
}
++v24;
}
while( v24 < *(_DWORD *)SubKeyCount );
v22 = (unsigned int)SubKeyList;
v5 = a4;
}
v13 = 0;
*v5 = v22;
*a5 = v23;
v12 = Handle;
}
else
{
v13 = -1073741789;
*v5 = v22;
*a5 = v15;
}
v8 = IsOfflineHandle;
}
}
if( v12 )
BiCloseKey(v12);
if( v10 )
ExFreePoolWithTag(v10, 0x4B444342u);
BiReleaseBcdSyncMutant(v8);
return v13;
}
return result;
}Referenced by:
SepSecureBootCorrectBcd