Наиболее интересным из всех "нововведений" в Windows 8 является Client Hyper-V, который позволяет нативно виртуализировать Windows-системы. Внутри, это тот-же Hyper-V, что и в серверных ОС, за вычетом таких фич как:
HVBackup позволяет делать живые бэкапы VM на лету, для чего используется Hyper-V VSS Writer. Подробно про то, как это работает, можно прочитать например здесь. Однако, когда я попытался использовать свой скрипт на машине с Windows 8 меня постигло разочарование: утилита падала с исключением, причиной которого было отсутствие Hyper-V VSS Writer. Поиск показал, что этот факт Microsoft особо не афиширует, ограничиваясь кратким упоминанием:
Я не смог пройти мимо такой вопиющей несправедливости и решил вернуть этот компонент обратно на его законное место. После некоторых изысканий выяснилось, что 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, её вывод выглядит так:

В Windows 8 эта строка отсутствует, даже при замене службы на её серверную версию. Это наводит на мысль, о том, что редакция ОС проверяется в самой службе. Так например поступает Task Manager, о чем хорошо написано в этой статье. Для быстрой проверки этой теории, можно воспользоваться трюком с WinDbg, описанным там же. Приведу цитату:
В нашем случае брейкпоинт будет выглядеть наоборот, т.к. нам нужно симулировать серверную ОС: bp ntdll!RtlGetNtProductType "as /x ReturnValue rcx; gu; ed ReturnValue 3; g". Кроме того, отладка служб связана с определенными неудобствами, т.к. если просто настроить автостарт отладчика при запуске службы, то из-за изоляции сессий, мы не сможем его увидеть, а Windows прибьет сервис по таймауту как зависший. Решается использованием удаленного отладчика и подключением к нему через WinDbg. Подробнее здесь.
Настраиваем, запускаем и проверяем. Vu à la! Hyper-V VSS Writer появился в списке. Теперь самое время копнуть vmms.exe дизассемблером и выяснить, где находится проверка и как её отключить на постоянной основе. GetVersionEx в службе вызывается два раза, оба они расположены рядом.
Первая процедура:

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

А тут проверяется является ли система десктопной (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 последовательности:
Дополнительно отмечу, что обе процедуры вызываются из нескольких мест и возможно их патч включает остальные недоступные функции, однако в оснастке Hyper-V и командлетах есть свои проверки на редакцию ОС. Интересующиеся могут копать в сторону метода LoadOSInfo (поле IsClientSku) в Microsoft.Virtualization.Client.Management.dll .
- Remote FX capability to virtualize GPUs (software GPU in RDP 8)
- Live VM migration
- Hyper-V Replica
- SR-IOV networking
- Synthetic fibre channel
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, её вывод выглядит так:

В 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 в службе вызывается два раза, оба они расположены рядом.
Первая процедура:

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

А тут проверяется является ли система десктопной (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.Manageme