VrpPreUnloadKey
INT64 __fastcall VrpPreUnloadKey(INT64 a1, UINT64 *a2){
_ETHREAD *CurrentThread;
__int64 v3;
volatile INT64 *v6;
UNICODE_STRING *ExactNamespaceNode;
unsigned int v8;
unsigned __int64 v10;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = *(_QWORD *)(a1 + 24);
--*((_WORD *)CurrentThread + 242);
v6 = (volatile INT64 *)(a2 + 2);
ExAcquirePushLockExclusiveEx((UINT64)(a2 + 2), 0i64);
ExactNamespaceNode = VrpFindExactNamespaceNode(a2, (unsigned __int16 *)(v3 + 16), &v10);
v8 = 0;
if( ExactNamespaceNode )
{
if( SLODWORD(ExactNamespaceNode[3].Buffer) < 0 )
{
*(_QWORD *)(a1 + 16) = ExactNamespaceNode;
}
else
{
v8 = -1073741790;
if( (_InterlockedExchangeAdd64(v6, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v6);
KeAbPostRelease((PVOID)v6);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}
return v8;
}
else
{
if( (_InterlockedExchangeAdd64(v6, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v6);
KeAbPostRelease((PVOID)v6);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return 0i64;
}
}Referenced by:
VrpRegistryCallback