MessageBox молча возвращает IDNO
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 24.08.20 14:19
Оценка:
Один из новых пользователей пожаловался, что мой установщик завершается, ничего не показав на экране, но заметил "какое-то моргание". Прислал логи установщика из двух систем — семерки и десятки. В обеих установщик нормально отрабатывает начальную часть кода (опрос системных параметров, чтение файла конфигурации, подготовка данных и т.п.), затем вызывает MessageBox с MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2 | MB_HELP, а MessageBox, ничего не рисуя, молча возвращает IDNO (No — кнопка по умолчанию). Код возврата, полученный от MessageBox, сразу же выводится в лог, никаких промежуточных присваиваний или условной обработки нет, так что нет сомнений, что код приходит от MessageBox.

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

Может ли быть такое, чтобы MessageBox при каком-нибудь внутреннем исключении ничего не показывал, но возвращал не нуль, а код кнопки по умолчанию? Гуглеж находит только обсуждения, в которых MessageBox возвращал нуль, а вызывающий код не проверял возвращаемое значение.
messagebox idno default button
Re: MessageBox молча возвращает IDNO
От: Sharowarsheg  
Дата: 24.08.20 15:26
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Может ли быть такое, чтобы MessageBox при каком-нибудь внутреннем исключении ничего не показывал, но возвращал не нуль, а код кнопки по умолчанию? Гуглеж находит только обсуждения, в которых MessageBox возвращал нуль, а вызывающий код не проверял возвращаемое значение.


