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