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