{"id":7433,"date":"2012-06-07T07:00:00","date_gmt":"2012-06-07T07:00:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/oldnewthing\/2012\/06\/07\/eventually-the-window-manager-simply-says-that-enough-is-enough\/"},"modified":"2012-06-07T07:00:00","modified_gmt":"2012-06-07T07:00:00","slug":"eventually-the-window-manager-simply-says-that-enough-is-enough","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/oldnewthing\/20120607-00\/?p=7433","title":{"rendered":"Eventually the window manager simply says that enough is enough"},"content":{"rendered":"<p>\nMany window manager operations are recursive,\nand eventually\nthe window manager will simply say that enough is enough\nwhen the recursion goes too deep.\nWe&#8217;ve seen this when you\n<a HREF=\"http:\/\/blogs.msdn.com\/b\/oldnewthing\/archive\/2003\/12\/18\/44379.aspx\">\nnest windows more than 50 levels deep<\/a>\nor\n<a HREF=\"http:\/\/blogs.msdn.com\/oldnewthing\/archive\/2003\/12\/30\/46594.aspx\">\nnest menus more than 25 levels deep<\/a>,\nfor example.\n(Note also that these limits may change in the future, so don&#8217;t\nrely on being able to walk right up to the edge.\nThose values came from 32-bit Windows&nbsp;XP;\nI don&#8217;t know if the limits have been dropped even further in\nsubsequent versions of Windows, and I&#8217;m not sufficiently\nmotivated to find out.)\n<\/p>\n<p>\nA customer had some code which installed a message hook,\nand they found that the message hook was not called consistently.\nThey tracked it down to another component in their application,\nand that component also installed a message hook.\nThe contact actually came from the developer who maintained the\nother component:\nDid I write my message hook incorrectly?\nAm I accidentally messing up other message hooks in the system?\n<\/p>\n<p>\nThe developer included their hook-management code, and it didn&#8217;t\nlook obviously wrong.\nAll code paths eventually called <code>Call&shy;Next&shy;Hook&shy;Ex<\/code>,\nso there shouldn&#8217;t be any hook-loss.\n<\/p>\n<p>\nThe customer was kind enough to include a copy of their program\nwith instructions on how to trigger the problem,\nand stepping through the hook code quickly revealed the source\nof the problem.\nMaybe you can see it too.\nHere&#8217;s a stack trace when the end of the hook chain is reached:\n<\/p>\n<pre>\nChildEBP RetAddr\n0011cdc4 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011cdf8 768231eb user32!DispatchHookA+0x104\n0011ce38 76824260 user32!CallHookWithSEH+0x21\n0011ce6c 773e642e user32!__fnHkINLPMSG+0x71\n0011ceb0 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011ceb4 76844787 user32!NtUserCallNextHookEx+0xc\n0011ced8 6fbdb1e0 user32!CallNextHookEx+0x71\n0011cf14 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011cf48 768231eb user32!DispatchHookA+0x104\n0011cf88 76824260 user32!CallHookWithSEH+0x21\n0011cfbc 773e642e user32!__fnHkINLPMSG+0x71\n0011d000 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011d004 76844787 user32!NtUserCallNextHookEx+0xc\n0011d028 6fbdb1e0 user32!CallNextHookEx+0x71\n0011d064 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011d098 768231eb user32!DispatchHookA+0x104\n0011d0d8 76824260 user32!CallHookWithSEH+0x21\n0011d10c 773e642e user32!__fnHkINLPMSG+0x71\n0011d150 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011d154 76844787 user32!NtUserCallNextHookEx+0xc\n0011d178 6fbdb1e0 user32!CallNextHookEx+0x71\n0011d1b4 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011d1e8 768231eb user32!DispatchHookA+0x104\n0011d228 76824260 user32!CallHookWithSEH+0x21\n0011d25c 773e642e user32!__fnHkINLPMSG+0x71\n0011d2a0 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011d2a4 76844787 user32!NtUserCallNextHookEx+0xc\n0011d2c8 6fbdb1e0 user32!CallNextHookEx+0x71\n0011d304 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011d338 768231eb user32!DispatchHookA+0x104\n0011d378 76824260 user32!CallHookWithSEH+0x21\n0011d3ac 773e642e user32!__fnHkINLPMSG+0x71\n0011d3f0 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011d3f4 76844787 user32!NtUserCallNextHookEx+0xc\n0011d418 6fbdb1e0 user32!CallNextHookEx+0x71\n0011d454 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011d488 768231eb user32!DispatchHookA+0x104\n0011d4c8 76824260 user32!CallHookWithSEH+0x21\n0011d4fc 773e642e user32!__fnHkINLPMSG+0x71\n0011d540 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011d544 76844787 user32!NtUserCallNextHookEx+0xc\n0011d568 6fbdb1e0 user32!CallNextHookEx+0x71\n0011d5a4 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011d5d8 768231eb user32!DispatchHookA+0x104\n0011d618 76824260 user32!CallHookWithSEH+0x21\n0011d64c 773e642e user32!__fnHkINLPMSG+0x71\n0011d690 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011d694 76844787 user32!NtUserCallNextHookEx+0xc\n0011d6b8 6fbdb1e0 user32!CallNextHookEx+0x71\n0011d6f4 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011d728 768231eb user32!DispatchHookA+0x104\n0011d768 76824260 user32!CallHookWithSEH+0x21\n0011d79c 773e642e user32!__fnHkINLPMSG+0x71\n0011d7e0 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011d7e4 76844787 user32!NtUserCallNextHookEx+0xc\n0011d808 6fbdb1e0 user32!CallNextHookEx+0x71\n0011d844 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011d878 768231eb user32!DispatchHookA+0x104\n0011d8b8 76824260 user32!CallHookWithSEH+0x21\n0011d8ec 773e642e user32!__fnHkINLPMSG+0x71\n0011d930 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011d934 76844787 user32!NtUserCallNextHookEx+0xc\n0011d958 6fbdb1e0 user32!CallNextHookEx+0x71\n0011d994 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011d9c8 768231eb user32!DispatchHookA+0x104\n0011da08 76824260 user32!CallHookWithSEH+0x21\n0011da3c 773e642e user32!__fnHkINLPMSG+0x71\n0011da80 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011da84 76844787 user32!NtUserCallNextHookEx+0xc\n0011daa8 6fbdb1e0 user32!CallNextHookEx+0x71\n0011dae4 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011db18 768231eb user32!DispatchHookA+0x104\n0011db58 76824260 user32!CallHookWithSEH+0x21\n0011db8c 773e642e user32!__fnHkINLPMSG+0x71\n0011dbd0 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011dbd4 76844787 user32!NtUserCallNextHookEx+0xc\n0011dbf8 6fbdb1e0 user32!CallNextHookEx+0x71\n0011dc34 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011dc68 768231eb user32!DispatchHookA+0x104\n0011dca8 76824260 user32!CallHookWithSEH+0x21\n0011dcdc 773e642e user32!__fnHkINLPMSG+0x71\n0011dd20 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011dd24 76844787 user32!NtUserCallNextHookEx+0xc\n0011dd48 6fbdb1e0 user32!CallNextHookEx+0x71\n0011dd84 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011ddb8 768231eb user32!DispatchHookA+0x104\n0011ddf8 76824260 user32!CallHookWithSEH+0x21\n0011de2c 773e642e user32!__fnHkINLPMSG+0x71\n0011de70 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011de74 76844787 user32!NtUserCallNextHookEx+0xc\n0011de98 6fbdb1e0 user32!CallNextHookEx+0x71\n0011ded4 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011df08 768231eb user32!DispatchHookA+0x104\n0011df48 76824260 user32!CallHookWithSEH+0x21\n0011df7c 773e642e user32!__fnHkINLPMSG+0x71\n0011dfc0 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011dfc4 76844787 user32!NtUserCallNextHookEx+0xc\n0011dfe8 6fbdb1e0 user32!CallNextHookEx+0x71\n0011e024 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011e058 768231eb user32!DispatchHookA+0x104\n0011e098 76824260 user32!CallHookWithSEH+0x21\n0011e0cc 773e642e user32!__fnHkINLPMSG+0x71\n0011e110 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011e114 76844787 user32!NtUserCallNextHookEx+0xc\n0011e138 6fbdb1e0 user32!CallNextHookEx+0x71\n0011e174 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011e1a8 768231eb user32!DispatchHookA+0x104\n0011e1e8 76824260 user32!CallHookWithSEH+0x21\n0011e21c 773e642e user32!__fnHkINLPMSG+0x71\n0011e260 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011e264 76844787 user32!NtUserCallNextHookEx+0xc\n0011e288 6fbdb1e0 user32!CallNextHookEx+0x71\n0011e2c4 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011e2f8 768231eb user32!DispatchHookA+0x104\n0011e338 76824260 user32!CallHookWithSEH+0x21\n0011e36c 773e642e user32!__fnHkINLPMSG+0x71\n0011e3b0 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011e3b4 76844787 user32!NtUserCallNextHookEx+0xc\n0011e3d8 6fbdb1e0 user32!CallNextHookEx+0x71\n0011e414 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011e448 768231eb user32!DispatchHookA+0x104\n0011e488 76824260 user32!CallHookWithSEH+0x21\n0011e4bc 773e642e user32!__fnHkINLPMSG+0x71\n0011e500 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011e504 76844787 user32!NtUserCallNextHookEx+0xc\n0011e528 6fbdb1e0 user32!CallNextHookEx+0x71\n0011e564 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011e598 768231eb user32!DispatchHookA+0x104\n0011e5d8 76824260 user32!CallHookWithSEH+0x21\n0011e60c 773e642e user32!__fnHkINLPMSG+0x71\n0011e650 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011e654 76844787 user32!NtUserCallNextHookEx+0xc\n0011e678 6fbdb1e0 user32!CallNextHookEx+0x71\n0011e6b4 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011e6e8 768231eb user32!DispatchHookA+0x104\n0011e728 76824260 user32!CallHookWithSEH+0x21\n0011e75c 773e642e user32!__fnHkINLPMSG+0x71\n0011e7a0 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011e7a4 76844787 user32!NtUserCallNextHookEx+0xc\n0011e7c8 6fbdb1e0 user32!CallNextHookEx+0x71\n0011e804 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011e838 768231eb user32!DispatchHookA+0x104\n0011e878 76824260 user32!CallHookWithSEH+0x21\n0011e8ac 773e642e user32!__fnHkINLPMSG+0x71\n0011e8f0 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011e8f4 76844787 user32!NtUserCallNextHookEx+0xc\n0011e918 6fbdb1e0 user32!CallNextHookEx+0x71\n0011e954 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011e988 768231eb user32!DispatchHookA+0x104\n0011e9c8 76824260 user32!CallHookWithSEH+0x21\n0011e9fc 773e642e user32!__fnHkINLPMSG+0x71\n0011ea40 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011ea44 76844787 user32!NtUserCallNextHookEx+0xc\n0011ea68 6fbdb1e0 user32!CallNextHookEx+0x71\n0011eaa4 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011ead8 768231eb user32!DispatchHookA+0x104\n0011eb18 76824260 user32!CallHookWithSEH+0x21\n0011eb4c 773e642e user32!__fnHkINLPMSG+0x71\n0011eb90 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011eb94 76844787 user32!NtUserCallNextHookEx+0xc\n0011ebb8 6fbdb1e0 user32!CallNextHookEx+0x71\n0011ebf4 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011ec28 768231eb user32!DispatchHookA+0x104\n0011ec68 76824260 user32!CallHookWithSEH+0x21\n0011ec9c 773e642e user32!__fnHkINLPMSG+0x71\n0011ece0 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011ece4 76844787 user32!NtUserCallNextHookEx+0xc\n0011ed08 6fbdb1e0 user32!CallNextHookEx+0x71\n0011ed44 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011ed78 768231eb user32!DispatchHookA+0x104\n0011edb8 76824260 user32!CallHookWithSEH+0x21\n0011edec 773e642e user32!__fnHkINLPMSG+0x71\n0011ee30 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011ee34 76844787 user32!NtUserCallNextHookEx+0xc\n0011ee58 6fbdb1e0 user32!CallNextHookEx+0x71\n0011ee94 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011eec8 768231eb user32!DispatchHookA+0x104\n0011ef08 76824260 user32!CallHookWithSEH+0x21\n0011ef3c 773e642e user32!__fnHkINLPMSG+0x71\n0011ef80 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011ef84 76844787 user32!NtUserCallNextHookEx+0xc\n0011efa8 6fbdb1e0 user32!CallNextHookEx+0x71\n0011efe4 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011f018 768231eb user32!DispatchHookA+0x104\n0011f058 76824260 user32!CallHookWithSEH+0x21\n0011f08c 773e642e user32!__fnHkINLPMSG+0x71\n0011f0d0 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011f0d4 76844787 user32!NtUserCallNextHookEx+0xc\n0011f0f8 6fbdb1e0 user32!CallNextHookEx+0x71\n0011f134 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011f168 768231eb user32!DispatchHookA+0x104\n0011f1a8 76824260 user32!CallHookWithSEH+0x21\n0011f1dc 773e642e user32!__fnHkINLPMSG+0x71\n0011f220 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011f224 76844787 user32!NtUserCallNextHookEx+0xc\n0011f248 6fbdb1e0 user32!CallNextHookEx+0x71\n0011f284 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011f2b8 768231eb user32!DispatchHookA+0x104\n0011f2f8 76824260 user32!CallHookWithSEH+0x21\n0011f32c 773e642e user32!__fnHkINLPMSG+0x71\n0011f370 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011f374 76844787 user32!NtUserCallNextHookEx+0xc\n0011f398 6fbdb1e0 user32!CallNextHookEx+0x71\n0011f3d4 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011f408 768231eb user32!DispatchHookA+0x104\n0011f448 76824260 user32!CallHookWithSEH+0x21\n0011f47c 773e642e user32!__fnHkINLPMSG+0x71\n0011f4c0 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011f4c4 76844787 user32!NtUserCallNextHookEx+0xc\n0011f4e8 6fbdb1e0 user32!CallNextHookEx+0x71\n0011f524 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011f558 768231eb user32!DispatchHookA+0x104\n0011f598 76824260 user32!CallHookWithSEH+0x21\n0011f5cc 773e642e user32!__fnHkINLPMSG+0x71\n0011f610 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011f614 76844787 user32!NtUserCallNextHookEx+0xc\n0011f638 6fbdb1e0 user32!CallNextHookEx+0x71\n0011f674 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011f6a8 768231eb user32!DispatchHookA+0x104\n0011f6e8 76824260 user32!CallHookWithSEH+0x21\n0011f71c 773e642e user32!__fnHkINLPMSG+0x71\n0011f760 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011f764 76844787 user32!NtUserCallNextHookEx+0xc\n0011f788 6fbdb1e0 user32!CallNextHookEx+0x71\n0011f7c4 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011f7f8 768231eb user32!DispatchHookA+0x104\n0011f838 76824260 user32!CallHookWithSEH+0x21\n0011f86c 773e642e user32!__fnHkINLPMSG+0x71\n0011f8b0 768447aa ntdll!KiUserCallbackDispatcher+0x2e\n0011f8b4 76844787 user32!NtUserCallNextHookEx+0xc\n0011f8d8 6fbdb1e0 user32!CallNextHookEx+0x71\n0011f914 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011f948 768231eb user32!DispatchHookA+0x104\n0011f988 76824260 user32!CallHookWithSEH+0x21\n0011f9bc 773e642e user32!__fnHkINLPMSG+0x71\n0011f9d0 00030000 ntdll!KiUserCallbackDispatcher+0x2e\n0011fa28 6fbdb1e0 0x30000\n0011fa64 16846e6e contoso!ContosoWindowEventHook+0x11b\n0011fa98 768231eb user32!DispatchHookA+0x104\n0011fad8 76824260 user32!CallHookWithSEH+0x21\n0011fb0c 773e642e user32!__fnHkINLPMSG+0x71\n0011fb20 00030000 ntdll!KiUserCallbackDispatcher+0x2e\n0011fb7c 768292a9 0x30000\n0011fba8 6b2ce010 user32!PeekMessageW+0xfb\n<\/pre>\n<p>\nAs you can see,\na <i>third<\/i> component in their application\ninstalled at least <i>thirty-five hooks<\/i>.\nAfter the thirty-fifth hook, the window manager stepped in and said,\n&#8220;<a HREF=\"http:\/\/www.huffingtonpost.com\/social\/Wanderland\/drunkest-countries-in-the-world_n_824757_78145314.html\">That&#8217;s it, I&#8217;m cutting you off<\/a>.&#8221;\n<\/p>\n<p>\nNow, the limit isn&#8217;t actually thirty-five.\nThe window manager keeps dispatching hooks until the kernel stack\nstarts running low, and then it gives up.\nThis happens with a lot of\n<a HREF=\"http:\/\/blogs.msdn.com\/b\/alejacma\/archive\/2009\/08\/11\/controls-won-t-get-resized-once-the-nesting-hierarchy-of-windows-exceeds-a-certain-depth-x64.aspx\">\nrecursive algorithms<\/a>:\nThe window manager plays the game for a while,\nbut when it looks like you&#8217;re about to bluescreen,\nit stops short and says,\n&#8220;Okay, I&#8217;m not going to do that any more.&#8221;\n<\/p>\n<p>\nThe developers now got to take their problem to the\ndeveloper responsible for the Contoso component,\nand figure out why it&#8217;s installing so many hooks.\nMaybe that component could try to consolidate identical hooks.\nOr maybe it&#8217;s a leak.\nThey never did report back (not that I was expecting them to).\n<\/p>\n<p>\n<b>Bonus chatter<\/b>:\nWhy is hook dispatch done recursively?\nShouldn&#8217;t it be done iteratively?\n<\/p>\n<p>\nRemember that windows hooks came from 16-bit Windows, where\n<a HREF=\"http:\/\/blogs.msdn.com\/b\/oldnewthing\/archive\/2006\/08\/09\/693280.aspx\">\neconomy was paramount<\/a>.\nAnd the existing <code>Call&shy;Next&shy;Hook<\/code> pattern was\npreserved, though it changed to\n<code>Call&shy;Next&shy;Hook&shy;Ex<\/code>,\nwhere you pass the hook handle directly instead of its address.\nOne advantage of the <code>Call&shy;Next&shy;Hook&shy;Ex<\/code> model\nover an iterative model is that\nexplicitly forwarding to the previous hook lets you do work on the back end.\nI.e., you can forward the call down the chain, and then\ndo something when control returns.\nThis is the sort of thing you probably use a lot when you subclass\na window or override a method in a derived class and call the base\nclass from your override.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Many window manager operations are recursive, and eventually the window manager will simply say that enough is enough when the recursion goes too deep. We&#8217;ve seen this when you nest windows more than 50 levels deep or nest menus more than 25 levels deep, for example. (Note also that these limits may change in the [&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":[25],"class_list":["post-7433","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oldnewthing","tag-code"],"acf":[],"blog_post_summary":"<p>Many window manager operations are recursive, and eventually the window manager will simply say that enough is enough when the recursion goes too deep. We&#8217;ve seen this when you nest windows more than 50 levels deep or nest menus more than 25 levels deep, for example. (Note also that these limits may change in the [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/7433","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=7433"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/7433\/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=7433"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/categories?post=7433"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/tags?post=7433"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}