Skip to content

Instantly share code, notes, and snippets.

@cnbluefire
Created April 16, 2026 10:39
Show Gist options
  • Select an option

  • Save cnbluefire/45b31748c696d092be985e395fdd7929 to your computer and use it in GitHub Desktop.

Select an option

Save cnbluefire/45b31748c696d092be985e395fdd7929 to your computer and use it in GitHub Desktop.
Retrieving device information using RtlGetDeviceFamilyInfoEnum.
using System.Runtime.InteropServices;
public static class DeviceFamilyInfoHelper
{
private static nint pGetDeviceFamilyInfo;
static DeviceFamilyInfoHelper()
{
if (!NativeLibrary.TryLoad("ntdll.dll", out var handle)
|| !NativeLibrary.TryGetExport(handle, "RtlGetDeviceFamilyInfoEnum", out pGetDeviceFamilyInfo))
{
pGetDeviceFamilyInfo = -1;
}
}
public unsafe static bool GetDeviceFamilyInfo(out UAPInfoVersion uapInfo, out DeviceFamilyInfoEnum deviceFamily, out DeviceFamilyDeviceForm deviceForm)
{
uapInfo = default;
deviceFamily = default;
deviceForm = default;
if (pGetDeviceFamilyInfo == -1) return false;
fixed (void* pUapInfo = &uapInfo)
fixed (void* pDeviceFamily = &deviceFamily)
fixed (void* pDeviceForm = &deviceForm)
{
((delegate* unmanaged[Stdcall]<ulong*, uint*, uint*, void>)pGetDeviceFamilyInfo)((ulong*)pUapInfo, (uint*)pDeviceFamily, (uint*)pDeviceForm);
return true;
}
}
public enum DeviceFamilyInfoEnum : uint
{
DEVICEFAMILYINFOENUM_UAP = 0x00,
DEVICEFAMILYINFOENUM_WINDOWS_8X = 0x01,
DEVICEFAMILYINFOENUM_WINDOWS_PHONE_8X = 0x02,
DEVICEFAMILYINFOENUM_DESKTOP = 0x03,
DEVICEFAMILYINFOENUM_MOBILE = 0x04,
DEVICEFAMILYINFOENUM_XBOX = 0x05,
DEVICEFAMILYINFOENUM_TEAM = 0x06,
DEVICEFAMILYINFOENUM_IOT = 0x07,
DEVICEFAMILYINFOENUM_IOT_HEADLESS = 0x08,
DEVICEFAMILYINFOENUM_SERVER = 0x09,
DEVICEFAMILYINFOENUM_HOLOGRAPHIC = 0x0A,
DEVICEFAMILYINFOENUM_XBOXSRA = 0x0B,
DEVICEFAMILYINFOENUM_XBOXERA = 0x0C,
DEVICEFAMILYINFOENUM_SERVER_NANO = 0x0D,
DEVICEFAMILYINFOENUM_8828080 = 0x0E,
DEVICEFAMILYINFOENUM_7067329 = 0x0F,
DEVICEFAMILYINFOENUM_WINDOWS_CORE = 0x10,
DEVICEFAMILYINFOENUM_WINDOWS_CORE_HEADLESS = 0x11,
}
public enum DeviceFamilyDeviceForm : uint
{
DEVICEFAMILYDEVICEFORM_UNKNOWN = 0x00,
DEVICEFAMILYDEVICEFORM_PHONE = 0x01,
DEVICEFAMILYDEVICEFORM_TABLET = 0x02,
DEVICEFAMILYDEVICEFORM_DESKTOP = 0x03,
DEVICEFAMILYDEVICEFORM_NOTEBOOK = 0x04,
DEVICEFAMILYDEVICEFORM_CONVERTIBLE = 0x05,
DEVICEFAMILYDEVICEFORM_DETACHABLE = 0x06,
DEVICEFAMILYDEVICEFORM_ALLINONE = 0x07,
DEVICEFAMILYDEVICEFORM_STICKPC = 0x08,
DEVICEFAMILYDEVICEFORM_PUCK = 0x09,
DEVICEFAMILYDEVICEFORM_LARGESCREEN = 0x0A,
DEVICEFAMILYDEVICEFORM_HMD = 0x0B,
DEVICEFAMILYDEVICEFORM_INDUSTRY_HANDHELD = 0x0C,
DEVICEFAMILYDEVICEFORM_INDUSTRY_TABLET = 0x0D,
DEVICEFAMILYDEVICEFORM_BANKING = 0x0E,
DEVICEFAMILYDEVICEFORM_BUILDING_AUTOMATION = 0x0F,
DEVICEFAMILYDEVICEFORM_DIGITAL_SIGNAGE = 0x10,
DEVICEFAMILYDEVICEFORM_GAMING = 0x11,
DEVICEFAMILYDEVICEFORM_HOME_AUTOMATION = 0x12,
DEVICEFAMILYDEVICEFORM_INDUSTRIAL_AUTOMATION = 0x13,
DEVICEFAMILYDEVICEFORM_KIOSK = 0x14,
DEVICEFAMILYDEVICEFORM_MAKER_BOARD = 0x15,
DEVICEFAMILYDEVICEFORM_MEDICAL = 0x16,
DEVICEFAMILYDEVICEFORM_NETWORKING = 0x17,
DEVICEFAMILYDEVICEFORM_POINT_OF_SERVICE = 0x18,
DEVICEFAMILYDEVICEFORM_PRINTING = 0x19,
DEVICEFAMILYDEVICEFORM_THIN_CLIENT = 0x1A,
DEVICEFAMILYDEVICEFORM_TOY = 0x1B,
DEVICEFAMILYDEVICEFORM_VENDING = 0x1C,
DEVICEFAMILYDEVICEFORM_INDUSTRY_OTHER = 0x1D,
DEVICEFAMILYDEVICEFORM_XBOX_ONE = 0x1E,
DEVICEFAMILYDEVICEFORM_XBOX_ONE_S = 0x1F,
DEVICEFAMILYDEVICEFORM_XBOX_ONE_X = 0x20,
DEVICEFAMILYDEVICEFORM_XBOX_ONE_X_DEVKIT = 0x21,
}
[StructLayout(LayoutKind.Explicit, Size = sizeof(ulong))]
public struct UAPInfoVersion
{
[FieldOffset(6)]
public ushort Major;
[FieldOffset(4)]
public ushort Minor;
[FieldOffset(2)]
public ushort Build;
[FieldOffset(0)]
public ushort Revision;
public override string ToString()
{
return $"{Major}.{Minor}.{Build}.{Revision}";
}
public static implicit operator Version(UAPInfoVersion v) => new Version(v.Major, v.Minor, v.Build, v.Revision);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment