別の記事では、MacBook ProにインストールしたWindows10でeGPUを接続してを実行させる方法を紹介しました。
しかし、実際にはeGPU以外のデバイスがUSB-C/Thunderboltポートに接続できなくなるなどの制約が発生するため、外付けストレージやUSBゲームコントローラーを接続することができなくなります。(この現象はmacOSでは発生しません)

これは、Windowsがデバイスを制御するために利用可能としているメモリ空間が4GB(32bit)に制限されているために発生しています。eGPUのようにメモリを多く利用するデバイスによって割り当てる空間が不足してしまうのです。
(・・・ちょっと自信がないので間違えてたらご指摘ください)

このような4GBの制限をDSDTテーブルという方法によって解決してしまおうというのが今回の趣旨です。

(注意:ここで紹介する記事を適用する前に、関連記事の内容を把握しておいてください。特にThunderboltポートの場所によってeGPUを認識しない現象は、この記事の内容を適用した後も発生します)

DSDTテーブルとは何か?


パソコンに内蔵されているBIOS(またはUEFI)には電源やハードディスクなどハードウェア情報がACPIテーブルとして列挙されていて、それをOSが参照することでデバイスドライバなどがロードされます。

DSDTテーブルとはACPIテーブルの中でもデバイスの構成情報がまとめられたものです。

→ ACPI - ウィキペディア

このDSDTテーブルをBIOS(またはUEFI)とOSの間に割り込んで書き換えてしまうことで、実際のハードウェアとは異なるハードとOSに認識させることができます。
DSDTExpression

この方法を使えば、MacBook Pro + Windows 10 環境でeGPUもUSB-C/Thunderboltポートもフルに使いきれるようになります。(ただし電源ONの前にデバイス接続が必要)

なお、最初に告白しておくと、この記事の内容はこちらに書かれた内容を少し簡略化して日本語化したものです。

なので「DSDTを修正してスリープから復帰しない問題は解決できるか?」とか「PCにサポートされないOSをインストールするときのDSDT編集方法を教えてくれ」とかいわれてもわからないのであしからず。


以降の作業は、MacBook Pro 2016 搭載メモリ 16GB、Windows 10 64bit 版 バージョン 1803 でのみ確認しています。メモリ搭載量が少なかったり、Windowsのバージョンが変わった場合はインストールするツールが変わるかもしれませんので、あらかじめご了承ください。


この作業の大まかな流れ


以下のような流れになります。
  • 一. Windowsに必要なツールのダウンロードとインストール
  • 二. コマンドプロンプトを管理者として実行し、コマンド操作


一.Windowsに必要なツールのダウンロードとインストール


まず、Cドライブの直下に「dsdt」という作業用フォルダを作成してください。エクスプローラーを開き、左サイドバーから「PC」をクリック。Cドライブを開いた直後、何もないところを右クリックして「新規作成(X) > フォルダー(F)」を実行し、名前を「dsdt」にします。今後はここを中心に作業します。

dsdt_folder

では次に、必要なツールをWindowsにインストールしましょう。いくつかのファイルやプログラムをインストールします。

  1. APCIテーブルを取得するツール
  2. Windowsドライバ開発キット(asl.exeというプログラムだけ必要)
  3. refs.txt というテキストファイルを自作

1:APCIテーブルを取得するツール


APCIテーブルを取得するためのツールをACPICAサイトからダウンロードします。
ただし最新版ではうまく動かないので、2016年の12月22日版(Version 20161222) をダウンロードします。
apcidownload

https://www.acpica.org/node/133
にアクセスして、iasl-win-20161222.zip をダウンロードし、解凍(ファイルを右クリックして「すべて展開...」)して c:\dsdt に中身をコピーします。

c:\dsdt の中身は以下のようになればOK
apci_copyed


2:Windowsドライバ開発キットのインストール


asl.exe というプログラムが必要なので、それが含まれているWindowsドライバ開発キットをMicrosoftからダウンロードしてインストールします。

