DevCon bits: WinSendMsg, WinPostMsg

User avatar
Eugene Gorbunoff
Site Admin
Posts: 685
Joined: Sat Apr 09, 2005 11:18
Location: St.Petersburg, Russia

DevCon bits: WinSendMsg, WinPostMsg

Postby Eugene Gorbunoff » Thu Apr 01, 2010 13:37

From: Glassman
Date: 2010/03/31

Проблемы с системными модальными окнами (ИТОГИ)

WinSendMsg, WinPostMsg, баг, нити

Область

WinSendMsg из одной нити в другую.

Что происходит

Всплытие системного окна с сообщением об ошибке нарушает логику работы WinSendMsg. В лучшем случае - посылка сообщений блокируется, в худшем случае WinSendMsg начинает возвращать NULL, а WinGetLastError при этом возвращает 0x1009 (PMERR_CALL_FROM_WRONG_THREAD). Происходит это не только в случае всплытия сообщения об ошибке работы с диском (AUTOFAIL=Yes в CONFIG.SYS отсутствует), но и при падении программы (SUPPRESSPOPUPS в CONFIG.SYS отсутствует). Проверка показала, что простое открытие системного модального окна к таким последствиям не приводит. Шаги для повторения проблемы:

1. Закомментировать AUTOFAIL=Yes в CONFIG.SYS и перегрузиться.
2. Запустить прилагаемую TESTSEND.EXE. Программа с интервалом в одну секунду посылает сообщение окну рабочего стола, запрашивая хэндл его иконки.
http://ecomstation.ru/projects/develope ... 100331.zip
3. При нормальной работе программы будут появляться повторяющиеся сообщения вида "WinSendMsg return XXXXXXXX", где XXXXXXXX ненулевое значение хэндла иконки.
4. Обратится любым способом к пустому дисководу или сидирому.
5. На время всплытия системного сообщения об ошибке, выдача сообщений программой TESTSEND.EXE либо прекратится, либо пойдут сообщения вида "WinSendMsg return 00000000, WinGetLastError return 000C1009".

Причину всего этого безобразия отловить не удалось. Удалось выяснить только то, что 0x1009 (PMERR_CALL_FROM_WRONG_THREAD) WinSendMsg возвращает, когда ей не удается выделить нужный кусок памяти из какого-то приватного пула PM.

Итоги

Однозначно баг. Шансов на исправление немного (никаких?). Единственный выход - донести до всех, что отключение AUTOFAIL и SUPPRESSPOPUPS недопустимо и приводит к катастрофическим последствиям. Может быть, можно пропатчить ядро, чтобы всплытие сообщений всегда было отключено?

Попутная идея

Написать утилиту, которая при загрузке системы стартует, прячется и мониторит POPUPLOG.OS2. При появлении в нем новых сообщений программа всплывает и уведомляет пользователя. Плюсы: системные сообщения отключены, поэтому нет проблем описанных выше. Тем не менее, пользователь уведомлен о падении программы. При этом, т.к. не используются системные модальные окна - мы не блокируем интерфейс. Ну и можно сделать несколько удобных вещей в этой же программе.

Return to “Developers / Разработчики”

Who is online

Users browsing this forum: No registered users and 1 guest