VrpPreUnloadKey
NTSTATUS __stdcall VrpPreUnloadKey(INT64 a1, UINT64 *a2){
_ETHREAD *CurrentThread;
_UNICODE_STRING *v3;
_EX_PUSH_LOCK *v6;
_UNICODE_STRING *ExactNamespaceNode;
NTSTATUS v8;
UINT64 v10;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = *(_UNICODE_STRING **)(a1 + 24);
--CurrentThread->Tcb.KernelApcDisable;
v6 = (_EX_PUSH_LOCK *)(a2 + 2);
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)a2 + 2, 0i64);
ExactNamespaceNode = VrpFindExactNamespaceNode(a2, v3 + 1, &v10);
v8 = 0;
if( ExactNamespaceNode )
{
if( SLODWORD(ExactNamespaceNode[3].Buffer) < 0 )
{
*(_QWORD *)(a1 + 16) = ExactNamespaceNode;
}
else
{
v8 = -1073741790;
if( (_InterlockedExchangeAdd64(&v6->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v6);
KeAbPostRelease(v6);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
return v8;
}
else
{
if( (_InterlockedExchangeAdd64(&v6->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v6);
KeAbPostRelease(v6);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return 0;
}
}Referenced by:
VrpRegistryCallback