Неясное сообщение ntvdm в XP: Подсистема Win 16 имеет недостаточно ресурсов для продолжения работы. [...]

1664
SamB

Что означает сообщение об ошибке ntvdm «Подсистема Win 16 имеет недостаточно ресурсов для продолжения работы. Нажмите OK, закройте свои приложения и перезагрузите компьютер». значит, а как это можно предотвратить?

(Интересно, но, предположительно, не связанных с проблемой, диалоговое окно, отображающее сообщение, фактически принадлежит csrss.exeпроцессу сеанса .)

1
В каком контексте вы получаете это сообщение? Пожалуйста, будьте конкретны. 13 лет назад 0
Что я могу сделать: подсистема Win16 = уровень эмуляции DOS в WinXP. Это сообщение означает, что у него почему-то закончились ресурсы (скорее всего, память), или, возможно, какой-то компонент зависит от нехватки памяти Как предотвратить это: трудно сказать без сведения об используемых приложениях и т. д. Marcus 13 лет назад 0
@Randolph: Запуск 16-битного приложения для Windows (что, я думаю, было ясно из бита «Подсистема 16 Win»). В частности, это происходило с `freecell.exe`, скопированным из Windows 98 (вместе с необходимой 16-разрядной версией cards.dll), но, вероятно, большинству любого 16-разрядного приложения Windows было бы достаточно. SamB 13 лет назад 0
Недостаточно информации, чтобы повторить ошибку на моей стороне. Вы используете Windows Vista? Windows 7? Server 2003 R2? ВИНО? Я хочу сказать, что проблема одинакова для любого 16-разрядного приложения, которое вы используете? Что происходит с режимом совместимости? Я не могу прояснить себя. 13 лет назад 0

2 ответа на вопрос

2
SamB

Согласно http://www.vttoth.com/wow32.htm, это сообщение об ошибке возникает, когда GDI возвращает дескриптор выше 16383 для вызова, сделанного от имени 16-разрядной программы Windows. Ручки могут доходить до 65535, но, очевидно, они получаютправо-сдвинутый влево на 2 бита перед тем, как его вернут в 16-битное приложение по какой-то причине (предположительно совместимость с чем-либо)

До Windows XP такого не могло быть, поскольку только 16384 объектам GDI было разрешено существовать в любом конкретном сеансе, но с XP предел был увеличен до 65536 объектов GDI. Поскольку GDI, очевидно, выделяет новый номер дескриптора только тогда, когда используются все более низкие номера дескрипторов, это может произойти, только если в сеансе одновременно существует более 16384 объектов GDI.

Перезагрузка, как правило, исправляет эту ситуацию, если предположить, что автоматически запускаемые программы не сразу проходят через первые дескрипторы 16384.

Если включено «быстрое переключение пользователей», другим вариантом будет выйти из системы, войти в другую учетную запись (например, «гость») и войти снова. (Здесь важно получить новую «сессию»; если вы не запускали «сессию 0» для начала, шаг «зарегистрировать другую учетную запись» не имеет значения.)

На связанной странице также есть патч для удаления смен wow32.dll. Будьте осторожны: как говорится на странице, применение этого патча может быть незаконным; Более того, это может быть опасно и, безусловно, нарушит работу любого приложения, для которого был добавлен сдвиг.

Это можно исправить, просто выйдя из системы и войдя обратно, так как это завершает сеанс. Перезагрузка не требуется. Кстати, в Vista и более поздних версиях интерактивные пользователи НИКОГДА не работают в сеансе 0. Быстрое переключение пользователей также будет работать, и нет необходимости фактически выходить из первого сеанса - второй логин получает новый сеанс. Jamie Hanrahan 8 лет назад 0
-1
Mark Manning

С тех пор, как компьютеры превратились из 16-битных компьютеров в 32-битные, люди стали видеть это сообщение об ошибке. Как заявляет SamB - есть несколько способов, которыми вы можете научить программу работать, но в конечном итоге - вы увидите это сообщение снова и снова. Как говорит SamB, реальная проблема заключается в том, что в настоящее время существует так много других программ, которые работают в фоновом режиме, что ограничение в 16 КБ превышается только при запуске вашего компьютера. Под 32-битной ОС эта проблема не появляется, потому что у вас есть намного больше дескрипторов, с которыми можно работать. НО! Ваше 16-битное приложение не может справиться с этим. Он был написан для работы под 16-битной ОС. Это означает, что он должен был работать под Windows v3.1 или Windows v95. Windows v98 (se) или Windows vME - это 32-битные ОС, так что даже там вы столкнетесь с этой проблемой.

Мое решение - скачать Virtual PC от Microsoft (это бесплатно) или загрузить Virtual Box из Oracle (это тоже бесплатно), установить копию Windows v3.1 или Windows v95 и запустить программу под ОС, для которой она предназначена. бежать под

