FsRtlInsertPerStreamContext
NTSTATUS __stdcall FsRtlInsertPerStreamContext(
_FSRTL_ADVANCED_FCB_HEADER *AdvFcbHeader,
_FSRTL_PER_STREAM_CONTEXT *Ptr){
_ETHREAD *CurrentThread;
_LIST_ENTRY *p_FilterContexts;
_LIST_ENTRY *Flink;
if( !AdvFcbHeader || (AdvFcbHeader->Flags2 & 2) == 0 )
return -1073741808;
if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
{
ExAcquireFastMutex(AdvFcbHeader->FastMutex);
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&AdvFcbHeader->PushLock, 0i64);
}
p_FilterContexts = &AdvFcbHeader->FilterContexts;
Flink = AdvFcbHeader->FilterContexts.Flink;
if( Flink->Blink != &AdvFcbHeader->FilterContexts )
__fastfail(3u);
Ptr->Links.Blink = p_FilterContexts;
Ptr->Links.Flink = Flink;
Flink->Blink = &Ptr->Links;
p_FilterContexts->Flink = &Ptr->Links;
if( (*((_BYTE *)AdvFcbHeader + 7) & 0xF0u) < 0x10 )
{
KeReleaseGuardedMutex(AdvFcbHeader->FastMutex);
}
else
{
ExReleasePushLockEx((_DWORD)AdvFcbHeader + 72, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
return 0;
}Referenced by:
No references.