{"id":28643,"date":"2006-12-21T10:00:02","date_gmt":"2006-12-21T10:00:02","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/oldnewthing\/2006\/12\/21\/the-evolution-of-version-resources-32-bit-version-resources\/"},"modified":"2006-12-21T10:00:02","modified_gmt":"2006-12-21T10:00:02","slug":"the-evolution-of-version-resources-32-bit-version-resources","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/oldnewthing\/20061221-02\/?p=28643","title":{"rendered":"The evolution of version resources &#8211; 32-bit version resources"},"content":{"rendered":"<p>\nLast time we looked at the format of 16-bit version resources.\nThe 32-bit version is nearly identical, except that everything\nis now in Unicode.\nEach node is stored in the following structure\n(in pseudo-C):\n<\/p>\n<pre>\nstruct VERSIONNODE {\n  WORD  cbNode;\n  WORD  cbData;\n  WORD  wType;\n  WCHAR wszName[];\n  BYTE  rgbPadding1[]; \/\/ DWORD alignment\n  union {\n   BYTE  rgbData[cbData];\n   WCHAR wszValue[cbData \/ sizeof(WCHAR)];\n  };\n  BYTE  rgbPadding2[]; \/\/ DWORD alignment\n  VERSIONNODE rgvnChildren[];\n};\n<\/pre>\n<p>\nIn words, each version node begins with a 16-bit value\ndescribing the size of the nodes in bytes (including its children),\nfollowed by a 16-bit value that specifies how much data\n(either binary or text) are associated with the node.\nThe <code>wType<\/code> is zero if the node data is binary\nor one if the node data is a string.\nOther values of <code>wType<\/code> are reserved for future use.\nThe rest is the same as before:\nA null-terminated key name, padding for <code>DWORD<\/code> alignment,\nthe node data,\nmore padding, and then the child nodes.\n<\/p>\n<p>\nThe only change beyond the conversion to Unicode is the\nintroduction of the <code>wType<\/code> field.\nThis field is necessary so that the system knows whether to\nconvert the node data from Unicode to ANSI when somebody calls\nthe <code>VerQueryStringA<\/code>.\nIf it&#8217;s binary data, then no conversion is done;\nif it&#8217;s string data, then the string is converted.\n<\/p>\n<p>\nWe illustrate the 32-bit resource format by looking at the resources\nfor the 32-bit <code>shell32.dll<\/code>.\n<\/p>\n<pre>\n0000  98 03 34 00 00 00 56 00-53 00 5F 00 56 00 45 00  ..4...V.S._.V.E.\n0010  52 00 53 00 49 00 4F 00-4E 00 5F 00 49 00 4E 00  R.S.I.O.N._.I.N.\n0020  46 00 4F 00 00 00 00 00-BD 04 EF FE 00 00 01 00  F.O.............\n0030  00 00 06 00 35 0B 54 0B-00 00 06 00 35 0B 54 0b  ....5.T.....5.T.\n0040  3F 00 00 00 00 00 00 00-04 00 04 00 02 00 00 00  ?...............\n0050  00 00 00 00 00 00 00 00-00 00 00 00 F6 02 00 00  ................\n0060  01 00 53 00 74 00 72 00-69 00 6E 00 67 00 46 00  ..S.t.r.i.n.g.F.\n0070  69 00 6C 00 65 00 49 00-6E 00 66 00 6F 00 00 00  i.l.e.I.n.f.o...\n0080  D2 02 00 00 01 00 30 00-34 00 30 00 39 00 30 00  ......0.4.0.9.0.\n0090  34 00 42 00 30 00 00 00-4C 00 2C 00 01 00 43 00  4.B.0...L.....C.\n00A0  6F 00 6D 00 70 00 61 00-6E 00 79 00 4E 00 61 00  o.m.p.a.n.y.N.a.\n00B0  6D 00 65 00 00 00 00 00-4D 00 69 00 63 00 72 00  m.e.....M.i.c.r.\n00C0  6F 00 73 00 6F 00 66 00-74 00 20 00 43 00 6F 00  o.s.o.f.t. .C.o.\n00D0  72 00 70 00 6F 00 72 00-61 00 74 00 69 00 6F 00  r.p.o.r.a.t.i.o.\n00E0  6E 00 00 00 5A 00 32 00-01 00 46 00 69 00 6C 00  n...Z.....F.i.l.\n00F0  65 00 44 00 65 00 73 00-63 00 72 00 69 00 70 00  e.D.e.s.c.r.i.p.\n0100  74 00 69 00 6F 00 6E 00-00 00 00 00 57 00 69 00  t.i.o.n.....W.i.\n0110  6E 00 64 00 6F 00 77 00-73 00 20 00 53 00 68 00  n.d.o.w.s. .S.h.\n0120  65 00 6C 00 6C 00 20 00-43 00 6F 00 6D 00 6D 00  e.l.l. .C.o.m.m.\n0130  6F 00 6E 00 20 00 44 00-6C 00 6C 00 00 00 00 00  o.n. .D.l.l.....\n0140  74 00 54 00 01 00 46 00-69 00 6C 00 65 00 56 00  t.*...F.i.l.e.V.\n0150  65 00 72 00 73 00 69 00-6F 00 6E 00 00 00 00 00  e.r.s.i.o.n.....\n0160  36 00 2E 00 30 00 30 00-2E 00 32 00 39 00 30 00  6...0.0...2.9.0.\n0170  30 00 2E 00 32 00 38 00-36 00 39 00 20 00 28 00  0...2.8.6.9. .(.\n0180  78 00 70 00 73 00 70 00-5F 00 73 00 70 00 32 00  x.p.s.p._.s.p.2.\n0190  5F 00 67 00 64 00 72 00-2E 00 30 00 36 00 30 00  _.g.d.r...0.6.0.\n01A0  33 00 31 00 36 00 2D 00-31 00 35 00 31 00 32 00  3.1.6.-.1.5.1.2.\n01B0  29 00 00 00 30 00 10 00-01 00 49 00 6E 00 74 00  )...0.....I.n.t.\n01C0  65 00 72 00 6E 00 61 00-6C 00 4E 00 61 00 6D 00  e.r.n.a.l.N.a.m.\n01D0  65 00 00 00 53 00 48 00-45 00 4C 00 4C 00 33 00  e...S.H.E.L.L.3.\n01E0  32 00 00 00 80 00 5C 00-01 00 4C 00 65 00 67 00  2.........L.e.g.\n01F0  61 00 6C 00 43 00 6F 00-70 00 79 00 72 00 69 00  a.l.C.o.p.y.r.i.\n0200  67 00 68 00 74 00 00 00-A9 00 20 00 4D 00 69 00  g.h.t..... .M.i.\n0210  63 00 72 00 6F 00 73 00-6F 00 66 00 74 00 20 00  c.r.o.s.o.f.t. .\n0220  43 00 6F 00 72 00 70 00-6F 00 72 00 61 00 74 00  C.o.r.p.o.r.a.t.\n0230  69 00 6F 00 6E 00 2E 00-20 00 41 00 6C 00 6C 00  i.o.n... .A.l.l.\n0240  20 00 72 00 69 00 67 00-68 00 74 00 73 00 20 00   .r.i.g.h.t.s. .\n0250  72 00 65 00 73 00 65 00-72 00 76 00 65 00 64 00  r.e.s.e.r.v.e.d.\n0260  2E 00 00 00 40 00 18 00-01 00 4F 00 72 00 69 00  ....@.....O.r.i.\n0270  67 00 69 00 6E 00 61 00-6C 00 46 00 69 00 6C 00  g.i.n.a.l.F.i.l.\n0280  65 00 6E 00 61 00 6D 00-65 00 00 00 53 00 48 00  e.n.a.m.e...S.H.\n0290  45 00 4C 00 4C 00 33 00-32 00 2E 00 44 00 4C 00  E.L.L.3.2...D.L.\n02A0  4C 00 00 00 6A 00 25 00-01 00 50 00 72 00 6F 00  L...j.%...P.r.o.\n02B0  64 00 75 00 63 00 74 00-4E 00 61 00 6D 00 65 00  d.u.c.t.N.a.m.e.\n02C0  00 00 00 00 4D 00 69 00-63 00 72 00 6F 00 73 00  ....M.i.c.r.o.s.\n02D0  6F 00 66 00 74 00 AE 00-20 00 57 00 69 00 6E 00  o.f.t... .W.i.n.\n02E0  64 00 6F 00 77 00 73 00-AE 00 20 00 4F 00 70 00  d.o.w.s... .O.p.\n02F0  65 00 72 00 61 00 74 00-69 00 6E 00 67 00 20 00  e.r.a.t.i.n.g. .\n0300  53 00 79 00 73 00 74 00-65 00 6D 00 00 00 00 00  S.y.s.t.e.m.....\n0310  42 00 1E 00 01 00 50 00-72 00 6F 00 64 00 75 00  B.....P.r.o.d.u.\n0320  63 00 74 00 56 00 65 00-72 00 73 00 69 00 6F 00  c.t.V.e.r.s.i.o.\n0330  6E 00 00 00 36 00 2E 00-30 00 30 00 2E 00 32 00  n...6...0.0...2.\n0340  39 00 30 00 30 00 2E 00-32 00 38 00 36 00 39 00  9.0.0...2.8.6.9.\n0350  00 00 00 00 44 00 00 00-01 00 56 00 61 00 72 00  ....D.....V.a.r.\n0360  46 00 69 00 6C 00 65 00-49 00 6E 00 66 00 6F 00  F.i.l.e.I.n.f.o.\n0370  00 00 00 00 24 00 04 00-00 00 54 00 72 00 61 00  ....$.....T.r.a.\n0380  6E 00 73 00 6C 00 61 00-74 00 69 00 6F 00 6E 00  n.s.l.a.t.i.o.n.\n0390  00 00 00 00 09 04 B0 04                          ........\n<\/pre>\n<p>\nAs always, we start with the root node.\n<\/p>\n<pre>\n0000  98 03         \/\/ cbNode (node ends at 0x0000 + 0x0398 = 0x0398)\n0002  34 00         \/\/ cbData = sizeof(VS_FIXEDFILEINFO)\n0004  00 00         \/\/ wType = 0 (binary data)\n0006  56 00 53 00 5F 00 56 00 45 00 52 00 53 00 49 00\n      4F 00 4E 00 5F 00 49 00 4E 00 46 00 4F 00 00 00\n                    \/\/ L\"VS_VERSION_INFO\" + null terminator\n0026  00 00         \/\/ padding to restore alignment\n0028  BD 04 EF FE   \/\/ dwSignature\n002C  00 00 01 00   \/\/ dwStrucVersion\n0030  00 00 06 00   \/\/ dwFileVersionMS = 6.0\n0034  35 0B 54 0B   \/\/ dwFileVersionLS = 2900.2869\n0038  00 00 06 00   \/\/ dwProductVersionMS = 6.0\n003C  35 0B 54 0B   \/\/ dwProductVersionLS = 2900.2869\n0040  3F 00 00 00   \/\/ dwFileFlagsMask\n0044  00 00 00 00   \/\/ dwFileFlags\n0048  04 00 04 00   \/\/ dwFileOS = VOS_NT_WINDOWS32\n004C  02 00 00 00   \/\/ dwFileType = VFT_DLL\n0050  00 00 00 00   \/\/ dwFileSubtype\n0054  00 00 00 00   \/\/ dwFileDateMS\n0058  00 00 00 00   \/\/ dwFileDateLS\n005C                \/\/ no padding needed\n<\/pre>\n<p>\nAs with the 16-bit version resource, the root node is always\na binary node consisting of a <code>VS_FIXEDFILEINFO<\/code>.\nAfter the root node come its children.\n<\/p>\n<pre>\n005C  F6 02         \/\/ cbNode (node ends at 0x005C + 0x02F6 = 0x0352)\n005E  00 00         \/\/ cbData (no data)\n0060  01 00         \/\/ wType = 1 (string data)\n0062  53 00 74 00 72 00 69 00 6E 00 67 00 46 00 69 00\n      6C 00 65 00 49 00 6E 00 66 00 6F 00 00 00\n                    \/\/ L\"StringFileInfo\" + null terminator\n007E  00 00         \/\/ padding to restore alignment\n<\/pre>\n<p>\nThe <code>StringFileInfo<\/code> contains no data, so the fact\nthat it&#8217;s string data is irrelevant.\nAs before, the children of the <code>StringFileInfo<\/code> are\nlanguage nodes.\n<\/p>\n<pre>\n0080  D2 02         \/\/ cbNode (node ends at 0x0080 + 0x02D2 = 0x0352)\n0082  00 00         \/\/ cbData (no data)\n0084  01 00         \/\/ wType = 1 (string data)\n0086  30 00 34 00 30 00 39 00 30 00 34 00 42 00 30 00\n      00 00         \/\/ L\"040904B0\" + null terminator\n0098                \/\/ no padding needed\n<\/pre>\n<p>\nThe children of the language node are the strings that make up the\nbulk of the version information.\n<\/p>\n<pre>\n0098  4C 00         \/\/ cbNode (node ends at 0x0088 + 0x004C = 0x00D40)\n009A  2C 00         \/\/ cbData\n009C  01 00         \/\/ wType = 1 (string data)\n009E  43 00 6F 00 6D 00 70 00 61 00 6E 00 79 00 4E 00\n      61 00 6D 00 65 00 00 00\n                    \/\/ L\"CompanyName\" + null terminator\n00B6  00 00         \/\/ padding to restore alignment\n00B8  4D 00 69 00 63 00 72 00 6F 00 73 00 6F 00 66 00\n      74 00 20 00 43 00 6F 00 72 00 70 00 6F 00 72 00\n      61 00 74 00 69 00 6F 00 6E 00 00 00\n                    \/\/ L\"Microsoft Corporation\" + null terminator\n00E4                \/\/ no padding needed\n<\/pre>\n<p>\nNotice that for string types, the <code>cbData<\/code>\nincludes the null terminator.\n<\/p>\n<pre>\n00E4  5A 00         \/\/ cbNode (node ends at 0x00E4 + 0x005A = 0x013E)\n00E6  32 00         \/\/ cbData\n00E8  01 00         \/\/ wTypes = 1 (string data)\n00EA  46 00 69 00 6C 00 65 00 44 00 65 00 73 00 63 00\n      72 00 69 00 70 00 74 00 69 00 6F 00 6E 00 00 00\n                    \/\/ L\"FileDescription\" + null terminator\n010A  00 00         \/\/ padding to restore alignment\n010C  57 00 69 00 6E 00 64 00 6F 00 77 00 73 00 20 00\n      53 00 68 00 65 00 6C 00 6C 00 20 00 43 00 6F 00\n      6D 00 6D 00 6F 00 6E 00 20 00 44 00 6C 00 6C 00\n      00 00\n                    \/\/ L\"Windows Shell Common Dll\" + null terminator\n013E  00 00         \/\/ padding to restore alignment\n0140  74 00         \/\/ cbNode (node ends at 0x0140 + 0x0074 = 0x01B4)\n0142  54 00         \/\/ cbData\n0144  01 00         \/\/ wType = 1 (string data)\n0146  46 00 69 00 6C 00 65 00 56 00 65 00 72 00 73 00\n      69 00 6F 00 6E 00 00 00\n                    \/\/ L\"FileVersion\" + null terminator\n015E  00 00         \/\/ padding to restore alignment\n0160  36 00 2E 00 30 00 30 00 2E 00 32 00 39 00 30 00\n      30 00 2E 00 32 00 38 00 36 00 39 00 20 00 28 00\n      78 00 70 00 73 00 70 00 5F 00 73 00 70 00 32 00\n      5F 00 67 00 64 00 72 00 2E 00 30 00 36 00 30 00\n      33 00 31 00 36 00 2D 00 31 00 35 00 31 00 32 00\n      29 00 00 00\n                    \/\/ L\"6.00.2900.2869 (xpsp_sp2_gdr.060316-1512)\"\n                    \/\/ + null terminator\n01B4                \/\/ no padding needed\n01B4  30 00         \/\/ cbNode (node ends at 0x01B4 + 0x0030 = 0x01E4)\n01B6  10 00         \/\/ cbData\n01B8  01 00         \/\/ wType = 1 (string data)\n01BA  49 00 6E 00 74 00 65 00 72 00 6E 00 61 00 6C 00\n      4E 00 61 00 6D 00 65 00 00 00\n                    \/\/ L\"InternalName\" + null terminator\n01D4                \/\/ no padding needed\n01D4  53 00 48 00 45 00 4C 00 4C 00 33 00 32 00 00 00\n                    \/\/ L\"SHELL32\" + null terminator\n01E4                \/\/ no padding needed\n01E4  80 00         \/\/ cbNode (node ends at 0x01E4 + 0x0080 = 0x0264)\n01E6  5C 00         \/\/ cbData\n01E8  01 00         \/\/ wType = 1 (string data)\n01EA  4C 00 65 00 67 00 61 00 6C 00 43 00 6F 00 70 00\n      79 00 72 00 69 00 67 00 68 00 74 00 00 00\n                    \/\/ L\"LegalCopyright\" + null terminator\n0208                \/\/ no padding needed\n0208  A9 00 20 00 4D 00 69 00 63 00 72 00 6F 00 73 00\n      6F 00 66 00 74 00 20 00 43 00 6F 00 72 00 70 00\n      6F 00 72 00 61 00 74 00 69 00 6F 00 6E 00 2E 00\n      20 00 41 00 6C 00 6C 00 20 00 72 00 69 00 67 00\n      68 00 74 00 73 00 20 00 72 00 65 00 73 00 65 00\n      72 00 76 00 65 00 64 00 2E 00 00 00\n                    \/\/ L\"&#xA9; Microsoft Corporation. \"\n                    \/\/ L\"All rights reserved.\" + null terminator\n0264                \/\/ no padding needed\n0264  40 00         \/\/ cbNode (node ends at 0x0264 + 0x0040 = 0x02A4)\n0266  18 00         \/\/ cbData\n0268  01 00         \/\/ wType = 1 (string data)\n026A  4F 00 72 00 69 00 67 00 69 00 6E 00 61 00 6C 00\n      46 00 69 00 6C 00 65 00 6E 00 61 00 6D 00 65 00\n      00 00         \/\/ L\"OriginalFilename\" + null terminator\n028C                \/\/ no padding needed\n028C  53 00 48 00 45 00 4C 00 4C 00 33 00 32 00 2E 00\n      44 00 4C 00 4C 00 00 00\n                    \/\/ L\"SHELL32.DLL\" + null terminator\n02A4                \/\/ no padding needed\n02A4  6A 00         \/\/ cbNode (node ends at 0x02A4 + 0x006A = 0x030E)\n02A6  25 00 01 00 50 00 72 00 6F 00 64 00 75 00 63 00\n      74 00 4E 00 61 00 6D 00 65 00 00 00\n                    \/\/ L\"ProductName\" + null terminator\n02C2  00 00         \/\/ padding to restore alignment\n02C4  4D 00 69 00 63 00 72 00 6F 00 73 00 6F 00 66 00\n      74 00 AE 00 20 00 57 00 69 00 6E 00 64 00 6F 00\n      77 00 73 00 AE 00 20 00 4F 00 70 00 65 00 72 00\n      61 00 74 00 69 00 6E 00 67 00 20 00 53 00 79 00\n      73 00 74 00 65 00 6D 00 00 00\n                    \/\/ L\"Microsoft&#xAE; Windows&#xAE; \"\n                    \/\/ L\"Operating System\" + null terminator\n030E  00 00         \/\/ padding to restore alignment\n0310  42 00         \/\/ cbNode (node ends at 0x0310 + 0x0042 = 0x0352)\n0312  1E 00         \/\/ cbData\n0314  01 00         \/\/ wType = 1 (string data)\n0316  50 00 72 00 6F 00 64 00 75 00 63 00 74 00 56 00\n      65 00 72 00 73 00 69 00 6F 00 6E 00 00 00\n                    \/\/ L\"ProductVersion\" + null terminator\n0334                \/\/ no padding needed\n0334  36 00 2E 00 30 00 30 00 2E 00 32 00 39 00 30 00\n      30 00 2E 00 32 00 38 00 36 00 39 00 00 00\n                    \/\/ L\"6.00.2900.2869\" + null terminator\n0352  00 00         \/\/ padding to restore alignment\n<\/pre>\n<p>\nAt offset <code>0x0352<\/code>, we&#8217;ve reached the end of the\n<code>ProductVersion<\/code> node, the language node, and\nthe <code>StringFileInfo<\/code> node.\nThe next node is therefore a sibilng to <code>StringFileInfo<\/code>.<\/p>\n<pre>\n0354  44 00         \/\/ cbNode (node ends at 0x0354 + 0x0044 = 0x0394)\n0356  00 00         \/\/ cbData\n0358  01 00         \/\/ wType = 1 (string data)\n035A  56 00 61 00 72 00 46 00 69 00 6C 00 65 00 49 00\n      6E 00 66 00 6F 00 00 00\n                    \/\/ L\"VarFileInfo\" + null terminator\n0372  00 00         \/\/ padding to restore alignment\n<\/pre>\n<\/p>\n<p>Since we haven&#8217;t exhausted the <code>VarFileInfo<\/code> node,\nthe next node is a child.\n<\/p>\n<pre>\n0374  24 00         \/\/ cbNode (node ends at 0x0374 + 0x0024 = 0x0394)\n0376  04 00         \/\/ cbData\n0378  00 00         \/\/ wType = 0 (binary data)\n037A  54 00 72 00 61 00 6E 00 73 00 6C 00 61 00 74 00\n      69 00 6F 00 6E 00 00 00\n                    \/\/ L\"Translation\" + null terminator\n0392  00 00         \/\/ padding to restore alignment\n0394  09 04 B0 04   \/\/ 0x0409 = US English\n                    \/\/ 0x04B0 = 1200 = Unicode UCS-2 little-endian\n0398                \/\/ no padding needed\n<\/pre>\n<p>\nWe have reached the end of the <code>Translation<\/code> node,\nthe <code>VarFileInfo<\/code> node, and the root node.\nOur parsing of the version data is complete and resulted in the\nfollowing version resource:\n<\/p>\n<pre>\nFILEVERSION    3,0,2900,2869\nPRODUCTVERSION 3,0,2900,2869\nFILEFLAGSMASK  VS_FFI_FILEFLAGSMASK\nFILEFLAGS      0\nFILEOS         VOS_NT_WINDOWS32\nFILETYPE       VFT_DLL\nFILESUBTYPE    VFT_UNKNOWN\nBEGIN\n BLOCK \"StringFileInfo\"\n BEGIN\n  BLOCK \"040904B0\"\n  BEGIN\n   VALUE \"CompanyName\", \"Microsoft Corporation\"\n   VALUE \"FileDescription\", Windows Shell Common Dll\"\n   VALUE \"FileVersion\", \"6.00.2900.2869 (xpsp_sp2_gdr.060316-1512)\"\n   VALUE \"InternalName\", \"SHELL32\"\n   VALUE \"LegalCopyright\", \"\\251 Microsoft Corporation. All rights reserved.\"\n   VALUE \"OriginalFilename\", \"SHELL32.DLL\"\n   VALUE \"ProductName\", \"Microsoft\\256 Windows\\256 Operating System\"\n   VALUE \"ProductVersion\", \"6.00.2900.2869\"\n  END\n END\n BLOCK \"VarFileInfo\"\n BEGIN\n  VALUE \"Translation\", 0x0409, 0x04B0\n END\nEND\n<\/pre>\n<p>\nThere you have it, the format of 32-bit version resources.\nFuture versions of Windows may extend this format, but that&#8217;s\nwhat it looks like up through Windows&nbsp;Vista.\n<\/p>\n<p>\nNow, after all that byte-mashing, I have to confess that I&#8217;ve\nbeen lying to you.\nWhat you saw was not the actual version resource in\n<code>shell32.dll<\/code>.\nWe&#8217;ll discuss what&#8217;s really going on next time.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Last time we looked at the format of 16-bit version resources. The 32-bit version is nearly identical, except that everything is now in Unicode. Each node is stored in the following structure (in pseudo-C): struct VERSIONNODE { WORD cbNode; WORD cbData; WORD wType; WCHAR wszName[]; BYTE rgbPadding1[]; \/\/ DWORD alignment union { BYTE rgbData[cbData]; WCHAR [&hellip;]<\/p>\n","protected":false},"author":1069,"featured_media":111744,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[2],"class_list":["post-28643","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oldnewthing","tag-history"],"acf":[],"blog_post_summary":"<p>Last time we looked at the format of 16-bit version resources. The 32-bit version is nearly identical, except that everything is now in Unicode. Each node is stored in the following structure (in pseudo-C): struct VERSIONNODE { WORD cbNode; WORD cbData; WORD wType; WCHAR wszName[]; BYTE rgbPadding1[]; \/\/ DWORD alignment union { BYTE rgbData[cbData]; WCHAR [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/28643","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/users\/1069"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/comments?post=28643"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/28643\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media\/111744"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media?parent=28643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/categories?post=28643"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/tags?post=28643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}