CmEnumSubkeyCallback

__int64 __fastcall CmEnumSubkeyCallback(__int64 a1, char *a2, const wchar_t *a3, __int64 a4){
  WCHAR *v8; 
  WCHAR *PoolWithTag; 
  WCHAR *v10; 
  WCHAR *v11; 
  UINT64 v12; 
  size_t v13; 
  NTSTRSAFE_PWSTR v14; 
  NTSTATUS v15; 
  __int64 v16; 
  unsigned int v17; 
  unsigned __int8(__fastcall *v18)(__int64, WCHAR *, __int64, _QWORD); 
  unsigned int v19; 
  WCHAR *v21; 
  UINT64 dwFlags; 
  UINT64 dwFlagsa; 
  HANDLE Handle; 
  size_t pcchRemaining; 
  NTSTRSAFE_PWSTR ppszDestEnd; 
  struct _UNICODE_STRING DestinationString; 
  char v28; 
  Handle = 0i64;
  ppszDestEnd = 0i64;
  pcchRemaining = 0i64;
  v28 = 0;
  v8 = 0i64;
  DestinationString = 0i64;
  PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x190ui64, 0x52504E50ui64);
  v10 = PoolWithTag;
  if( PoolWithTag )
  {
    v11 = PoolWithTag;
    v12 = 200i64;
    if( *(_WORD *)(a4 + 4) )
    {
      LODWORD(dwFlags) = 2304;
      if( (int)RtlStringCchCopyExW(PoolWithTag, 0xC8ui64, (WCHAR *)(a4 + 4), &ppszDestEnd, &pcchRemaining, dwFlags) < 0 )
        goto LABEL_16;
      v13 = pcchRemaining;
      if( pcchRemaining < 2 )
        goto LABEL_16;
      v14 = ppszDestEnd;
      *ppszDestEnd = 92;
      v11 = v14 + 1;
      v12 = v13 - 2;
      *v11 = 0;
    }
    v15 = RtlStringCchCopyW(v11, v12, (PWCHAR)a3);
    v16 = 0i64;
    if( v15 >= 0 )
    {
      if( *(_DWORD *)a4 < 3u )
      {
        if( a1 )
          v16 = *(_QWORD *)(a1 + 224);
        if( (int)SysCtxRegOpenKey(v16, a2, a3, 8u, 0x20019u, &Handle) < 0 )
          goto LABEL_16;
        v21 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x1B8ui64, 0x52504E50ui64);
        v8 = v21;
        if( !v21 )
          goto LABEL_16;
        memset((INT64)v21, 0i64);
        LODWORD(dwFlagsa) = 2304;
        *(_DWORD *)v8 = *(_DWORD *)a4 + 1;
        RtlStringCchCopyExW(v8 + 2, 0xC8ui64, v10, 0i64, 0i64, dwFlagsa);
        *((_BYTE *)v8 + 404) = *(_BYTE *)(a4 + 404);
        *((_QWORD *)v8 + 51) = *(_QWORD *)(a4 + 408);
        *((_QWORD *)v8 + 52) = *(_QWORD *)(a4 + 416);
        *((_QWORD *)v8 + 53) = *(_QWORD *)(a4 + 424);
        *((_DWORD *)v8 + 108) = *(_DWORD *)(a4 + 432);
        *((_DWORD *)v8 + 109) = *(_DWORD *)(a4 + 436);
        PnpCtxRegEnumKeyWithCallback(a1, Handle, (__int64)CmEnumSubkeyCallback, (__int64)v8);
        *(_DWORD *)(a4 + 436) = *((_DWORD *)v8 + 109);
        *(_QWORD *)(a4 + 424) = *((_QWORD *)v8 + 53);
        *(_DWORD *)(a4 + 432) = *((_DWORD *)v8 + 108);
        goto LABEL_14;
      }
      if( (int)CmValidateDeviceName(0i64, v10) >= 0 && (int)RtlInitUnicodeStringEx(&DestinationString, v10) >= 0 )
      {
        v17 = DestinationString.MaximumLength >> 1;
        if( !*(_BYTE *)(a4 + 404) || (int)CmIsDevicePresent(a1, v10, &v28) >= 0 && v28 )
        {
          v18 = *(unsigned __int8(__fastcall **)(__int64, WCHAR *, __int64, _QWORD))(a4 + 408);
          if( !v18 || v18(a1, v10, 1i64, *(_QWORD *)(a4 + 416)) )
          {
            *(_DWORD *)(a4 + 436) += v17;
            v19 = *(_DWORD *)(a4 + 432);
            if( v19 > v17 )
            {
              LODWORD(dwFlags) = 2304;
              RtlStringCchCopyExW(*(WCHAR **)(a4 + 424), v19, v10, 0i64, 0i64, dwFlags);
              *(_QWORD *)(a4 + 424) += 2i64 * v17;
              *(_DWORD *)(a4 + 432) -= v17;
LABEL_14:
              if( v8 )
                ExFreePoolWithTag(v8, 0);
            }
          }
        }
      }
    }
LABEL_16:
    ExFreePoolWithTag(v10, 0);
  }
  if( Handle )
    ZwClose(Handle);
  return 0i64;
}

Referenced by:

No references.