воскресенье, 10 декабря 2017 г.

Выключение автозапуска ранее открытых приложений после перезагрузки Windows 10

Ориентировочно после билда 16299.15, наткнулся на крайне раздражающее поведение 10ки - она автоматически перезапускает приложения, которые были запущены перед нажатием на "ребут". Обычно это окна браузера, но подобному рестарту полежит так же и запущенный Regedit, который "пугает" окном UAC после перезагрузки, а так же ряд других приложений.

Об этом написано тут, и тут, и в куче еще мест. Способа "победить" данное поведение с помощью групповых политик не найдено (раньше, говорят, работало отключение "Use my sign-in info to automatically finish...", мне не помогло).

Приводится цитата инженера MS: 
Old behavior:
  • When you shut down your PC, all apps are closed
  • After reboot/restart, you have to re-open any app you'd like to use
New behavior:
  • When shutting down your PC, any open apps are "bookmarked" (for lack of a better word)
  • After reboot/restart, these apps will re-open automatically
If you want to start with no apps open (other than those set to auto-start via Task Manager/Start), you'll need to ensure all apps are closed before shutting down or restarting the PC.

вторник, 19 апреля 2016 г.

Колхозный хоум-сервер с мониторингом

Волею судеб досталось мне несколько SAS HDD дисков, материнская плата Asus P5K, Xeon E5450 с переходником на LGA755, и решил я сделать из них себе NAS. Да не просто NAS, а полноценный home server - с хостом виртуализации на Hyper-V в качестве "ядра", одной виртуалкой под файлопомойку и DLNA сервер, второй - под инфраструктурные сервисы вроде обхода роскомнадзора и KMS эмулятора, третьей - с 10кой под разные извращения, и еще даже немного ресурсов в запасе осталось :)

понедельник, 1 февраля 2016 г.

Тонкий клиент HP t610 как домашний медиацентр

Написать свои мысли сподвигла данная статья на хабре. В ней на основе тонкого клиента T610 автор поднимает home сервер на Centos 7.

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

Под рукой "внезапно" оказался тонкий клиент HP t610. ТК у меня был не t160 plus, как у автора статьи на хабре, а его "тощий" вариант - без райзера и возможности установить туда дополнительную видео или сетевую карту, зато вдвое меньшей толщины.


Что есть в наличии у t610:
  • Процессор AMD Dual-Core T56N 1.65 ГГц
  • Видеокарта Radeon HD 6320
  • Display Port и DVI
  • 2 USB3 и 4 USB2 порта
  • 2 PS/2 и 1 COM порт
  • Broadcom BCM57781 Gigabit Ethernet
  • WiFi+Bluetooth комбайн BCM943228HM8
  • 2 SATA разъема
  • 1 40-пиновый (ноутбучный) ATA
И самое главное - всё на пассивном охлаждении. То есть, идеально подходит для домашнего медиацентра - посторонние звуки издавать не будет, даже если будет оставаться включенным круглосуточно.


четверг, 15 мая 2014 г.

Установка Windows 2003 Server на недорогом VPS-хостинге

Понадобился мне на днях виртуальный сервер под Windows, работающий круглосуточно и находящийся на стабильном канале. Быстрый поиск по сайтам натолкнул на сервис где с большим отрывом по цене выделялась компания ITL DC 

На минимальном тарифе дают 1-ядерную виртуалку под KVM-QEMU c 15 Гб HDD, 512 Мб памяти и неограниченным трафиком. Данные параметры подходят под минимальные требования 2008r2, а 2003 сервер – будет просто летать.

Триального доступа к своим сервисам провайдер не дает, но можно заказать виртуалку сроком на 1 день, я так и сделал, чтобы поиграться. Следует отметить, что провайдер меряет сутки не от момента оплаты, а по концу дня своего местного времени, и виртуалка, оплаченная в обед «превратилась в тыкву» в 1 час ночи по Москве, хотя я рассчитывал ее покрутить еще и утром.

