Windows 2000はKB3072401 の影響を受けるか?

FAT32 ファイル システムで (4 GB-1) バイトのファイルを削除すると、ファイル システムの破損が検知される - Ask CORE - Site Home - TechNet Blogs

厳密には FAT32 を利用しているときに 4GB分のクラスタを使っている場合に発生します。
つまり 4GB - 1クラスタのサイズ + 1 バイト以上のファイルを削除するとファイルシステムの破損が検知されるというものです

まぁ、そもそも、Windows 2000以降のユーザーが、FAT32なんか使ってるわけがない…。
って思うんですけどね・ω・;

・FAT32だと、USNジャーナルが使えない(ファイルアクセス中に落ちるとディスクがクラッシュしやすい)
・Microsoftの陰謀で NT 系OSでは32GBを超えるFAT32パーティションが作成できない
・ファイル暗号化・圧縮に非対応
・ファイルの検索が遅い

最近は Windows 9x for NTFS なんてものもありますし、互換性もあまり気にしなくていいですよね・ω・

さて、この不具合、Windows 2000でも影響があるのか調べてみました

 SUB_L000187E4:
          push    00000054h
          push    L00014620
          call    SUB_L00013464
          mov    esi,edx
          mov    [ebp-48h],esi
          mov    [ebp-30h],ecx
          xor    edi,edi
          mov    [ebp-20h],edi
          mov    al,[esi+000000F6h]
          mov    [ebp-19h],al
          mov    [ebp-1Ah],al
          push    [ebp+08h]
          mov    ebx,[ntoskrnl.exe!FsRtlNumberOfRunsInLargeMcb]
          call    ebx
          mov    [ebp-44h],eax
          test    eax,eax
          jz     L00018A09
          mov    [ebp-04h],edi
          xor    eax,eax
          inc    eax
          mov    [ebp-4Ch],eax
          push    eax
          lea    eax,[esi+00000180h]
          push    eax
          call    [ntoskrnl.exe!ExAcquireResourceSharedLite]
          push    [ebp+08h]
          call    ebx
        ;;;;;;;;;;;;;;;;;;
        ;;;;;;;;;;;;;;;;;;
          mov    [ebp-3Ch],eax;;;;;;;;;;;;;;;;;;
          mov    ebx,edi
          mov    [ebp-20h],ebx
 L00018843:
          cmp    ebx,eax
          jnc    L000188B3
          lea    eax,[ebp-2Ch]
          push    eax
          lea    eax,[ebp-58h]
          push    eax
          lea    eax,[ebp-40h]
          push    eax
          push    ebx
          mov    edx,[ebp+08h]
          mov    ecx,esi
          call    SUB_L0002AC48
          mov    eax,[ebp-2Ch]
          mov    cl,[ebp-19h]
          shr    eax,cl
          mov    [ebp-40h],eax
;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
          mov    eax,[ebp-58h]
          sub    eax,[esi+000000E0h]
          mov    edx,[ebp-54h]
          sbb    edx,[esi+000000E4h]
          movzx    ecx,[esi+000000F6h]
          call    jmp_ntoskrnl.exe!_allshr
          add    eax,00000002h
          mov    ecx,[ebp-40h]
          push    edi
          mov    edx,esi
          cmp    ecx,00000001h
          jnz    L000188A0
          push    eax
          mov    ecx,[ebp-30h]
          call    SUB_L00018F64
          jmp    L000188AA
 L000188A0:
          push    ecx
          push    eax
          mov    ecx,[ebp-30h]
          call    SUB_L00019274
 L000188AA:
          inc    ebx
          mov    [ebp-20h],ebx
          mov    eax,[ebp-3Ch]
          jmp    L00018843
 L000188B3:
          lea    ecx,[esi+00000128h]
          call    [ntoskrnl.exe!ExAcquireFastMutexUnsafe]
          mov    ebx,edi
 L000188C1:
          mov    [ebp-20h],ebx
          cmp    ebx,[ebp-3Ch]
          jnc    L000189EA
          lea    eax,[ebp-2Ch]
          push    eax
          lea    eax,[ebp-58h]
          push    eax
          lea    eax,[ebp-40h]
          push    eax
          push    ebx
          mov    edx,[ebp+08h]
          mov    ecx,esi
          call    SUB_L0002AC48
          mov    eax,[ebp-2Ch]
