Windows 2000がWindows 7のアップグレード対象から外された理由

Windows 2000は元々Windows 7のライセンスアップグレード対象に含まれていて、当初 Microsoft のショップの先行予約コーナーにも 2000が記載されていました

Windows 7情報色々

KDWや拡張カーネルの Windows 2000で Windows 7のインストーラーを動かすと

win72
ブートパーティションに730M以上あることを認識できなくてとまってしまいます。

OutputDebugString の文字を見てみたところ

INFO     GetSystemDiskNTPath: Found system disk at [\Device\Harddisk0\DR0].
INFO     GetSystemDiskNumber: Disk [0] is the system disk.
INFO     LogVolumeSummary: Found volume [\\?\Volume{408d2567-bf19-11dd-b092-806d6172696f}\]
INFO     LogVolumeSummary:   - Free bytes  = 14877614080 bytes
INFO     LogVolumeSummary:   - Retained    = no
INFO     LogVolumeSummary:   - FVEncrypted = no
INFO     LogVolumeSummary:   - FVEDisabled = no

どうも、Retainedが 0だと容量にかかわらずはじいてるみたいなので更に解析

           push    edi
          push    esi
          lea    eax,[ebp-04h]
          push    eax
          push    esi
          push    esi
          push    esi
          push    esi
         push    00560028h
          push    [ebp+08h]
          call   [DeviceIoControl]

するとココでエラー

#define IOCTL_VOLUME_BASE 0x00000056L
#define METHOD_BUFFERED 0
#define METHOD_OUT_DIRECT 2
#define FILE_ANY_ACCESS 0
#define FILE_READ_ACCESS ( 0x0001 )

#if (NTDDI_VERSION >= 0x05010000)
#define IOCTL_VOLUME_IS_PARTITION  CTL_CODE\
( IOCTL_VOLUME_BASE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS )

#define IOCTL_VOLUME_READ_PLEX  CTL_CODE\
( IOCTL_VOLUME_BASE, 11, METHOD_OUT_DIRECT, FILE_READ_ACCESS )
#define IOCTL_VOLUME_SET_GPT_ATTRIBUTES  CTL_CODE\
( IOCTL_VOLUME_BASE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS )
#endif

どういうことかというと、ドライブが固定ディスクのパーティションかどうかの判定に常に失敗して、ドライブを認識できないバグ。

他の関数は置き換え可能だけど、ここはWindows 2000向けにコンパイルした場合動作しないので、このコードの見落としが、どうしてもWindows 2000向けにインストーラーを作れなくて対象から外したんじゃないかなと思ってる(笑)

おすすめ

コメントを残す

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