IoRequestDeviceRemovalForReset

NTSTATUS __stdcall IoRequestDeviceRemovalForReset(PVOID DeviceObject, UINT64 Flags){
  int v2; 
  VOID **PoolWithTag; 
  __int64 v5; 
  INT64 v6; 
  int v7; 
  INT64 v8; 
  INT64 v9; 
  INT64 v10; 

  v2 = Flags;
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0xE0ui64, 1164996176i64);
  v5 = 0i64;
  v6 = (INT64)PoolWithTag;
  if( !PoolWithTag )
    goto LABEL_2;
  memset(PoolWithTag, 0i64, 0xE0u);
  KeInitializeDpc((PRKDPC)(v6 + 64), (PKDEFERRED_ROUTINE)PfSnTracingStateDpcRoutine, (PVOID)v6);
  KeInitializeTimerEx(v6, 0);
  *(_QWORD *)(v6 + 152) = v6;
  *(_QWORD *)(v6 + 144) = IopRetryDeviceRemovalForReset;
  *(_QWORD *)(v6 + 128) = 0i64;
  ObfReferenceObjectWithTag(DeviceObject, 0x52706E50ui64);
  *(_QWORD *)(v6 + 184) = DeviceObject;
  *(_QWORD *)(v6 + 160) = 0i64;
  *(_DWORD *)(v6 + 192) = 0;
  *(_DWORD *)(v6 + 216) = v2;
  *(_OWORD *)(v6 + 200) = 0i64;
  if( IopAllocateUnicodeString((_UNICODE_STRING *)(v6 + 200), 0x200u) >= 0 )
    v7 = IopQueueDeviceResetEvent((_RESET_REMOVAL_CONTEXT *)v6);
  else
LABEL_2:
    v7 = -1073741670;
  PnpTraceRequestDeviceRemovalForReset((__int64)DeviceObject, v2, v7);
  if( v7 >= 0 )
  {
    if( DeviceObject )
      v5 = *(_QWORD *)(*((_QWORD *)DeviceObject + 39) + 40i64);
    if( (byte_140C130BB & 8) != 0 )
      McTemplateK0hzr0_EtwWriteTransfer(v9, v8, v10, *(_WORD *)(v5 + 40) >> 1, *(_QWORD *)(v5 + 48));
  }
  else if( v6 )
  {
    IopFreeResetRemovalContext((_RESET_REMOVAL_CONTEXT *)v6);
  }
  return v7;
}

Referenced by:

No references.