IoSetOplockKeyContext
NTSTATUS __stdcall IoSetOplockKeyContext(_FILE_OBJECT *FileObject, PVOID OplockKeyContext, UINT16 OplockKeyVersion){
int v4;
NTSTATUS result;
_OWORD *v6;
__int128 v7;
__int128 v8;
NTSTATUS v9;
void *v10;
PVOID FoExt;
FoExt = 0i64;
v4 = OplockKeyVersion;
if( (unsigned __int16)(OplockKeyVersion - 1) > 1u )
return -1073741811;
if( FileObject->FileObjectExtension )
{
IopGetFileObjectExtension(FileObject, FoExtTypeOplockKey, &FoExt);
}
else
{
result = IopAllocateFileObjectExtension(FileObject, &FoExt);
if( result < 0 )
return result;
}
LODWORD(v6) = ExAllocateFromNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)IopOplockFoExtLookasideList);
if( !v6 )
return -1073741670;
*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:
v9 = IopSetTypeSpecificFoExtension((_IOP_FILE_OBJECT_EXTENSION *)FoExt, FoExtTypeOplockKey, v6);
if( v9 == -1073741823 )
ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)IopOplockFoExtLookasideList, v10);
return v9;
}Referenced by:
FsRtlCheckOplockEx2
FsRtlpAttachOplockKey