PiIsDriverBlocked
INT64 __stdcall PiIsDriverBlocked(
PVOID SdbHandle,
_UNICODE_STRING *FullPath,
PVOID ImageBase,
UINT64 ImageSize,
_GUID *EntryGuid){
wchar_t *Buffer;
PVOID v7;
INT64 v9;
unsigned int DatabaseMatch;
unsigned int v11;
INT64 v13;
char v14;
CHAR IsHVCIEnabled;
WCHAR *v16;
WCHAR v17;
wchar_t *v18;
bool v19;
UINT64 cbImageSize;
int v21;
int v22[5];
UINT64 v23;
INT64 v24;
PVOID v25;
GUID Guid;
__int128 v27;
__int64 v28;
v28 = 0i64;
Buffer = FullPath->Buffer;
v7 = ImageBase;
v25 = ImageBase;
v21 = 0;
Guid = 0i64;
v27 = 0i64;
DatabaseMatch = SdbGetDatabaseMatch(SdbHandle, Buffer, ImageBase, ImageBase, (unsigned int)ImageSize);
if( !DatabaseMatch )
{
v11 = 0;
goto LABEL_3;
}
*(_QWORD *)&v22[1] = 0i64;
LODWORD(v24) = 4;
v22[0] = 0;
v23 = 0x400000000i64;
if( (unsigned int)SdbTagRefToTagID((__int64)SdbHandle, DatabaseMatch, (PVOID **)&v22[1], v22) )
{
if( !(unsigned int)SdbQueryDataExTagID(
*(RTL_RUN_ONCE **)&v22[1],
(unsigned int)v22[0],
v13,
&v24,
&v21,
(UINT64 *)((char *)&v23 + 4),
&v23) )
{
v11 = 0;
v14 = v21;
if( (v21 & 0x10) != 0 )
{
IsHVCIEnabled = PiIsHVCIEnabled();
v14 = v21;
if( IsHVCIEnabled )
v11 = -1073740949;
}
else if( (v21 & 4) == 0 || ExIsProcessorFeaturePresent(9u) )
{
v11 = ((v14 & 1) != 0) - 1073740949;
}
if( (v14 & 8) != 0
&& (PnpSetupInProgress || PnpSetupOOBEInProgress
|| PnpSetupUpgradeInProgress
|| PnpSetupRollbackActiveInProgress) )
{
v11 = -1073740949;
}
goto LABEL_13;
}
}
else
{
LODWORD(cbImageSize) = DatabaseMatch;
AslLogCallPrintf(1ui64, "SdbQueryDataEx", 0x162Dui64, "Failed to convert tagref 0x%x to tagid", cbImageSize);
}
v11 = -1073740949;
LABEL_13:
if( !(unsigned int)SdbReadEntryInformation((__int64)SdbHandle, DatabaseMatch, (__int64)&Guid)
&& (PiLoggedErrorEventsMask & 0x100) == 0 )
{
PiLoggedErrorEventsMask |= 0x100u;
*(_OWORD *)&v22[1] = 0i64;
RtlInitUnicodeString((PUNICODE_STRING)&v22[1], L"READ DRIVER ID FAILED", v9);
LODWORD(cbImageSize) = 0;
PnpLogEvent((UNICODE_STRING *)&v22[1], 0i64, 3221226349i64, 0i64, cbImageSize);
}
v7 = v25;
LABEL_3:
if( v11 + 1073740949 <= 1 )
{
v16 = wcsrchr(FullPath->Buffer, 0x5Cu);
if( v16 )
v18 = v16 + 1;
else
v18 = FullPath->Buffer;
*(_OWORD *)&v22[1] = 0i64;
RtlInitUnicodeString((PUNICODE_STRING)&v22[1], v18, v17);
LODWORD(cbImageSize) = 16;
PnpLogEvent((UNICODE_STRING *)&v22[1], 0i64, v11, &Guid, cbImageSize);
PnpTraceDriverBlocked((INT64)v18, (INT64)&Guid);
}
if( !v11 || v11 + 1073740949 <= 1 )
{
PiUpdateDriverDBCache(FullPath, v7, v9, (GUID *)v11, &Guid);
if( v11 + 1073740949 <= 1 )
{
if( EntryGuid )
{
v19 = (v21 & 0x10) == 0;
*EntryGuid = Guid;
if( !v19 )
PiNotifyCiDriverBlocked(EntryGuid, (UINT8 **)FullPath);
}
}
}
return v11;
}Referenced by:
PiLookupInDDB