DrvDbGetObjectSubKeyCallback
__int64 __fastcall DrvDbGetObjectSubKeyCallback(__int64 a1, char *a2, const wchar_t *a3, __int64 a4){
const wchar_t **v4;
__int64 v5;
int v6;
unsigned int v11;
WCHAR *PoolWithTag;
WCHAR *v13;
WCHAR *v14;
int v15;
NTSTRSAFE_PWSTR v16;
__int64 v17;
__int64 v18;
_OWORD *v19;
__int64 v20;
_OWORD *v21;
_OWORD *v22;
__int128 v23;
unsigned __int8(__fastcall *v24)(__int64, WCHAR *, _QWORD, _QWORD);
unsigned int v25;
unsigned int v26;
UINT64 dwFlags;
UINT64 dwFlagsa;
int v30;
HANDLE Handle;
size_t pcchRemaining;
NTSTRSAFE_PWSTR ppszDestEnd;
struct _UNICODE_STRING DestinationString;
int v35;
v4 = (const wchar_t **)&off_140007248;
ppszDestEnd = 0i64;
pcchRemaining = 0i64;
v5 = 0i64;
Handle = 0i64;
v6 = 0;
v35 = 0;
v30 = 0;
DestinationString = 0i64;
while( wcsicmp(a3, *v4) )
{
++v6;
++v4;
if( v6 )
{
v11 = 256;
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x200ui64, 0x42444450ui64);
v13 = PoolWithTag;
if( !PoolWithTag )
break;
v14 = PoolWithTag;
if( *(_WORD *)(a4 + 8) )
{
LODWORD(dwFlags) = 2304;
if( (int)RtlStringCchCopyExW(PoolWithTag, 0x100ui64, (WCHAR *)(a4 + 8), &ppszDestEnd, &pcchRemaining, dwFlags) >= 0 )
{
v15 = pcchRemaining;
if( pcchRemaining >= 2 )
{
v16 = ppszDestEnd;
*ppszDestEnd = 92;
v14 = v16 + 1;
*v14 = 0;
v11 = v15 - 2;
goto LABEL_9;
}
}
LABEL_28:
ExFreePoolWithTag(v13, 0);
break;
}
LABEL_9:
if( RtlStringCchCopyW(v14, v11, (PWCHAR)a3) < 0 )
goto LABEL_28;
v17 = 0i64;
if( a1 )
v17 = *(_QWORD *)(a1 + 224);
if( (int)SysCtxRegOpenKey(v17, a2, a3, 8u, 0x20019u, &Handle) < 0
|| (int)PnpCtxRegQueryInfoKey(v18, Handle, &v35, 0i64, &v30, 0i64, 0i64) < 0 )
{
goto LABEL_28;
}
if( v35 && *(_DWORD *)(a4 + 4) < *(_DWORD *)a4 )
{
v19 = ExAllocatePoolWithTag(PagedPool, 0x228ui64, 0x42444450ui64);
v5 = (__int64)v19;
if( !v19 )
goto LABEL_28;
v20 = 4i64;
v21 = v19;
v22 = (_OWORD *)a4;
do
{
*v21 = *v22;
v21[1] = v22[1];
v21[2] = v22[2];
v21[3] = v22[3];
v21[4] = v22[4];
v21[5] = v22[5];
v21[6] = v22[6];
v21 += 8;
v23 = v22[7];
v22 += 8;
*(v21 - 1) = v23;
--v20;
}
while( v20 );
LODWORD(dwFlagsa) = 2304;
*v21 = *v22;
v21[1] = v22[1];
*((_QWORD *)v21 + 4) = *((_QWORD *)v22 + 4);
++*(_DWORD *)(v5 + 4);
RtlStringCchCopyExW((WCHAR *)(v5 + 8), 0x100ui64, v13, 0i64, 0i64, dwFlagsa);
PnpCtxRegEnumKeyWithCallback(a1, Handle, (__int64)DrvDbGetObjectSubKeyCallback, v5);
*(_QWORD *)(a4 + 536) = *(_QWORD *)(v5 + 536);
*(_DWORD *)(a4 + 544) = *(_DWORD *)(v5 + 544);
*(_DWORD *)(a4 + 548) = *(_DWORD *)(v5 + 548);
}
if( v30 )
{
v24 = *(unsigned __int8(__fastcall **)(__int64, WCHAR *, _QWORD, _QWORD))(a4 + 520);
if( (!v24 || v24(a1, v13, 0i64, *(_QWORD *)(a4 + 528)))
&& (int)RtlInitUnicodeStringEx(&DestinationString, v13) >= 0 )
{
v25 = *(_DWORD *)(a4 + 544);
v26 = DestinationString.MaximumLength >> 1;
*(_DWORD *)(a4 + 548) += v26;
if( v25 > v26 )
{
LODWORD(dwFlagsa) = 2304;
RtlStringCchCopyExW(*(WCHAR **)(a4 + 536), v25, v13, 0i64, 0i64, dwFlagsa);
*(_QWORD *)(a4 + 536) += 2i64 * v26;
*(_DWORD *)(a4 + 544) -= v26;
}
}
}
if( v5 )
ExFreePoolWithTag((PVOID)v5, 0);
goto LABEL_28;
}
}
if( Handle )
ZwClose(Handle);
return 0i64;
}Referenced by:
No references.