ObpDeleteSymbolicLinkName
void **__fastcall ObpDeleteSymbolicLinkName(__int64 a1){
void **result;
int v2;
__int64 v4;
__int64 v5;
__int64 *CurrentServerSiloGlobals;
_ETHREAD *CurrentThread;
__int64 *v8;
__int64 v9;
int v10;
void *retaddr;
result = &retaddr;
v2 = *(_DWORD *)(a1 + 24);
if( v2 )
{
v4 = a1 - 48 - *((unsigned __int8 *)ObpInfoMaskToOffset + (*(_BYTE *)(a1 - 48 + 26) & 3));
result = *(void ***)v4;
v5 = *(_QWORD *)(*(_QWORD *)v4 + 304i64);
if( v5 )
{
CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals();
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v8 = CurrentServerSiloGlobals;
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx((UINT64)(CurrentServerSiloGlobals + 15), 0i64);
v9 = (unsigned int)(v2 - 1);
v10 = ~(1 << (v2 - 1));
*(_DWORD *)(v5 + 28) &= v10;
*(_BYTE *)(v9 + v5 + 32) = 0;
if( v5 == *v8 )
*((_DWORD *)v8 + 2) &= v10;
else
--*((_DWORD *)v8 + v9 + 3);
ExReleasePushLockEx((UINT64)(v8 + 15), 0i64);
result = (void **)KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
*(_DWORD *)(a1 + 24) = 0;
}
return result;
}Referenced by:
ObCloseHandleTableEntry
ObShutdownSystem
ObpDeleteNameCheck
ObpMarkDirectoryObjectsTemporary