"Самый полезный ответ
Megamozg ответил: августа 6, 2010
Основная проблема Майкрософт заключается в том, что в саппорт набирают полных дебилов.
С технической точки зрения механизм работает так. Пользователь пытается запустить каким-то образом исполняемый файл. Но система не сразу дает ему управление, а сначала пытается проверить его совместимость по различным признакам (такие как имя, контрольная сумма и т.п.) Если системе показалось, что файл находится в списке несовместимых или устаревших, то она может либо предупредить пользователя о том, что нужно применять режимы совместимости, либо вообще заблокировать выполнение этой задачи (установщик старой версии Windows, к примеру).
В Висте/Семерке к этому списку добавился еще и список legacy игр. Проверка для них осуществляется только по имени исполняемого файла. Если имя исполняемого файла игры совпало с одним из этого списка, то _ПЕРЕД_ запуском этого исполняемого файла ОС запускает этот самый rundll32, чтобы он добавил игру в гейм эксплорер. Пока он не отработает - запуска этого исполняемого файла не произойдет. Данные для добавления берутся из файла GameUXLegacyGDFs.dll.
Далее, в какой-то момент портится база данных ГеймЭксплорера. Портится она самопроизвольно в результате работы самого ГеймЭксплорера (точнее того кода, который был в него добавлен в семерке). Не у всех и достаточно редко. Виноват, конечно, сам пользователь - выключил компьютер когда Геймэксплорер на фоне занимался очень важной оптимизацией для быстродействия своих данных или рано закрыл окно ГейЭсплорера после запуска игры, не промедитировав положенные 10 минут . Под БД я понимаю здесь совокупность информации из GameUXLegacyGDFs.dll, реестра и файловой структуры(которая разбросана по куче папок). После этого код GameUx.dll не может правильно проитерировать все записи из GameUXLegacyGDFs.dll (и не может обнаружить порчу метаданных) в результате чего зацикливается.
Зациклившись, он начинает съедать ресурс процессора. Т.к. по счастью, он не многопоточный, то он займет не весь процессор, а только одно ядро. Для одноядерных это может быть процентов 70 (остальное съедят другие задачи), для двухядерных - 50%, для моего 3х-ядерного - 33% и т.д.
Диагностика:
1. Игра может запускаться и работать, но при этом тормозить, не выдавать ожидаемого фпс. Самое явное проявление - дергающийся звук. Даже если вам кажется, что все хорошо - нажмите три кнопки и посмотрите, не висит ли у вас rundll32 в процессах. Владельцы многоядерных могут вообще не замечать проблемы, а таких процессоров сейчас большинство.
2. Игра запускается со второй попытки. Это, кстати, по совместительству, одно из решения проблемы. Просто запустить еще раз и забить на фоновый процесс.
3. Подобная ситуация может возникать не со всеми играми, а только с теми, которые ОС распознает как игры (наличие данных для ГеймЭксплорера) или имя исполняемого файла находится в списке Legacy игр. Или вообще с одной отдельно взятой игрой.
Варианты решения:
1. Способ от саппорта! В геймэксплорере отключить сбор информации об игре. Способ, естественно, не работает, но упоминаю потому, что всех, кто столкнулся с проблемой будут сначала проверять на вирусы, потом отправлять на базу знаний Майрософта, где написана эта рекомендация.
2. Отключить все остальное в геймэксплорере и почистить собранную информацию. Тоже мало кому-помогает.
3. Переименовать исполняемый файл игры. Недостатки: каждую игру нужно переименовывать отдельно, некоторые онлайн-игры скачивают заново исполняемый файл или он создается во время запуска и др.
4. Отключить геймэксплорер путем удаления файлов gameux.dll либо записей в ветви реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\GameUX. Тоже не всегда является выходом, т.к. многим удобно использовать ГеймЭксплорер, в конце-концов не зря же его делали.
5. Удалить базу старых игр GameUXLegacyGDFs.dll. В отличие от предыдущего, записи о новых играх будут работать. Но отключатся старые.
6. Дождаться, пока кто-то из разработчиков не сделает дифф на старые версии gameux.dll и не удалит ошибочный код. Это будет тяжело и очень долго, т.к. саппорт, который должен осуществлять взаимодействие между пользователем и разработчиком, в Майкрософте страдает херней, рассказывает, что все так и должно быть как оно есть или придумывает свои способы "решения" проблемы.
Вопросы совместимости приложения и операционной системы:
Как в данной ситуации этими может заниматься разработчик приложения, когда до выполнения его кода дело даже и не доходит? Ему надо писать драйвер, который будет обходить механизмы ОС и патчить ошибки Майкрософта? Если этого не происходит в определенных играх, то это просто означает, что имя исполняемого файла еще не попало в список Legacy или на машине еще не повреждена БД ГеймЭксплорера.
"