CmEnumSubkeyCallback
__int64 __fastcall CmEnumSubkeyCallback(__int64 a1, char *a2, const wchar_t *a3, __int64 a4){
WCHAR *v8;
WCHAR *PoolWithTag;
WCHAR *v10;
WCHAR *v11;
UINT64 v12;
size_t v13;
NTSTRSAFE_PWSTR v14;
NTSTATUS v15;
__int64 v16;
unsigned int v17;
unsigned __int8(__fastcall *v18)(__int64, WCHAR *, __int64, _QWORD);
unsigned int v19;
WCHAR *v21;
UINT64 dwFlags;
UINT64 dwFlagsa;
HANDLE Handle;
size_t pcchRemaining;
NTSTRSAFE_PWSTR ppszDestEnd;
struct _UNICODE_STRING DestinationString;
char v28;
Handle = 0i64;
ppszDestEnd = 0i64;
pcchRemaining = 0i64;
v28 = 0;
v8 = 0i64;
DestinationString = 0i64;
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x190ui64, 0x52504E50ui64);
v10 = PoolWithTag;
if( PoolWithTag )
{
v11 = PoolWithTag;
v12 = 200i64;
if( *(_WORD *)(a4 + 4) )
{
LODWORD(dwFlags) = 2304;
if( (int)RtlStringCchCopyExW(PoolWithTag, 0xC8ui64, (WCHAR *)(a4 + 4), &ppszDestEnd, &pcchRemaining, dwFlags) < 0 )
goto LABEL_16;
v13 = pcchRemaining;
if( pcchRemaining < 2 )
goto LABEL_16;
v14 = ppszDestEnd;
*ppszDestEnd = 92;
v11 = v14 + 1;
v12 = v13 - 2;
*v11 = 0;
}
v15 = RtlStringCchCopyW(v11, v12, (PWCHAR)a3);
v16 = 0i64;
if( v15 >= 0 )
{
if( *(_DWORD *)a4 < 3u )
{
if( a1 )
v16 = *(_QWORD *)(a1 + 224);
if( (int)SysCtxRegOpenKey(v16, a2, a3, 8u, 0x20019u, &Handle) < 0 )
goto LABEL_16;
v21 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x1B8ui64, 0x52504E50ui64);
v8 = v21;
if( !v21 )
goto LABEL_16;
memset((INT64)v21, 0i64);
LODWORD(dwFlagsa) = 2304;
*(_DWORD *)v8 = *(_DWORD *)a4 + 1;
RtlStringCchCopyExW(v8 + 2, 0xC8ui64, v10, 0i64, 0i64, dwFlagsa);
*((_BYTE *)v8 + 404) = *(_BYTE *)(a4 + 404);
*((_QWORD *)v8 + 51) = *(_QWORD *)(a4 + 408);
*((_QWORD *)v8 + 52) = *(_QWORD *)(a4 + 416);
*((_QWORD *)v8 + 53) = *(_QWORD *)(a4 + 424);
*((_DWORD *)v8 + 108) = *(_DWORD *)(a4 + 432);
*((_DWORD *)v8 + 109) = *(_DWORD *)(a4 + 436);
PnpCtxRegEnumKeyWithCallback(a1, Handle, (__int64)CmEnumSubkeyCallback, (__int64)v8);
*(_DWORD *)(a4 + 436) = *((_DWORD *)v8 + 109);
*(_QWORD *)(a4 + 424) = *((_QWORD *)v8 + 53);
*(_DWORD *)(a4 + 432) = *((_DWORD *)v8 + 108);
goto LABEL_14;
}
if( (int)CmValidateDeviceName(0i64, v10) >= 0 && (int)RtlInitUnicodeStringEx(&DestinationString, v10) >= 0 )
{
v17 = DestinationString.MaximumLength >> 1;
if( !*(_BYTE *)(a4 + 404) || (int)CmIsDevicePresent(a1, v10, &v28) >= 0 && v28 )
{
v18 = *(unsigned __int8(__fastcall **)(__int64, WCHAR *, __int64, _QWORD))(a4 + 408);
if( !v18 || v18(a1, v10, 1i64, *(_QWORD *)(a4 + 416)) )
{
*(_DWORD *)(a4 + 436) += v17;
v19 = *(_DWORD *)(a4 + 432);
if( v19 > v17 )
{
LODWORD(dwFlags) = 2304;
RtlStringCchCopyExW(*(WCHAR **)(a4 + 424), v19, v10, 0i64, 0i64, dwFlags);
*(_QWORD *)(a4 + 424) += 2i64 * v17;
*(_DWORD *)(a4 + 432) -= v17;
LABEL_14:
if( v8 )
ExFreePoolWithTag(v8, 0);
}
}
}
}
}
LABEL_16:
ExFreePoolWithTag(v10, 0);
}
if( Handle )
ZwClose(Handle);
return 0i64;
}Referenced by:
No references.