Преконфигурированными для данной конфигурации VPS доступны только линуксы – при попытке выбрать Windows получаем «For the OS 'Windows-Server-2008-R2-Web' at least 768 MiB of RAM is required», что не является правдой.
Меня же интересует Windows 2003 Server, который, увы никак не доступен на данном провайдере – ни среди готовых шаблонов, ни среди образов компакт-дисков. Конечно, можно написать, чтобы они добавили ISOшку, да еще и интегрировали туда драйвера virtio (иначе 2003 сервер не увидит жесткий диск), но это не наш метод.
На всякий случай выбираю шаблон с 32-битным Linux, тк 2003 сервер будет 32-битным.

Для установки 2003 сервера мы пойдём таким путем: разбиваем HDD на 2 части, в начале диска – 5 Гб раздел NTFS, он «примет» на себя Windows 2003. На вторую половину – ставится любая доступная операционка, из-под которой копируются установочные файлы Windows 2003 на первый раздел, первый раздел делается активным – и profit. После завершения установки Windows 2003 второй раздел можно будет удалить. В качестве «буферной» OS я использую windows 2008 r2, тк ее ISO образ доступен для монтирования. Но подойдет и любая другая OS, главное, чтобы была возможность из-под нее создать совместимый с Windows 2003 код MBR и бутсектор первого раздела.

понедельник, 25 февраля 2013 г.

Shim-ы и RT

С развитием эмулятора x86 Windows на Windows RT - практически каждый день сталкиваюсь с новыми багами в эмулируемых приложениях. Причем, причина некоторых "злостных" багов - не недостатки эмулятора, а кривость рук или природная лень авторов данных приложений.
То, что программы обращаются к блоку памяти после его освобождения или возвращают указатели на строки, выделенные на стеке - это еще мелочи. К выходу за пределы блока памяти  и к тому, что некоторые программы используют исключения Access Violation в своей нормальной работе вместо проверки параметров функций - я уже привык. Но вот некоторые конструкции заставляют переделывать большие участки существующего кода, просто чтобы заставить подобные программы хоть как-то работать. В итоге все-равно получается "не красиво", так как инече просто не реализуемо при использвоании имеющихся x86 движков (это я, например, про использование SuspendThread для синхронизации потоков). Так что вопрос о создании своего х86 движка, неуниверсального, но зато "заточенного" под конкретные нужды - давно решен утвердительно. Осталось только выделить на него время.

Чем больше занимаюсь проектом - тем больше начинаю уважать микрософт в плане поддержки старого софта на новых версиях Windows. И тем больше понимаю, что для осуществления запуска x86 программ на RT банального враппера поверх "родного" API и трансляции x86 команд будет недостаточно. В RT микрософт наконец выкинуло большие куски legacy кода, в некоторых случаях оставшегося еще со времен Windows 1.0, и реализация всех этих "костылей" теперь ложится на меня. Можно просто сравнить размер shim-ов в папке C:\Windows\AppPatch на RT и на настольной Windows 8. В релизе RT есть только несколько тестовых, в то время как в настольной - папка занимает более 10 мб. К счастью, формат базы shim-ов хоть и не документирован официально, но информации по нему предостаточно, так что можно "позаимствовать" данную базу в моем проекте.

По поводу application compatibility, и вообще по историческим апектам того, почему в windows некоторые вещи реализованы именно так, а не иначе - есть неплохой блог the old new thing. Его автор и книгу написал (найти ее скан не проблема), и выложил пару бесплатных глав. Одна из таких глав как раз посвящена историям про совместимость. И, читая данную книгу, я нахожу некоторые ошибки у себя. Как пример такой ошибки - вызов программой функции GetWindowLong(hwnd,DWL_DLGPROC) совершенно не означает, что hwnd == диалог, и программа хочет получить адрес его диалоговой процедуры. Ведь DWL_DLGPROC это просто константа 4, и в случае обычного окна - программа может хотеть прочитать второе слово из своих cbWndExtra, а храниться там может вообще все что угодно. Про это написано по приведенной выше ссылке в разделе "If it has eight bytes, it must be a dialog box".
Приходится определять класс окна (RealGetWindowClass) и смотреть диалог ли это. И только если диалог - добавлять спец обработку для эмуляции x86 диалоговых процедур.

вторник, 19 февраля 2013 г.

Citrix Streaming клиент и некомпилрующийся проект в Visual Studio 2012

