PiCMGetObjectPropertyKeys
INT64 __stdcall PiCMGetObjectPropertyKeys(
PVOID IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
PVOID IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
UINT64 *v5;
unsigned int v6;
UINT8 *PoolWithTag;
int ObjectPropertyKeys;
unsigned int v10;
int v11;
UINT64 v12;
unsigned __int64 v13;
int v14;
unsigned __int64 v16;
UINT64 v17;
UINT64 ExpectedOutputSize;
UINT64 IoctlOutputBufferSizea;
INT64 v20[2];
__int128 v21;
UINT64 v22;
UINT64 *v23;
v5 = v23;
LODWORD(v23) = 0;
v6 = IoctlOutputBufferSize;
v22 = 0i64;
PoolWithTag = 0i64;
*(_DWORD *)v5 = 0;
*(_OWORD *)v20 = 0i64;
v21 = 0i64;
ObjectPropertyKeys = PiCMCaptureObjectInputData(
(UINT64)IoctlInputBuffer,
IoctlInputBufferSize,
(unsigned int)BytesUsed,
(INT64)v20);
if( ObjectPropertyKeys < 0 )
goto LABEL_42;
if( !(_QWORD)v21 || HIDWORD(v20[0]) || HIDWORD(v21) )
{
ObjectPropertyKeys = -1073741811;
goto LABEL_48;
}
if( !IoctlOutputBuffer || v6 < 0x14 )
{
ObjectPropertyKeys = -1073741811;
goto LABEL_39;
}
v10 = 0;
if( SLODWORD(v20[1]) > 6 )
{
switch( LODWORD(v20[1]) )
{
case 0x10001:
v11 = 7;
break;
case 0x10002:
v11 = 8;
break;
case 0x10003:
v11 = 9;
break;
case 0x10004:
v11 = 10;
break;
case 0x10005:
v11 = 11;
break;
default:
goto LABEL_31;
}
v10 = PiDrvDbCtx != 0 ? v11 : 0;
LABEL_31:
if( !v10 )
ObjectPropertyKeys = -1073741811;
goto LABEL_33;
}
switch( LODWORD(v20[1]) )
{
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( LODWORD(v20[1]) != 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 * (_DWORD)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 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v12, 0x34706E50ui64);
if( !PoolWithTag )
{
ObjectPropertyKeys = -1073741670;
goto LABEL_39;
}
v16 = v13 / 0x14;
}
else
{
LODWORD(v16) = 0;
}
LODWORD(v23) = v16;
ObjectPropertyKeys = PnpGetObjectPropertyKeys(
PiPnpRtlCtx,
v21,
v10,
0i64,
v17,
0,
(__int64)PoolWithTag,
v16,
(__int64)&v23);
LABEL_48:
if( ObjectPropertyKeys < 0 )
goto LABEL_39;
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(ExpectedOutputSize) = v22;
LODWORD(v17) = 20 * (_DWORD)v23;
v14 = PiCMReturnBufferResultData(
(unsigned int)ObjectPropertyKeys,
(unsigned int)(20 * (_DWORD)v23),
0i64,
PoolWithTag,
v17,
ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v5);
LABEL_40:
ObjectPropertyKeys = v14;
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x34706E50u);
LABEL_42:
PiCMReleaseObjectInputData((INT64)v20);
return(unsigned int)ObjectPropertyKeys;
}Referenced by:
No references.