CmGetDeviceSiblings
NTSTATUS __stdcall CmGetDeviceSiblings(
HPNPCTX *hPnpCtx,
WCHAR *DeviceInstanceId,
WCHAR *SiblingInstanceIdList,
UINT64 *SiblingInstanceIdListLen){
WCHAR *v5;
unsigned int v8;
int DeviceParent;
VOID **v10;
WCHAR *i;
VOID **PoolWithTag;
unsigned int Len;
UINT64 ParentDeviceInstanceIdLength[2];
WCHAR ParentDeviceInstanceId[200];
v5 = SiblingInstanceIdList;
if( !SiblingInstanceIdList )
goto LABEL_4;
if( !*(_DWORD *)SiblingInstanceIdListLen )
{
v5 = 0i64;
LABEL_4:
v8 = 0;
goto LABEL_6;
}
*SiblingInstanceIdList = 0;
v8 = *(_DWORD *)SiblingInstanceIdListLen;
LABEL_6:
*(_DWORD *)SiblingInstanceIdListLen = 0;
LODWORD(ParentDeviceInstanceIdLength[0]) = 200;
DeviceParent = CmGetDeviceParent(hPnpCtx, DeviceInstanceId, ParentDeviceInstanceId, ParentDeviceInstanceIdLength);
if( DeviceParent >= 0 )
{
v10 = 0i64;
LODWORD(ParentDeviceInstanceIdLength[0]) = 0;
for( i = 0i64; ; i = (WCHAR *)PoolWithTag )
{
DeviceParent = CmGetDeviceChildren(hPnpCtx, ParentDeviceInstanceId, i, ParentDeviceInstanceIdLength);
if( !DeviceParent || DeviceParent != -1073741789 )
break;
if( v10 )
ExFreePoolWithTag(v10, 0);
PoolWithTag = ExAllocatePoolWithTag(1ui64, 2i64 * LODWORD(ParentDeviceInstanceIdLength[0]), 1380994640i64);
v10 = PoolWithTag;
if( !PoolWithTag )
{
DeviceParent = -1073741801;
break;
}
}
if( DeviceParent >= 0 )
{
if( !v10 )
return -1073741275;
if( PnpMultiSzDeleteString((UINT8 *)v10, DeviceInstanceId) )
{
Len = PnpMultiSzGetLen((const WCHAR *)v10);
if( Len > 1 )
{
*(_DWORD *)SiblingInstanceIdListLen = Len;
if( v8 >= Len )
memmove(v5, v10, 2 * Len);
else
DeviceParent = -1073741789;
}
else
{
DeviceParent = -1073741275;
}
}
else
{
DeviceParent = -1073741595;
}
}
if( v10 )
ExFreePoolWithTag(v10, 0);
}
return DeviceParent;
}Referenced by:
CmGetDeviceMappedPropertyFromComposite