В обед на работе "озарила" идея, которую захотелось сразу проверть в своем проекте эмуляторе.  Для проверки - собираю проект студией, стоящей на рабочем ПК, и получаю странные ошибки:

15>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(249,5): error MSB4018: The "CL" task failed unexpectedly.
15>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(249,5): error MSB4018: System.AggregateException: One or more errors occurred. ---> System.ArgumentOutOfRangeException: Not a valid Win32 FileTime.
15>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(249,5): error MSB4018: Parameter name: fileTime
15>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(249,5): error MSB4018:    at System.DateTime.FromFileTimeUtc(Int64 fileTime)

либо:

1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(611,5): warning MSB6008: Forcing a rebuild of all sources due to an error with the tracking logs. Not a valid Win32 FileTime.
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(611,5): warning MSB6008: Parameter name: fileTime
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(611,5): error MSB6001: Invalid command line switch for "link.exe". Not a valid Win32 FileTime.
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(611,5): error MSB6001: Parameter name: fileTime

Ошибки плавают, возникают то в одном, то в другом месте, но во всех них идет жалоба на "неправильный" FileTime. Причем, Rebuild All - работает, "поломалась" только обычная компиляция.
Как оказалось виноват клиент Citrix (вот на что бы никогда не подумал - так именно на него). Подробнее тут:
http://connect.microsoft.com/VisualStudio/feedback/details/635940/invalid-command-line-switch-for-link-exe-when-building

Мы как раз на работе "играемся" с стримингом приложений цитрикса, чтобы упростить контроль за использованием ПО на рабочих станциях. Я на днях решил протестировать как оно работает на себе, поставил стриминг клиента - и поплатился.
Вылечилось удалением streaming клиента citrix. Вариант с правкой файлов проекта не проверял, так как у меня их более 70 штук в эмуляторе.

понедельник, 28 января 2013 г.

Борюсь с дедлоком в своем проекте эмулятора. Вещь неприятная - возникает рандомно при включении звука в HOMM3. Оказалась причина дедлока - библиотека Miles Sound System. Для синхронизации работы с основным потоком они не используют критические секции и подобные примитивы, а нашли более "оригинальный метод".
Как написано на их сайте, "John Miles first released MSS in 1991 in the early days of PC gaming". Во времена ДОС для синхронизации было популярно использовать команды CLI (запретить прерывания), сделать свои дела и потом вызвать STI (разрешить прерывания). Видать стояла перед Женькой задача "быстро портировать под windows", вот он взял и заменил CLI на SuspendThread, а STI на ResumeThread для основного потока программы. А о том, что основной поток может быть не единственным, или то, что этот поток может "держать" критическую секцию, которая может понадобится самому MSS, да и то, что использовать данные функции не оптимально хотя бы с точки зрения производительности - думать не надо. И работало все до тех пор, пока не пришел я со своим эмулятором. И засуспендил MSS основной поток в тот момент, когда эмулятор держал критическую секцию, и попробовал MSS начать дальше выполняться - а фиг вам, для этого надо взять ту же секцию, а остановленный поток ее держит и не отдает. И пришлось мне делать свою реализацию SuspendThread, учитывающую подобные "особенности" криворуких программистов, не умеющих пользоваться примитивами синхронизации и изобретающих свой велосипед. "Miles is super robust. Since we ship in so many games, Miles just gets better and better - it just doesn't crash", да, он не крашится. Он просто наглухо вешает вашу программу. Хотя я сужу по библиотеке более чем 10-летней давности, может быть в последних версиях, наконец, действуют более корректно.

И еще один перл от того же автора. На этот раз в библиотеке binkw32.dll:
          loc_100014C2:                          
                push    0              
                call    Sleep
                mov     eax, [esi+4Ch]
                test    eax, eax
                jnz     short loc_100014C2
Зачем нам евенты - есть же поллинг, так хорошо зарекомендовавший себя под ДОС! Будем опрашивать переменную до посинения обнуления. Хотя бы Sleep(0) догадался добавить, чтобы квант времени потока отдать. Только не сильно оно помогло, у меня в эмуляторе этот цикл превратился в вечный. Но это уже баг на моей стороне, "переоптимизировал".

mamaich, 28.01.2013