Nintendo SwitchのSDカードを容量の大きなものに交換する

Nintendo Switchに使っているSDカードの空き容量が不足してきたので、サイズの大きなSDカードに交換したいと思う。Nintendo SwitchのSDカードはFAT32フォーマットを採用していて、2TBのSDカードまで対応している。パソコンで単純にコピーできれば早いのだが、Windowsでは32GBを越えるFAT32パーティションを作成することが出来ない。そこで使用するのは以下の二種類のツール。作業を始める前にダウンロードしてインストールしておく。
HDD Raw Copy Tool
MiniTool Partition Wizard 無料版

SDカードリーダーが2台有ればMiniTool Partition Wizardで元となる容量の小さなSDカード、新しい容量の大きいSDカードに直接コピーできる。だがその為だけにSDカードリーダーを追加で用意するのも勿体ない。ここではHDD Raw Copy Toolを使ってSDカードを複製した後に、MiniTool Partition Wizardでパーティションサイズを変更する手順で作っていく。

コピー元SDカード⇒ディスクイメージファイル

最初にHDD Raw Copy Toolを使用してSDカードからディスクイメージフィルを作成する。HDD Raw Copy Toolは日本語化されていないので日本語のフォルダ名やファイル名は文字化けする。保存先などには日本語名が混じらないようにする。

SDカードをリーダーに挿した後にHDD Raw Copy Toolを起動すると認識しているディスクの一覧が表示されるので、コピー元となるSDカードを選択して、Continueをクリックする。

次にコピー先となるディスクイメージファイルを選択する。認識されているディスクの一覧の最後にFILEと言う項目があるので、それをダブルクリックする。保存先の選択ダイアログが表示されるので、保存先のファイル名を入力する。

コピー先となるディスクイメージファイルを指定したら、Continueをクリックする。

以下のような確認画面が表示されるので、Startをクリックして、ディスクイメージファイルの作成が終わるのを待つ。コピーが終わったら100% completeと表示されるので、HDD Raw Copy Toolを終了する。

ディスクイメージファイル⇒コピー先SDカード

コピー先SDカードに差し替えて、再びHDD Raw Copy Toolを起動する。最初にコピー元を選択するが、今度はディスク一覧の最後にあるFILEを選択する。FILEをダブルクリックして、先ほど作成したディスクイメージファイルを指定して、Continueをクリックする。

次にコピー先を選択するので、ディスクの一覧からコピー先となるSDカードを選択して、Continueをクリックする。

コピー確認画面でStartをクリックする。コピー先のパーティションを上書きして良いか警告が表示される。ここでは警告を無視して「はい」をクリックして先に進める。

パーティションサイズの変更

この時点では、コピー先SDカードのパーティションサイズは、コピー元SDカードと同じになっています。この後に、MiniTool Partition Wizardを使用して、コピー先SDカードのパーティション拡張を行います。

MiniTool Partition Wizardを起動してドライブの一覧から対象のSSDにあるFAT32パーティションを選択したあと、右側のパーティション変更からパーティション拡張をクリックします。

パーティション拡張のバーを一番右側までスライドさせ、パーティションサイズを最大まで拡張します。

最後に右下の「適用」をクリックしてパーティションの拡張を実行します。

この手順で、キャプチャした画像はコピー元のSDカードが32GB、コピー先のSDカードが64GBになっていますが、最大2TBまで制限無く拡張できるはずです。

画像ファイルを開こうとすると「ファイルシステムエラー ファイルを読み込めません」となる。

MicrosoftフォトなどのMicrosoft Store アプリが動作しなくなると中々に厄介です。昔同様の状況になったときには修復できずに終わったのですが、今回はなんとか修復できたので実行した作業を纏めて起きます。

DISMコマンドおよびsfcコマンドでコンポーネントストアの修復を試みます。管理者権限でコマンドプロンプトを開いて、以下のコマンドを順番に実行します。