Теперь, к сожалению, если вы не сохранили свои дискеты с Windows v3.1 или Windows v95 (или компакт-диск в случае Windows v95), вам придется их найти и купить. Или вы можете обратиться в Microsoft с просьбой о копировании, но я не верю, что они их сохранили или выпустят. (В отличие от Apple Computer Inc., которая выпустила бесплатно DOS 3.3, ProDos, ProDos для // gs и Mac OS до версии 9.x)

Так что это мое предложение / ответ. Для Windows v3.1 и Windows v95 я бы больше склонялся к Virtual PC, так как он действительно прекрасно работает под Windows XP, а также вплоть до использования DOS, DR DOS и даже IBM PC DOS или BDOS.

Обновление: 27.01.2016

Чтобы лучше ответить на вопрос SamB о несовместимости (о котором я не говорил). Давайте посмотрим на 8-битную ОС. 8-битная ОС ожидала, что все различные стеки (стек вызовов, дескрипторы и т. Д.) Будут иметь определенный размер и не превышать этот размер. Когда вы превысите его - вы получите синий экран смерти или, возможно, ваша система просто перезагрузится. Когда пришли 16-битные ОС, 8-битные программы работали так, как будто они работали в 8-битной системе. Это означало, что если бы они превышали 8-битный размер выделения, они, вероятно, все равно дали бы вам синий экран смерти, или ваша система все равно просто перезагрузилась бы. МНОГИЕ компании никогда не заботились о сбоях компьютеров, если клиенты не жаловались на это. (Обычно называется синдромом скрипучего колеса. ) Microsoft попыталась облегчить эти проблемы, протестировав столько программ, сколько они могли бы для каждой ОС, но дело в том, что некоторые программы просто не будут работать под более новой ОС. Мое подозрение (и НЕ ФАКТ) состоит в том, что некоторые из этих ранних стеков были заколдованы против другого стека, поэтому, если вы переполнили один стек, это может отрицательно повлиять на другой стек. Помните, что память не была дешевой, как сегодня, поэтому вы пытались втиснуть в память как можно больше. Мне самому много раз удавалось разбить мой Apple] [+, а также мой IBM PC XT просто потому, что я вызвал переполнение стека. Одной из других проблем является (как я уже сказал), что там было много плохих программистов, которые не заботились об очистке своих программ. Таким образом, они будут выделять память, стековую память, дескрипторы и всякие другие вещи, а не освобождать их. Ваш единственный намек на то, что это происходит, заключается в том, что ваш компьютер будет работать все медленнее и медленнее, пока вы не перезагрузите его. Перезагрузка очистит все данные из памяти, вернет все это в вашу ОС, и ваша ОС снова будет работать быстрее. Как я уже сказал, это похоже на работу программ TSR или Terminate and Stay Resident. В современных операционных системах - много раз процессы изолированы от других процессов, и сама ОС заботится о высвобождении памяти обратно в пул (а также об очистке стека или даже выделении нового стека каждому процессу, чтобы каждый процесс мог обойти свои собственные стек, но не стек ОС). Проблема, однако, в том, что более старые программы из эпохи 16-битных ОС были статически ориентированы. Таким образом, библиотеки и др. Были включены в программу. Это означает, что он может попытаться переопределить то, что текущая ОС говорит, что может сделать. Таким образом, 16-битная программа может сказать «запись в местоположение XYZ», но «XYZ» является частью более новой ОС. Итак, вы перезаписали, кто знает, что и ваша система может зависнуть или зависнуть из-за этого. Если у вас также есть права администратора - вы ДЕЙСТВИТЕЛЬНО можете все испортить. Таким образом, мое предложение использовать Virtual PC, переустановить более раннюю ОС - и запустить программу под той ОС, под которой она должна была работать. Во-первых, у вас больше шансов иметь возможность запустить программу там, а во-вторых, если она дает сбой, вы теряете только виртуальную систему, а не всю вашу компьютерную систему. Перезаписать, кто знает, что и ваша система может зависать или зависать из-за этого. Если у вас также есть права администратора - вы ДЕЙСТВИТЕЛЬНО можете все испортить. Таким образом, мое предложение использовать Virtual PC, переустановить более раннюю ОС - и запустить программу под той ОС, под которой она должна была работать. Во-первых, у вас больше шансов иметь возможность запустить программу там, а во-вторых, если она дает сбой, вы теряете только виртуальную систему, а не всю вашу компьютерную систему. Перезаписать, кто знает, что и ваша система может зависать или зависать из-за этого. Если у вас также есть права администратора - вы ДЕЙСТВИТЕЛЬНО можете все испортить. Таким образом, мое предложение использовать Virtual PC, переустановить более раннюю ОС - и запустить программу под той ОС, под которой она должна была работать. Во-первых, у вас больше шансов иметь возможность запустить программу там, а во-вторых, если она дает сбой, вы теряете только виртуальную систему, а не всю вашу компьютерную систему.

Но это не "несовместимо", а "архаично". Чтобы действительно упростить задачу, вы можете думать об этом следующим образом: стеки по 8 бит = 8 000 стеков, 16 бит = 16 стеков, 32 бита = стеки по 32 КБ и т. Д. Это не точно, но все же видно, что разные ОС использовали разные размеры для всего. Вот почему у вас возникают проблемы, когда вы переносите что-то из одной ОС в другую.

Имеет ли это смысл?

Э-э, у вас есть источники для идеи о том, что более ранние версии Windows могут размещать дескрипторы, несовместимые с Win16? SamB 8 лет назад 0
Я не сказал «несовместимо», я сказал: «32-битные ОС используют все первые 16 КБ для дескрипторов». Эта конкретная проблема начала появляться для меня на Windows 98se. Раньше была запись об этом, и одна из упомянутых здесь вещей - после выделения дескрипторы для 16-битных программ не выпускаются должным образом. Почти как программа TSR. Так, например, я запускал старую 16-битную игру Microsoft Tetris. Я запустил это, сделал некоторые вещи, запустил это снова, сделал кое-что, и тогда это не будет бежать. Кроме того, моя система становилась все медленнее и медленнее. Я использую XP. Перезагрузка снова все прояснила. Mark Manning 8 лет назад 0
Это та же проблема, что и у 8-битных ОС, когда все переходили на 16-битные ОС. 8-битные ОС ожидали, что все будет определенным образом, но 16-битные ОС ожидали, что все будет сделано по-другому. Так что, если вы запускаете 8-битные программы, которые должны работать на 8-битных ОС, у них могут возникнуть проблемы с настройкой 16-битной ОС. То же самое верно для 16 и 32, 32 и 64. Вот почему некоторые 32-битные программы просто не будут работать на системах с 64-битной ОС. Mark Manning 8 лет назад 0
Я должен исправить свое последнее предложение. Это одна из причин, почему некоторые 32-битные программы просто не будут работать на системах с 64-битной ОС. Есть и другие причины, такие как несовместимые библиотеки, различные / обновленные способы вызова подпрограмм, новые библиотеки, недоступные в более ранних ОС (как Windows XP не может выполнять Direct 2D) и так далее. Mark Manning 8 лет назад 0
Извините, но ваше объяснение не имеет смысла. NTVDM работает в 32-битном процессе и предоставляет 16-битное приложение в полной 16-битной среде. ВСЕГДА не имеет значения, сколько других вещей выполняется в вашей 32-битной системе Windows, потому что все эти другие вещи находятся в других процессах, то есть в совершенно разных адресных пространствах. А твое представление о том, что 32 бита подразумевают стеки по 32K ... о боже. (Стеки пользовательского режима в семействе NT по умолчанию составляют до 1 МБ, но могут быть больше ... или меньше.) Jamie Hanrahan 8 лет назад 0
@JamieHanrahan: Во-первых, как я уже сказал, просто пример не реальный. Второе - 32-битная ОС, как я уже сказал, гораздо более продвинутая, чем 16-битная ОС, но 16-битная программа может отменить ограничения 32-битной ОС, если все статично, а не динамически / совместно используется. Потому что он может писать напрямую в ячейку памяти. Старые 16-битные программы часто делали это. Что касается «NTVDM ... обеспечивает полную 16-битную среду» - это не так. Даже Microsoft так много сказала. Он пытается эмулировать его как можно лучше, но в списке есть несколько 16-битных программ Microsoft, которые просто не будут работать под 32-битной ОС. Mark Manning 8 лет назад 0
@JamieHanrahan: Продолжение - если вы посмотрите на сайт Microsoft, сейчас они говорят, что многие из старых 32-битных программ не будут работать с Windows10. Это потому, что сейчас это всего лишь 64-битная ОС, и вам теперь нужно использовать Virtual Box (даже говорят, что Virtual PC больше не работает, как мне сказали, - но пока не проверял сам, потому что я не использую Windows 10). Mark Manning 8 лет назад 0
Это было не то, что я имел в виду под «полной 16-битной средой». Да, есть ограничения на то, что может делать 16-битный код - все, что потребует доступа пользовательского режима к структурам данных ОС, запрещено. (Статическое или динамическое / совместное использование не то, как это запрещено или почему, но неважно.) Но ваша теория основывалась на том, что 16-битный код был каким-то образом подвержен влиянию совместного использования одних и тех же ресурсов со «всеми другими работающими программами». ». Это не так. Я был бы признателен за ссылку на это утверждение, что «многие 32-разрядные программы не будут работать с Windows 10», потому что это, конечно, не мой опыт. Jamie Hanrahan 8 лет назад 0
Кстати, Windows 10 НЕ «просто 64-битная ОС сейчас» - 32-битная версия доступна, а уровень 32-битной совместимости все еще присутствует в 64-битной версии, как и всегда. Черт, даже Office 2016 поставляется в обеих версиях, а MS даже устанавливает 32-разрядную версию по умолчанию на 64-разрядных системах ... Jamie Hanrahan 8 лет назад 0
Давайте [продолжим это обсуждение в чате] (http://chat.stackexchange.com/rooms/34976/discussion-between-mark-manning-and-jamie-hanrahan). Mark Manning 8 лет назад 0