PpHotSwapUpdateRemovalPolicy
VOID __stdcall PpHotSwapUpdateRemovalPolicy(_DEVICE_NODE *DeviceNode){
unsigned int Characteristics;
int v3;
int v4;
wchar_t *Buffer;
NTSTATUS DeviceRegProp;
UINT64 v7;
_DEVICE_NODE *DetachableNode;
_DEVICE_REMOVAL_POLICY RemovalPolicy;
UINT64 CmRegPropType;
UINT64 PropertySize;
DetachableNode = 0i64;
RemovalPolicy = RemovalPolicyNotDetermined;
LODWORD(CmRegPropType) = 0;
PiHotSwapGetDetachableNode(DeviceNode, &DetachableNode);
if( !DetachableNode )
{
*(_WORD *)&DeviceNode->RemovalPolicy = 257;
return;
}
Characteristics = DeviceNode->PhysicalDeviceObject->Characteristics;
v3 = Characteristics & 0x300;
if( (Characteristics & 0x4000) != 0 )
goto LABEL_19;
if( (Characteristics & 0x8000) != 0 )
{
LABEL_18:
v4 = 3;
goto LABEL_17;
}
if( v3 == 512 )
{
LABEL_19:
v4 = 2;
goto LABEL_17;
}
if( v3 == 768 )
goto LABEL_18;
if( DeviceNode != DetachableNode )
{
v4 = 6;
LABEL_17:
RemovalPolicy = v4;
goto LABEL_10;
}
PiHotSwapGetDefaultBusRemovalPolicy(DeviceNode, &RemovalPolicy);
v4 = RemovalPolicy;
LABEL_10:
if( DeviceNode != DetachableNode )
{
if( v4 > DeviceNode->Parent->RemovalPolicy )
v4 = DeviceNode->Parent->RemovalPolicy;
RemovalPolicy = v4;
}
LODWORD(v7) = 0;
DeviceNode->RemovalPolicy = v4;
DeviceNode->HardwareRemovalPolicy = v4;
Buffer = DeviceNode->InstancePath.Buffer;
LODWORD(PropertySize) = 4;
DeviceRegProp = CmGetDeviceRegProp(
*(&stru_140CF2E80 + 607),
Buffer,
0i64,
34i64,
&CmRegPropType,
(UINT8 *)&RemovalPolicy,
&PropertySize,
v7);
if( DeviceRegProp >= 0 )
{
if( (_DWORD)CmRegPropType != 4 )
DeviceRegProp = -1073741584;
if( DeviceRegProp >= 0 && (unsigned int)(RemovalPolicy - 2) <= 1 )
DeviceNode->RemovalPolicy = RemovalPolicy;
}
}Referenced by:
PiProcessNewDeviceNode