WbDecryptEncryptionSegment
NTSTATUS __stdcall WbDecryptEncryptionSegment(INT64 a1, wil_details_FeatureReportingCache *a2, UINT64 a3){
int InitializedEncryptionSegment;
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *v5;
_BYTE *v6;
wil_details_FeatureReportingCache *v7;
INT64 v8;
INT64 v9;
_BYTE *v10;
char v11;
INT64 v13;
v13 = 0i64;
if( (unsigned int)a3 < 0x10 )
{
InitializedEncryptionSegment = -1073741811;
}
else
{
InitializedEncryptionSegment = WbGetInitializedEncryptionSegment(a1, a2, a3, (INT64 **)&v13);
if( InitializedEncryptionSegment >= 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
v5 = (_EX_PUSH_LOCK *)(v13 + 8);
v6 = KeAbPreAcquire((VOID *)(v13 + 8), 0i64, 0i64);
v10 = v6;
if( _interlockedbittestandset64((volatile signed __int32 *)v5, 0i64) )
ExfAcquirePushLockExclusiveEx(v5, v6, v5);
if( v10 )
v10[26] |= 1u;
InitializedEncryptionSegment = WbDecryptWarbirdEncryptionSegment(v13, v7, v8, v9);
v11 = _InterlockedExchangeAdd64(&v5->_bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v11 & 2) != 0 && (v11 & 4) == 0 )
ExfTryToWakePushLock(v5);
KeAbPostRelease(v5);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
}
sub_1405D2184((volatile signed __int64 *)v13);
return InitializedEncryptionSegment;
}Referenced by:
WbDispatchOperation