PiCMGetDeviceIdList
NTSTATUS __stdcall PiCMGetDeviceIdList(
VOID *IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
VOID *IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
UINT64 *v5;
unsigned int v6;
VOID **PoolWithTag;
INT64 v9;
__int64 v10;
int v11;
INT64 v12;
unsigned __int16 v13;
unsigned int v14;
unsigned int v15;
NTSTATUS DeviceRelationsList;
int v17;
unsigned __int64 v18;
__int64 v19;
NTSTATUS v20;
const WCHAR *v22;
UINT64 v23;
UINT64 BufferSize;
UINT64 ExpectedOutputSize;
UINT64 v26;
UINT64 IoctlOutputBufferSizea;
UINT64 *v28;
WCHAR *v29;
UINT64 v30;
_CMAPI_DEVICE_LIST_FILTER CmapiFilter[4];
UINT64 v32;
_SECURITY_SUBJECT_CONTEXT SubjectContext;
UINT64 *v34;
v5 = v34;
v30 = 0i64;
v6 = IoctlOutputBufferSize;
*(_DWORD *)v34 = 0;
memset(&SubjectContext, 0, sizeof(SubjectContext));
v32 = 0i64;
PoolWithTag = 0i64;
*(_OWORD *)CmapiFilter = 0i64;
v11 = PiCMCaptureDeviceListInputData(
IoctlInputBuffer,
IoctlInputBufferSize,
(_CMAPI_INPUT_DEVICE_LIST_DATA *)(unsigned int)BytesUsed);
if( v11 < 0 )
goto LABEL_22;
v13 = CmapiFilter[1];
if( (byte_140C130BB & 2) != 0 )
{
if( LOWORD(CmapiFilter[1]) )
{
switch( LOWORD(CmapiFilter[1]) )
{
case 1u:
v22 = L"Enum";
break;
case 2u:
v22 = L"Service";
break;
case 4u:
v22 = L"EjectRelations";
break;
case 8u:
v22 = L"RemovalRelations";
break;
case 0x10u:
v22 = L"PowerRelations";
break;
case 0x20u:
v22 = L"BusRelations";
break;
case 0x40u:
v22 = L"TransportRelations";
break;
case 0x80u:
v22 = L"Class";
break;
default:
v22 = L"Unknown";
break;
}
}
else
{
v22 = (const WCHAR *)L"None";
}
McTemplateK0zzt_EtwWriteTransfer(
(INT64)v22,
v9,
v12,
*(const WCHAR **)&CmapiFilter[2],
v22,
BYTE2(CmapiFilter[1]) & 1);
}
if( !IoctlOutputBuffer || v6 < 0x14 )
{
DeviceRelationsList = -1073741811;
LABEL_18:
if( DeviceRelationsList >= 0 )
{
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(ExpectedOutputSize) = HIDWORD(v32);
LODWORD(BufferSize) = 2 * v30;
v20 = PiCMReturnBufferResultData(
(unsigned int)DeviceRelationsList,
(unsigned int)(2 * v30),
0i64,
PoolWithTag,
BufferSize,
ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v5);
goto LABEL_20;
}
goto LABEL_28;
}
v14 = 0;
if( v6 - 20 >= 2 )
v14 = v6 - 20;
if( v14 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, v14, 879783504i64);
if( !PoolWithTag )
{
DeviceRelationsList = -1073741670;
goto LABEL_28;
}
v15 = v14 >> 1;
}
else
{
v15 = 0;
}
LODWORD(v30) = v15;
DeviceRelationsList = PiCMConvertDeviceListFilters(CmapiFilter[1], (_CM_DEVICE_LIST_FILTER *)&v30 + 1);
if( DeviceRelationsList >= 0 )
{
v18 = (unsigned int)v13 - 4;
if( (unsigned int)v18 <= 0x3C && (v19 = 0x1000000010001011i64, _bittest64(&v19, v18)) )
{
if( !*(_QWORD *)&CmapiFilter[2] )
{
DeviceRelationsList = -1073741811;
goto LABEL_28;
}
v23 = HIDWORD(v30);
LODWORD(v23) = HIDWORD(v30) & 0xFFFFFEFF;
LODWORD(BufferSize) = v17;
DeviceRelationsList = CmGetDeviceRelationsList(
*(&stru_140CF2E80 + 607),
*(const WCHAR **)&CmapiFilter[2],
v23,
(WCHAR *)PoolWithTag,
BufferSize,
&v30,
v26);
if( DeviceRelationsList < 0 )
goto LABEL_28;
}
else
{
SeCaptureSubjectContext((INT64)&SubjectContext);
DeviceRelationsList = CmGetMatchingFilteredDeviceList(
*(&stru_140CF2E80 + 607),
*(const WCHAR **)&CmapiFilter[2],
SHIDWORD(v30),
(UINT8 *)PiCMMandatoryFilterCallback,
(HPNPCTX *)&SubjectContext,
(const WCHAR *)PoolWithTag,
(_CM_OBJECT_TYPE)v30,
&v30,
v28,
v29,
v30,
*(UINT64 **)CmapiFilter,
*(UINT64 *)&CmapiFilter[2]);
SeReleaseSubjectContext(&SubjectContext);
if( DeviceRelationsList < 0 )
{
LABEL_17:
v5 = v34;
goto LABEL_18;
}
}
if( !(_DWORD)v30 )
{
LODWORD(v30) = 1;
if( v14 < 2 )
{
DeviceRelationsList = -1073741789;
goto LABEL_28;
}
*(_WORD *)PoolWithTag = 0;
}
goto LABEL_17;
}
LABEL_28:
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(ExpectedOutputSize) = HIDWORD(v32);
LODWORD(BufferSize) = 0;
v20 = PiCMReturnBufferResultData(
(unsigned int)DeviceRelationsList,
(unsigned int)(2 * v30),
0i64,
0i64,
BufferSize,
ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v34);
LABEL_20:
v11 = v20;
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x34706E50u);
LABEL_22:
if( *(_QWORD *)&CmapiFilter[2] )
PiControlFreeUserModeCallersBuffer(KeGetCurrentThread()->PreviousMode, *(PVOID *)&CmapiFilter[2]);
if( (byte_140C130BB & 2) != 0 )
McTemplateK0d_EtwWriteTransfer(v10, (const _EVENT_DESCRIPTOR *)&CmFcpWnfTypeId.TypeId[7], v12, v11);
return v11;
}Referenced by:
PiCMHandleIoctl