пятница, 10 декабря 2010 г.

workaround for MSTSC window minimization curse == RemoteDesktop_SuppressWhenMinimized

Года два назад я интересовался проблемой присущей ряду инструментов функционального тестирования приложений в сценариях работы на удаленных машинах доступ к которым предоставляется через стандартный клиент Microsoft Terminal Services Client. Завел я тогда вот этот топик, в надежде добиться правды, но без результата. Проблема была следующая:  когда окно клиента минимизируется - удаленная станция получает уведомление от клиента о том, что его больше не интересуют обновления от сервера (output suppression).

Штука хорошая, экономит трафик - однако сервер при этом помимо обеспечения простой "тишины в эфире" еще и защищает станцию, активизируя winlogon в целях безопасности. Ряд API, связанных с управлением мышью и клавиатурой, благополучно перестают работать и соответственно тестирование  не приведет ни к чему хорошему.

Теоретически решение этой проблемы достаточно простое - например, "научить" клиента не отправлять серверу output supression сообщения, однако официального способа сделать это в mstsc тогда так и не нашлось (хотя помнится для альтернативного клиента rdesktop был даже соответствующий патч).

И хотя я уже потерял интерес к этой проблеме, было приятно увидеть, что недавно ее решение опубликовали.  Полагаю (и это мое личное мнение) Microsoft дал добро на разглашение уже известного некоторым игрокам рынка функционального тестирования решения, которое, как обычно, заключается в добавлении Правильного Параметра в Правильное Место реестра. Для деталей погуглите вот так - RemoteDesktop_SuppressWhenMinimized.

Мне кажется любопытным еще тот факт, что с небольшим интервалом эта информация появилась в источниках от двух конкурирующих продуктов- это TestComplete от Automated QA и Quicktest Professional от HP и насколько можно судить из коментариев - пользователи TestComplete как-то лучше прочувствовали важность этого решения, нежели пользователи близкого мне QTP. Даже разочаровался немного...

Incremental Linking

Возможно факт достаточно известный, однако не раз уже сталкивался с неприятным эффектом инкрементальной компоновки для некоторых специфичных проектов и поэтому решил оставить своеобразную напоминалку здесь: при инкрементальной линковке вызовы функций, которые физически попадают в модуль из других объектников вашего проекта, могут происходить косвенно.

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