FsRtlRemovePerStreamContext
_LIST_ENTRY *__fastcall FsRtlRemovePerStreamContext(
_FSRTL_ADVANCED_FCB_HEADER *AdvFcbHeader,
VOID *OwnerId,
VOID *InstanceId){
_ETHREAD *CurrentThread;
_LIST_ENTRY *v7;
_LIST_ENTRY *p_FilterContexts;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v10;
_LIST_ENTRY *Blink;
if( !AdvFcbHeader || (AdvFcbHeader->Flags2 & 2) == 0 )
return 0i64;
if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
{
ExAcquireFastMutex(AdvFcbHeader->FastMutex);
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&AdvFcbHeader->PushLock, 0i64);
}
v7 = 0i64;
p_FilterContexts = &AdvFcbHeader->FilterContexts;
Flink = AdvFcbHeader->FilterContexts.Flink;
if( InstanceId )
{
while( Flink != p_FilterContexts )
{
if( Flink[1].Flink == OwnerId && Flink[1].Blink == InstanceId )
goto LABEL_9;
Flink = Flink->Flink;
}
}
else if( OwnerId )
{
while( Flink != p_FilterContexts )
{
if( Flink[1].Flink == OwnerId )
goto LABEL_9;
Flink = Flink->Flink;
}
}
else if( Flink != p_FilterContexts )
{
LABEL_9:
v7 = Flink;
if( Flink )
{
v10 = Flink->Flink;
if( v10->Blink != v7 || (Blink = v7->Blink, Blink->Flink != v7) )
__fastfail(3u);
Blink->Flink = v10;
v10->Blink = Blink;
}
}
if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
{
KeReleaseGuardedMutex(AdvFcbHeader->FastMutex);
}
else
{
ExReleasePushLockEx((_DWORD)AdvFcbHeader + 72, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
return v7;
}Referenced by:
No references.