IoSetOplockKeyContext
VOID __fastcall IoSetOplockKeyContext(_FILE_OBJECT *FileObject, VOID *OplockKeyContext, UINT16 OplockKeyVersion){
int v4;
int v5;
_OWORD *v6;
__int128 v7;
__int128 v8;
VOID *v9;
VOID *FoExt;
FoExt = 0i64;
v4 = OplockKeyVersion;
if( (unsigned __int16)(OplockKeyVersion - 1) <= 1u )
{
if( FileObject->FileObjectExtension )
{
IopGetFileObjectExtension(FileObject, FoExtTypeOplockKey, &FoExt);
}
else
{
IopAllocateFileObjectExtension(FileObject, &FoExt);
if( v5 < 0 )
return;
}
v6 = ExAllocateFromNPagedLookasideList((_NPAGED_LOOKASIDE_LIST *)((char *)&WheapErrorSourceTable + 2984));
if( !v6 )
return;
*v6 = 0i64;
v6[1] = 0i64;
v6[2] = 0i64;
*(_WORD *)v6 = v4;
if( v4 == 1 )
{
v8 = *(_OWORD *)OplockKeyContext;
}
else
{
if( v4 != 2 )
goto LABEL_12;
if( *((_BYTE *)OplockKeyContext + 32) )
{
v7 = *(_OWORD *)OplockKeyContext;
*((_WORD *)v6 + 1) |= 1u;
*(_OWORD *)((char *)v6 + 4) = v7;
}
if( !*((_BYTE *)OplockKeyContext + 33) )
goto LABEL_12;
v8 = *((_OWORD *)OplockKeyContext + 1);
}
*((_WORD *)v6 + 1) |= 2u;
*(_OWORD *)((char *)v6 + 20) = v8;
LABEL_12:
if( IopSetTypeSpecificFoExtension((_IOP_FILE_OBJECT_EXTENSION *)FoExt, FoExtTypeOplockKey, v6) == -1073741823 )
ExFreeToNPagedLookasideList((_NPAGED_LOOKASIDE_LIST *)((char *)&WheapErrorSourceTable + 2984), v9);
}
}Referenced by:
FsRtlCheckOplockEx2
FsRtlpAttachOplockKey