beatcracker: (Leet Crew)
Наиболее интересным из всех "нововведений" в Windows 8 является Client Hyper-V, который позволяет нативно виртуализировать Windows-системы. Внутри, это тот-же Hyper-V, что и в серверных ОС, за вычетом таких фич как:
  • Remote FX capability to virtualize GPUs (software GPU in RDP 8)
  • Live VM migration
  • Hyper-V Replica
  • SR-IOV networking
  • Synthetic fibre channel
На первый взгляд, в списке ничего критичного для домашнего использования, однако на практике все оказалось хуже. Для бэкапа VM в рабочем окружении у меня используется самописный PowerShell-скрипт, который работает продвинутой обвязкой для опенсорсной утилиты HVBackup. Автор утилиты — сотрудник компании Cloudbase solutions предоставляющей услуги облачного хостинга. Не смотря на статус "beta", софтина используется в production-окружении , что положительно говорит о её надежности. А при возникновении проблем, открытый исходный код позволяет решать их самостоятельно: я например исправил баг при работе под Windows Server 2012 и этот патч уже включен в исходники на CodePlex.

HVBackup позволяет делать живые бэкапы VM на лету, для чего используется Hyper-V VSS Writer. Подробно про то, как это работает, можно прочитать например здесь. Однако, когда я попытался использовать свой скрипт на машине с Windows 8 меня постигло разочарование: утилита падала с исключением, причиной которого было отсутствие Hyper-V VSS Writer. Поиск показал, что этот факт Microsoft особо не афиширует, ограничиваясь кратким упоминанием:


The Hyper-V VSS writer is documented in the Hyper-V API documentation. This writer is an in-box writer for Windows Server operating system versions; it does not ship in Windows Client.

Я не смог пройти мимо такой вопиющей несправедливости и решил вернуть этот компонент обратно на его законное место. После некоторых изысканий выяснилось, что Hyper-V VSS writer обитает в службе Hyper-V Virtual Machine Management (%windir%\system32\vmms.exe). Не размениваясь на мелочи, я первым делом попробовал подсунуть аналогичный файл из Windows Server 2012. Служба успешно запустилась, однако Hyper-V VSS writer в системе не появился. Проверить его наличие можно выполнив команду vssadmin list writers в 64-битной сессии PowerShell. В серверных ОС с установленной ролью Hyper-V, её вывод выглядит так:

vssadmin list writers

В Windows 8 эта строка отсутствует, даже при замене службы на её серверную версию. Это наводит на мысль, о том, что редакция ОС проверяется в самой службе. Так например поступает Task Manager, о чем хорошо написано в этой статье. Для быстрой проверки этой теории, можно воспользоваться трюком с WinDbg, описанным там же. Приведу цитату:


Чтобы проверить версию системы из своего приложения, нужно вызвать функцию GetVersionEx. Вернётся структура OSVERSIONINFOEX, где в поле dwProductType будет указано, серверная или клиентская версия системы.

При этом, GetVersionEx вызывает RtlGetNtProductType, которая в регистре ecx возвращает 1 для клиентской и 3 для серверной. С неё-то и начнём.

Отладчиками под Windows я пользовался мало, поэтому выбрал единственный, с которым умею обращаться в данном случае, WinDbg. Для него есть замечательная команда, которой можно сделать автоматический брейкпоинт с заменой:

bp ntdll!RtlGetNtProductType "as /x ReturnValue rcx; gu; ed ReturnValue 1; g"

В нашем случае брейкпоинт будет выглядеть наоборот, т.к. нам нужно симулировать серверную ОС: bp ntdll!RtlGetNtProductType "as /x ReturnValue rcx; gu; ed ReturnValue 3; g". Кроме того, отладка служб связана с определенными неудобствами, т.к. если просто настроить автостарт отладчика при запуске службы, то из-за изоляции сессий, мы не сможем его увидеть, а Windows прибьет сервис по таймауту как зависший. Решается использованием удаленного отладчика и подключением к нему через WinDbg. Подробнее здесь.

Настраиваем, запускаем и проверяем. Vu à la! Hyper-V VSS Writer появился в списке. Теперь самое время копнуть vmms.exe дизассемблером и выяснить, где находится проверка и как её отключить на постоянной основе. GetVersionEx в службе вызывается два раза, оба они расположены рядом.

Первая процедура:

Проверка редакции ОС в vmms.exe

Здесь идет проверка на серверную редакцию или на контроллер домена (dwProductType = 2), если одно из этих условий выполняется, то функция возвращает в регистре ecx единицу. Чтобы отключить эту проверку достаточно команду условного перехода jz после первого сравнения заменить на безусловный jmp. Забегая вперед, скажу, что патч этой функции на Hyper-V VSS writer никак не повлиял.

Вторая процедура:

Проверка редакции ОС в vmms.exe

А тут проверяется является ли система десктопной (dwProductType = 1). Очень похоже на нужное место: если возвращаемое GetVersionEx значение dwProductType = 1, то внутренняя переменная выставляется в единицу и возвращается как результат выполнения функции в регистре eax. Чтобы отключить эту проверку, достаточно "занопить" команду setz cl.

Патчим файл, запускаем службу и проверяем вывод vssadmin list writers: Microsoft Hyper-V VSS writer на месте, как и ожидалось. Контрольный запуск HVBackup потдверждает, что все ок и теневые копии успешно создаются. Mischief managed!

По результатам этого исследования я сделал универсальный патч, который должен работать на всех версиях vmms.exe и убирает обе проверки. Eсли у вас есть возможность его протестировать (особенно на Windows 8.1) — попробуйте и напишите в комментариях. Те, кто не доверяют случайным exe-файлам из интернета, могут найти и заменить в vmms.exe последовательности:

  • 8A84243A0100003C037404 на 8A84243A0100003C03EB04 для отключения первой проверки.
  • 80BC243A010000010F94C1 на 80BC243A010000010909090 для отключения второй проверки.

Дополнительно отмечу, что обе процедуры вызываются из нескольких мест и возможно их патч включает остальные недоступные функции, однако в оснастке Hyper-V и командлетах есть свои проверки на редакцию ОС. Интересующиеся могут копать в сторону метода LoadOSInfo (поле IsClientSku) в Microsoft.Virtualization.Client.Management.dll.

March 2021

M T W T F S S
1234567
891011121314
151617181920 21
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Saturday, 27 December 2025 10:51
Powered by Dreamwidth Studios