PiCMEnumerateSubKeys
NTSTATUS __stdcall PiCMEnumerateSubKeys(
VOID *IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
VOID *IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
UINT64 *v5;
unsigned int v6;
VOID **PoolWithTag;
int v9;
UINT64 v10;
NTSTATUS v11;
unsigned int v13;
PNPCTX_BASE_KEY_TYPE v14;
NTSTATUS CachedContextBaseKey;
unsigned int v16;
unsigned int v17;
int v18;
NTSTATUS v19;
UINT64 v20;
UINT64 ExpectedOutputSize;
VOID *IoctlOutputBuffera;
VOID *IoctlOutputBufferb;
UINT64 IoctlOutputBufferSizea;
INT64 v25;
UINT64 KeyIndex[2];
UINT64 v27;
UINT64 *BytesUseda;
v5 = BytesUseda;
v25 = 0i64;
v6 = IoctlOutputBufferSize;
LODWORD(BytesUsed) = 0;
LODWORD(BytesUseda) = 0;
*(_DWORD *)v5 = 0;
*(_OWORD *)KeyIndex = 0i64;
LODWORD(v27) = 0;
PoolWithTag = 0i64;
v9 = PiCMCaptureEnumerateInputData(
IoctlInputBuffer,
IoctlInputBufferSize,
(_CMAPI_INPUT_ENUMERATE_DATA *)IoctlOutputBuffer);
if( v9 < 0 )
return v9;
if( HIDWORD(KeyIndex[0]) )
goto LABEL_3;
if( !IoctlOutputBuffer || v6 < 0x14 )
{
v10 = 3221225485i64;
goto LABEL_29;
}
v13 = v6 - 20;
if( v6 - 20 < 2 )
goto LABEL_3;
PoolWithTag = ExAllocatePoolWithTag(1ui64, v13, 879783504i64);
if( !PoolWithTag )
{
v10 = 3221225626i64;
goto LABEL_4;
}
LODWORD(BytesUsed) = v13 >> 1;
if( LODWORD(KeyIndex[1]) == 1 )
{
v14 = PNPCTX_BASE_KEY_TYPE_ENUM;
goto LABEL_19;
}
if( LODWORD(KeyIndex[1]) == 2 )
{
v14 = PNPCTX_BASE_KEY_TYPE_CLASS;
goto LABEL_19;
}
if( LODWORD(KeyIndex[1]) != 3 )
{
LABEL_3:
v10 = 3221225485i64;
LABEL_4:
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(ExpectedOutputSize) = v27;
LODWORD(v20) = 0;
v11 = PiCMReturnBufferResultData(
v10,
(unsigned int)(2 * (_DWORD)BytesUsed),
0i64,
0i64,
v20,
ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v5);
goto LABEL_5;
}
v14 = PNPCTX_BASE_KEY_TYPE_DEVICECLASSES;
LABEL_19:
CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(*(&stru_140CF2E80 + 607), v14, (VOID **)&v25);
v10 = (unsigned int)CachedContextBaseKey;
if( CachedContextBaseKey < 0 )
goto LABEL_4;
v16 = HIDWORD(KeyIndex[1]);
v17 = RegRtlEnumKey(
(VOID *)v25,
HIDWORD(KeyIndex[1]),
(WCHAR *)PoolWithTag,
(UINT64 *)&BytesUsed,
v20,
ExpectedOutputSize,
(INT64)IoctlOutputBuffera,
IoctlOutputBufferSizea);
v10 = v17;
if( v17 == -2147483622 )
{
if( LODWORD(KeyIndex[1]) != 3 )
goto LABEL_4;
if( !CmIsStateSeparationEnabled() )
goto LABEL_4;
v18 = PnpCtxRegQueryInfoKey(v10, (VOID *)v25, &BytesUseda, 0i64, 0i64, 0i64, 0i64);
v10 = (unsigned int)v18;
if( v18 < 0 )
goto LABEL_4;
if( v16 < (unsigned int)BytesUseda )
{
v10 = 3221225701i64;
goto LABEL_4;
}
v19 = PnpCtxGetCachedContextBaseKey(*(&stru_140CF2E80 + 607), PNPCTX_BASE_KEY_TYPE_DEVICECONTAINERS, (VOID **)&v25);
v10 = (unsigned int)v19;
if( v19 < 0 )
goto LABEL_4;
v10 = (unsigned int)RegRtlEnumKey(
(VOID *)v25,
v16 - (unsigned int)BytesUseda,
(WCHAR *)PoolWithTag,
(UINT64 *)&BytesUsed,
v20,
ExpectedOutputSize,
(INT64)IoctlOutputBufferb,
IoctlOutputBufferSizea);
}
LABEL_29:
if( (v10 & 0x80000000) != 0i64 )
goto LABEL_4;
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(ExpectedOutputSize) = v27;
LODWORD(v20) = 2 * (_DWORD)BytesUsed;
v11 = PiCMReturnBufferResultData(
v10,
(unsigned int)(2 * (_DWORD)BytesUsed),
0i64,
PoolWithTag,
v20,
ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v5);
LABEL_5:
v9 = v11;
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x34706E50u);
return v9;
}Referenced by:
PiCMHandleIoctl