Может быть и не такое, у всяких моддеров, которые выключают всякие сервисы, ставят драйверы от 95й винды в десятку, отрезают виндовый шпионаж, освобождают память, запрещают обновления, и прочее тому подобное. Если это у тебя один такой клиент, я бы рекомендовал расстаться с ним. Если расстаться нельзя, или просто скучно, то начинать с того, что в safe mode перезагрузиться. Я один раз видел, как похожим образом глючит Unchecky (https://unchecky.com/). Оно там автоматически кнопки нажимает при инсталляциях, и не всегда хорошо понимает, на что именно нажимает.
Re[2]: MessageBox молча возвращает IDNO
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 24.08.20 17:32
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>Может быть и не такое, у всяких моддеров, которые выключают всякие сервисы, ставят драйверы от 95й винды в десятку, отрезают виндовый шпионаж, освобождают память, запрещают обновления, и прочее тому подобное. Если это у тебя один такой клиент, я бы рекомендовал расстаться с ним.


Клиент не производит впечатления фаната — в меру толковый пользователь, в целом понимает, как все устроено, но не спец.

S>Если расстаться нельзя, или просто скучно


Я ему ничем не обязан, он пока ничего не купил, но мне стало интересно, что за фигня такая вылезла.

S>начинать с того, что в safe mode перезагрузиться.


Это вариант, надо попробовать. Но тут может быть другая проблема — установщик ставит звуковой драйвер, а звук в Safe Mode зарезан, так что и там обломается.

S>Я один раз видел, как похожим образом глючит Unchecky (https://unchecky.com/). Оно там автоматически кнопки нажимает при инсталляциях, и не всегда хорошо понимает, на что именно нажимает.


Вот и я грешу на подобную автоматизацию, но клиент божится, что ничего подобного не держит, и малвари его антивирусники не находят.
Re[3]: MessageBox молча возвращает IDNO
От: Sharowarsheg  
Дата: 24.08.20 17:45
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:


ЕМ>Это вариант, надо попробовать. Но тут может быть другая проблема — установщик ставит звуковой драйвер, а звук в Safe Mode зарезан, так что и там обломается.


А она там раньше или позже обломается, чем message box? Если сначала MessageBox, то можно попробовать всё равно.

S>>Я один раз видел, как похожим образом глючит Unchecky (https://unchecky.com/). Оно там автоматически кнопки нажимает при инсталляциях, и не всегда хорошо понимает, на что именно нажимает.


ЕМ>Вот и я грешу на подобную автоматизацию, но клиент божится, что ничего подобного не держит, и малвари его антивирусники не находят.


Что ещё можно сделать, это конкретно для этого клиента сделать два одинаковых MessageBox. Или, время померять, и если оно меньше секунды, то выводить Message Box ещё раз, добавив к нему снизу строку Please wait at least three seconds before closing this message.
Отредактировано 24.08.2020 17:50 Sharowarsheg . Предыдущая версия .
Re: MessageBox молча возвращает IDNO
От: Doom100500 Израиль  
Дата: 25.08.20 07:14
Оценка: 46 (4)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Может ли быть такое, чтобы MessageBox при каком-нибудь внутреннем исключении ничего не показывал, но возвращал не нуль, а код кнопки по умолчанию? Гуглеж находит только обсуждения, в которых MessageBox возвращал нуль, а вызывающий код не проверял возвращаемое значение.


Была такая хрень на Windows 7 embedded. Стандартные MessageBox вообще не показывались, а возвращали дефолтный результат (может быть даже IDNO)
Решение
Оно?
Спасибо за внимание
Re: MessageBox молча возвращает IDNO
От: Pavel Dvorkin Россия  
Дата: 25.08.20 07:30
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Один из новых пользователей пожаловался, что мой установщик завершается, ничего не показав на экране, но заметил "какое-то моргание". Прислал логи установщика из двух систем — семерки и десятки. В обеих установщик нормально отрабатывает начальную часть кода (опрос системных параметров, чтение файла конфигурации, подготовка данных и т.п.), затем вызывает MessageBox с MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2 | MB_HELP, а MessageBox, ничего не рисуя, молча возвращает IDNO (No — кнопка по умолчанию). Код возврата, полученный от MessageBox, сразу же выводится в лог, никаких промежуточных присваиваний или условной обработки нет, так что нет сомнений, что код приходит от MessageBox.


ЕМ>Я такого ни разу не видел, и даже не слышал. Подозреваю, что у пользователя в обоих системах стоит какой-то софт, то ли перехватывающий MessageBox, то ли программно нажимающий кнопку, но пользователь уверяет, что регулярно запускает разные программы, в том числе установщики, и все работает нормально. Я тоже не вижу в своем коде ничего подозрительного, его запускают тысячи людей ежемесячно, никто не жаловался.


ЕМ>Может ли быть такое, чтобы MessageBox при каком-нибудь внутреннем исключении ничего не показывал, но возвращал не нуль, а код кнопки по умолчанию? Гуглеж находит только обсуждения, в которых MessageBox возвращал нуль, а вызывающий код не проверял возвращаемое значение.


Может, кто-то хук поставил ?

Как вариант — сделать простейшее приложение с таким же MessageBox и попросить пользователя запустить его и прислать лог.
With best regards
Pavel Dvorkin
Re: MessageBox молча возвращает IDNO
От: varenikAA  
Дата: 25.08.20 07:34
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Может ли быть такое, чтобы MessageBox при каком-нибудь внутреннем исключении ничего не показывал, но возвращал не нуль, а код кнопки по умолчанию? Гуглеж находит только обсуждения, в которых MessageBox возвращал нуль, а вызывающий код не проверял возвращаемое значение.


Можно попробовать выполнить все действия с клавиатуры, может с мышой что-то.
Еще был случай — винда выключалась внезапно. Подхожу, смотрю: вилка в розетке болтается!
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: MessageBox молча возвращает IDNO
От: Alexander G Украина  
Дата: 25.08.20 08:29
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Может ли быть такое, чтобы MessageBox при каком-нибудь внутреннем исключении ничего не показывал, но возвращал не нуль, а код кнопки по умолчанию? Гуглеж находит только обсуждения, в которых MessageBox возвращал нуль, а вызывающий код не проверял возвращаемое значение.


Один коллега переустановил систему, чтобы избавиться от вируса, который странно влиял на поведение програм.

Вирус не исчез, и оказался крошками в клавиатуре.
Русский военный корабль идёт ко дну!
Re[4]: MessageBox молча возвращает IDNO
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 25.08.20 15:06
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>Что ещё можно сделать, это конкретно для этого клиента сделать два одинаковых MessageBox.


Да понятно, что обойти можно. Я не в этом смысле спрашивал — думал, вдруг это более-менее известный глюк с известной же причиной.
Re: MessageBox молча возвращает IDNO
От: T4r4sB Россия  
Дата: 25.08.20 15:13
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Я такого ни разу не видел, и даже не слышал. Подозреваю, что у пользователя в обоих системах стоит какой-то софт, то ли перехватывающий MessageBox, то ли программно нажимающий кнопку, но пользователь уверяет, что регулярно запускает разные программы, в том числе установщики, и все работает нормально.


Да просто все на Qt уже пишут с ручной отрисовкой кнопок и своими мессагебоксами.
Re[2]: MessageBox молча возвращает IDNO
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 27.08.20 11:48
Оценка:
Здравствуйте, Doom100500, Вы писали:

D>Была такая хрень на Windows 7 embedded. Стандартные MessageBox вообще не показывались, а возвращали дефолтный результат (может быть даже IDNO)

D>Решение
D>Оно?

Блин, действительно оно. Спасибо! Эта хрень работает и в Win7 Pro, и в десятках.

Теперь осталось понять, как оно опознает приложение и/или стандартные диалоги. Ибо при включенном EnableDefaultReply, когда диалоги от моего установщика подавляются даже после переименования EXE, удаления оттуда информации о версии и модификации большинства строк, в тестовом приложении из нескольких строк, MessageBox не подавляется.

Как оно их различает?
Re[2]: MessageBox молча возвращает IDNO
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 27.08.20 11:55
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Как вариант — сделать простейшее приложение с таким же MessageBox и попросить пользователя запустить его и прислать лог.


Я уже в своей виртуалке поставил этот софт (Media Control Server от Autonomic Controls), и получил тот же эффект (подавление MessageBox) со своим установщиком, но простейшее приложение MessageBox показывает. После удаления Media Control Server проблема сохраняется. Выключение EnableDefaultReply в "Error Message Instrument" решает проблему, но очень хочется понять, каким образом винда различает установщик и тестовое приложение, чтобы в подавлять MessageBox в установщике, но не подавлять его в тестовом.
Re[3]: MessageBox молча возвращает IDNO
От: Pavel Dvorkin Россия  
Дата: 27.08.20 13:41
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Я уже в своей виртуалке поставил этот софт (Media Control Server от Autonomic Controls), и получил тот же эффект (подавление MessageBox) со своим установщиком, но простейшее приложение MessageBox показывает. После удаления Media Control Server проблема сохраняется. Выключение EnableDefaultReply в "Error Message Instrument" решает проблему, но очень хочется понять, каким образом винда различает установщик и тестовое приложение, чтобы в подавлять MessageBox в установщике, но не подавлять его в тестовом.


Не объяснение, но установщик работает под elevated privileges. Попробуй сделать тестовое приложение с ними.

P.S. Нечто похожее (но все же не совсем) нашел

https://community.splunk.com/t5/Getting-Data-In/How-to-get-a-Windows-user-prompt-to-appear-on-a-client-machine/td-p/284919
With best regards
Pavel Dvorkin
Отредактировано 27.08.2020 13:50 Pavel Dvorkin . Предыдущая версия .
Re[4]: MessageBox молча возвращает IDNO
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 27.08.20 14:51
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>установщик работает под elevated privileges. Попробуй сделать тестовое приложение с ними.


Еще до того, как сделать тестовое приложение, я выкинул из установщика манифест для повышения привилегий (там еще был список поддерживаемых версий винды и прочее) — ничего не изменилось.

По-моему, идея подавлять все MessageBox, и при этом только их, могла прийти в голову только очень больному человеку. И в Applications Log эти события пишутся только в том случае, когда включен EnableLogging.
Re[5]: MessageBox молча возвращает IDNO
От: Pavel Dvorkin Россия  
Дата: 27.08.20 16:41
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>По-моему, идея подавлять все MessageBox, и при этом только их, могла прийти в голову только очень больному человеку. И в Applications Log эти события пишутся только в том случае, когда включен EnableLogging.


Вообще-то в инсталляторах полно DialogBox, и все они работают. MessageBox мало чем от их отличается, разве что в него вклиниться прямым путем нельзя.
Хотя черт его знает.
With best regards
Pavel Dvorkin
Re[6]: MessageBox молча возвращает IDNO
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 27.08.20 17:31
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Вообще-то в инсталляторах полно DialogBox, и все они работают.


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

По уму, им надо было сделать фильтр по параметрам сообщений (заголовок, текст, конфигурация кнопок и т.п.). А этим дурным прибабахом куда проще выбесить и юзеров, и админов непонятным поведением системы/приложений, нежели добиться вменяемой автоматизации, для которой его придумали.
Re[3]: MessageBox молча возвращает IDNO
От: ononim  
Дата: 27.08.20 18:05
Оценка:
ЕМ>каким образом винда различает установщик и тестовое приложение, чтобы в подавлять MessageBox в установщике, но не подавлять его в тестовом.
Например по имени ехешника. Без шуток:

Installer Detection only applies to:

1. 32 bit executables

2. Applications without a requestedExecutionLevel

3. Interactive processes running as a Standard User with LUA enabled

Before a 32 bit process is created, the following attributes are checked to determine whether it is an installer:

Filename includes keywords like "install," "setup," "update," etc.
Keywords in the following Versioning Resource fields: Vendor, Company Name, Product Name, File Description, Original Filename, Internal Name, and Export Name.
Keywords in the side-by-side manifest embedded in the executable.
Keywords in specific StringTable entries linked in the executable.
Key attributes in the RC data linked in the executable.
Targeted sequences of bytes within the executable.

(c) https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-vista/cc709628(v=ws.10)?redirectedfrom=MSDN
Как много веселых ребят, и все делают велосипед...
Re[4]: MessageBox молча возвращает IDNO
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 27.08.20 19:38
Оценка:
Здравствуйте, ononim, Вы писали:

O>Например по имени ехешника.


Это было первое, что я поменял. Потом выкинул манифест и VERSION_INFO — тоже не помогло. А в статье про Default Reply вообще ни слова об установщиках — там в первую очередь про сообщения об ошибках.

Сейчас интереса ради поменял в тестовом приложении абстрактный текст на "Install the application?", шапку — на "Application installer", вдобавок импортировал несколько функций из SetupAPI. Все равно этот MessageBox нормально отображается при включенном Default Reply. А установщик уже покорежил донельзя, и все равно ни один MessageBox оттуда не отображается. Реально, больные люди это делали.
Re[5]: MessageBox молча возвращает IDNO
От: Mystic Artifact  
Дата: 27.08.20 19:41
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Сейчас интереса ради поменял в тестовом приложении абстрактный текст на "Install the application?", шапку — на "Application installer", вдобавок импортировал несколько функций из SetupAPI. Все равно этот MessageBox нормально отображается при включенном Default Reply. А установщик уже покорежил донельзя, и все равно ни один MessageBox оттуда не отображается. Реально, больные люди это делали.


А что есть твой установщик? В смысле завязки на MSI есть или это просто приложение которое делает всё само?

PS: А так согласен, попахивает бредятиной. Вообще фича сама по себе попахивает.
Re[6]: MessageBox молча возвращает IDNO
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 27.08.20 19:55
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA> А что есть твой установщик? В смысле завязки на MSI есть или это просто приложение которое делает всё само?


Все сам, все руками.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.