最新の Microcode Update Device を Windows 2000に適用する

先日ちょこっと話をしましたが、
KB936357(マイクロコード信頼性の更新が利用可能な Intel プロセッサを使用しているシステムの信頼性を向上させる) マイクロコードアップデートというのがあります。
これは、マザーボードさえ対応していれば問題ないのですが、逆に対応していないと、CPUの軽微なバグがそのままだったり、CPUの性能を発揮できないなどの問題があります。


インテルプロセッサ識別ユーティリティで CPUのリビジョン見た時に「なし」になっていた場合は、まずいかもしれません。
icpu1

ちなみに、Windows 2000の場合、SP4に同梱されている update.sys 5.0.2195.6655 が最新で、ビルド番号から推察すると 2003年1月のものです。

そこで、Windows XP SP3 に入っている update.sys が使えないかと考えてみました(Win2000のものを Windows XPで使っても問題ないので)

Windows XP の Update.sys は IoForwardIrpSynchronously
(IoForwardAndCatchIrpと同じ) をインポートしてるので、そのままでは Windows 2000では使えません。

逆に、 IoForwardIrpSynchronously のコードを自分で書いてやれば動かすことができるわけです。

ちなみに、この関数を自分で書くとこんな感じ。

IoForwardIrpSynchronously:
          push    ebp
          mov    ebp,esp
          sub    esp,00000010h
          mov    edx,[ebp+0Ch]
          cmp    byte ptr [edx+23h],01h
          jnz    L1
          xor    al,al
          jmp    L2
L1:
          push    ebx
          push    esi
          mov    esi,[edx+60h]
          push    edi
          lea    eax,[esi-24h]
          mov    edi,eax
          push    00000007h
          pop    ecx
          rep movsd
          xor    ebx,ebx
          mov    [eax+03h],bl
          lea    eax,[ebp-08h]
          mov    [ebp-04h],eax
          mov    [ebp-08h],eax
          mov    eax,[edx+60h]
          sub    eax,00000024h
          mov    [ebp-10h],bl
          mov    byte ptr [ebp-0Eh],04h
          mov    [ebp-0Ch],ebx
          lea    ecx,[ebp-10h]
          mov    [eax+20h],ecx
          mov    ecx,[ebp+08h]
          mov    dword ptr [eax+1Ch],offset L5
          mov    byte ptr [eax+03h],E0h
          call    IofCallDriver
          cmp    eax,00000103h
          jz     L4
 L3:
          pop    edi
          pop    esi
          mov    al,01h
          pop    ebx
 L2:
          leave
          retn    0008h
 L4:
          push    ebx
          push    ebx
          push    ebx
          push    00000005h
          lea    eax,[ebp-10h]
          push    eax
          call    KeWaitForMutexObject
          jmp    L3
 L5:
          push    ebp
          mov    ebp,esp
          push    00000000h
          push    00000000h
          push    [ebp+10h]
          call    KeSetEvent
          mov    eax,C0000016h
          pop    ebp
          retn    000Ch

コードにして150バイト程あける必要があるわけですが、同一セグメントには70バイト程度の空きしかないので、PAGECONSセクションを128バイトずらしてKeSetEventとKeWaitForMutexObjectのインポートテーブルを追加して書き換えることにしました。

Download: Windows2000-KB936357-v3-x86-ENU.zip
Language: Multilingual (excepted NEC98)
Description: update.sys 5.0.2195.7155
Author: Customized by BlackWingCat besed update.sys(5.1.2600.5512/xp sp3)

ちなみに、このドライバを使っても、リビジョンが変わらない場合は、このドライバの効果は全く ありません。

