Created
April 16, 2026 10:39
-
-
Save cnbluefire/45b31748c696d092be985e395fdd7929 to your computer and use it in GitHub Desktop.
Retrieving device information using RtlGetDeviceFamilyInfoEnum.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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