PiCMGetObjectList
NTSTATUS __stdcall PiCMGetObjectList(
PVOID IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
PVOID IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
UINT64 *v5;
unsigned int v6;
UINT8 *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;
INT64 v21[2];
__int128 v22;
UINT64 v23;
UINT64 *v24;
v5 = v24;
LODWORD(v24) = 0;
v6 = IoctlOutputBufferSize;
v23 = 0i64;
PoolWithTag = 0i64;
*(_DWORD *)v5 = 0;
*(_OWORD *)v21 = 0i64;
v22 = 0i64;
ObjectList = PiCMCaptureObjectInputData(
(UINT64)IoctlInputBuffer,
IoctlInputBufferSize,
(unsigned int)BytesUsed,
(INT64)v21);
if( ObjectList < 0 )
goto LABEL_23;
if( (_QWORD)v22 || __PAIR64__(DWORD2(v22), 0) != HIDWORD(v21[0]) || HIDWORD(v22) )
{
ObjectList = -1073741811;
goto LABEL_19;
}
if( !IoctlOutputBuffer || v6 < 0x14 )
{
LABEL_46:
ObjectList = -1073741811;
goto LABEL_25;
}
v11 = LODWORD(v21[1]);
v12 = 1i64;
v13 = 0;
if( SLODWORD(v21[1]) <= 6 )
{
if( LODWORD(v21[1]) == 6 )
{
v13 = 6;
goto LABEL_12;
}
v11 = (unsigned int)(LODWORD(v21[1]) - 1);
if( LODWORD(v21[1]) == 1 )
{
v13 = 1;
ObjectList = -1073741637;
goto LABEL_12;
}
v11 = (unsigned int)(LODWORD(v21[1]) - 2);
if( LODWORD(v21[1]) == 2 )
{
v13 = 2;
goto LABEL_12;
}
v11 = (unsigned int)(LODWORD(v21[1]) - 3);
if( LODWORD(v21[1]) == 3 )
{
v13 = 4;
goto LABEL_12;
}
v11 = (unsigned int)(LODWORD(v21[1]) - 4);
if( LODWORD(v21[1]) == 4 )
{
v13 = 3;
goto LABEL_12;
}
if( LODWORD(v21[1]) == 5 )
{
v13 = 5;
goto LABEL_12;
}
}
else
{
switch( LODWORD(v21[1]) )
{
case 0x10001:
v11 = 7i64;
LABEL_10:
v13 = PiDrvDbCtx != 0 ? v11 : 0;
goto LABEL_11;
case 0x10002:
v11 = 8i64;
goto LABEL_10;
case 0x10003:
v11 = 9i64;
goto LABEL_10;
}
v11 = (unsigned int)(LODWORD(v21[1]) - 65540);
if( LODWORD(v21[1]) == 65540 )
{
v11 = 10i64;
goto LABEL_10;
}
if( LODWORD(v21[1]) == 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 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v14, 0x34706E50ui64);
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((INT64)v21);
return ObjectList;
}Referenced by:
No references.