IopAllocateBootResourcesInternal
NTSTATUS __stdcall IopAllocateBootResourcesInternal(
_ARBITER_REQUEST_SOURCE ArbiterRequestSource,
PDEVICE_OBJECT DeviceObject,
PCM_RESOURCE_LIST BootResources){
__int64 v6;
_DEVICE_NODE *DeviceNode;
VOID **v8;
VOID **v9;
int v10;
_CM_RESOURCE_LIST *BootResourcesTranslated;
_CM_RESOURCE_LIST *v13;
_CM_RESOURCE_LIST *v14;
PNP_RESOURCE_REQUEST Request[16];
memset(Request, 0i64, sizeof(Request));
if( DeviceObject )
DeviceNode = (_DEVICE_NODE *)DeviceObject->DeviceObjectExtension->DeviceNode;
else
DeviceNode = 0i64;
v8 = PnpCmResourcesToIoResources(v6, BootResources, 1);
v9 = v8;
if( v8 )
{
Request[3] = ArbiterRequestSource;
*(_QWORD *)&Request[6] = v8;
*(_QWORD *)Request = DeviceObject;
v10 = IopResourceRequirementsListToReqList(Request, (VOID **)&Request[8]);
if( v10 >= 0 )
{
if( !*(_QWORD *)&Request[8] )
goto LABEL_15;
v10 = IopBootAllocation(*(_REQ_LIST **)&Request[8]);
if( v10 >= 0 )
{
PipSetDevNodeFlags(DeviceNode, 0x80ui64);
PnpBuildCmResourceList((__int64)Request, 0);
v10 = Request[14];
if( Request[14] >= 0 )
{
if( DeviceNode->BootResources )
{
if( *(_QWORD *)&Request[10] )
{
ExFreePoolWithTag(*(PVOID *)&Request[10], 0);
*(_QWORD *)&Request[10] = 0i64;
}
}
else
{
DeviceNode->BootResources = *(_CM_RESOURCE_LIST **)&Request[10];
}
BootResourcesTranslated = DeviceNode->BootResourcesTranslated;
if( BootResourcesTranslated )
{
ExFreePoolWithTag(BootResourcesTranslated, 0);
DeviceNode->BootResourcesTranslated = 0i64;
}
v10 = 0;
DeviceNode->BootResourcesTranslated = *(_CM_RESOURCE_LIST **)&Request[12];
}
}
}
}
else
{
v10 = -1073741823;
}
if( *(_QWORD *)&Request[8] )
IopFreeReqList(*(_REQ_LIST **)&Request[8]);
LABEL_15:
if( v9 )
ExFreePoolWithTag(v9, 0);
if( v10 < 0 )
{
v13 = DeviceNode->BootResources;
if( v13 )
{
ExFreePoolWithTag(v13, 0);
DeviceNode->BootResources = 0i64;
}
v14 = DeviceNode->BootResourcesTranslated;
if( v14 )
{
ExFreePoolWithTag(v14, 0);
DeviceNode->BootResourcesTranslated = 0i64;
}
}
return v10;
}Referenced by:
IopAllocateBootResources
IopReleaseResources