PiCMGetObjectList
NTSTATUS __stdcall PiCMGetObjectList(
VOID *IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
VOID *IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
UINT64 *v5;
unsigned int v6;
VOID **PoolWithTag;
NTSTATUS ObjectList;
__int64 v10;
__int64 v11;
__int64 v12;
unsigned int v13;
unsigned int v14;
int v15;
NTSTATUS v16;
UINT64 BufferSize;
UINT64 ExpectedOutputSize;
UINT64 IoctlOutputBufferSizea;
_CMAPI_INPUT_OBJECT_DATA ObjectData[4];
__int128 v22;
UINT64 v23;
UINT64 *v24;
v5 = v24;
LODWORD(v24) = 0;
v6 = IoctlOutputBufferSize;
v23 = 0i64;
PoolWithTag = 0i64;
*(_DWORD *)v5 = 0;
*(_OWORD *)ObjectData = 0i64;
v22 = 0i64;
ObjectList = PiCMCaptureObjectInputData(
IoctlInputBuffer,
IoctlInputBufferSize,
(_CMAPI_INPUT_OBJECT_DATA *)(unsigned int)BytesUsed);
if( ObjectList < 0 )
goto LABEL_23;
if( (_QWORD)v22 || __PAIR64__(DWORD2(v22), 0) != ObjectData[1] || HIDWORD(v22) )
{
ObjectList = -1073741811;
goto LABEL_19;
}
if( !IoctlOutputBuffer || v6 < 0x14 )
{
LABEL_46:
ObjectList = -1073741811;
goto LABEL_25;
}
v11 = (unsigned int)ObjectData[2];
v12 = 1i64;
v13 = 0;
if( ObjectData[2] <= 6 )
{
if( ObjectData[2] == 6 )
{
v13 = 6;
goto LABEL_12;
}
v11 = (unsigned int)(ObjectData[2] - 1);
if( ObjectData[2] == 1 )
{
v13 = 1;
ObjectList = -1073741637;
goto LABEL_12;
}
v11 = (unsigned int)(ObjectData[2] - 2);
if( ObjectData[2] == 2 )
{
v13 = 2;
goto LABEL_12;
}
v11 = (unsigned int)(ObjectData[2] - 3);
if( ObjectData[2] == 3 )
{
v13 = 4;
goto LABEL_12;
}
v11 = (unsigned int)(ObjectData[2] - 4);
if( ObjectData[2] == 4 )
{
v13 = 3;
goto LABEL_12;
}
if( ObjectData[2] == 5 )
{
v13 = 5;
goto LABEL_12;
}
}
else
{
switch( ObjectData[2] )
{
case 65537:
v11 = 7i64;
LABEL_10:
v13 = *(&stru_140CF2E80 + 608) != 0i64 ? v11 : 0;
goto LABEL_11;
case 65538:
v11 = 8i64;
goto LABEL_10;
case 65539:
v11 = 9i64;
goto LABEL_10;
}
v11 = (unsigned int)(ObjectData[2] - 65540);
if( ObjectData[2] == 65540 )
{
v11 = 10i64;
goto LABEL_10;
}
if( ObjectData[2] == 65541 )
{
v11 = 11i64;
goto LABEL_10;
}
}
LABEL_11:
if( !v13 )
goto LABEL_46;
LABEL_12:
if( ObjectList < 0 )
goto LABEL_25;
v14 = 0;
if( v6 - 20 >= 2 )
v14 = v6 - 20;
if( v14 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, v14, 879783504i64);
if( !PoolWithTag )
{
ObjectList = -1073741670;
goto LABEL_25;
}
v15 = v14 >> 1;
}
else
{
v15 = 0;
}
LODWORD(v24) = v15;
ObjectList = PnpGetObjectList(v11, v13, v10, v12, (INT64)PoolWithTag, v15, (INT64)&v24, 0);
LABEL_19:
if( ObjectList >= 0 )
{
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(ExpectedOutputSize) = v23;
LODWORD(BufferSize) = 2 * (_DWORD)v24;
v16 = PiCMReturnBufferResultData(
(unsigned int)ObjectList,
(unsigned int)(2 * (_DWORD)v24),
0i64,
PoolWithTag,
BufferSize,
ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v5);
goto LABEL_21;
}
LABEL_25:
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(ExpectedOutputSize) = v23;
LODWORD(BufferSize) = 0;
v16 = PiCMReturnBufferResultData(
(unsigned int)ObjectList,
(unsigned int)(2 * (_DWORD)v24),
0i64,
0i64,
BufferSize,
ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v5);
LABEL_21:
ObjectList = v16;
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x34706E50u);
LABEL_23:
PiCMReleaseObjectInputData(ObjectData);
return ObjectList;
}Referenced by:
PiCMHandleIoctl