;**********
;**********
          mov    cl,[ebp-19h]
;***********
;***********
;***********
;***********
;***********
          
shr    eax,cl
        ;***********
        ;***********
        ;***********
        ;***********
        ;***********
          mov    [ebp-34h],eax
          mov    eax,[ebp-58h]
          sub    eax,[esi+000000E0h]
          mov    edx,[ebp-54h]
          sbb    edx,[esi+000000E4h]
          movzx    ecx,[esi+000000F6h]
          call    jmp_ntoskrnl.exe!_allshr
          lea    ebx,[eax+02h]
          mov    edx,[esi+6Ch]
          mov    [ebp-44h],edx
          mov    [ebp-38h],edx
          mov    eax,[ebp-34h]
          dec    eax
          add    eax,ebx
          mov    [ebp-40h],eax
          mov    ecx,[edx+04h]
          cmp    ebx,ecx
          ja     L0001898C
          mov    edx,[edx]
          cmp    eax,edx
 ;***********
;***********
       jc     L0001898C
          cmp    ebx,edx
          jnc    L00018949
          cmp    eax,ecx
          jbe    L00018940
 L00018937:
          mov    eax,edx
          mov    [ebp-24h],eax
          sub    ecx,edx
          jmp    L0001895A
 L00018940:
          cmp    ebx,edx
          jnc    L00018949
          mov    ecx,[ebp-40h]
          jmp    L00018937
 L00018949:
          mov    eax,ebx
          mov    [ebp-24h],eax
          cmp    [ebp-40h],ecx
          ja     L00018958
;***********
          mov    ecx,[ebp-34h]
          jmp    L0001895B
 L00018958:
          sub    ecx,ebx
        ;***********
 L0001895A:
          inc    ecx
 L0001895B:
          mov    [ebp-28h],ecx
          test    ecx,ecx
          jz     L000189E1
          push    ecx
          sub    eax,edx
          push    eax
          lea    eax,[esi+00000120h]
          push    eax
          call    [ntoskrnl.exe!RtlClearBits]
          mov    eax,[ebp-24h]
          mov    ecx,[ebp-44h]
          sub    eax,[ecx]
          add    eax,00000002h
          cmp    eax,[esi+000001C8h]
          jnc    L0001898C
          mov    [esi+000001C8h],eax
;***********
;***********
 L0001898C:
          cmp    byte ptr [esi+000000F4h],20h
          jnz    L000189A3
          lea    eax,[ebx-02h]
          shr    eax,10h
          imul    ecx,eax,0Ch
          add    ecx,[esi+68h]
          jmp    L000189A6
 L000189A3:
          mov    ecx,[esi+68h]
 L000189A6:
          mov    [ebp-38h],ecx
          mov    [ebp-24h],ebx
          mov    edx,[ebp-34h]
 L000189AF:
          mov    [ebp-28h],edx
          test    edx,edx
          jz     L000189D8
          mov    eax,[ecx+04h]
          sub    eax,ebx
          inc    eax
          cmp    eax,edx
          jc     L000189C2
          mov    eax,edx
 L000189C2:
          add    [ecx+08h],eax
          cmp    edx,eax
          jz     L000189D4
          add    ecx,0000000Ch
          mov    [ebp-38h],ecx
          mov    ebx,[ecx]
          mov    [ebp-24h],ebx
 L000189D4:
          sub    edx,eax
          jmp    L000189AF
 L000189D8:
          mov    eax,[ebp-34h]
          add    [esi+000000F0h],eax
 L000189E1:
    
     mov    ebx,[ebp-20h]
          inc    ebx
;***********
;***********
          jmp    L000188C1
 L000189EA:
          lea    ecx,[esi+00000128h]
          call    [ntoskrnl.exe!ExReleaseFastMutexUnsafe]
          mov    dword ptr [ebp-04h],FFFFFFFEh
          mov    dword ptr [ebp-4Ch],00000000h
          call    SUB_L00018A1F
 L00018A09:
          call    SUB_L000134A9
          retn    0004h

問題のあるWindows 8.1の関数(;***が入ってるか所は修正版では命令が入ります)

