PiCMGetObjectPropertyKeys
NTSTATUS __stdcall PiCMGetObjectPropertyKeys(
VOID *IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
VOID *IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
UINT64 *v5;
unsigned int v6;
VOID **PoolWithTag;
int ObjectPropertyKeys;
unsigned int v10;
int v11;
UINT64 v12;
unsigned __int64 v13;
NTSTATUS v14;
unsigned __int64 v16;
UINT64 v17;
UINT64 ExpectedOutputSize;
UINT64 IoctlOutputBufferSizea;
_CMAPI_INPUT_OBJECT_DATA ObjectData[4];
INT64 v21[2];
UINT64 v22;
INT64 v23;
v5 = (UINT64 *)v23;
LODWORD(v23) = 0;
v6 = IoctlOutputBufferSize;
v22 = 0i64;
PoolWithTag = 0i64;
*(_DWORD *)v5 = 0;
*(_OWORD *)ObjectData = 0i64;
*(_OWORD *)v21 = 0i64;
ObjectPropertyKeys = PiCMCaptureObjectInputData(
IoctlInputBuffer,
IoctlInputBufferSize,
(_CMAPI_INPUT_OBJECT_DATA *)(unsigned int)BytesUsed);
if( ObjectPropertyKeys < 0 )
goto LABEL_42;
if( !v21[0] || ObjectData[1] || HIDWORD(v21[1]) )
{
ObjectPropertyKeys = -1073741811;
goto LABEL_48;
}
if( !IoctlOutputBuffer || v6 < 0x14 )
{
ObjectPropertyKeys = -1073741811;
goto LABEL_39;
}
v10 = 0;
if( ObjectData[2] > 6 )
{
switch( ObjectData[2] )
{
case 65537:
v11 = 7;
break;
case 65538:
v11 = 8;
break;
case 65539:
v11 = 9;
break;
case 65540:
v11 = 10;
break;
case 65541:
v11 = 11;
break;
default:
goto LABEL_31;
}
v10 = *(&stru_140CF2E80 + 608) != 0i64 ? v11 : 0;
LABEL_31:
if( !v10 )
ObjectPropertyKeys = -1073741811;
goto LABEL_33;
}
switch( ObjectData[2] )
{
case 6:
v10 = 6;
goto LABEL_33;
case 1:
v10 = 1;
goto LABEL_33;
case 2:
v10 = 2;
goto LABEL_33;
case 3:
v10 = 4;
goto LABEL_33;
case 4:
v10 = 3;
goto LABEL_33;
}
if( ObjectData[2] != 5 )
goto LABEL_31;
v10 = 5;
LABEL_33:
if( ObjectPropertyKeys < 0 )
{
LABEL_39:
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(ExpectedOutputSize) = v22;
LODWORD(v17) = 0;
v14 = PiCMReturnBufferResultData(
(unsigned int)ObjectPropertyKeys,
(unsigned int)(20 * v23),
0i64,
0i64,
v17,
ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v5);
goto LABEL_40;
}
v12 = 0i64;
if( v6 - 20 >= 0x14 )
v12 = v6 - 20;
if( (_DWORD)v12 )
{
v13 = (unsigned int)v12;
PoolWithTag = ExAllocatePoolWithTag(1ui64, v12, 879783504i64);
if( !PoolWithTag )
{
ObjectPropertyKeys = -1073741670;
goto LABEL_39;
}
v16 = v13 / 0x14;
}
else
{
LODWORD(v16) = 0;
}
LODWORD(IoctlOutputBufferSizea) = v16;
LODWORD(v23) = v16;
ObjectPropertyKeys = PnpGetObjectPropertyKeys(
*(&stru_140CF2E80 + 607),
v21[0],
v10,
0i64,
v17,
0,
(INT64)PoolWithTag,
IoctlOutputBufferSizea,
(INT64)&v23);
LABEL_48:
if( ObjectPropertyKeys < 0 )
goto LABEL_39;
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(ExpectedOutputSize) = v22;
LODWORD(v17) = 20 * v23;
v14 = PiCMReturnBufferResultData(
(unsigned int)ObjectPropertyKeys,
(unsigned int)(20 * v23),
0i64,
PoolWithTag,
v17,
ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v5);
LABEL_40:
ObjectPropertyKeys = v14;
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x34706E50u);
LABEL_42:
PiCMReleaseObjectInputData(ObjectData);
return ObjectPropertyKeys;
}Referenced by:
PiCMHandleIoctl