Lenovo G580のWiFiモジュールはBIOSのホワイトリストにある製品以外は下記メッセージが表示され、起動が止まってしまう。
104-Unsupported wireless network device detected. System Halted. Remove device and restart.
この処理についてBIOS解析した。
解析対象
BIOSのバージョンによりホワイトリストの記載箇所が異なる。
ここでは下記2つのバージョンを対象に解析している。
- 62CN34WW
工場出荷時(購入時)のバージョン - 62CN97WW_64
最新(2020年10月現在)のWindows8(64bit)向けバージョン
解析モジュール
下記はUEFITool にて確認した内容。
UEFI/BIOSのBIOSリージョン(1)の圧縮領域内(2)の DxeOemDriver.efi ファイル(3)がホワイトリストを判定しているモジュールとなっている。
このモジュールの PE2 image (4)を取り出し(UEFITool でExtract body)解析した。
[ image - Intel ] +-[ Region - Descriptor ] +-[ Region - ME ] +-[ Region - BIOS ] (1) +-[Volume - FFSv2 ]
7A9354D9-0468-444A-81CE-0BF617D890DF +-[ File - Volume image ]
4A538818-5AE0-4EB2-B2EB-488B23657022 +-[ Section - Compressed ] (2) +-[ Section - Volume image ] +-[ Volume - FFSv2 ]
7A9354D9-0468-444A-81CE-0BF617D890DF +-[ File - DXE Driver ] DxeOemDriver.efi (3)
608FBD1D-15E1-40C4-9443-662ECC0C07AA +-[ Section - GUID defined ] +-[ Section - DXE dependency ] +-[ Section - PE2 image ] (4) +-[ Section - User interface ]
ホワイトリスト
下記がホワイトリスト。
No.6~8 は 62CN97WW_64 のみ。
No. | PCI ID | 名前 | サブシステム名 |
1 |
14e4:4727 |
BCM4313 802.11bgn Wireless Network Adapter | Broadcom Inc. and subsidiaries / 802.11n Network Adapter |
2 | 14e4:4727 14e4:0587 |
BCM4313 802.11bgn Wireless Network Adapter | Broadcom Limited / 802.11n Network Adapter |
3 | 168c:002b 17aa:30a1 |
AR9285 Wireless Network Adapter (PCI-Express) | Lenovo RTL8192DE Wireless LAN 802.11N PCIe NIC MAC0 |
4 | 168c:002b 17aa:31a1 |
AR9285 Wireless Network Adapter (PCI-Express) | Lenovo |
5 | 8086:0886 8086:1315 |
Centrino Wireless-N + WiMAX 6150 | Intel / Centrino Wireless-N + WiMAX 6150 BGN |
6 | 168c:0032 17aa:3118 |
AR9485 Wireless Network Adapter | Lenovo |
7 | 14e4:4365 17aa:3218 |
CM43142 802.11b/g/n | Lenovo |
8 | 168c:0032 17aa:3218 |
AR9485 Wireless Network Adapter Lenovo | AR9485WB-EG Wireless Network Adapter |
実際のホワイトリストのダンプ
(下記は 62CN97WW_64 の場合、62CN34WW はアドレス 0003E0 から)
000400: E4 14 27 47 E4 14 1B 05 FF FF FF FF -> BCM4313
00040C: E4 14 27 47 E4 14 87 05 FF FF FF FF -> BCM4313
000418: 8C 16 2B 00 AA 17 A1 30 FF FF FF FF -> AR9285
000424: 8C 16 2B 00 AA 17 A1 31 FF FF FF FF -> AR9285 (Lenovo)
000430: 86 80 86 08 86 80 15 13 FF FF FF FF -> Wireless-N + WiMAX 6150
00043C: 8C 16 32 00 AA 17 18 31 FF FF FF FF -> AR9485 (Lenovo)
000448: E4 14 65 43 AA 17 11 06 5B 10 65 E0 -> CM43142
000454: 8C 16 32 00 AA 17 18 32 F3 0C 04 30 -> AR9485 (AR9485WB-EG)
000460: FF FF FF FF FF FF FF FF FF FF FF FF -> (データ終端)
ホワイトリストチェック処理
ホワイトリストのチェックは下記処理となっている。
[ ] は[]内のアドレスから1ワード取得。
- WiFiカードのPCI IDの4ワード(8バイト)をP1,P2,P3,P4に格納
- adr = ホワイトリストの先頭アドレス
- L1 = [ adr + 0 ]
- L2 = [ adr + 2 ]
- L3 = [ adr + 4 ]
- L4 = [ adr + 6 ]
- もし、L1~L4 が P1~P4 に一致したら処理終了
(ホワイトリストと一致として終了) - adr = adr + 12
(次のデータに進める) - L1 = [ adr + 0 ]
- もし、L1 が 0xffff の場合、エラーメッセージを表示して無限ループ
(ホワイトリストの不一致として無限ループ) - 4へ戻る
実際のマシンコードダンプ
- 赤の箇所:無限ループのコード
- 青の箇所:0xffffでない場合にループ先頭に戻るコード
- 緑の箇所:ホワイトリストに一致した場合のジャンプ先
- 灰色の箇所:ホワイトリスト不一致の場合のメッセージ出力処理
62CN97WW_64の場合
000EE0: -- -- -- -- -- -- -- -- -- -- -- -- 48 83 EC 28
000EF0: 45 33 C0 85 D2 0F 85 9C 00 00 00 0F B7 05 FE F4
000F00: FF FF 41 BA FF FF 00 00 66 41 3B C2 74 4C 41 8B
000F10: D0 4C 8D 0D E8 F4 FF FF 66 3B 01 75 24 0F B7 41
000F20: 02 66 42 39 44 0A 02 75 18 0F B7 41 04 66 42 39
000F30: 44 0A 04 75 0C 0F B7 41 06 66 42 39 44 0A 06 74
000F40: 44 49 FF C0 4B 8D 04 40 48 8B D0 48 C1 E2 02 42
000F50: 0F B7 04 0A 66 41 3B C2 75 BE 48 8B 05 A7 0D 00
000F60: 00 48 8B 50 40 48 8B CA FF 52 30 4C 8B 1D 96 0D
000F70: 00 00 48 8D 15 67 F8 FF FF 49 8B 43 40 48 8B C8
000F80: FF 50 08 EB FE 48 8B 05 9C 0D 00 00 80 88 40 06
000F90: 00 00 01 33 C0 EB 0A 48 B8 0E 00 00 00 00 00 00
000FA0: 80 48 83 C4 28 C3 -- -- -- -- -- -- -- -- -- --
62CN34WWの場合
000E20: -- -- -- -- 48 83 EC 28 45 33 C0 41 3B D0 0F 85
000E30: 9D 00 00 00 0F B7 05 A5 F5 FF FF 66 41 81 C9 FF
000E40: FF 66 41 3B C1 74 4D 49 8B D0 4C 8D 15 8F F5 FF
000E50: FF 66 3B 01 75 24 0F B7 41 02 66 42 39 44 12 02
000E60: 75 18 0F B7 41 04 66 42 39 44 12 04 75 0C 0F B7
000E70: 41 06 66 42 39 44 12 06 74 45 49 83 C0 01 4B 8D
000E80: 04 40 48 8B D0 48 C1 E2 02 66 42 8B 04 12 66 41
000E90: 3B C1 75 BD 48 8B 05 ED 0D 00 00 48 8B 50 40 48
000EA0: 8B CA FF 52 30 4C 8B 1D DC 0D 00 00 48 8D 15 2D
000EB0: F8 FF FF 49 8B 43 40 48 8B C8 FF 50 08 EB FE 48
000EC0: 8B 05 E2 0D 00 00 80 88 40 06 00 00 01 33 C0 EB
000ED0: 0A 48 B8 0E 00 00 00 00 00 00 80 48 83 C4 28 C3