SUB_L00021C38:
          push    ebp
          mov    ebp,esp
          push    FFFFFFFFh
          push    L00012298
          push    jmp_ntoskrnl.exe!_except_handler3
          mov    eax,fs:[00000000h]
          push    eax
          mov    fs:[00000000h],esp
          push    ecx
          push    ecx
          sub    esp,00000058h
          push    ebx
          push    esi
          push    edi
          mov    esi,[ebp+0Ch]
          mov    bl,[esi+000000EEh]
          mov    [ebp-30h],bl
          push    [ebp+10h]
          mov    edi,[ntoskrnl.exe!FsRtlNumberOfRunsInMcb]
          call    edi
          test    eax,eax
          jz     L00021E74
          and    dword ptr [ebp-04h],00000000h
          push    00000001h
          lea    eax,[esi+00000164h]
          push    eax
          call    [ntoskrnl.exe!ExAcquireResourceSharedLite]
          push    [ebp+10h]
          call    edi
          mov    [ebp-3Ch],eax
          and    dword ptr [ebp-40h],00000000h
 L00021C9B:
          mov    eax,[ebp-3Ch]
          cmp    [ebp-40h],eax
          jnc    L00021D0B
          lea    eax,[ebp-24h]
          push    eax
          lea    eax,[ebp-20h]
          push    eax
          lea    eax,[ebp-2Ch]
          push    eax
          push    [ebp-40h]
          push    [ebp+10h]
          push    esi
          call    SUB_L00011520
          mov    edi,[ebp-24h]
          mov    cl,bl
          shr    edi,cl
          mov    [ebp-28h],edi
          mov    eax,[ebp-20h]
          sub    eax,[esi+000000D8h]
          mov    edx,[ebp-1Ch]
          sbb    edx,[esi+000000DCh]
          movzx    ecx,[esi+000000EEh]
          call    jmp_ntoskrnl.exe!_allshr
          inc    eax
          inc    eax
          mov    [ebp-38h],eax
          cmp    edi,00000001h
          push    00000000h
          jnz    L00021CFB
          push    eax
          push    esi
          push    [ebp+08h]
          call    SUB_L000221A4
          jmp    L00021D06
 L00021CFB:
          push    edi
          push    eax
          push    esi
          push    [ebp+08h]
          call    SUB_L00020306
 L00021D06:
          inc    [ebp-40h]
          jmp    L00021C9B
 L00021D0B:
          lea    ecx,[esi+0000010Ch]
          call    [HAL.dll!ExAcquireFastMutex]
          and    dword ptr [ebp-40h],00000000h
 L00021D1B:
          mov    eax,[ebp-40h]
          cmp    eax,[ebp-3Ch]
          jnc    L00021E5F
          lea    ecx,[ebp-24h]
          push    ecx
          lea    ecx,[ebp-20h]
       &
