IopSetLockOperationProcess

void __fastcall IopSetLockOperationProcess(__int64 a1, __int64 a2, char a3){
  CHAR *v3; 
  char v4; 
  INT64 v8; 
  int v9; 
  CHAR *Pool_0; 
  UINT64 v11; 
  _QWORD *v12; 
  __int64 v13; 
  unsigned __int8 v14; 
  unsigned __int64 v15; 
  _QWORD *v16; 
  _QWORD *FileObjectExtension; 
  FileObjectExtension = 0i64;
  v3 = 0i64;
  v4 = 0;
  if( a2 )
  {
    if( a3 )
    {
      FileObjectExtension = IopGetFileObjectExtension((_FILE_OBJECT *)a1, FoExtTypeInternal, 0i64);
      v12 = FileObjectExtension;
      if( !FileObjectExtension )
        return;
    }
    else
    {
      IopGetSetSpecificExtension(
        (_FILE_OBJECT *)a1,
        FoExtTypeInternal,
        0x20ui64,
        1u,
        (PVOID *)&FileObjectExtension,
        0i64);
      if( v9 < 0 )
        return;
      Pool_0 = IopVerifierExAllocatePool_0(v8, 0x10ui64);
      v12 = FileObjectExtension;
      v3 = Pool_0;
    }
    KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 184), v11);
    v13 = v12[2];
    v15 = v14;
    if( v13 )
    {
      v16 = (_QWORD *)v12[2];
      while( v16[1] != a2 )
      {
        v16 = (_QWORD *)*v16;
        if( !v16 )
          goto LABEL_15;
      }
      v4 = 1;
    }
    else
    {
LABEL_15:
      if( !a3 && v3 )
      {
        *(_QWORD *)v3 = v13;
        v12[2] = v3;
        *((_QWORD *)v3 + 1) = a2;
      }
    }
    KxReleaseSpinLock((UINT64 *)(a1 + 184));
    __writecr8(v15);
    if( v4 )
    {
      if( v3 )
        ExFreePoolWithTag(v3, 0);
    }
  }
}

Referenced by:

IopCloseFile
NtLockFile