PiIsDriverBlocked
VOID __fastcall PiIsDriverBlocked(VOID *SdbHandle, _UNICODE_STRING *FullPath, VOID *ImageBase, UINT64 ImageSize){
wchar_t *Buffer;
VOID *v6;
INT64 v8;
unsigned int DatabaseMatch;
unsigned int v10;
const WCHAR *v11;
char v12;
CHAR IsHVCIEnabled;
WORD *v14;
wchar_t *v15;
bool v16;
int cbBufferSize;
unsigned int cbBufferSize_4;
_UNICODE_STRING DestinationString;
UINT64 v20;
UINT64 dwDataType;
VOID *v22;
__int128 v23[2];
__int64 v24;
_OWORD *v25;
v24 = 0i64;
Buffer = FullPath->Buffer;
v6 = ImageBase;
v22 = ImageBase;
cbBufferSize = 0;
memset(v23, 0, sizeof(v23));
DatabaseMatch = SdbGetDatabaseMatch(SdbHandle, Buffer, ImageBase, ImageBase, (unsigned int)ImageSize);
if( !DatabaseMatch )
{
v10 = 0;
goto LABEL_3;
}
*(_QWORD *)&DestinationString.Length = 0i64;
LODWORD(dwDataType) = 4;
cbBufferSize_4 = 0;
v20 = 0x400000000i64;
if( SdbTagRefToTagID(SdbHandle, DatabaseMatch, (_DB **)&DestinationString, (UINT64 *)&cbBufferSize_4) )
{
if( !SdbQueryDataExTagID(
*(_DB **)&DestinationString.Length,
cbBufferSize_4,
v11,
&dwDataType,
&cbBufferSize,
(UINT64 *)((char *)&v20 + 4),
&v20) )
{
v10 = 0;
v12 = cbBufferSize;
if( (cbBufferSize & 0x10) != 0 )
{
IsHVCIEnabled = PiIsHVCIEnabled();
v12 = cbBufferSize;
if( IsHVCIEnabled )
v10 = -1073740949;
}
else if( (cbBufferSize & 4) == 0 || ExIsProcessorFeaturePresent(9ui64) )
{
v10 = ((v12 & 1) != 0) - 1073740949;
}
if( (v12 & 8) != 0 && HIDWORD(qword_140C50A2C) )
v10 = -1073740949;
goto LABEL_13;
}
}
else
{
AslLogCallPrintf(1ui64, (INT8 *)"SdbQueryDataEx", 0x162Dui64, (INT8 *)"Failed to convert tagref 0x%x to tagid");
}
v10 = -1073740949;
LABEL_13:
if( !(unsigned int)SdbReadEntryInformation(SdbHandle, DatabaseMatch, (__int64)v23)
&& (PiLoggedErrorEventsMask & 0x100) == 0 )
{
PiLoggedErrorEventsMask |= 0x100u;
DestinationString = 0i64;
RtlInitUnicodeString(&DestinationString, L"READ DRIVER ID FAILED");
PnpLogEvent((const VOID **)&DestinationString, 0i64, -1073740947, 0i64, 0);
}
v6 = v22;
LABEL_3:
if( v10 + 1073740949 <= 1 )
{
v14 = wcsrchr(FullPath->Buffer, 92);
if( v14 )
v15 = v14 + 1;
else
v15 = FullPath->Buffer;
DestinationString = 0i64;
RtlInitUnicodeString(&DestinationString, v15);
PnpLogEvent((const VOID **)&DestinationString, 0i64, v10, v23, 0x10u);
PnpTraceDriverBlocked((__int64)v15, (__int64)v23);
}
if( !v10 || v10 + 1073740949 <= 1 )
{
PiUpdateDriverDBCache(FullPath, v6, v8, (_GUID *)v10);
if( v10 + 1073740949 <= 1 && v25 )
{
v16 = (cbBufferSize & 0x10) == 0;
*v25 = v23[0];
if( !v16 )
PiNotifyCiDriverBlocked(v25, (const VOID **)FullPath);
}
}
}Referenced by:
PiLookupInDDB