nbsp;  push    ecx
          lea    ecx,[ebp-2Ch]
          push    ecx
          push    eax
          push    [ebp+10h]
          push    esi
          call    SUB_L00011520
          mov    ebx,[ebp-24h]
          mov    cl,[ebp-30h]
          shr    ebx,cl
          mov    [ebp-28h],ebx
          mov    eax,[ebp-20h]
          sub    eax,[esi+000000D8h]
          mov    edx,[ebp-1Ch]
          sbb    edx,[esi+000000DCh]
          movzx    ecx,[esi+000000EEh]
          call    jmp_ntoskrnl.exe!_allshr
          mov    edi,eax
          inc    edi
          inc    edi
          mov    [ebp-38h],edi
          mov    edx,[esi+6Ch]
          mov    [ebp-34h],edx
          lea    ecx,[edi+ebx-01h]
          mov    [ebp-48h],ecx
          mov    eax,[edx+04h]
          cmp    edi,eax
          ja     L00021DF3
          mov    edx,[edx]
          cmp    ecx,edx
          jc     L00021DF3
          cmp    edi,edx
          jnc    L00021DA9
          cmp    ecx,eax
          jbe    L00021D98
          mov    ebx,edx
          mov    [ebp-44h],ebx
          sub    eax,edx
          jmp    L00021DB9
 L00021D98:
          cmp    edi,edx
          jnc    L00021DA9
          mov    ebx,edx
          mov    [ebp-44h],ebx
          sub    ecx,edx
          inc    ecx
          mov    [ebp-50h],ecx
          jmp    L00021DBD
 L00021DA9:
          mov    ebx,edi
          mov    [ebp-44h],ebx
          cmp    ecx,eax
          ja     L00021DB7
          mov    eax,[ebp-28h]
          jmp    L00021DBA
 L00021DB7:
          sub    eax,edi
 L00021DB9:
          inc    eax
 L00021DBA:
          mov    [ebp-50h],eax
 L00021DBD:
          cmp    dword ptr [ebp-50h],00000000h
          jz     L00021E57
          push    [ebp-50h]
          mov    eax,ebx
          sub    eax,edx
          push    eax
          lea    eax,[esi+00000104h]
          push    eax
          call    [ntoskrnl.exe!RtlClearBits]
          mov    eax,[ebp-34h]
          sub    ebx,[eax]
          lea    eax,[ebx+02h]
          lea    ecx,[esi+000001ACh]
          cmp    eax,[ecx]
          jnc    L00021DF0
          mov    [ecx],eax
 L00021DF0:
          mov    ebx,[ebp-28h]
 L00021DF3:
          xor    eax,eax
          cmp    byte ptr [esi+000000ECh],20h
          setz     al
          test    al,al
          jz     L00021E14
          lea    eax,[edi-02h]
          shr    eax,10h
          imul    eax,00005DD4h
          add    eax,[esi+68h]
          jmp    L00021E17
 L00021E14:
          mov    eax,[esi+68h]
 L00021E17:
          mov    [ebp-34h],eax
          mov    [ebp-44h],edi
          mov    [ebp-50h],ebx
 L00021E20:
          cmp    dword ptr [ebp-50h],00000000h
          jbe    L00021E51
          mov    ecx,[eax+04h]
          sub    ecx,edi
          inc    ecx
          cmp    ecx,[ebp-50h]
          jc     L00021E34
          mov    ecx,[ebp-50h]
 L00021E34:          mov    [ebp-4Ch],ecx
          add    [eax+08h],ecx
          cmp    [ebp-50h],ecx
          jz     L00021E4C
          add    eax,00005DD4h
          mov    [ebp-34h],eax
          mov    edi,[eax]
          mov    [ebp-44h],edi
 L00021E4C:
          sub    [ebp-50h],ecx
          jmp    L00021E20
 L00021E51:
          add    [esi+000000E8h],ebx
 L00021E57:
          inc    [ebp-40h]
          jmp    L00021D1B
 L00021E5F:
          lea    ecx,[esi+0000010Ch]
          call    [HAL.dll!ExReleaseFastMutex]
          or    dword ptr [ebp-04h],FFFFFFFFh
          call    SUB_L00021E88
 L00021E74:
          mov    ecx,[ebp-10h]
          mov    fs:[00000000h],ecx
          pop    edi
          pop    esi
          pop    ebx
          leave
          retn    000Ch

Windows 2000

Windows 7のfastfat.sys の ソースコードを見ると全くこの処理が同じことが分かります。
Windows 2000も確認してみましたが、使ってる関数がちょっと違うだけで、基本同じ処理をしていることが分かります。

というわけで、恐らく影響を受けると思われます。
みなさんFAT32は卒業しましょう |・ω・)ノ

おすすめ

3件のフィードバック

  1. 774 より:

    XPとVISTAで使える「BitLocker To Go リーダー」はNTFSをBitLocker暗号化したパーティションは認識できないように作られています。
    それで、FAT32をBitLocker暗号化したパーティションだけが読み込みできる。
    そう考えると、VISTAからWindows10への移行のきっかけ作りなのかもしれませんね。
    32ビット版の「BitLocker To Go リーダー」をNTFSでBitLocker暗号化したパーティションも読めるように魔改造できませんかねぇ…。

  2. 使ってる物としては・・・ より:

    そういえば、USBメモリーがFAT32のままですね。

  3. 黒翼猫 より:

    理論的に 4G のUSBメモリだと 4G-1クラスタのファイル作れないので、4Gを超える容量のUSBメモリである必要がありますけどね

コメントを残す

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