WbFreeMemoryBlockRegion
NTSTATUS __fastcall WbFreeMemoryBlockRegion(INT64 a1, INT64 a2){
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *v5;
_BYTE *v6;
_BYTE *v7;
unsigned __int64 v8;
__int64 i;
__int64 v10;
__int64 j;
char v12;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
v5 = (_EX_PUSH_LOCK *)(a1 + 1072);
v6 = KeAbPreAcquire((VOID *)(a1 + 1072), 0i64, 0i64);
v7 = v6;
if( _interlockedbittestandset64((volatile signed __int32 *)v5, 0i64) )
ExfAcquirePushLockExclusiveEx(v5, v6, v5);
if( v7 )
v7[26] |= 1u;
v8 = (unsigned __int64)(a2 - *(_QWORD *)(a1 + 32)) >> 6;
if( (_DWORD)v8 )
{
for( i = (unsigned int)(v8 - 1); i >= 0; --i )
{
if( *(_BYTE *)(i + a1 + 44) != 2 )
break;
}
v10 = i + 1;
}
else
{
v10 = 0i64;
}
for( j = (unsigned int)v8; *(_BYTE *)(j + a1 + 44) == 2; ++j )
;
if( v10 <= j )
memset((VOID *)(a1 + v10 + 44), 0i64, j - v10 + 1);
v12 = _InterlockedExchangeAdd64(&v5->_bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v12 & 2) != 0 && (v12 & 4) == 0 )
ExfTryToWakePushLock(v5);
KeAbPostRelease(v5);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
return 0;
}Referenced by:
sub_14065DA88