まず「Windows Driver Kit (WDK) のダウンロードします。」のページ(https://docs.microsoft.com/ja-jp/windows-hardware/drivers/download-the-wdk)に移動し、
WDK の Windows 10、バージョン 1803 をダウンロードします。
の文字をクリックすると「wdksetup」がダウンロードされるのでダブルクリックしてインストールしてください。(英語ですが、Next と Accept のボタンを押していけばOK)

wdk_download_place

インストールが終わったら "C:\Program Files (x86)\Windows Kits\10\Tools\x64\ACPIVerify\asl.exe" を c:\dsdt にコピーします。以下のようになります。
asl_copyed

3:refs.txt というテキストファイルを自作


DSDTの修正に必要なファイルを自作します。
以下のグレーの領域にあるテキストをメモ帳などに貼り付けて「refs.txt」という名前で c:\dsdt に保存すればOK。

refs.txt:


External(MDBG, MethodObj, 1)
External(_GPE.MMTB, MethodObj, 0)
External(_SB.PCI0.LPCB.H_EC.ECWT, MethodObj, 2)
External(_SB.PCI0.LPCB.H_EC.ECRD, MethodObj, 1)
External(_SB.PCI0.LPCB.H_EC.ECMD, MethodObj, 1)
External(_SB.PCI0.PEG0.PEGP.SGPO, MethodObj, 2)
External(_SB.PCI0.GFX0.DD02._BCM, MethodObj, 1)
External(_SB.PCI0.SAT0.SDSM, MethodObj, 4)
External(_GPE.VHOV, MethodObj, 3)
External(_SB.PCI0.XHC.RHUB.TPLD, MethodObj, 2)


refs_saved



dsdt_allresult
以上で、作業フォルダ( c:\dsdt )の準備は完了です。


二.コマンドプロンプトを管理者として実行し、コマンド操作


以降は「コマンドプロンプト」と呼ばれるプログラムを“管理者として実行”して作業します。
作業の流れは

  1. コマンド プロンプトを管理者として実行
  2. コマンド プロンプト内で作業フォルダ(c:\dsdt) に移動
  3. acpidump コマンドで ACPIテーブルデータを取得
  4. asl コマンドで dsdt.asl を作成
  5. iasl コマンドで refs.txt の内容から dsdt.dsl を作成
  6. dsdt.dsl をテキストエディタで編集
  7. iasl コマンドで dsdt.dsl から dsdt.aml ファイルを作成
  8. asl コマンドで dsdt.aml ファイルをWindowsに適用
  9. Windows をテストモードに変更

以上のような感じ。よく似た拡張子を扱うので書き間違えに注意してください。

1:コマンド プロンプトを管理者として実行


画面左下にある検索エリアに「cmd」と入力し表示される「コマンド プロンプト」を右クリックして「管理者として実行」を選びます。
cmd_administrator

「このアプリがデバイスに変更を加えいることを許可しますか?」というメッセージが出たら「はい」をクリック。以下のような状態になればOKです。
command_first

2:コマンド プロンプト内で作業フォルダ(c:\dsdt) に移動


次に、最初に作っておいた作業フォルダ(c:\dsdt)に移動します。
cd \dsdt
とタイプしてreturnキーを押します。
command_cddsdt

3:acpidump コマンドで ACPIテーブルデータを取得

acpidump -b -z
とタイプしてreturnキーを押します。 → dsdt.dat が作成されれば成功
command_apcidump

4:asl コマンドで dsdt.asl を作成

asl /u dsdt.dat
とタイプしてreturnキーを押します。 → dsdt.asl が作成されれば成功
command_asl_dsdt_asl

5:iasl コマンドで refs.txt の内容から dsdt.dsl を作成

iasl -da -dl -fe refs.txt dsdt.dat
とタイプしてreturnキーを押します。 → dsdt.dsl が作成されれば成功
command_dsdt_dsl

6:dsdt.dsl をテキストエディタで編集

c:\dsdt に作成さ入れた「dsdt.dsl」を任意のテキストエディタ(メモ帳など)で開いて、以下のコードを「,, , AddressRangeMemory, TypeStatic)」と「})」の間にに貼り付けます。
QWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
   0x0000000000000000, // Granularity
   0x0000000C20000000, // Range Minimum,  set it to 48.5GB
   0x0000000E0FFFFFFF, // Range Maximum,  set it to 56.25GB
   0x0000000000000000, // Translation Offset
   0x00000001F0000000, // Length calculated by Range Max - Range Min.
   ,, , AddressRangeMemory, TypeStatic)