DISM /Online /Cleanup-Image /CheckHealth
DISM /Online /Cleanup-Image /ScanHealth
DISM /Online /Cleanup-Image /RestoreHealth
sfc /SCANNOW

次に設定→更新とセキュリティ→トラブルシューティング→追加のトラブルシューティングからWindowsストアアプリを選んでトラブルシューティングツールの実行を行います。

設定→アプリ→アプリと機能からMicrosoftフォトを選択して詳細オプションを開く。終了、修復、リセットを純に実行する。

Microsoftフォトが起動するようにはなりましたが、アプリと機能に表示されないなどどこか動作が不自然なのでPowershellからMicrosoftフォトをアンインストールします。

管理者権限でPowershellを開いて以下のコマンドを実行します。

Get-AppxPackage Microsoft.Windows.Photos | Remove-AppxPackage

Microsoftストアを開いてMicorosftフォトを再度インストールします。

参考:ファイルシステム エラー-2147219196の対処法7つ

VBAはオワコンなのか?

VBAがオワコンなのか?という話題がTwitterで流れていたので、私の考えを纏めておこうと思う。

VBAの生い立ち

Visual Basic for Applications(以下VBA)の話しをするときに、Visual Basic(以下VB)のことを抜きにすることはできません。VBAは、いまはサポートが終了しているVBという開発言語を元にして生まれました。VBは、いまもMicrosoftが提供しているVisual Basic.NET(以下VB.NET)とはまったく異なる開発言語です。VBはWindows専用の開発言語として広く支持を集めました。その開発の平易さから、特に受託開発の現場で多く使われてきました。利用者がが増えれば、対応する事業者も増えます。多くのサードベンダーがVB用のコンポーネントを提供しており、当時としては開発しやすい環境が整っていたのです。

VB最後のバージョンとなるVB6.0はComponent Object Model(以下COM)に準拠し、Microsoft開発言語の中核となりました。どのような言語であってもにCOMに準拠したコードを書けば、使用する言語によらず機能を呼び出せるようになります。オーバーヘッドも比較的小さく、単にライブラリを呼び出せるだけでは無く、プロセス間の通信や、ネットワークを介してサーバー間の呼び出しも行えるものでした。多くのコンポーネントがCOMに準拠したものに置き換わり、様々なサードベンダーが提供するようになっていきました。

ところがその後にCOMの欠点が問題になっていきます。VB 6.0の発売された1998年はインターネットの黎明期にあたりました。今ほどセキュリティへの要求は厳しくない時代に設計されたため、セキュリティへの設計面での配慮がほとんど無かったのです。Microsoftはその後に多くのセキュリティ問題に苦しむことになります。

VB 6.0の発売から4年後、セキュリティを強化して再設計したVB.NET 7.0がリリースされます。Microsoftはそれまで、二年ごとに新バージョンを提供していたことを考えると、相当に苦労したことがうかがえます。ですがVB.NETにはVB6.0との互換性は全くありませんでした。互換性の問題からVB6.0からVB.NET7.0への移行は進まず、Windows 11となった今もVB6.0のランタイムライブラリがOSと共に提供され続けています。

VB.NET7.0が発表された後、当然ながらVBAについても多くの議論が巻き起こりました。セキュリティを考慮するならVB.NET7.0を基礎としたものに作り替えた方が良いのは分かっています。でも現実問題として互換性の全くない言語への移行は困難を極めるのは明らかでした。それに対する結論として現在の状況があります。

MicrosoftはVBAはその互換性を維持して提供し続けることを選択しました。同時に、セキュリティの問題に対応するためにデフォルト設定ではマクロ機能を無効にし、また電子署名を付けた出所の明確なマクロ以外では警告を表示するようにしました。拡張子もxlsx(マクロ無し)とxlsmx(マクロ有り)と分ける事でユーザーがマクロの有無を意識しやすくしました。ユーザーはマクロを利用するために設定を変更する事になりますが、それに伴うリスクはユーザーが負うものとなりました。

