{"id":16863,"date":"2009-09-03T10:00:00","date_gmt":"2009-09-03T10:00:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/oldnewthing\/2009\/09\/03\/woe-unto-progman-ini\/"},"modified":"2009-09-03T10:00:00","modified_gmt":"2009-09-03T10:00:00","slug":"woe-unto-progman-ini","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/oldnewthing\/20090903-00\/?p=16863","title":{"rendered":"Woe unto PROGMAN.INI"},"content":{"rendered":"<p>Sad but true: Once you document a file format, it becomes a de facto API.\n The Windows&nbsp;95 team learned this the hard way when they set out to replace Program Manager with Explorer. Not only were the settings in the <code>PROGMAN.INI<\/code> file documented, so too was the binary file format of <code>*.GRP<\/code> files. The binary file format was included for diagnostic purposes: If you have a corrupted <code>GRP<\/code> file, you can use the binary file format documentation to try to recover what you can out of it.\n But many people treated this documentation not as a FYI, but as a backdoor API. Instead of using the formal DDE interface for creating program groups and icons, they just directly edited the <code>PROGMAN.INI<\/code> file and the applicable <code>GRP<\/code> files to get the icons and groups they wanted.\n Oh wait, and then you need to reboot in order for the backdoor API to take effect, because all you did was modify the on-disk files, not the in-memory copy held by <code>PROGMAN.EXE<\/code>.\n Of course, when Windows&nbsp;95 replaced Program Manager with Explorer, these programs found themselves modifying the data files of a program that no longer was running. Special code had to be added to Explorer to read settings from <code>PROGMAN.INI<\/code> and even detect that a new <code>GRP<\/code> file was added and convert it into shortcuts on the Start menu.<\/p>\n<p> I wouldn&#8217;t be surprised if that code is still lying around, just in case somebody pulls out an old application from 1994 and installs it. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sad but true: Once you document a file format, it becomes a de facto API. The Windows&nbsp;95 team learned this the hard way when they set out to replace Program Manager with Explorer. Not only were the settings in the PROGMAN.INI file documented, so too was the binary file format of *.GRP files. The binary [&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-16863","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oldnewthing","tag-history"],"acf":[],"blog_post_summary":"<p>Sad but true: Once you document a file format, it becomes a de facto API. The Windows&nbsp;95 team learned this the hard way when they set out to replace Program Manager with Explorer. Not only were the settings in the PROGMAN.INI file documented, so too was the binary file format of *.GRP files. The binary [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/16863","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=16863"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/16863\/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=16863"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/categories?post=16863"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/tags?post=16863"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}