CmDeviceClassesSubkeyCallback
__int64 __fastcall CmDeviceClassesSubkeyCallback(__int64 a1, char *a2, const wchar_t *a3, unsigned int *a4){
__int64 v5;
unsigned __int64 v6;
WCHAR *v9;
_WORD *PoolWithTag;
WCHAR *v11;
__int64 v12;
unsigned int v13;
UINT64 v14;
WCHAR *v15;
unsigned int v16;
unsigned __int8(__fastcall *v17)(__int64, WCHAR *, __int64, _QWORD);
unsigned int v18;
__int64 v20;
WCHAR *v21;
__int64 v22;
UINT64 dwFlags;
UINT64 dwFlagsa;
int v25;
__int64 v26;
HANDLE Handle;
NTSTRSAFE_PWSTR ppszDestEnd;
size_t pcchRemaining;
UNICODE_STRING String2;
UNICODE_STRING String1;
struct _UNICODE_STRING DestinationString;
char v33;
Handle = 0i64;
v5 = *a4;
v6 = -1i64;
v25 = 0;
ppszDestEnd = 0i64;
pcchRemaining = 0i64;
v33 = 0;
v9 = 0i64;
PoolWithTag = 0i64;
v11 = 0i64;
DestinationString = 0i64;
String1 = 0i64;
String2 = 0i64;
if( (_DWORD)v5 == 1 )
{
v22 = -1i64;
do
++v22;
while( a3[v22] );
if( v22 != 38 || *a3 != 123 )
return 0i64;
}
else if( (unsigned int)(v5 - 2) <= 1 )
{
v12 = -1i64;
do
++v12;
while( a3[v12] );
if( !v12 || *a3 != 35 )
return 0i64;
}
if( (unsigned int)v5 >= 3 && ((_DWORD)v5 != 3 || !*((_BYTE *)a4 + 1428)) )
goto LABEL_10;
v20 = 0i64;
if( a1 )
v20 = *(_QWORD *)(a1 + 224);
if( (int)SysCtxRegOpenKey(v20, a2, a3, 8u, 0x20019u, &Handle) >= 0 )
{
LABEL_10:
v13 = *a4;
if( *a4 < 3 )
{
if( v13 == 2 && *((_WORD *)a4 + 506) )
{
PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x190ui64, 0x52504E50ui64);
if( !PoolWithTag )
goto LABEL_38;
LODWORD(v26) = 400;
if( (int)RegRtlQueryValue(Handle, L"DeviceInstance", &v25, PoolWithTag, (__int64)&v26) < 0 )
goto LABEL_36;
if( v25 != 1 )
goto LABEL_36;
if( (unsigned int)v26 < 2 )
goto LABEL_36;
PoolWithTag[199] = 0;
if( (int)RtlInitUnicodeStringEx(&String1, PoolWithTag) < 0
|| (int)RtlInitUnicodeStringEx(&String2, (WCHAR *)a4 + 506) < 0
|| !RtlEqualUnicodeString(&String1, &String2, 1u) )
{
goto LABEL_36;
}
}
v13 = *a4;
}
else if( v13 == 3 )
{
do
++v6;
while( a3[v6] );
if( v6 <= 1 || *a3 != 35 )
goto LABEL_17;
v33 = 1;
v13 = 3;
}
if( v13 < 2 )
goto LABEL_25;
LABEL_17:
v11 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x3F0ui64, 0x52504E50ui64);
if( v11 )
{
v14 = 504i64;
if( *((_WORD *)a4 + 2) )
{
LODWORD(dwFlags) = 2304;
if( (int)RtlStringCchCopyExW(v11, 0x1F8ui64, (WCHAR *)a4 + 2, &ppszDestEnd, &pcchRemaining, dwFlags) < 0 )
goto LABEL_34;
v15 = ppszDestEnd;
v14 = pcchRemaining - 1;
*ppszDestEnd = 0;
}
else
{
v15 = v11;
}
if( v33 == 1 || *a4 == 2 )
{
if( RtlStringCchCopyW(v15, v14, (PWCHAR)a3) < 0 )
goto LABEL_34;
if( v33 == 1 )
*v15 = 92;
}
LABEL_25:
if( *a4 < 3 )
{
v21 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x5B8ui64, 0x52504E50ui64);
v9 = v21;
if( v21 )
{
memset((INT64)v21, 0i64);
*(_DWORD *)v9 = *a4 + 1;
LODWORD(dwFlags) = 2304;
RtlStringCchCopyExW(v9 + 2, 0x1F8ui64, v11, 0i64, 0i64, dwFlags);
LODWORD(dwFlagsa) = 2304;
RtlStringCchCopyExW(v9 + 506, 0xC8ui64, (WCHAR *)a4 + 506, 0i64, 0i64, dwFlagsa);
*((_QWORD *)v9 + 177) = *((_QWORD *)a4 + 177);
*((_DWORD *)v9 + 356) = a4[356];
*((_BYTE *)v9 + 1428) = *((_BYTE *)a4 + 1428);
*((_QWORD *)v9 + 179) = *((_QWORD *)a4 + 179);
*((_QWORD *)v9 + 180) = *((_QWORD *)a4 + 180);
*((_QWORD *)v9 + 181) = *((_QWORD *)a4 + 181);
*((_DWORD *)v9 + 364) = a4[364];
*((_DWORD *)v9 + 365) = a4[365];
PnpCtxRegEnumKeyWithCallback(a1, Handle, (__int64)CmDeviceClassesSubkeyCallback, (__int64)v9);
*((_QWORD *)a4 + 177) = *((_QWORD *)v9 + 177);
a4[356] = *((_DWORD *)v9 + 356);
a4[365] = *((_DWORD *)v9 + 365);
*((_QWORD *)a4 + 181) = *((_QWORD *)v9 + 181);
a4[364] = *((_DWORD *)v9 + 364);
LABEL_32:
if( v9 )
ExFreePoolWithTag(v9, 0);
}
}
else
{
*(_QWORD *)v11 = *(_QWORD *)L"\\\\?\\";
if( (int)CmValidateDeviceInterfaceName(v5, v11) >= 0
&& (int)RtlInitUnicodeStringEx(&DestinationString, v11) >= 0 )
{
v16 = DestinationString.MaximumLength >> 1;
if( *((_BYTE *)a4 + 1428) )
{
CmIsDeviceInterfaceEnabled(a1, v11);
}
else
{
v17 = (unsigned __int8(__fastcall *)(__int64, WCHAR *, __int64, _QWORD))*((_QWORD *)a4 + 179);
if( !v17 || v17(a1, v11, 3i64, *((_QWORD *)a4 + 180)) )
{
a4[365] += v16;
v18 = a4[364];
if( v18 > v16 )
{
LODWORD(dwFlags) = 2304;
RtlStringCchCopyExW(*((WCHAR **)a4 + 181), v18, v11, 0i64, 0i64, dwFlags);
*((_QWORD *)a4 + 181) += 2i64 * v16;
a4[364] -= v16;
goto LABEL_32;
}
}
}
}
}
LABEL_34:
if( v11 )
ExFreePoolWithTag(v11, 0);
}
LABEL_36:
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0);
}
LABEL_38:
if( Handle )
ZwClose(Handle);
return 0i64;
}Referenced by:
No references.