CmGetMatchingDeviceListForSubkey
__int64 __fastcall CmGetMatchingDeviceListForSubkey(
__int64 a1,
const WCHAR *a2,
char a3,
__int64 a4,
__int64 a5,
_WORD *a6,
unsigned int a7,
unsigned int *a8){
int CachedContextBaseKey;
WCHAR *v11;
int v12;
__int64 v13;
int v14;
VOID *PoolWithTag;
__int64 v16;
unsigned int v17;
unsigned int v18;
WCHAR *v20;
UINT64 dwFlags;
HANDLE Handle;
char *v23;
v23 = 0i64;
*a8 = 0;
Handle = 0i64;
if( a7 )
*a6 = 0;
CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(a1, 5, (__int64 *)&v23);
if( CachedContextBaseKey >= 0 )
{
v11 = (WCHAR *)a2;
v12 = 0;
if( a2 )
{
while( *v11 && *v11 != 92 )
{
if( (unsigned int)++v12 > 2 )
{
CachedContextBaseKey = -1073741811;
goto LABEL_17;
}
v20 = wcschr(v11, 0x5Cu);
if( v20 )
{
v11 = v20 + 1;
if( v11 )
continue;
}
goto LABEL_5;
}
CachedContextBaseKey = -1073741811;
}
LABEL_5:
if( CachedContextBaseKey >= 0 )
{
v13 = 0i64;
if( a1 )
v13 = *(_QWORD *)(a1 + 224);
v14 = SysCtxRegOpenKey(v13, v23, a2, 0, 8u, &Handle);
CachedContextBaseKey = v14;
if( v14 == -1073741444 )
{
CachedContextBaseKey = -1073741595;
}
else if( v14 >= 0 )
{
PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x1B8ui64, 0x52504E50ui64);
v16 = (__int64)PoolWithTag;
if( PoolWithTag )
{
memset((INT64)PoolWithTag + 4, 0i64);
LODWORD(dwFlags) = 2304;
*(_DWORD *)v16 = v12 + 1;
RtlStringCchCopyExW((WCHAR *)(v16 + 4), 0xC8ui64, (WCHAR *)a2, 0i64, 0i64, dwFlags);
*(_BYTE *)(v16 + 404) = a3;
*(_QWORD *)(v16 + 408) = a4;
*(_QWORD *)(v16 + 416) = a5;
*(_QWORD *)(v16 + 424) = a6;
*(_DWORD *)(v16 + 432) = a7;
*(_DWORD *)(v16 + 436) = 0;
CachedContextBaseKey = PnpCtxRegEnumKeyWithCallback(a1, Handle, (__int64)CmEnumSubkeyCallback, v16);
if( CachedContextBaseKey >= 0 )
{
v17 = *(_DWORD *)(v16 + 436);
*a8 = v17;
if( v17 )
{
v18 = v17 + 1;
*a8 = v18;
if( a6 && a7 >= v18 )
a6[v18 - 1] = 0;
else
CachedContextBaseKey = -1073741789;
}
}
ExFreePoolWithTag((PVOID)v16, 0);
}
else
{
CachedContextBaseKey = -1073741801;
}
}
}
}
LABEL_17:
if( Handle )
ZwClose(Handle);
return(unsigned int)CachedContextBaseKey;
}Referenced by:
CmGetMatchingDeviceList
CmGetMatchingFilteredDeviceListWorker