最近でもセキュリティ強化は続いていて、インターネットからダウンロードしたファイルや、共有フォルダ上のファイルについては、デフォルトではマクロが実行されないような改善が行われています。

VBAに変わる機能を提供する試みも繰り返し行われています。ファイル仕様が公開されオープン化したことにより、xlsxファイルを編集する事のできるライブラリが様々な言語で利用できるようになりました。またOffice製品を操作するために、Microsoft Office Interop、Visual Studio Tools for Office、Apps for Office、Excel REST APIと何度か新たなツールを提供を試みていますが普及には至っていません。Windows OSに比較的容易に使える開発言語としてPythonを組み込むと言ったことも行われています。最近あらたに提供しているのはPower Automateですね。

VBAを使い続ける事の何が問題なのか?

セキュリティ上のリスク

マクロの実行を許可することに伴ってキュリティリスクが発生します。VBAが含まれたファイルがコンピューターウィルスの感染経路となっている事は知られていることと思います。リスクを認識して電子署名の無いマクロの実行を禁止する等の対策を取っているなら良いのでしょう。ですが、VBAを使っている企業では利便性を優先して、どんなマクロも実行許可しているのが実情でしょう。

機能面の貧弱さ

VB6.0の頃には様々なベンダーがCOMコンポーネントを提供していました。これにより2008年頃までは拡張性の高いパワフルな言語となっていましたが、今は殆どのベンダーがCOMコンポーネントの提供から撤退しています。VBAで出来る事が縮小していっているのが実態です。

VBAの言語機能どのものの拡張も20年単位で行われていません。この20年間で多くの言語に取り込まれてきたような機能、完全なオブジェクト指向や無名関数、並列化などの機能が追加される見込は無いでしょう。ソースコード管理システムとの連携が極めて困難なのも生産性を大きく下げてしまいます。

本当に何処でも実行出来るのか?

VBAを利用する理由のひとつに「Excelはどのパソコンにもインストールされており、どのパソコンでも利用できる」というのが有る。Microsoftはサブスクリプションモデルへの移行を目指しており、従来の買切り型ライセンスのOffice製品は2025年でサポートを終了することになっている。現在はデバイスライセンス下で複数の従業員が共有しているパソコンについても、2025年移行はユーザーライセンスに移行する事が求められる。例え利用時間が月に30分でも、アルバイトが20人いれば20ライセンスを購入することになるが、はたして購入し続けるだろうか?

また年々セキュリティ意識が高まっていく中、VBAを実行するためにセキュリティ設定を緩めて貰う事が、いつまで受け入れられるでしょうか?VBAを完全に禁止している会社も少なからずあるのが実情です。

またランタイムを追加で導入する必要が無く、何処でも実行可能であることがVBAを選択する理由なら、JavaScriptでもPythonでも良いはずです。

VBAを使い続ける上で必要なこと

VBAを使い続ける上で必要なことは、リスクを正しく認識する事だと考えて居ます。以下の様な問題があることを踏まえた上で、バランスを取りつつVBAと付き合っていく必要があるわけです。

  • VBAを使うためにセキュリティリスクを高めていること。
  • VBAの生産性を高めるような言語機能の拡張は20年ほど行われておらず、多言語と比較して生産性の低い開発言語となりつつあること。
  • VBAには将来に向けたロードマップが無く、今後もサポートが縮小していく可能性が高いこと。
  • セキュリティ問題、ソフトウェア資産管理上の問題から、VBAの利用を禁止している企業も少なくない。

少なくとも僕個人の方針として、今から積極的にVBAで書かれたソフトウェア資産を増やしたり、今からVBAを学ぶというのは、リスクに対してベネフィットが合わなくなる可能性が高いと捉えています。

VBAによるソフトウェア資産の総量を、VBAを止める必要が生じたときに速やかに他の開発言語に移植できる程度の量に納める必要があるでしょう。ソースコードの総量をメンテナンス可能な範囲に納める必要があるいのはVBAに限った話しではありませんが、VBAの場合には生産性の低さや将来性のなさから、より少ない量に抑える必要があるはずです。

