HalpKdEnumerateDebuggingDevices

INT64 __stdcall HalpKdEnumerateDebuggingDevices(
        VOID *LoaderBlock,
        DEBUG_DEVICE_DESCRIPTOR *Device,
        KD_CALLBACK_ACTION Callback,
        DEBUG_DEVICE_DESCRIPTOR **a4){
  __int64 v6; 
  __int128 v7; 
  unsigned int v8; 
  void *Memory; 
  int v10; 
  UINT64 v11; 
  unsigned __int64 v12; 
  wchar_t *PoolWithTag; 
  if( !Device )
    return 3221225485i64;
  if( Device->Configured )
    return 0i64;
  if( KdDebugDevice
    && *(_BYTE *)(KdDebugDevice + 19)
    && (unsigned __int8)HalpDeviceEquals((DEBUG_DEVICE_DESCRIPTOR *)LoaderBlock, Device) )
  {
    v6 = KdDebugDevice;
    *(_OWORD *)&Device->Bus = *(_OWORD *)KdDebugDevice;
    *(_OWORD *)&Device->ProgIf = *(_OWORD *)(v6 + 16);
    *(_OWORD *)&Device->BaseAddress[0].TranslatedAddress = *(_OWORD *)(v6 + 32);
    *(_OWORD *)&Device->BaseAddress[1].Type = *(_OWORD *)(v6 + 48);
    *(_OWORD *)&Device->BaseAddress[1].Length = *(_OWORD *)(v6 + 64);
    *(_OWORD *)&Device->BaseAddress[2].TranslatedAddress = *(_OWORD *)(v6 + 80);
    *(_OWORD *)&Device->BaseAddress[3].Type = *(_OWORD *)(v6 + 96);
    v7 = *(_OWORD *)(v6 + 112);
    v6 += 128i64;
    *(_OWORD *)&Device->BaseAddress[3].Length = v7;
    *(_OWORD *)&Device->BaseAddress[4].TranslatedAddress = *(_OWORD *)v6;
    *(_OWORD *)&Device->BaseAddress[5].Type = *(_OWORD *)(v6 + 16);
    *(_OWORD *)&Device->BaseAddress[5].Length = *(_OWORD *)(v6 + 32);
    *(_OWORD *)&Device->Memory.MaxEnd.LowPart = *(_OWORD *)(v6 + 48);
    *(_OWORD *)&Device->Memory.Length = *(_OWORD *)(v6 + 64);
    *(_OWORD *)&Device->OemData = *(_OWORD *)(v6 + 80);
    *(_OWORD *)&Device->NameSpacePath = *(_OWORD *)(v6 + 96);
    Device->TransportData = *(_DEBUG_TRANSPORT_DATA *)(v6 + 112);
    v8 = *(_DWORD *)(KdDebugDevice + 216);
    if( v8 && *(_QWORD *)(KdDebugDevice + 208) )
    {
      if( HalpMmLoaderBlock )
        Memory = HalpMmAllocateMemory(v8);
      else
        Memory = ExAllocatePoolWithTag(PagedPool, *(unsigned int *)(KdDebugDevice + 216), 0x206C6148ui64);
      Device->OemData = Memory;
      if( !Memory )
        return 3221225473i64;
      memmove((UINT8 *)Memory, *(UINT8 **)(KdDebugDevice + 208), *(unsigned int *)(KdDebugDevice + 216));
    }
    v10 = *(_DWORD *)(KdDebugDevice + 232);
    if( !v10 || !*(_QWORD *)(KdDebugDevice + 224) )
      goto LABEL_22;
    v11 = (unsigned int)(v10 + 2);
    v12 = (unsigned int)v11;
    if( HalpMmLoaderBlock )
      PoolWithTag = (wchar_t *)HalpMmAllocateMemory(v11);
    else
      PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, (unsigned int)v11, 0x206C6148ui64);
    Device->NameSpacePath = PoolWithTag;
    if( PoolWithTag )
    {
      memset((INT64)PoolWithTag, 0i64);
      wcsncpy_s(
        Device->NameSpacePath,
        v12 >> 1,
        *(WCHAR **)(KdDebugDevice + 224),
        (unsigned __int64)*(unsigned int *)(KdDebugDevice + 232) >> 1);
LABEL_22:
      *(_WORD *)&Device->Initialized = 256;
      return 0i64;
    }
  }
  return 3221225473i64;
}

Referenced by:

HalpKdSetupDebuggingDevice