Pentium II ODP
CPUID=1632 UpdateRev=02 1998/06/10
CPUID=611 UpdateRev=B27 1996/12/18
CPUID=612 UpdateRev=C6 1996/12/10
CPUID=616 UpdateRev=C6 1996/12/10
CPUID=617 UpdateRev=C6 1996/12/10
CPUID=619 UpdateRev=D2 1998/02/18
Pentium II
CPUID=633 UpdateRev=36 1998/09/23
CPUID=634 UpdateRev=37 1998/09/23
Pentium II/Celeron
CPUID=650 UpdateRev=19 1997/12/12  PlatformID=2
CPUID=650 UpdateRev=2E 1998/02/11  PlatformID=5
CPUID=650 UpdateRev=2F 1998/02/11  PlatformID=7
CPUID=650 UpdateRev=40 1999/05/25  PlatformID=0
CPUID=650 UpdateRev=41 1999/05/25  PlatformID=1
CPUID=650 UpdateRev=45 1999/05/25  PlatformID=3
CPUID=651 UpdateRev=40 1999/05/25  PlatformID=0
CPUID=651 UpdateRev=41 1999/05/25  PlatformID=1
CPUID=651 UpdateRev=42 1999/05/25  PlatformID=3
Pentium II
CPUID=652 UpdateRev=2A 1999/05/12  PlatformID=0
CPUID=652 UpdateRev=2B 1999/05/12  PlatformID=2
CPUID=652 UpdateRev=2C 1999/05/17  PlatformID=1
CPUID=652 UpdateRev=2D 1999/05/18  Platf
ormID=3
CPUID=653 UpdateRev=10 1999/06/28  PlatformID=0
CPUID=653 UpdateRev=0B 1999/05/20  PlatformID=2
CPUID=653 UpdateRev=0C 1999/05/18  PlatformID=1
CPUID=653 UpdateRev=0D 1999/05/18  PlatformID=3
Celeron
CPUID=660 UpdateRev=0A 1999/05/05  PlatformID=0
CPUID=665 UpdateRev=03 1999/05/05  PlatformID=4
CPUID=66A UpdateRev=0B 1999/05/05  PlatformID=5
CPUID=66A UpdateRev=0C 1999/05/05  PlatformID=1
CPUID=66A UpdateRev=0D 1999/05/05  PlatformID=3
CPUID=66D UpdateRev=05 1999/03/12  PlatformID=1
CPUID=66D UpdateRev=06 1999/03/12  PlatformID=3
CPUID=66D UpdateRev=07 1999/05/05  PlatformID=5
CPUID=671 UpdateRev=14 1998/08/11  PlatformID=2
CPUID=672 UpdateRev=10 1999/09/22  PlatformID=0
CPUID=672 UpdateRev=38 1999/09/22  PlatformID=2
CPUID=673 UpdateRev=2E 1999/09/10  PlatformID=2
CPUID=673 UpdateRev=0E 1999/09/10  PlatformID=0
Pentium III
CPUID=681 UpdateRev=10 1999/09/21  PlatformID=2
CPUID=681 UpdateRev=11 1999/09/21  PlatformID=4
CPUID=681 UpdateRev=0D 1999/09/21  PlatformID=0
CPUID=681 UpdateRev=0E 1999/09/21  PlatformID=5
CPUID=681 UpdateRev=0F 1999/09/21  PlatformID=3
CPUID=683 UpdateRev=10 2001/02/06  PlatformID=2
CPUID=683 UpdateRev=13 2001/02/06  PlatformID=0
CPUID=683 UpdateRev=14 2001/02/06  PlatformID=4
CPUID=683 UpdateRev=07 1999/10/15  PlatformID=5
CPUID=683 UpdateRev=08 1999/10/15  PlatformID=3
CPUID=686 UpdateRev=02 2000/05/04  PlatformID=2
CPUID=686 UpdateRev=07 2000/05/05  PlatformID=0
CPUID=686 UpdateRev=08 2000/05/05  PlatformID=4
CPUID=686 UpdateRev=0A 2000/05/04  PlatformID=1
CPUID=686 UpdateRev=0C 2000/05/04  PlatformID=7
CPUID=68A UpdateRev=01 2000/11/02  PlatformID=4
CPUID=68A UpdateRev=04 2000/12/07  PlatformID=5
CPUID=68A UpdateRev=05 2000/12/07  PlatformID=7
CPUID=695 UpdateRev=07 2004/11/09  PlatformID=4
CPUID=695 UpdateRev=07 2004/11/09  PlatformID=5
CPUID=695 UpdateRev=47 2004/11/09  PlatformID=7
CPUID=6A0 UpdateRev=03 2000/01/10  PlatformID=2
CPUID=6A1 UpdateRev=01 2000/03/06  PlatformID=2
CPUID=6A4 UpdateRev=01 2000/06/16  PlatformID=2
CPUID=6B1 UpdateRev=1C 2001/02/15  PlatformID=4
CPUID=6B1 UpdateRev=1D 2001/02/20  PlatformID=5
CPUID=6B4 UpdateRev=01 2002/01/10  PlatformID=4
CPUID=6B4 UpdateRev=02 2002/01/11  PlatformID=5
Pentium M
CPUID=6D6 UpdateRev=18 2004/10/17  PlatformID=5
CPUID=F05 UpdateRev=0B 2000/08/24  PlatformID=0
Celeron
CPUID=6E8 UpdateRev=39 2005/11/15  PlatformID=5
CPUID=6EC UpdateRev=54 2006/05/01  PlatformID=5
CPUID=6EC UpdateRev=59 2006/09/12  PlatformID=7
Pentium 4
CPUID=F07 UpdateRev=08 2000/11/15  PlatformID=1
CPUID=F07 UpdateRev=12 2002/07/16  PlatformID=0
Pentium 4 Xeon
CPUID=F0A UpdateRev=13 2002/07/16  PlatformID=0
CPUID=F0A UpdateRev=14 2002/07/16  PlatformID=2
CPUID=F0A UpdateRev=15 2002/08/21  PlatformID=1
CPUID=F11 UpdateRev=0A 2003/07/29  PlatformID=1
CPUID=F12 UpdateRev=2D 2003/05/02  PlatformID=0
CPUID=F12 UpdateRev=2E 2003/05/02  PlatformID=2
CPUID=F12 UpdateRev=2F 2003/05/02  PlatformID=1
CPUID=F13 UpdateRev=05 2003/05/08  PlatformID=2
CPUID=F22 UpdateRev=05 2003/07/29  PlatformID=1
CPUID=F24 UpdateRev=1E 2003/06/05  PlatformID=2
CPUID=F24 UpdateRev=1F 2003/06/05  PlatformID=1
CPUID=F24 UpdateRev=20 2003/06/05  PlatformID=3
CPUID=F24 UpdateRev=21 2003/06/10  PlatformID=4
CPUID=F25 UpdateRev=2A 2004/08/11  PlatformID=1
CPUID=F25 UpdateRev=29 2004/08/11  PlatformID=0
CPUID=F25 UpdateRev=2B 2004/08/11  PlatformID=2
CPUID=F25 UpdateRev=2C 2004/08/26  PlatformID=4
CPUID=F26 UpdateRev=10 2004/08/05  PlatformID=1
CPUID=F27 UpdateRev=37 2003/06/04  PlatformID=2
CPUID=F27 UpdateRev=38 2003/06/04  PlatformID=1
CPUID=F27 UpdateRev=39 2003/06/04  PlatformID=3
CPUID=F29 UpdateRev=2E 2004/08/11  PlatformID=2
CPUID=F29 UpdateRev=2D 2004/08/11  PlatformID=1
CPUID=F29 UpdateRev=2F 2004/08/11  PlatformID=3
CPUID=F32 UpdateRev=0A 2004/05/11  PlatformID=0,2,3
CPUID=F33 UpdateRev=0C 2005/04/21  PlatformID=0,2,3
CPUID=F43 UpdateRev=05 2005/04/21  PlatformID=0,2,3,4,7
D-Xeon/C2D
CPUID=6F2 UpdateRev=5A 2007/09/26  PlatformID=0
CPUID=6F2 UpdateRev=57 2007/03/15  PlatformID=5
CPUID=6F6 UpdateRev=C7 2007/03/15  PlatformID=5
CPUID=6F6 UpdateRev=CB 2007/09/16  PlatformID=0
CPUID=6F6 UpdateRev=CD 2007/09/16  PlatformID=2
C2Q
CPUID=6F7 UpdateRev=68 2007/09/16  PlatformID=4
CPUID=6F7 UpdateRev=69 2007/09/17  PlatformID=6
Q-XEON/C2Q
CPUID=6FA UpdateRev=92 2007/03/13  PlatformID=7
Core2Duo
CPUID=6FB UpdateRev=B3 2007/03/14  PlatformID=7
CPUID=6FB UpdateRev=B6 2007/07/13  PlatformID=0
CPUID=6FB UpdateRev=B6 2007/07/13  PlatformID=3
CPUID=6FB UpdateRev=B6 2007/07/13  PlatformID=4
CPUID=6FB UpdateRev=B7 2007/08/06  PlatformID=2
CPUID=6FB UpdateRev=B7 2007/08/06  PlatformID=6
CPUID=6FD UpdateRev=A1 2007/03/13  PlatformID=7
CPUID=6FD UpdateRev=A3 2007/08/13  PlatformID=0
Celeron
CPUID=10661 UpdateRev=31 2007/03/16  PlatformID=1
CPUID=10661 UpdateRev=33 2007/03/16  PlatformID=7
CPUID=10661 UpdateRev=38 2007/09/19  PlatformID=0
Xeon E
CPUID=10676 UpdateRev=60B 2008/01/19  PlatformID=0
CPUID=10676 UpdateRev=60B 2008/01/19  PlatformID=2
CPUID=10676 UpdateRev=60B 2008/01/19  PlatformID=4
CPUID=10676 UpdateRev=60B 2008/01/19  PlatformID=6
C2Q(Yorkfield)
CPUID=10677 UpdateRev=703 2008/01/19  PlatformID=4
Pentium 4
CPUID=F34 UpdateRev=17 2005/04/21  PlatformID=0,2,3,4
CPUID=F41 UpdateRev=16 2005/04/21  PlatformID=1
CPUID=F41 UpdateRev=17 2005/04/22  PlatformID=0,2,3,4,5,7
CPUID=F44 UpdateRev=06 2005/04/21  PlatformID=0,2,3,4,7
CPUID=F47 UpdateRev=03 2005/04/21  PlatformID=0,2,3,4,7
CPUID=F65 UpdateRev=07 2006/04/26  PlatformID=2
CPUID=F48 UpdateRev=07 2005/06/30  PlatformID=0,1,2,3,4,6
CPUID=F48 UpdateRev=0B 2005/09/01  PlatformID=1
CPUID=F48 UpdateRev=0C 2006/05/08  PlatformID=0
CPUID=F49 UpdateRev=03 2005/04/21  PlatformID=0,2,3,4,5,7
CPUID=F4A UpdateRev=04 2005/12/14  PlatformID=2,3,4,6
CPUID=F4A UpdateRev=02 2005/06/10  PlatformID=0,2,3,4,6
CPUID=F65 UpdateRev=08 2006/04/26  PlatformID=0
CPUID=F62 UpdateRev=0F 2005/12/15  PlatformID=2
CPUID=F64 UpdateRev=02 2005/12/15  PlatformID=0
CPUID=F64 UpdateRev=04 2005/12/23  PlatformID=2,4,5
CPUID=F68 UpdateRev=09 2006/07/14  PlatformID=1,5

このドライバの作成日は2008/04/13になっているので、1年ほど前のCPUのマイクロコードには対応してると思います。

Core i7は 106A4とか106A5なので、非対応ですね。
ちなみに、うちのデスクも 1067A(X3360)なので非対応。

しかし、改めてみると、AMD系が入ってないのね。後、Windows Vistaにはこの手のドライバがなくて、mcupdate_GenuineIntel.dllに入っていることが判明。

関連リンク
Intel Microcode List

関連記事:
最新の Microcode Update Device を Windows 2000に適用する その2

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です