IopLegacyResourceAllocation
NTSTATUS __stdcall IopLegacyResourceAllocation(
_ARBITER_REQUEST_SOURCE AllocationType,
_DRIVER_OBJECT *DriverObject,
_DEVICE_OBJECT *DeviceObject,
_IO_RESOURCE_REQUIREMENTS_LIST *ResourceRequirements,
_CM_RESOURCE_LIST **AllocatedResources){
_ETHREAD *CurrentThread;
_ARBITER_REQUEST_SOURCE v6;
_DEVICE_OBJECT *v7;
_DEVICE_NODE *v8;
NTSTATUS v12;
_DEVICE_NODE *v13;
_DEVICE_NODE *LegacyDeviceNode;
NTSTATUS v16;
_DEVICE_NODE *v17;
_DEVICE_NODE *v18;
_DEVICE_OBJECT *v19;
_DEVICE_OBJECT *v20;
_DEVICE_NODE *v21;
_DEVICE_NODE *v22;
const VOID **v23;
_CM_RESOURCE_LIST *v24;
VOID **PoolWithTag;
size_t v26;
_CM_RESOURCE_LIST *v27;
_CM_RESOURCE_LIST *v28;
unsigned int v29;
_DEVICE_OBJECT *PhysicalDeviceObject;
__int64 v31[8];
_DEVICE_NODE *DeviceNode;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = AllocationType;
v7 = 0i64;
v8 = 0i64;
--CurrentThread->Tcb.KernelApcDisable;
KeWaitForSingleObject((UINT64)&PnpReplaceEvent + 6016, 4, 0, 0, 0i64);
v12 = -1073741823;
if( DeviceObject )
{
v13 = (_DEVICE_NODE *)DeviceObject->DeviceObjectExtension->DeviceNode;
DeviceNode = v13;
if( v13 )
{
v8 = v13;
LABEL_4:
v7 = DeviceObject;
LABEL_5:
v12 = 0;
goto LABEL_6;
}
if( (DeviceObject->Flags & 0x1000) == 0 )
{
v16 = PipAllocateDeviceNode(DeviceObject, (PDEVICE_NODE *)&DeviceNode);
v17 = DeviceNode;
v12 = v16;
if( DeviceNode )
{
if( v16 == -1073740946 )
{
IopDestroyDeviceNode(DeviceNode);
goto LABEL_17;
}
PipSetDevNodeFlags(DeviceNode, 0x20000ui64);
v8 = v17;
goto LABEL_4;
}
goto LABEL_35;
}
}
else
{
v18 = (_DEVICE_NODE *)*(&PnpReplaceEvent + 720);
DeviceNode = (_DEVICE_NODE *)*(&PnpReplaceEvent + 720);
if( *(&PnpReplaceEvent + 720) )
{
do
{
if( (_DRIVER_OBJECT *)v18->DuplicatePDO == DriverObject )
break;
v18 = v18->Sibling;
}
while( v18 );
DeviceNode = v18;
if( v18 )
{
v7 = v18->PhysicalDeviceObject;
v8 = v18;
goto LABEL_5;
}
}
PhysicalDeviceObject = 0i64;
v12 = IopCreateRootEnumeratedDeviceObject(&PhysicalDeviceObject);
if( v12 >= 0 )
{
v19 = PhysicalDeviceObject;
v20 = PhysicalDeviceObject;
PhysicalDeviceObject->Flags |= 0x1000u;
v12 = PipAllocateDeviceNode(v20, (PDEVICE_NODE *)&DeviceNode);
if( v12 == -1073740946 || (v21 = DeviceNode) == 0i64 )
{
IoDeleteDevice(v19);
v6 = AllocationType;
LABEL_35:
v12 = -1073741670;
goto LABEL_36;
}
v22 = DeviceNode;
v19->DriverObject = DriverObject;
PipSetDevNodeFlags(v22, 0x20001ui64);
PipSetDevNodeState(v21, DeviceNodeInitialized);
v21->DuplicatePDO = (_DEVICE_OBJECT *)DriverObject;
v21->Sibling = (_DEVICE_NODE *)*(&PnpReplaceEvent + 720);
if( *(&PnpReplaceEvent + 720) )
*(_QWORD *)(*(&PnpReplaceEvent + 720) + 8i64) = v21;
v7 = v19;
*(&PnpReplaceEvent + 720) = v21;
v6 = AllocationType;
v8 = v21;
}
}
LABEL_36:
if( v12 < 0 )
goto LABEL_17;
LABEL_6:
LegacyDeviceNode = 0i64;
if( v8->Parent )
goto LABEL_7;
if( ResourceRequirements )
{
if( ResourceRequirements->InterfaceType == InterfaceTypeUndefined )
ResourceRequirements->InterfaceType = Isa;
v8->Parent = (_DEVICE_NODE *)*(&PnpReplaceEvent + 831);
LABEL_7:
if( ResourceRequirements )
goto LABEL_42;
}
if( v8->Parent )
{
LABEL_9:
IopReleaseResources(v8);
goto LABEL_10;
}
LABEL_42:
if( v8->ResourceList || v8->BootResources )
goto LABEL_9;
LABEL_10:
if( !ResourceRequirements )
{
LegacyDeviceNode = v8->OverUsed1.LegacyDeviceNode;
goto LABEL_12;
}
memset(v31, 0i64, sizeof(v31));
v31[0] = (__int64)v7;
v31[3] = (__int64)ResourceRequirements;
HIDWORD(v31[1]) = v6;
LODWORD(v31[1]) = 128;
PnpAllocateResources(1u, (PNP_RESOURCE_REQUEST *)v31, 1, 0i64);
v12 = v31[7];
if( SLODWORD(v31[7]) < 0 )
goto LABEL_12;
v23 = (const VOID **)AllocatedResources;
v24 = (_CM_RESOURCE_LIST *)v31[5];
if( *AllocatedResources )
v24 = *AllocatedResources;
DeviceNode = (_DEVICE_NODE *)(unsigned int)PnpDetermineResourceListSize(v24);
PoolWithTag = ExAllocatePoolWithTag(1ui64, (UINT64)DeviceNode, 538996816i64);
if( PoolWithTag )
{
if( *v23 )
ExFreePoolWithTag((PVOID)v31[5], 0);
else
*v23 = (const VOID *)v31[5];
ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
v26 = (unsigned int)DeviceNode;
v8->ResourceList = (_CM_RESOURCE_LIST *)PoolWithTag;
memmove(PoolWithTag, *v23, v26);
v8->ResourceListTranslated = (_CM_RESOURCE_LIST *)v31[6];
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
LegacyDeviceNode = v8->OverUsed1.LegacyDeviceNode;
}
else
{
ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
v8->ResourceList = (_CM_RESOURCE_LIST *)v31[5];
v8->ResourceListTranslated = (_CM_RESOURCE_LIST *)v31[6];
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
IopReleaseResources(v8);
v12 = -1073741670;
}
if( v12 < 0 )
{
LABEL_12:
IopRemoveLegacyDeviceNode(DeviceObject, v8);
if( v12 < 0 )
goto LABEL_17;
}
if( LegacyDeviceNode )
{
v27 = IopCombineLegacyResources(LegacyDeviceNode);
v28 = v27;
if( v27 )
{
v29 = PnpDetermineResourceListSize(v27);
IopWriteAllocatedResourcesToRegistry(LegacyDeviceNode, v28, v29);
ExFreePoolWithTag(v28, 0);
}
}
if( AllocationType != ArbiterRequestPnpDetected && ResourceRequirements )
IopSetLegacyResourcesFlag(DriverObject);
LABEL_17:
KeReleaseSemaphore((_KSEMAPHORE *)&PnpReplaceEvent + 188, 0i64, 1i64, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v12;
}Referenced by:
IoAssignResources
IoReportResourceUsageInternal
IopDestroyDeviceNode
IopReleaseDeviceResources