{"id":111599,"date":"2025-09-15T07:00:00","date_gmt":"2025-09-15T14:00:00","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/oldnewthing\/?p=111599"},"modified":"2025-09-15T08:13:43","modified_gmt":"2025-09-15T15:13:43","slug":"20250915-00","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/oldnewthing\/20250915-00\/?p=111599","title":{"rendered":"Why is the name of the Microsoft Wireless Notebook Presenter Mouse 8000 hard-coded into the Bluetooth drivers?"},"content":{"rendered":"<p>Some time ago, people noticed that buried in the Windows Bluetooth drivers is the hard-coded name of the Microsoft Wireless Notebook Presenter Mouse 8000. What&#8217;s going on there? Does the Microsoft Wireless Notebook Presenter Mouse 8000 receive favorable treatment from the Microsoft Bluetooth drivers? Is this some sort of collusion?<\/p>\n<p>No, it&#8217;s not that.<\/p>\n<p>There is a lot of a bad hardware out there, and there are a lot of compatibility hacks to deal with it. You have <a title=\"More stories of bad hardware\" href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20031117-00\/?p=41803\"> CD-ROM controller cards that report the same drive four times<\/a> or USB devices that <a title=\"A blurry photo of the legendary USB Cart of Death\" href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20240521-00\/?p=109786\"> draw more than 500mW of power after promising they wouldn&#8217;t<\/a>. More generally, you have devices whose descriptors are syntactically invalid or contain values that are outside of legal range or which are simply nonsensical.<\/p>\n<p>Most of the time, the code to compensate for these types of errors doesn&#8217;t betray its presence in the form of hard-coded strings. Instead, you have &#8220;else&#8221; branches that secretly repair or ignore corrupted values.<\/p>\n<p>Unfortunately, the type of mistake that the Microsoft Wireless Notebook Presenter Mouse 8000 made is one that is easily exposed via strings, because they messed up their string!<\/p>\n<p>The device local name string is <a href=\"https:\/\/www.bluetooth.com\/wp-content\/uploads\/Files\/Specification\/HTML\/CSS_v11\/out\/en\/supplement-to-the-bluetooth-core-specification\/data-types-specification.html#:~:text=1.2.2,types\"> specified to be encoded in UTF-8<\/a>. However, the Microsoft Wireless Notebook Presenter Mouse 8000 reports its name as <tt>Microsoft<span style=\"border: solid 1px currentcolor;\">\u27eaAE\u27eb<\/span> Wireless Notebook Presenter Mouse 8000<\/tt>, encoding the registered trademark symbol \u00ae not as UTF-8 as required by the specification but in code page 1252. What&#8217;s even worse is that a bare <tt><span style=\"border: solid 1px currentcolor;\">\u27eaAE\u27eb<\/span><\/tt> is not a legal UTF-8 sequence, so the string wouldn&#8217;t even show up as corrupted; it would get rejected as invalid.<\/p>\n<p>Thanks, Legal Department, for sticking a \u00ae in the descriptor and messing up the whole thing.<\/p>\n<p>There is a special table inside the Bluetooth drivers of &#8220;Devices that report their names wrong (and the correct name to use)&#8221;. If the Bluetooth stack sees one of these devices, and it presents the wrong name, then the correct name is substituted.<\/p>\n<p>That table currently has only one entry.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Is it some sort of favoritism?<\/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":[26],"class_list":["post-111599","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oldnewthing","tag-other"],"acf":[],"blog_post_summary":"<p>Is it some sort of favoritism?<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/111599","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=111599"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/111599\/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=111599"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/categories?post=111599"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/tags?post=111599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}