FsRtlRemovePerFileObjectContext
_FSRTL_PER_FILEOBJECT_CONTEXT *__stdcall FsRtlRemovePerFileObjectContext(
PFILE_OBJECT FileObject,
VOID *OwnerId,
VOID *InstanceId){
_ETHREAD *CurrentThread;
_FSRTL_PER_FILEOBJECT_CONTEXT *bf_0;
_EX_PUSH_LOCK *v7;
_FSRTL_PER_FILEOBJECT_CONTEXT *i;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
_EX_PUSH_LOCK *PushLock;
PushLock = 0i64;
if( !FileObject )
return 0i64;
IoGetFileObjectFilterContext(FileObject, (PVOID *)&PushLock, 0);
if( !PushLock )
return 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
bf_0 = 0i64;
--CurrentThread->Tcb.KernelApcDisable;
v7 = PushLock;
ExAcquirePushLockExclusiveEx(PushLock, 0i64);
if( InstanceId )
{
for( i = (_FSRTL_PER_FILEOBJECT_CONTEXT *)v7[1]._bf_0;
i != (_FSRTL_PER_FILEOBJECT_CONTEXT *)&v7[1];
i = (_FSRTL_PER_FILEOBJECT_CONTEXT *)i->Links.Flink )
{
if( i->OwnerId == OwnerId && i->InstanceId == InstanceId )
{
LABEL_8:
bf_0 = i;
goto LABEL_9;
}
}
}
else if( OwnerId )
{
for( i = (_FSRTL_PER_FILEOBJECT_CONTEXT *)v7[1]._bf_0;
i != (_FSRTL_PER_FILEOBJECT_CONTEXT *)&v7[1];
i = (_FSRTL_PER_FILEOBJECT_CONTEXT *)i->Links.Flink )
{
if( i->OwnerId == OwnerId )
goto LABEL_8;
}
}
else if( (_EX_PUSH_LOCK *)v7[1]._bf_0 != &v7[1] )
{
bf_0 = (_FSRTL_PER_FILEOBJECT_CONTEXT *)v7[1]._bf_0;
LABEL_9:
if( bf_0 )
{
Flink = bf_0->Links.Flink;
if( (_FSRTL_PER_FILEOBJECT_CONTEXT *)bf_0->Links.Flink->Blink != bf_0
|| (Blink = bf_0->Links.Blink, (_FSRTL_PER_FILEOBJECT_CONTEXT *)Blink->Flink != bf_0) )
{
__fastfail(3u);
}
Blink->Flink = Flink;
Flink->Blink = Blink;
}
}
ExReleasePushLockEx((ULONG_PTR)v7, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return bf_0;
}Referenced by:
No references.