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