マクロの実行を有効にする上で、セキュリティリスクを下げるため、ウィルス対策ソフトを使用するのは当然として、それ以外にもアクセス権管理やコンテンツフィルタなど、多層防御できる態勢を整えておく必要があるでしょう。新しいウィルスがウィルス対策ソフトのパターンファイルをすり抜ける事は珍しく無いのです。

ポート名を指定して既存のプリンタドライバを削除する

こちらのように”rundll32.exe printui.dll,PrintUIEntry ~”を使用すればコマンドラインからプリンタをインストールする事で設定の共通化を出来るが、既に同一ポート名でプリンタが導入されていた場合に複数のプリンタドライバをインストール出来てしまう。同一ポートを使用するプリンタドライバをインストールしてしまうと、設定⇒デバイス⇒プリンタとスキャナーで表示したときに、一つに集約されてしまい、非常に扱い難くなる。

そこで事前に以下のPowershellスクリプトでポート名を指定して既存プリンタを削除しておく事で、同一ポート名で重複登録することを防ぐとよい。

#RemovePrinterWithPort.ps1
$removePort = $args[0];
$printerNameKey = "プリンター名";
$portNameKey = "ポート名";

$printerName = "";
$portName = "";
cscript $env:SystemRoot\System32\Printing_Admin_Scripts\ja-JP\prnmngr.vbs -l | ForEach-Object {
    if ($_ -match ('^' + $printerNameKey + '.*'))
    {
        $printerName = $_.Replace(($printerNameKey + " "), "");
    }

    if ($_ -match ('^' + $portNameKey + '.*'))
    {
        $portName = $_.Replace(($portNameKey + " "), "");
        if ($portName -eq $removePort)
        {
            ("Remove Printer : " + $printerName);
            cscript $env:SystemRoot\System32\Printing_Admin_Scripts\ja-JP\prnmngr.vbs -d -p $printerName;
        }
    }
}

exit;

上記スクリプトをRemovePrinterWithPort.ps1で保存し、以下のコマンドでコマンドプロンプトから呼び出す。

 powershell.exe -Command .\RemovePrinterWithPort.ps1 IP_192.168.0.10

コマンドプロンプトからプリンタドライバをインストールする(Canon LIPS LX)

コマンドプロンプト(BATファイル)からサイレントにプリンタドライバをインストール手順です。コマンドプロンプトからインストール出来ると、キッティングやメンテナンスの手間を大幅に減らせます。CanonのLIPS LXドライバを例としていますが、他社のドライバでも本質的には同じです。

CanonのWEBサイトからダウンロードしたインストーラを起動し、展開されたファイルから.\x64\Driver下の以下のファイルを取り出します。

  • cnlb0m.cat
  • CNLB0MA64.INF
  • gpb0.cab

INFファイルの中味を確認する。以下の”Canon Generic Plus LIPSLX”がドライバ名にあたる。

; Canon Generic Plus LIPSLX printer INF for Microsoft Windows (x64)
; Copyright CANON INC. 2017
; CNLB0MA64.INF

[Version]
Signature="$Windows NT$"
Provider=%CANON%
ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318}
Class=Printer
DriverVer=06/26/2023,2.90.0.0
CatalogFile=CNLB0M.CAT

[Manufacturer]
"Canon" = Canon,NTamd64,NTamd64.6.0

;64-bit x64
[Canon.NTamd64]
"Canon Generic Plus LIPSLX"             = GPBDL,,1284_CID_CA_XPS_OIP
"Canon Generic Plus LIPSLX"             = GPBDL,,1284_CID_CA_UFRII_COLOR_OIP
"Canon Generic Plus LIPSLX"             = GPBDL,,1284_CID_CA_UFRII_BW_OIP
"Canon Generic Plus LIPSLX"             = GPBDL,CanonGeneric_V3_PrinC2DB

