CmGetMatchingFilteredDeviceInterfaceListWorker
NTSTATUS __stdcall CmGetMatchingFilteredDeviceInterfaceListWorker(
HPNPCTX *hPnpCtx,
const WCHAR *ClassGuid,
const WCHAR *DeviceInstanceId,
INT64 FilterFlags,
UINT8 *MatchCallbackRoutine,
HPNPCTX *a6,
const WCHAR *a7,
_CM_OBJECT_TYPE a8,
VOID *a9,
VOID *MatchCallbackContext,
WCHAR *Buffer,
UINT64 BufferLength,
UINT64 *RequiredLength,
UINT64 Flags){
WCHAR *v17;
char v18;
int CachedContextBaseKey;
__int64 v20;
NTSTATUS v21;
VOID **PoolWithTag;
NTSTATUS v23;
void *v24;
int v25;
unsigned int v26;
UINT64 dwFlags;
VOID *Handle;
INT64 v30;
_UNICODE_STRING UnicodeString;
_CM_OBJECT_TYPE v33;
v30 = 0i64;
*(_DWORD *)a9 = 0;
Handle = 0i64;
v17 = 0i64;
UnicodeString = 0i64;
if( a8 )
*a7 = 0;
if( (FilterFlags & 0xFFFFFFFE) != 0 || (_WORD)MatchCallbackContext )
goto LABEL_26;
v18 = FilterFlags & 1;
CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(hPnpCtx, PNPCTX_BASE_KEY_TYPE_DEVICECONTAINERS, (VOID **)&v30);
if( CachedContextBaseKey < 0 )
goto LABEL_20;
if( !ClassGuid )
{
v33 = CM_OBJECT_TYPE_DEVICE;
goto LABEL_8;
}
if( !PnpIsValidGuidString(ClassGuid) )
{
LABEL_26:
CachedContextBaseKey = -1073741811;
goto LABEL_20;
}
v33 = CM_OBJECT_TYPE_DEVICE_INSTALLER_CLASS;
LABEL_8:
if( hPnpCtx )
v20 = *((_QWORD *)hPnpCtx + 28);
else
v20 = 0i64;
v21 = SysCtxRegOpenKey(v20, (VOID *)v30, ClassGuid, 0, 8u, &Handle);
CachedContextBaseKey = v21;
if( v21 == -1073741444 )
{
CachedContextBaseKey = -1073741595;
}
else if( v21 >= 0 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x5B8ui64, 1380994640i64);
v17 = (WCHAR *)PoolWithTag;
if( PoolWithTag )
{
memset((char *)PoolWithTag + 4, 0i64, 0x5B4u);
LODWORD(dwFlags) = 2304;
*(_DWORD *)v17 = v33;
RtlStringCchCopyExW(v17 + 506, 0xC8ui64, (WCHAR *)DeviceInstanceId, 0i64, 0i64, dwFlags);
*((_QWORD *)v17 + 179) = MatchCallbackRoutine;
*((_QWORD *)v17 + 180) = a6;
*((_QWORD *)v17 + 177) = 0i64;
*((_DWORD *)v17 + 356) = 0;
*((_BYTE *)v17 + 1428) = v18;
*((_QWORD *)v17 + 181) = a7;
*((_DWORD *)v17 + 364) = a8;
*((_DWORD *)v17 + 365) = 0;
v23 = PnpCtxRegEnumKeyWithCallback((INT64)hPnpCtx, Handle, (INT64)CmDeviceClassesSubkeyCallback, (INT64)v17);
v24 = (void *)*((_QWORD *)v17 + 177);
CachedContextBaseKey = v23;
if( v24 )
ExFreePoolWithTag(v24, 0);
if( CachedContextBaseKey >= 0 )
{
v25 = *((_DWORD *)v17 + 365);
*(_DWORD *)a9 = v25;
if( v25 )
{
v26 = v25 + 1;
*(_DWORD *)a9 = v26;
if( a7 && a8 >= v26 )
a7[v26 - 1] = 0;
else
CachedContextBaseKey = -1073741789;
}
}
}
else
{
CachedContextBaseKey = -1073741801;
}
}
LABEL_20:
RtlFreeAnsiString(&UnicodeString);
if( v17 )
ExFreePoolWithTag(v17, 0);
if( Handle )
ZwClose((_HANDLE)Handle);
return CachedContextBaseKey;
}Referenced by:
CmGetMatchingFilteredDeviceInterfaceList