IopFreeBandwidthContract

INT64 __fastcall IopFreeBandwidthContract(PVOID Object, _QWORD *a2){
  INT64 result; 
  int v4; 
  UINT64 v5; 
  UINT8 v6; 
  UINT8 v7; 
  _DEVICE_OBJECT *RelatedDeviceObject; 
  _IRP *IrpMustSucceed; 
  _IRP *v10; 
  struct _KEVENT *p_Event; 
  __int64 v12; 
  struct _KEVENT *v13; 
  IRP *v14; 
  union _LARGE_INTEGER Interval; 
  struct _KEVENT Event; 
  __int128 v17; 
  __int128 v18; 
  int v19; 
  result = 0i64;
  memset(&Event, 0, sizeof(Event));
  v17 = 0i64;
  v19 = 0;
  v18 = 0i64;
  if( (_QWORD *)*a2 != a2 )
  {
    v4 = *((_DWORD *)Object + 20) & 2;
    while( 1 )
    {
      KeInitializeEvent(&Event, SynchronizationEvent, 0);
      if( (*((_DWORD *)Object + 20) & 0x4000000) == 0 )
        KeResetEvent((char *)Object + 152, v5, v6, v7, v14);
      v19 = 0;
      v18 = 0i64;
      RelatedDeviceObject = IoGetRelatedDeviceObject((_FILE_OBJECT *)Object);
      IrpMustSucceed = IopAllocateIrpMustSucceed(RelatedDeviceObject, *((_BYTE *)RelatedDeviceObject + 76));
      v10 = IrpMustSucceed;
      *((_QWORD *)IrpMustSucceed + 24) = Object;
      *((_QWORD *)IrpMustSucceed + 19) = KeGetCurrentThread();
      *((_BYTE *)IrpMustSucceed + 64) = 0;
      if( v4 )
      {
        p_Event = 0i64;
      }
      else
      {
        *((_DWORD *)IrpMustSucceed + 4) = 4;
        p_Event = &Event;
      }
      *((_QWORD *)IrpMustSucceed + 10) = p_Event;
      *((_QWORD *)IrpMustSucceed + 9) = &v17;
      v12 = *((_QWORD *)IrpMustSucceed + 23);
      *((_QWORD *)v10 + 11) = 0i64;
      *(_BYTE *)(v12 - 72) = 6;
      *(_QWORD *)(v12 - 24) = Object;
      *(_DWORD *)(v12 - 64) = 20;
      *(_DWORD *)(v12 - 56) = 44;
      *((_QWORD *)v10 + 14) = 0i64;
      *((_QWORD *)v10 + 1) = 0i64;
      *((_QWORD *)v10 + 3) = &v18;
      ObfReferenceObject(Object);
      IopQueueThreadIrp(v10);
      if( IofCallDriver(RelatedDeviceObject, v10) == 259 )
      {
        v13 = (struct _KEVENT *)((char *)Object + 152);
        if( !v4 )
          v13 = &Event;
        KeWaitForSingleObject(v13, Executive, 0, 0, 0i64);
      }
      result = (unsigned int)v17;
      if( (_DWORD)v17 != -1073741670 && (_DWORD)v17 != -1073741801 )
        break;
      Interval.QuadPart = -1000000i64;
      KeDelayExecutionThread(0, 0, &Interval);
    }
  }
  return result;
}

Referenced by:

IopCloseFile