以下の様なバッチファイルを作成する。
1.prnmngr.vbsで既存プリンタ設定を列挙し既にインストール済みなら実行しない。
2.prnport.vbsでプリンタポートを作成
3.rundll32.exe printui.dll,PrintUIEntry~でドライバをインストールする。Canon以外のプリンタの場合には/fオプション以下のINFファイル名、/mオプション以下のプリンタドライバ名が変わる事になる。/bオプション以下は任意のプリンタ名となる。

set exe_dir=%~dp0

rem IPアドレス、ポート名を格納
set ip_addr=192.168.0.10
set ip_port=IP_192.168.0.10
set prname=iR-ADV C5850

rem ログ出力
set log_file=install.log
set driver_path=%exe_dir%

rem プリンタインストール済みかチェック
set prnmngr=C:\Windows\System32\Printing_Admin_Scripts\ja-JP\prnmngr.vbs
cscript %prnmngr% -l | findstr /l /C:"%prname%"
if %ERRORLEVEL%==0 GOTO END

:INSTALL
rem ポートの追加
set prnport=C:\Windows\System32\Printing_Admin_Scripts\ja-JP\prnport.vbs
cscript %prnport% -a -s %computername% -r %ip_port% -h %ip_addr% -o raw -n 9100 >> "%exe_dir%%log_file%

rem プリンタドライバの追加
rundll32.exe printui.dll,PrintUIEntry /if /f "%driver_path%\CNLB0MA64.INF" /v "Windows 10" /m "Canon Generic Plus LIPSLX" /r "%ip_port%" /b "%prname%"

:END

BIG-IP EDGE CLIENTが正常に動作しない

BIG-IP EDGE CLIENTが正常に動作しない場合、接続時にバックグラウンドで自動的にダウンロードするモジュールが壊れている場合があります。BIG-IP EDGE CLIENTは必要なファイルを”C:\Windows\Downloaded Program Files”にダウンロードしますので、管理者権限で当該フォルダの中にあるファイルを全て削除してから再実行してみてください。

当該フォルダはBIG-IP EDGE CLIENT以外のアプリケーションも使用している可能性があります。ですが仮に削除しても、実行時に再度ダウンロードするはずなので問題はありません。

PowershellからBITS(Background Intelligent Transfer Service)を使用して大容量ファイルを配布する

BITSはMicrosoftがWindowsに標準機能として載せている分散ダウンロード機能です。WindowsUpdateもバックグラウンドでBITSを利用しており、LAN内の複数のPCからWindowsUpdateをダウンロードする場合には、他のパソコンが自動的にキャッシュサーバーとなることで、インターネットとの通信負荷を押させてくれます。このBITSはWindowsUpdate専用の機能というわけではなく、簡単なプログラムを用意すれば、大容量ファイルを配布するときに自由に活用することができます。

昨今、プログラムやセキュリティパッチのフットプリント(ファイルサイズ)が大きく鳴り続ける、パッチ配布のネットワーク負荷が原因でインターネットが輻輳するなんて事件もありましたね。社内ネットワーク(WAN)はその構造上、どうしても一か所に負荷が集中しやすく、分散ダウンロードができると随分と助かりますね。

BITSでダウンロードするための一連の流れは次のようになります。

  1. HTTPサーバー上にダウンロード元となるファイルを用意します。
  2. Start-BitsTransferでBITSに新しいダウンロード要求を登録します。
  3. 定期的にGet-BitsTransferを呼び出しダウンロードの完了を待ちます。
  4. ダウンロード完了後にComplete-BitsTransferでファイルに書き出します。

上記をPowershell Scriptで記述したのが下記です。このスクリプトをダウンロードが完了するまで定周期で実行します。

$displayName = 'BITS_Sample'; # BITSにダウンロード要求を登録する時の表示名
$fromURL = 'http://www.example.co.jp/BITS_Sample.zip'; # ダウンロード元のURL
$destFile = 'C:\TEMP\BITS_Sample.zip'; # ダウンロード先のファイル名
$logFile = 'C:\TEMP\BITS_Sample.log' # ログ出力先のファイル名

