FsRtlpAttachOplockKey
NTSTATUS __stdcall FsRtlpAttachOplockKey(_IRP *Irp){
_IO_STACK_LOCATION *CurrentStackLocation;
NTSTATUS v3;
__int64 v4;
_ECP_LIST *v5;
_ECP_LIST *v6;
UINT16 v8;
NTSTATUS v9;
PVOID EcpContext;
struct _ECP_LIST *ExtraCreateParameter[2];
CurrentStackLocation = Irp->Tail.CurrentStackLocation;
v3 = 0;
if( !CurrentStackLocation->MajorFunction )
{
LODWORD(v4) = IoGetOplockKeyContextEx((INT64)CurrentStackLocation->FileObject);
if( !v4 )
{
EcpContext = 0i64;
ExtraCreateParameter[0] = 0i64;
IoGetIrpExtraCreateParameter(Irp, ExtraCreateParameter);
v5 = ExtraCreateParameter[0];
if( ExtraCreateParameter[0] )
{
v6 = ExtraCreateParameter[0];
*(GUID *)ExtraCreateParameter = GUID_ECP_DUAL_OPLOCK_KEY;
if( FsRtlFindExtraCreateParameter(v6, (_GUID *)ExtraCreateParameter, &EcpContext, 0i64) )
{
*(GUID *)ExtraCreateParameter = GUID_ECP_OPLOCK_KEY;
if( FsRtlRemoveExtraCreateParameter(v5, (_GUID *)ExtraCreateParameter, &EcpContext, 0i64) )
return v3;
v8 = 1;
}
else
{
v8 = 2;
}
IoSetOplockKeyContext(CurrentStackLocation->FileObject, EcpContext, v8);
v3 = v9;
if( v8 == 1 )
FsRtlFreeExtraCreateParameter(EcpContext);
else
FsRtlAcknowledgeEcp(EcpContext);
if( v3 == -1073741823 )
return 0;
}
}
}
return v3;
}Referenced by:
FsRtlOplockBreakH
FsRtlpOplockFsctrlInternal