FsRtlRemovePerStreamContext
_FSRTL_PER_STREAM_CONTEXT *__stdcall FsRtlRemovePerStreamContext(
_FSRTL_ADVANCED_FCB_HEADER *AdvFcbHeader,
PVOID OwnerId,
PVOID InstanceId){
_ETHREAD *CurrentThread;
_FSRTL_PER_STREAM_CONTEXT *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();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx((UINT64)&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 = (_FSRTL_PER_STREAM_CONTEXT *)Flink;
if( Flink )
{
v10 = Flink->Flink;
if( (_FSRTL_PER_STREAM_CONTEXT *)v10->Blink != v7
|| (Blink = v7->Links.Blink, (_FSRTL_PER_STREAM_CONTEXT *)Blink->Flink != v7) )
{
__fastfail(3u);
}
Blink->Flink = v10;
v10->Blink = Blink;
}
}
if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
{
KeReleaseGuardedMutex(AdvFcbHeader->FastMutex);
}
else
{
ExReleasePushLockEx((UINT64)&AdvFcbHeader->PushLock, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}
return v7;
}Referenced by:
No references.