$noBitsInstance = $true;
$completeDownload = $false;

Add-Content -Path $logFile -Value ('Start Script:' + (Get-Date));

# ダウンロード先フォルダが無ければ作成しておく
if ($false -eq (Test-Path 'C:\TEMP')){
    mkdir 'C:\TEMP';
}

# ダウンロードファイルが
if ($false -eq (Test-Path $destFile)){
    # BITSへのダウンロード要求を列挙する
    Get-BitsTransfer | Where-Object {
        Add-Content -Path $logFile -Value ('BITS Status:' + $_.DisplayName + '-' + $_.JobState);
        # 表示名の一致しているダウンロード要求が転送終了になるまで待機
        if ($_.DisplayName -eq $displayName){
            $noBitsInstance = $false;
            if ($_.JobState -eq "Transferred") {
         # ダウンロード完了した転送要求を完了させる
                Complete-BitsTransfer $_;
                $completeDownload = $true;
            }
        }
    }

    # BITSにダウンロード要求が登録されていなければ、新たに登録する。
    if ($noBitsInstance -eq $true){
        $delayMinute = Get-Random -Maximum 240;
        $kickDateTime = (Get-Date).AddMinutes($delayMinute);

        # 新規ダウンロード登録までランダムに待機する
        Add-Content -Path $logFile -Value ('Wait ' + $delayMinute + ' Minutes');
        While ($kickDateTime -ge (Get-Date)){
            Add-Content -Path $logFile -Value ('delay - ' + (Get-Date));
            sleep 60;
        }

        # 新規にダウンロードを登録する
        Add-Content -Path $logFile -Value ('Start BitsTransfer:' + $displayName + '-' + $destFile);
        Start-BitsTransfer -Source $fromURL -Destination $destFile -Asynchronous -Priority Normal -DisplayName $displayName
    }

    if ($completeDownload -eq $true){
        # ダウンロード完了後の処理
        Add-Content -Path $logFile -Value ('Complte Download:' + $displayName + '-' + $destFile);
    }
}
Add-Content -Path $logFile -Value ('End Script:' + (Get-Date));

私はActive Directoryのグループポリシーでログオンスクリプトとして登録しました。コントロールパネルのタスクで定周期に起動してもよいでしょう。

BITSで使用する帯域の制限などはレジストリに記述するか、ActiveDirectoryのグループポリシーで定義します。

Power Autoamte Desktopを導入

遅ればせながらPower Automate Desktop(以下PAD)を導入。

以前はPowershell + UIAutomation.dllでデスクトップアプリケーションの自動化を行っていた。同じ処理をPADで再実装してみたが、実装にかかる作業時間が1/5程度になっている感じでありがたい。Powershell + UIAutomation.dllで記述したときには画面が表示されるのを待つためのループ処理やディレイ処理が多く遅かったのだが、PADで記述したことでディレイ処理は1箇所のみに減り、大幅に早くなっている。

ただしいくつか気になる点もある。

1.複数のMicrosoftアカウントをWindowsに関連付けていると動作しない。実行時例外が発生して「The cache contains multiple tokens satisfying the requirements. Try to clear token cache.」となってしまう。あまり使わない方のMicrosoftアカウントの連携を解除して解決した。

