{"id":112508,"date":"2026-07-07T07:00:00","date_gmt":"2026-07-07T14:00:00","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/oldnewthing\/?p=112508"},"modified":"2026-07-04T07:10:33","modified_gmt":"2026-07-04T14:10:33","slug":"20260707-00","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/oldnewthing\/20260707-00\/?p=112508","title":{"rendered":"How did Windows 95 decide that a setup program ran?"},"content":{"rendered":"<p>A little while ago, I mentioned that <a title=\"Windows 95 defenses against installers that overwrite a file with an older version\" href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20260324-00\/?p=112159\"> Windows 95 had some defenses against installers that overwrite a file with an older version<\/a>. These defenses kicked in whenever it detected that a setup program had finished. But <a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20260324-00\/?p=112159&amp;commentid=143974#comment-143974\"> how does it know that a setup program was running<\/a>?<\/p>\n<p>It guesses.<\/p>\n<p>If the name of the program contains the word &#8220;setup&#8221;, &#8220;install&#8221;, or some other magic words, then it is considered to be a setup program. Here&#8217;s the list of magic words.<\/p>\n<table class=\"cp3\" style=\"border-collapse: collapse;\" border=\"1\" cellspacing=\"0\" cellpadding=\"3\">\n<tbody>\n<tr>\n<th>Magic word<\/th>\n<th>Notes<\/th>\n<\/tr>\n<tr>\n<td><tt>setup<\/tt><\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td><tt>install<\/tt><\/td>\n<td>Redundant<\/td>\n<\/tr>\n<tr>\n<td><tt>inst<\/tt><\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td><tt>imposta<\/tt><\/td>\n<td>Italian?<\/td>\n<\/tr>\n<tr>\n<td><tt>ayarla<\/tt><\/td>\n<td>Turkish?<\/td>\n<\/tr>\n<tr>\n<td><tt>felrak<\/tt><\/td>\n<td>Hungarian?<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The entry for <tt>install<\/tt> is redundant with <tt>inst<\/tt>, because anything that contains &#8220;install&#8221; will also contain &#8220;inst&#8221;. My guess is that &#8220;install&#8221; came first, and then later somebody found that a lot of setup programs were called &#8220;<span style=\"border: solid 1px currentcolor;\">blah<\/span>inst&#8221; for various values of &#8220;blah&#8221; so they added an entry for &#8220;inst&#8221;, but failed to remove the redundant entry for &#8220;install&#8221;.<\/p>\n<p>If there are no matches on the program name, Windows 95 also checks whether the path to the executable contains the word &#8220;Setup&#8221;.<\/p>\n<p>In the above two cases, the file check is delayed until the next start, because some setup programs will realize that the file is in use and cannot be replaced, so they use <code>Exit\u00adWindows\u00adExec<\/code> to exit Windows back to MS-DOS, run a batch file, and then start Windows back up. We have to wait until the restart of Windows to catch any files that were improperly modified by the batch file.<\/p>\n<p>As a special bonus, Windows 95 does a live file check after any multimedia driver installs via an INF file. I guess the multimedia team discovered that a lot of drivers overwrite system DLLs in their INF files, so they asked for a cleanup pass afterward.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>It used some heuristics.<\/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-112508","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oldnewthing","tag-history"],"acf":[],"blog_post_summary":"<p>It used some heuristics.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/112508","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=112508"}],"version-history":[{"count":1,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/112508\/revisions"}],"predecessor-version":[{"id":112509,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/112508\/revisions\/112509"}],"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=112508"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/categories?post=112508"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/tags?post=112508"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}