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.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org

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 Thursday, 8 January 2026 08:39
Powered by Dreamwidth Studios