FsRtlTeardownPerStreamContexts
VOID __stdcall FsRtlTeardownPerStreamContexts(_FSRTL_ADVANCED_FCB_HEADER *AdvFcbHeader){
_LIST_ENTRY *p_FilterContexts;
_ETHREAD *CurrentThread;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v5;
_ETHREAD *v6;
p_FilterContexts = &AdvFcbHeader->FilterContexts;
if( p_FilterContexts->Flink != p_FilterContexts )
{
if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
{
ExAcquireFastMutex(AdvFcbHeader->FastMutex);
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&AdvFcbHeader->PushLock, 0i64);
}
while( 1 )
{
Flink = p_FilterContexts->Flink;
if( p_FilterContexts->Flink == p_FilterContexts )
break;
v5 = Flink->Flink;
if( Flink->Blink != p_FilterContexts || v5->Blink != Flink )
__fastfail(3u);
p_FilterContexts->Flink = v5;
v5->Blink = p_FilterContexts;
if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
{
KeReleaseGuardedMutex(AdvFcbHeader->FastMutex);
}
else
{
ExReleasePushLockEx((_DWORD)AdvFcbHeader + 72, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
((void(__fastcall *)(_LIST_ENTRY *))Flink[2].Flink)(Flink);
if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
{
ExAcquireFastMutex(AdvFcbHeader->FastMutex);
}
else
{
v6 = (_ETHREAD *)KeGetCurrentThread();
--v6->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&AdvFcbHeader->PushLock, 0i64);
}
}
if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
{
KeReleaseGuardedMutex(AdvFcbHeader->FastMutex);
}
else
{
ExReleasePushLockEx((_DWORD)AdvFcbHeader + 72, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
}
}Referenced by:
RawCleanupVcb