2.圧縮→ZIPファイルが日本語ファイル名に対応しておらず、文字化けしてしまう。OSSのUnZip(http://infozip.sourceforge.net/UnZip.html)を子プロセスとして呼ぶことで対応した。

3.コードの見にくさ。WEB上のMicrosoft Flowも何度か使ってみた事はあるのだが、一画面に20ステップ程度しか表示出来ないので、やはり複雑な処理は書きにくい。

4.バグを見つけたのでレポートしたいが、お手軽なバグレポートツールが見当たらない。ヘルプ辺りにレポートメニューがあると有り難いのだが。

総じてデスクトップアプリの自動化を行うツールとして、無償でここまで扱いやすいツールは他に無く、とてもよいと思う。だがWEBアプリ操作やファイル処理を行おうとすると、なかなか厳しい。その辺りは適材適所、SeleniumやVBAを併用する事は続きそうだ。

Active Directory環境でDHCPを使用する。

Active Directory環境でDHCPを使用する場合には、DHCPサーバとADサーバとの間で信頼関係を結び、ADサーバ上のDNSに登録されているクライアントPCのIPアドレスを更新する必要があります。

ADサーバーとの間で認証する都合上、必然的に使用できるDHCPサーバーは限られます。LinuxとSMBを使っても出来るはずですが、実際に構築したという情報も少なく面倒そうです。

DHCP自体は負荷の高いサービスでは無いので、ADサーバーとDHCPサーバーを兼ねるのが良さそうです。各ネットワークセグメントにDHCP Relayサーバーを配置して、中央のADサーバにDHCPの問合せを送ります。

参考:More about authorizing DHCP servers in AD DS

Server 2003/2008からP2Vで仮想化したときにブルースクリーン(0x0000007B)が発生する。

Windows Server 2003やWindows Server 2008の環境でP2Vツールを使用して物理サーバーから仮想環境(Hyper-V等)に移行した場合に、OSの起動時にブルスクリーンが発生して0x0000007Bのエラーが発生する場合がある。これは元の物理サーバーの環境でRAIDやSCSIを使用していたために、標準のSATA関係のドライバが組み込まれていないことに原因があります。

C:\Windows\System32\に以下のドライバが無い場合には、正常な環境から複製してください。

C:\windows\system32\drivers\intelide.sys
C:\windows\system32\drivers\pciide.sys
C:\windows\system32\drivers\atapi.sys

ドライバを読み込ませるために、以下のレジストリエントリが無い場合には作成してください。

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7111
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7110&cc_0601
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\primary_ide_channel
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\secondary_ide_channel
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\IntelIde
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\PCIIde
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\atapi

設定すべき値は以下を参照してください。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7111]
"Service"="intelide"
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7110&cc_0601]
"ClassGUID"="{4D36E97D-E325-11CE-BFC1-08002BE10318}"
"Service"="isapnp"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\primary_ide_channel]
"Service"="atapi"
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CriticalDeviceDatabase\secondary_ide_channel]
"Service"="atapi"
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\IntelIde]
"ErrorControl"=dword:00000001
"Group"="System Bus Extender"
"Start"=dword:00000000
"Tag"=dword:00000004
"Type"=dword:00000001
"ImagePath"=hex(2):73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,69,00,6e,00,74,00,65,00,6c,00,69,\
  00,64,00,65,00,2e,00,73,00,79,00,73,00,00,00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\IntelIde]
"ErrorControl"=dword:00000001
"Group"="System Bus Extender"
"Start"=dword:00000000
"Tag"=dword:00000004
"Type"=dword:00000001
"ImagePath"=hex(2):73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,69,00,6e,00,74,00,65,00,6c,00,69,\
  00,64,00,65,00,2e,00,73,00,79,00,73,00,00,00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\atapi]
"ErrorControl"=dword:00000001
"Group"="SCSI miniport"
"Start"=dword:00000000
"Tag"=dword:00000019
"Type"=dword:00000001
"DisplayName"="標準 IDE/ESDI ハード ディスク コントローラ"
"ImagePath"=hex(2):73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,61,00,74,00,61,00,70,00,69,00,2e,\
  00,73,00,79,00,73,00,00,00

P2Vで仮想化する前の元の環境で設定を変更できれば良いのですが、それが出来ない場合には仮想ディスクファイル(*.VHD)をマウントして編集します。レジストリを編集するにはレジストリエディタを起動し”ファイル→ハイプの読み込み”から、マウントした仮想ディスクの”\windows\system32\config\system”を開きます。

参考:P2V Migration Issues with Hyper-V: STOP: 0x0000007B