Changeset 286
- Timestamp:
- Jul 3, 2017, 8:47:34 PM (8 years ago)
- Author:
- Valery V. Sedletski
- Message:
-
fat32.ifs: Fix some problems remained in previous revision.
- Fix a trap 000d caused by unzeroed variables.
- Move check for bad sectors from ReadSector to ReadBlock and WriteBlock.
- Fix allocating new clusters in SetNextCluster in exFAT code.
- Change unlink() to DelFile() and avoid calling filesystem access functions in CHKDSK when FS is not accessible.
- Location:
- trunk/src
- Files:
-
- 5 edited
- ifs/fat32a.c (modified) (13 diffs)
- ifs/ifscache.c (modified) (2 diffs)
- ifs/ifsfile.c (modified) (1 diff)
- ufat32/chkdsk.c (modified) (4 diffs)
- ufat32/fatfunc.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ifs/fat32a.c
r284 r286 601 601 PSZ pszFile; 602 602 USHORT rc; 603 PDIRENTRY pDirEntry (削除) (削除ここまで);603 PDIRENTRY pDirEntry(追記) = NULL (追記ここまで); 604 604 #ifdef EXFAT 605 605 PDIRENTRY1 pDirEntry1; … … 610 610 PSHOPENINFO pDirSHInfo = NULL; 611 611 //BYTE szLongName[ FAT32MAXPATH ]; 612 PSZ szLongName (削除) (削除ここまで);612 PSZ szLongName(追記) = NULL (追記ここまで); 613 613 614 614 _asm push es; … … 4009 4009 { 4010 4010 ULONG ulSector; 4011 (削除) // (削除ここまで)ULONG ulNextCluster;4011 (追記) (追記ここまで)ULONG ulNextCluster; 4012 4012 USHORT usSectorsPerBlock = (USHORT)(pVolInfo->ulBlockSize / pVolInfo->BootSect.bpb.BytesPerSector); 4013 4013 USHORT rc; … … 4026 4026 4027 4027 // check for bad cluster 4028 (削除) // (削除ここまで)ulNextCluster = GetNextCluster(pVolInfo, NULL, ulCluster);4029 (削除) // (削除ここまで)if (ulNextCluster == pVolInfo->ulFatBad)4030 (削除) // (削除ここまで)return ERROR_SECTOR_NOT_FOUND;4028 (追記) (追記ここまで)ulNextCluster = GetNextCluster(pVolInfo, NULL, ulCluster); 4029 (追記) (追記ここまで)if (ulNextCluster == pVolInfo->ulFatBad) 4030 (追記) (追記ここまで) return ERROR_SECTOR_NOT_FOUND; 4031 4031 4032 4032 ulSector = pVolInfo->ulStartOfData + … … 4051 4051 { 4052 4052 ULONG ulSector; 4053 (削除) // (削除ここまで)ULONG ulNextCluster;4053 (追記) (追記ここまで)ULONG ulNextCluster; 4054 4054 USHORT usSectorsPerBlock = (USHORT)(pVolInfo->ulBlockSize / pVolInfo->BootSect.bpb.BytesPerSector); 4055 4055 USHORT rc; … … 4068 4068 4069 4069 // check for bad cluster 4070 (削除) // (削除ここまで)ulNextCluster = GetNextCluster(pVolInfo, NULL, ulCluster);4071 (削除) // (削除ここまで)if (ulNextCluster == pVolInfo->ulFatBad)4072 (削除) // (削除ここまで)return ERROR_SECTOR_NOT_FOUND;4070 (追記) (追記ここまで)ulNextCluster = GetNextCluster(pVolInfo, NULL, ulCluster); 4071 (追記) (追記ここまで)if (ulNextCluster == pVolInfo->ulFatBad) 4072 (追記) (追記ここまで) return ERROR_SECTOR_NOT_FOUND; 4073 4073 4074 4074 ulSector = pVolInfo->ulStartOfData + … … 4903 4903 } 4904 4904 4905 (削除) (削除ここまで)ReleaseFat(pVolInfo);4905 (追記) //// (追記ここまで)ReleaseFat(pVolInfo); 4906 4906 if (f32Parms.fMessageActive & LOG_FUNCS) 4907 4907 { … … 5377 5377 5378 5378 if (GetFatAccess(pVolInfo, "SetNextCluster")) 5379 (追記) { (追記ここまで) 5380 (追記) #ifdef EXFAT (追記ここまで) 5381 (追記) if (pVolInfo->bFatType == FAT_TYPE_EXFAT) (追記ここまで) 5382 (追記) { (追記ここまで) 5383 (追記) // mark cluster in exFAT allocation bitmap (追記ここまで) 5384 (追記) MarkCluster(pVolInfo, ulCluster, FALSE); (追記ここまで) 5385 (追記) } (追記ここまで) 5386 (追記) #endif (追記ここまで) 5379 5387 return pVolInfo->ulFatEof; 5388 (追記) } (追記ここまで) 5380 5389 5381 5390 if (ReadFatSector(pVolInfo, GetFatEntrySec(pVolInfo, ulCluster))) 5391 (追記) { (追記ここまで) 5392 (追記) #ifdef EXFAT (追記ここまで) 5393 (追記) if (pVolInfo->bFatType == FAT_TYPE_EXFAT) (追記ここまで) 5394 (追記) { (追記ここまで) 5395 (追記) // mark cluster in exFAT allocation bitmap (追記ここまで) 5396 (追記) MarkCluster(pVolInfo, ulCluster, FALSE); (追記ここまで) 5397 (追記) } (追記ここまで) 5398 (追記) #endif (追記ここまで) 5382 5399 return pVolInfo->ulFatEof; 5400 (追記) } (追記ここまで) 5383 5401 5384 5402 fUpdateFSInfo = FALSE; … … 5403 5421 { 5404 5422 ReleaseFat(pVolInfo); 5423 (追記) #ifdef EXFAT (追記ここまで) 5424 (追記) if (pVolInfo->bFatType == FAT_TYPE_EXFAT) (追記ここまで) 5425 (追記) { (追記ここまで) 5426 (追記) // mark cluster in exFAT allocation bitmap (追記ここまで) 5427 (追記) MarkCluster(pVolInfo, ulCluster, FALSE); (追記ここまで) 5428 (追記) } (追記ここまで) 5429 (追記) #endif (追記ここまで) 5405 5430 return pVolInfo->ulFatEof; 5406 5431 } … … 5891 5916 //UCHAR szLongName1[FAT32MAXPATH]; 5892 5917 PSZ pszLongName1; 5918 (追記) PSZ pszLongName2; (追記ここまで) 5893 5919 //USHORT pusUniName[256]; 5894 5920 PUSHORT pusUniName; … … 5901 5927 return pDir; 5902 5928 5903 pszLongName (削除) 1 (削除ここまで)= (PSZ)malloc((size_t)FAT32MAXPATH);5904 if (!pszLongName (削除) 1 (削除ここまで))5929 pszLongName(追記) 2 (追記ここまで) = (PSZ)malloc((size_t)FAT32MAXPATH); 5930 if (!pszLongName(追記) 2 (追記ここまで)) 5905 5931 return pDir; 5932 (追記) (追記ここまで) 5933 (追記) pszLongName1 = pszLongName2; (追記ここまで) 5906 5934 5907 5935 pusUniName = (PUSHORT)malloc(256 * sizeof(USHORT)); 5908 5936 if (!pusUniName) 5937 (追記) { (追記ここまで) 5938 (追記) free(pszLongName2); (追記ここまで) 5909 5939 return pDir; 5940 (追記) } (追記ここまで) 5910 5941 5911 5942 // @todo Use upcase table … … 5916 5947 5917 5948 if (!usNeededEntries) 5949 (追記) { (追記ここまで) 5950 (追記) free(pszLongName2); (追記ここまで) 5951 (追記) free(pusUniName); (追記ここまで) 5918 5952 return pDir; 5953 (追記) } (追記ここまで) 5919 5954 5920 5955 pLN = (PDIRENTRY1)pDir; … … 5952 5987 *pusNameHash = NameHash(pusUniName, DBCSStrlen(r)); 5953 5988 5954 free(pusUniName); 5955 free(pszLongName1); 5989 5990 if (pusUniName) 5991 free(pusUniName); 5992 if (pszLongName2) 5993 free(pszLongName2); 5956 5994 5957 5995 return pLN; -
trunk/src/ifs/ifscache.c
r284 r286 275 275 ULONG ulCluster; 276 276 277 (削除) (削除ここまで)for( ulCluster = ulStartCluster; ulCluster <= ulEndCluster; ulCluster++ )277 (追記) /* (追記ここまで)for( ulCluster = ulStartCluster; ulCluster <= ulEndCluster; ulCluster++ ) 278 278 { 279 279 //ulNextCluster = GetNextCluster2( pVolInfo, NULL, ulCluster ); … … 291 291 if (usSectors == 0) 292 292 // avoid reading zero sectors 293 return ERROR_SECTOR_NOT_FOUND; (削除) (削除ここまで)293 return ERROR_SECTOR_NOT_FOUND;(追記) */ (追記ここまで) 294 294 } 295 295 -
trunk/src/ifs/ifsfile.c
r284 r286 835 835 free(pDirOldStream); 836 836 #endif 837 (追記) free(szLongName); (追記ここまで) 837 838 } 838 839 else -
trunk/src/ufat32/chkdsk.c
r283 r286 109 109 USHORT fGetUpCaseTbl(PCDINFO pCD, PULONG pulFirstCluster, PULONGLONG pullLen, PULONG pulChecksum); 110 110 void SetSHInfo1(PCDINFO pCD, PDIRENTRY1 pStreamEntry, PSHOPENINFO pSHInfo); 111 (追記) APIRET DelFile(PCDINFO pCD, PSZ pszFilename); (追記ここまで) 111 112 112 113 USHORT _Far16 _Pascal _loadds INIT16(HMODULE hmod, ULONG flag); … … 717 718 718 719 if (pCD->ulRecoveredClusters) 719 show_message("%1 bytes in %2 (削除) user files.\n", 0, 1365 (削除ここまで), 2,720 show_message("%1 bytes in %2 (追記) recovered files.\n", 0, 1366 (追記ここまで), 2, 720 721 TYPE_DOUBLE, (DOUBLE)pCD->ulRecoveredClusters * pCD->ulClusterSize, 721 722 TYPE_LONG, pCD->ulRecoveredFiles); 723 (追記) //show_message("%1 bytes in %2 user files.\n", 0, 1365, 2, (追記ここまで) 724 (追記) // TYPE_DOUBLE, (DOUBLE)pCD->ulRecoveredClusters * pCD->ulClusterSize, (追記ここまで) 725 (追記) // TYPE_LONG, pCD->ulRecoveredFiles); (追記ここまで) 722 726 723 727 if (pCD->ulLostClusters) … … 1486 1490 if (pCD->fFix) 1487 1491 { 1488 unlink(Mark.szFileName); 1492 DelFile(pCD, Mark.szFileName); 1493 //unlink(Mark.szFileName); 1489 1494 strcpy(Mark.szFileName, pbPath); 1490 1495 Mark.fEAS = FILE_HAS_NO_EAS; … … 2110 2115 if (pCD->fFix) 2111 2116 { 2112 unlink(Mark.szFileName); 2117 DelFile(pCD, Mark.szFileName); 2118 //unlink(Mark.szFileName); 2113 2119 strcpy(Mark.szFileName, pbPath); 2114 2120 Mark.fEAS = FILE_HAS_NO_EAS; -
trunk/src/ufat32/fatfunc.c
r283 r286 91 91 USHORT fGetAllocBitmap(PCDINFO pCD, PULONG pulFirstCluster, PULONGLONG pullLen); 92 92 void SetSHInfo1(PCDINFO pCD, PDIRENTRY1 pStreamEntry, PSHOPENINFO pSHInfo); 93 (追記) APIRET DelFile(PCDINFO pCD, PSZ pszFilename); (追記ここまで) 93 94 94 95 void set_datetime(DIRENTRY *pDir); … … 2688 2689 2689 2690 if (ReadFatSector(pCD, GetFatEntrySec(pCD, ulCluster))) 2691 (追記) { (追記ここまで) 2692 (追記) #ifdef EXFAT (追記ここまで) 2693 (追記) if (pCD->bFatType == FAT_TYPE_EXFAT) (追記ここまで) 2694 (追記) { (追記ここまで) 2695 (追記) // mark cluster in exFAT allocation bitmap (追記ここまで) 2696 (追記) MarkCluster2(pCD, ulCluster, FALSE); (追記ここまで) 2697 (追記) } (追記ここまで) 2698 (追記) #endif (追記ここまで) 2690 2699 return pCD->ulFatEof; 2700 (追記) } (追記ここまで) 2691 2701 2692 2702 fUpdateFSInfo = FALSE; … … 2708 2718 rc = WriteFatSector(pCD, GetFatEntrySec(pCD, ulCluster)); 2709 2719 if (rc) 2720 (追記) { (追記ここまで) 2721 (追記) #ifdef EXFAT (追記ここまで) 2722 (追記) if (pCD->bFatType == FAT_TYPE_EXFAT) (追記ここまで) 2723 (追記) { (追記ここまで) 2724 (追記) // mark cluster in exFAT allocation bitmap (追記ここまで) 2725 (追記) MarkCluster2(pCD, ulCluster, FALSE); (追記ここまで) 2726 (追記) } (追記ここまで) 2727 (追記) #endif (追記ここまで) 2710 2728 return pCD->ulFatEof; 2729 (追記) } (追記ここまで) 2711 2730 2712 2731 if (fUpdateFSInfo) … … 4014 4033 return rc; 4015 4034 } 4035 (追記) (追記ここまで) 4036 (追記) APIRET DelFile(PCDINFO pCD, PSZ pszFilename) (追記ここまで) 4037 (追記) { (追記ここまで) 4038 (追記) PSZ pszFile; (追記ここまで) 4039 (追記) DIRENTRY DirEntry; (追記ここまで) 4040 (追記) PDIRENTRY1 pDirEntry1; (追記ここまで) 4041 (追記) DIRENTRY1 DirEntryStream; (追記ここまで) 4042 (追記) DIRENTRY1 DirStream; (追記ここまで) 4043 (追記) SHOPENINFO DirSHInfo; (追記ここまで) 4044 (追記) PSHOPENINFO pDirSHInfo = NULL; (追記ここまで) 4045 (追記) ULONG ulDirCluster; (追記ここまで) 4046 (追記) ULONG ulCluster; (追記ここまで) 4047 (追記) APIRET rc; (追記ここまで) 4048 (追記) (追記ここまで) 4049 (追記) ulDirCluster = FindDirCluster(pCD, (追記ここまで) 4050 (追記) pszFilename, (追記ここまで) 4051 (追記) 0xffff, (追記ここまで) 4052 (追記) RETURN_PARENT_DIR, (追記ここまで) 4053 (追記) &pszFile, (追記ここまで) 4054 (追記) &DirStream); (追記ここまで) 4055 (追記) (追記ここまで) 4056 (追記) if (ulDirCluster == pCD->ulFatEof) (追記ここまで) 4057 (追記) { (追記ここまで) 4058 (追記) rc = ERROR_PATH_NOT_FOUND; (追記ここまで) 4059 (追記) goto DeleteFileExit; (追記ここまで) 4060 (追記) } (追記ここまで) 4061 (追記) (追記ここまで) 4062 (追記) #ifdef EXFAT (追記ここまで) 4063 (追記) if (pCD->bFatType == FAT_TYPE_EXFAT) (追記ここまで) 4064 (追記) { (追記ここまで) 4065 (追記) pDirSHInfo = &DirSHInfo; (追記ここまで) 4066 (追記) SetSHInfo1(pCD, &DirStream, pDirSHInfo); (追記ここまで) 4067 (追記) } (追記ここまで) 4068 (追記) #endif (追記ここまで) 4069 (追記) (追記ここまで) 4070 (追記) ulCluster = FindPathCluster(pCD, ulDirCluster, pszFile, pDirSHInfo, (追記ここまで) 4071 (追記) &DirEntry, &DirEntryStream, NULL); (追記ここまで) 4072 (追記) if (ulCluster == pCD->ulFatEof) (追記ここまで) 4073 (追記) { (追記ここまで) 4074 (追記) rc = ERROR_FILE_NOT_FOUND; (追記ここまで) 4075 (追記) goto DeleteFileExit; (追記ここまで) 4076 (追記) } (追記ここまで) 4077 (追記) (追記ここまで) 4078 (追記) pDirEntry1 = (PDIRENTRY1)&DirEntry; (追記ここまで) 4079 (追記) (追記ここまで) 4080 (追記) #ifdef EXFAT (追記ここまで) 4081 (追記) if ( ((pCD->bFatType < FAT_TYPE_EXFAT) && (DirEntry.bAttr & FILE_DIRECTORY)) || (追記ここまで) 4082 (追記) ((pCD->bFatType == FAT_TYPE_EXFAT) && (pDirEntry1->u.File.usFileAttr & FILE_DIRECTORY)) ) (追記ここまで) 4083 (追記) #else (追記ここまで) 4084 (追記) if ( DirEntry.bAttr & FILE_DIRECTORY ) (追記ここまで) 4085 (追記) #endif (追記ここまで) 4086 (追記) { (追記ここまで) 4087 (追記) rc = ERROR_ACCESS_DENIED; (追記ここまで) 4088 (追記) goto DeleteFileExit; (追記ここまで) 4089 (追記) } (追記ここまで) 4090 (追記) (追記ここまで) 4091 (追記) rc = ModifyDirectory(pCD, ulDirCluster, pDirSHInfo, MODIFY_DIR_DELETE, (追記ここまで) 4092 (追記) &DirEntry, NULL, &DirEntryStream, NULL, NULL); (追記ここまで) 4093 (追記) if (rc) (追記ここまで) 4094 (追記) goto DeleteFileExit; (追記ここまで) 4095 (追記) (追記ここまで) 4096 (追記) if (ulCluster) (追記ここまで) 4097 (追記) DeleteFatChain(pCD, ulCluster); (追記ここまで) 4098 (追記) rc = 0; (追記ここまで) 4099 (追記) (追記ここまで) 4100 (追記) DeleteFileExit: (追記ここまで) 4101 (追記) return rc; (追記ここまで) 4102 (追記) } (追記ここまで)
Note:
See TracChangeset
for help on using the changeset viewer.