IoRequestDeviceEjectEx

NTSTATUS __stdcall IoRequestDeviceEjectEx(
        PDEVICE_OBJECT PhysicalDeviceObject,
        PIO_DEVICE_EJECT_CALLBACK Callback,
        PVOID Context,
        PDRIVER_OBJECT DriverObject){
  _DWORD *DeviceNode; 
  VOID **PoolWithTag; 
  const VOID **v11; 
  _DRIVER_OBJECT *v12; 
  _UNICODE_STRING *p_DriverName; 
  VOID **v14; 
  VOID **v15; 
  _DEVOBJ_EXTENSION *DeviceObjectExtension; 
  _WORD *v17; 
  __int64 v18; 
  _WORD *v19; 
  __int64 v20; 

  if( !PhysicalDeviceObject )
    goto LABEL_20;
  DeviceNode = PhysicalDeviceObject->DeviceObjectExtension->DeviceNode;
  if( !DeviceNode || (DeviceNode[99] & 0x20000) != 0 )
  {
    IoAddTriageDumpDataBlock(PhysicalDeviceObject, (_BYTE *)PhysicalDeviceObject->Size);
    v12 = PhysicalDeviceObject->DriverObject;
    if( v12 )
    {
      IoAddTriageDumpDataBlock(v12, (_BYTE *)(unsigned int)v12->Size);
      p_DriverName = &PhysicalDeviceObject->DriverObject->DriverName;
      if( p_DriverName->Length )
      {
        IoAddTriageDumpDataBlock(p_DriverName, (_BYTE *)2);
        IoAddTriageDumpDataBlock(
          PhysicalDeviceObject->DriverObject->DriverName.Buffer,
          (_BYTE *)PhysicalDeviceObject->DriverObject->DriverName.Length);
      }
    }
    v14 = (VOID **)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode;
    if( v14 )
    {
      v15 = v14 + 5;
      IoAddTriageDumpDataBlock(v14, (_BYTE *)0x310);
      if( *(_WORD *)v15 )
      {
        IoAddTriageDumpDataBlock(v15, (_BYTE *)2);
        IoAddTriageDumpDataBlock(v15[1], (_BYTE *)*(unsigned __int16 *)v15);
      }
      DeviceObjectExtension = PhysicalDeviceObject->DeviceObjectExtension;
      v17 = (char *)DeviceObjectExtension->DeviceNode + 56;
      if( *v17 )
      {
        IoAddTriageDumpDataBlock(v17, (_BYTE *)2);
        IoAddTriageDumpDataBlock(
          *((VOID **)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode + 8),
          (_BYTE *)*((unsigned __int16 *)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode + 28));
        DeviceObjectExtension = PhysicalDeviceObject->DeviceObjectExtension;
      }
      v18 = *((_QWORD *)DeviceObjectExtension->DeviceNode + 2);
      if( v18 )
      {
        v19 = (_WORD *)(v18 + 56);
        if( *v19 )
        {
          IoAddTriageDumpDataBlock(v19, (_BYTE *)2);
          v20 = *((_QWORD *)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode + 2);
          IoAddTriageDumpDataBlock(*(VOID **)(v20 + 64), (_BYTE *)*(unsigned __int16 *)(v20 + 56));
        }
      }
    }
LABEL_20:
    KeBugCheckEx(0xCAu, (PVOID)2, PhysicalDeviceObject, 0i64, 0i64);
  }
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x5D8ui64, 1181773392i64);
  if( !PoolWithTag )
    return -1073741670;
  v11 = (const VOID **)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode;
  *PoolWithTag = Callback;
  PoolWithTag[1] = Context;
  memmove(PoolWithTag + 8, v11[6], *((unsigned __int16 *)v11 + 20));
  *((_WORD *)PoolWithTag + ((unsigned __int64)*((unsigned __int16 *)v11 + 20) >> 1) + 32) = 0;
  if( DriverObject )
    ObfReferenceObjectWithTag(DriverObject, 0x45706E50ui64);
  PoolWithTag[2] = DriverObject;
  *((_DWORD *)PoolWithTag + 116) = 0;
  *((_WORD *)PoolWithTag + 234) = 0;
  PoolWithTag[6] = PnpRequestDeviceEjectExWorker;
  PoolWithTag[7] = PoolWithTag;
  PoolWithTag[4] = 0i64;
  ExQueueWorkItem((PWORK_QUEUE_ITEM)PoolWithTag + 1, DelayedWorkQueue);
  return 0;
}

Referenced by:

IoRequestDeviceEject