What do all the recent NTDDI_VERSION values mean?

1 min read

If you’ve looked through semi-recent Windows SDK headers, you might’ve noticed preprocessor directives such as this:

#if (NTDDI_VERSION >= NTDDI_WIN10_CU)

But what does NTDDI_WIN10_CU mean in this context? Google isn’t much help, and Microsoft’s own documentation is conspicuously missing these more recent macros:

  • NTDDI_WIN10_VB
  • NTDDI_WIN10_MN
  • NTDDI_WIN10_FE
  • NTDDI_WIN10_CO
  • NTDDI_WIN10_NI
  • NTDDI_WIN10_CU
  • NTDDI_WIN11_ZN
  • NTDDI_WIN11_GA
  • NTDDI_WIN11_GE

You may recognise some of those suffixes as chemical elements. And, in fact, they all are apart from VB. (VB is apparently Vibranium, used as a substitute for chromium to avoid confusion.1)

What Windows version those chemical elements relate to can be found from a list of Windows code names on Wikipedia (as well as from other sources). (Note that some of the chemical elements don’t refer to stable versions of Windows.)

If you want to know what Windows 10 or 11 version a function, interface or similar became available in, however, trying to go off the NTDDI_VERSION preprocessor directive used doesn’t always give you the correct answer in my experience – I’ve found that the relevant bit of documentation on learn.microsoft.com is usually a better guide2.

(On that last point, dwrite_3.h currently contains this gem:

#if NTDDI_VERSION >= NTDDI_WIN10_CU // TODO - set correct DDI version

)

Footnotes

  1. List of Microsoft codenames – Wikipedia

  2. When the documentation is actually available. Some newer DirectWrite interfaces are only documented for DWriteCore, for some reason.