CmEnumSubkeyCallback
PNPCTX_REG_ENUM_KEY_ACTION __stdcall CmEnumSubkeyCallback(
HPNPCTX *hPnpCtx,
VOID *hkParent,
WCHAR *KeyName,
VOID *Context){
WCHAR *v8;
VOID **PoolWithTag;
WCHAR *v10;
WCHAR *v11;
UINT64 v12;
__int64 v13;
__int64 v14;
NTSTATUS v15;
__int64 v16;
unsigned int v17;
unsigned __int8(__fastcall *v18)(HPNPCTX *, WCHAR *, __int64, _QWORD);
unsigned int v19;
VOID **v21;
UINT64 dwFlags;
UINT64 dwFlagsa;
VOID *Handle;
size_t pcchRemaining[2];
_NTSTRSAFE_PWSTR ppszDestEnd[2];
_UNICODE_STRING DestinationString;
UINT8 Present;
Handle = 0i64;
*(_QWORD *)ppszDestEnd = 0i64;
*(_QWORD *)pcchRemaining = 0i64;
Present = 0;
v8 = 0i64;
DestinationString = 0i64;
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x190ui64, 1380994640i64);
v10 = (WCHAR *)PoolWithTag;
if( PoolWithTag )
{
v11 = (WCHAR *)PoolWithTag;
v12 = 200i64;
if( *((_WORD *)Context + 2) )
{
LODWORD(dwFlags) = 2304;
if( RtlStringCchCopyExW(
(WCHAR *)PoolWithTag,
0xC8ui64,
(WCHAR *)Context + 2,
(WCHAR **)ppszDestEnd,
(UINT64 *)pcchRemaining,
dwFlags) < 0 )
goto LABEL_16;
v13 = *(_QWORD *)pcchRemaining;
if( *(_QWORD *)pcchRemaining < 2ui64 )
goto LABEL_16;
v14 = *(_QWORD *)ppszDestEnd;
**(_WORD **)ppszDestEnd = 92;
v11 = (WCHAR *)(v14 + 2);
v12 = v13 - 2;
*v11 = 0;
}
v15 = RtlStringCchCopyW(v11, v12, KeyName);
v16 = 0i64;
if( v15 >= 0 )
{
if( *(_DWORD *)Context < 3u )
{
if( hPnpCtx )
v16 = *((_QWORD *)hPnpCtx + 28);
if( SysCtxRegOpenKey(v16, hkParent, KeyName, 8u, 0x20019u, &Handle) < 0 )
goto LABEL_16;
v21 = ExAllocatePoolWithTag(1ui64, 0x1B8ui64, 1380994640i64);
v8 = (WCHAR *)v21;
if( !v21 )
goto LABEL_16;
memset(v21, 0i64, 0x1B8u);
LODWORD(dwFlagsa) = 2304;
*(_DWORD *)v8 = *(_DWORD *)Context + 1;
RtlStringCchCopyExW(v8 + 2, 0xC8ui64, v10, 0i64, 0i64, dwFlagsa);
*((_BYTE *)v8 + 404) = *((_BYTE *)Context + 404);
*((_QWORD *)v8 + 51) = *((_QWORD *)Context + 51);
*((_QWORD *)v8 + 52) = *((_QWORD *)Context + 52);
*((_QWORD *)v8 + 53) = *((_QWORD *)Context + 53);
*((_DWORD *)v8 + 108) = *((_DWORD *)Context + 108);
*((_DWORD *)v8 + 109) = *((_DWORD *)Context + 109);
PnpCtxRegEnumKeyWithCallback((INT64)hPnpCtx, Handle, (INT64)CmEnumSubkeyCallback, (INT64)v8);
*((_DWORD *)Context + 109) = *((_DWORD *)v8 + 109);
*((_QWORD *)Context + 53) = *((_QWORD *)v8 + 53);
*((_DWORD *)Context + 108) = *((_DWORD *)v8 + 108);
goto LABEL_14;
}
if( CmValidateDeviceName(0i64) >= 0 && RtlInitUnicodeStringEx(&DestinationString, v10) >= 0 )
{
v17 = DestinationString.MaximumLength >> 1;
if( !*((_BYTE *)Context + 404) || CmIsDevicePresent(hPnpCtx, v10, &Present) >= 0 && Present )
{
v18 = (unsigned __int8(__fastcall *)(HPNPCTX *, WCHAR *, __int64, _QWORD))*((_QWORD *)Context + 51);
if( !v18 || v18(hPnpCtx, v10, 1i64, *((_QWORD *)Context + 52)) )
{
*((_DWORD *)Context + 109) += v17;
v19 = *((_DWORD *)Context + 108);
if( v19 > v17 )
{
LODWORD(dwFlags) = 2304;
RtlStringCchCopyExW(*((WCHAR **)Context + 53), v19, v10, 0i64, 0i64, dwFlags);
*((_QWORD *)Context + 53) += 2i64 * v17;
*((_DWORD *)Context + 108) -= v17;
LABEL_14:
if( v8 )
ExFreePoolWithTag(v8, 0);
}
}
}
}
}
LABEL_16:
ExFreePoolWithTag(v10, 0);
}
if( Handle )
ZwClose((_HANDLE)Handle);
return 0;
}Referenced by:
No references.