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