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は卒業しましょう |・ω・)ノ
XPとVISTAで使える「BitLocker To Go リーダー」はNTFSをBitLocker暗号化したパーティションは認識できないように作られています。
それで、FAT32をBitLocker暗号化したパーティションだけが読み込みできる。
そう考えると、VISTAからWindows10への移行のきっかけ作りなのかもしれませんね。
32ビット版の「BitLocker To Go リーダー」をNTFSでBitLocker暗号化したパーティションも読めるように魔改造できませんかねぇ…。
そういえば、USBメモリーがFAT32のままですね。
理論的に 4G のUSBメモリだと 4G-1クラスタのファイル作れないので、4Gを超える容量のUSBメモリである必要がありますけどね