WinMerge で編集前と編集後を差分表示したところ
edit_dsdt_dsl

注意:以下の編集作業は私のMacBook Proでのみ発生するようで、全てのMac・MacBookで必要な作業ではありません。

「0x02020015」という文字がある2つめの行が編集前のような状態であるとき、編集後のように編集します。
具体的には1行目の「... Zero),」を「 ... Zero))」とし、If の手前で改行。
最後の行にある「})」を「}」にするだけです。
この編集をしないと、この後の「7:iasl コマンド...」の実行時にエラーが出てしまいます。

編集前:

                0x02020015, Zero), If (((Arg0 == 0x03) || (Arg0 == 0x04)))
                {
                    Local0 = \_SB.MBOX (0x03)
                    If ((Local0 != Zero)) {}
                })


編集後:

                0x02020015, Zero))
                If (((Arg0 == 0x03) || (Arg0 == 0x04)))
                {
                    Local0 = \_SB.MBOX (0x03)
                    If ((Local0 != Zero)) {}
                }

よくわかんなかったら、前者を行選択した状態で後者を貼り付けてください。

WinMergeで比較したところ
edit_dsdt_dsl2

7:iasl コマンドで dsdt.dsl から dsdt.aml ファイルを作成


コマンド プロンプトに作業を戻して、以下のコマンドを実行
iasl -ve dsdt.dsl
とタイプしてreturnキーを押します。 → dsdt.aml が作成されれば成功
command_dsdt_aml


これ以降の操作でdsdt.amlの内容をWindowsに適用します。この操作を行うと、最悪Windowsが起動しなくなりますので、もう一度これまでの操作でおかしなエラーが出ていなかったか確認してください。
後、もう一度重要なデータのバックアップを忘れていないか確認してください。 何が起こっても、当ブログは一切の責任を追いません!

やや手順が複雑になりますが、ミスしてもWindowsを普通に起動できるより安全な適用方法はこちらで紹介しています。


8:asl コマンドで dsdt.aml ファイルをWindowsに適用

dsdt.aml をレジストリに登録する操作をします。
asl /loadtable dsdt.aml
とタイプしてreturnキーを押します。
command_load_aml
以下のように〜 succeeded. 〜 って表示されればとりあえずは成功です。
command_aml_loaded_sucess

8:Windows をテストモードに変更

これまでの変更内容を有効にするため、Windowsをテストモードに変更します。
bcdedit -set TESTSIGNING ON
とタイプしてreturnキーを押します。
command_testmode
→「この操作を正しく終了しました。」と表示されれば成功。 この後、再起動してWindowsが正しく起動してくれば、eGPUを接続していても、すべてのUSB-C/Thunderboltが利用できるようになります。 ただし、USB接続のゲームコントローラーなどはWindowsが起動している状態で接続するとフリーズする場合があります。
その場合は、一旦MacBook Proの電源を切った状態にし、USB接続のゲームコントローラーなどを接続してからMacBook Proの電源をオンにしてください。

私の環境では以上の操作でXbox用のコントローラーが使えるようになりました。
(PC用ゲームはXbox用コントローラーに対応していることが多く、ゲーム中の操作ボタン表示などが見たままになるため便利)


・・・以上までを実施してもまだうまくいかない場合はこちらの記事を試してみてください。


これまでの変更を無効にする手順

最後のこれまでの変更を元に戻す手順を掲載します。 Windowsが起動しなくなっても、セーフモードで起動すればうまく復帰できるかもしれません。 (セーフモードの入りかたは通常Windows起動前にF8キーを押し続けることですが、MacBook Proではこのキーが押せないためその他でWindowsをセーフモードで起動する方法がわからなかったので、保証はできません)

1:Windows をテストモードを解除

テストモードを無効にします。
bcdedit -set TESTSIGNING OFF
とタイプしてreturnキーを押します。

2:dsdt.aml の適用を解除します

コマンド プロンプトを管理者として実行し、まずは c:\dsdt の作業フォルダに移動します。
c: & cd\dsdt
とタイプしてreturnキーを押します。 次に、以下のコマンドを実行すれば解除完了です。
asl /loadtable -d dsdt.aml
とタイプしてreturnキーを押します。