PiPnpRtlGetFilteredDeviceList
INT64 __fastcall PiPnpRtlGetFilteredDeviceList(INT64 a1){
int v1;
WCHAR *PoolWithTag;
WCHAR *v4;
bool v5;
char v6;
_WORD *v7;
int inited;
WCHAR *v11;
__int64 v12;
char v13;
int CmObjectListFromCache;
PVOID v15;
ULONG v16;
__int64 v17;
char v18;
int v19;
WCHAR *v20;
int v21;
WCHAR *v22;
__int64 v23;
char v24;
int pcchRemaining;
int pcchRemaininga;
UINT64 dwFlags;
__int64 dwFlagsa;
__int64 dwFlagsb;
__int64 dwFlagsc;
UINT64 *v31;
struct _UNICODE_STRING DestinationString;
INT64 v33[2];
__int128 v34;
__int64 r8_0;
char v36;
int v37;
__int16 v38;
char v39;
PVOID P;
__int64 v41;
__int64 v42;
__int64 v43;
size_t v44;
NTSTRSAFE_PWSTR ppszDestEnd;
v1 = *(_DWORD *)(a1 + 24);
v37 = 0;
v38 = 0;
v39 = 0;
PoolWithTag = 0i64;
HIDWORD(v41) = 0;
ppszDestEnd = 0i64;
v44 = 0i64;
*(_OWORD *)v33 = 0i64;
v34 = 0i64;
DestinationString = 0i64;
if( (v1 & 0x7C) != 0 )
{
inited = -1073741802;
LABEL_30:
if( PoolWithTag )
{
v16 = 1198550608;
v15 = PoolWithTag;
goto LABEL_15;
}
}
else
{
if( (v1 & 1) != 0 )
{
v20 = *(WCHAR **)(a1 + 16);
if( v20 )
{
v21 = 0;
while( *v20 )
{
if( *v20 == 92 )
break;
if( (unsigned int)++v21 > 2 )
break;
v22 = wcschr(v20, 0x5Cu);
if( v22 )
{
v20 = v22 + 1;
if( v20 )
continue;
}
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x190ui64, 0x47706E50ui64);
if( !PoolWithTag )
return(unsigned int)-1073741670;
LODWORD(dwFlags) = 2048;
inited = RtlStringCchCopyExW(PoolWithTag, 0xC8ui64, *(WCHAR **)(a1 + 16), &ppszDestEnd, &v44, dwFlags);
if( inited >= 0 )
{
if( v44 < 2 )
{
inited = -1073741811;
}
else
{
*(_DWORD *)ppszDestEnd = 92;
inited = RtlInitUnicodeStringEx(&DestinationString, PoolWithTag);
if( inited >= 0 )
{
v23 = *(_QWORD *)(a1 + 48);
v33[0] = (INT64)&DestinationString;
v24 = BYTE1(*(_DWORD *)(a1 + 24)) & 1;
*(_DWORD *)((char *)&v33[1] + 1) = 0;
LOBYTE(v33[1]) = v24;
v34 = *(_OWORD *)(a1 + 32);
dwFlagsc = *(_QWORD *)(a1 + 64);
pcchRemaininga = *(_DWORD *)(a1 + 56);
*(_WORD *)((char *)&v33[1] + 5) = 0;
HIBYTE(v33[1]) = 0;
inited = PiDmGetCmObjectListFromCache(
1i64,
(__int64)PiPnpRtlEnumeratorFilterCallback,
(__int64)v33,
v23,
pcchRemaininga,
dwFlagsc);
}
}
}
goto LABEL_30;
}
}
return(unsigned int)-1073741811;
}
if( (v1 & 2) == 0 )
{
if( (v1 & 0x80u) == 0 )
{
v17 = *(_QWORD *)(a1 + 48);
v5 = (v1 & 0x100) != 0;
*(_DWORD *)((char *)&v33[1] + 1) = 0;
v18 = v33[1];
if( v5 )
v18 = 1;
*(_WORD *)((char *)&v33[1] + 5) = 0;
LOBYTE(v33[1]) = v18;
v34 = *(_OWORD *)(a1 + 32);
dwFlagsb = *(_QWORD *)(a1 + 64);
v19 = *(_DWORD *)(a1 + 56);
HIBYTE(v33[1]) = 0;
return(unsigned int)PiDmGetCmObjectListFromCache(
1i64,
(__int64)PiPnpRtlEnumeratorFilterCallback,
(__int64)v33,
v17,
v19,
dwFlagsb);
}
v4 = *(WCHAR **)(a1 + 16);
if( v4 )
{
v5 = (v1 & 0x100) != 0;
*(_DWORD *)((char *)&v33[1] + 1) = 0;
v6 = v33[1];
if( v5 )
v6 = 1;
*(_WORD *)((char *)&v33[1] + 5) = 0;
LOBYTE(v33[1]) = v6;
v34 = *(_OWORD *)(a1 + 32);
v31 = *(UINT64 **)(a1 + 64);
LODWORD(dwFlags) = *(_DWORD *)(a1 + 56);
v7 = *(_WORD **)(a1 + 48);
HIBYTE(v33[1]) = 0;
return(unsigned int)PiDmGetCmObjectConstraintListFromCache(
5i64,
v4,
(INT64)PiPnpRtlEnumeratorFilterCallback,
(INT64)v33,
v7,
dwFlags,
v31);
}
return(unsigned int)-1073741811;
}
v11 = *(WCHAR **)(a1 + 16);
if( !v11 )
return(unsigned int)-1073741811;
inited = RtlInitUnicodeStringEx(&DestinationString, v11);
if( inited >= 0 )
{
v12 = *(_QWORD *)(a1 + 48);
r8_0 = (__int64)&DestinationString;
v13 = BYTE1(*(_DWORD *)(a1 + 24)) & 1;
v37 = 0;
v36 = v13;
v42 = *(_QWORD *)(a1 + 32);
v43 = *(_QWORD *)(a1 + 40);
dwFlagsa = *(_QWORD *)(a1 + 64);
pcchRemaining = *(_DWORD *)(a1 + 56);
v38 = 0;
v39 = 0;
v41 = 0i64;
P = 0i64;
CmObjectListFromCache = PiDmGetCmObjectListFromCache(
1i64,
(__int64)PiPnpRtlServiceFilterCallback,
(__int64)&r8_0,
v12,
pcchRemaining,
dwFlagsa);
v15 = P;
inited = CmObjectListFromCache;
if( P )
{
v16 = 0;
LABEL_15:
ExFreePoolWithTag(v15, v16);
}
}
}
return(unsigned int)inited;
}Referenced by:
PiPnpRtlCmActionCallback