Context Navigation


Changeset 286


Ignore:
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

Legend:

Unmodified
Added
Removed
  • trunk/src/ifs/fat32a.c

    r284 r286
    601601PSZ pszFile;
    602602USHORT rc;
    603PDIRENTRY pDirEntry(削除) (削除ここまで);
    603PDIRENTRY pDirEntry(追記) = NULL (追記ここまで);
    604604#ifdef EXFAT
    605605PDIRENTRY1 pDirEntry1;
    610610PSHOPENINFO pDirSHInfo = NULL;
    611611//BYTE szLongName[ FAT32MAXPATH ];
    612PSZ szLongName(削除) (削除ここまで);
    612PSZ szLongName(追記) = NULL (追記ここまで);
    613613
    614614 _asm push es;
    40094009{
    40104010ULONG ulSector;
    4011(削除) // (削除ここまで)ULONG ulNextCluster;
    4011(追記) (追記ここまで)ULONG ulNextCluster;
    40124012USHORT usSectorsPerBlock = (USHORT)(pVolInfo->ulBlockSize / pVolInfo->BootSect.bpb.BytesPerSector);
    40134013USHORT rc;
    40264026
    40274027 // 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;
    40314031
    40324032 ulSector = pVolInfo->ulStartOfData +
    40514051{
    40524052ULONG ulSector;
    4053(削除) // (削除ここまで)ULONG ulNextCluster;
    4053(追記) (追記ここまで)ULONG ulNextCluster;
    40544054USHORT usSectorsPerBlock = (USHORT)(pVolInfo->ulBlockSize / pVolInfo->BootSect.bpb.BytesPerSector);
    40554055USHORT rc;
    40684068
    40694069 // 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;
    40734073
    40744074 ulSector = pVolInfo->ulStartOfData +
    49034903 }
    49044904
    4905 (削除) (削除ここまで)ReleaseFat(pVolInfo);
    4905 (追記) //// (追記ここまで)ReleaseFat(pVolInfo);
    49064906 if (f32Parms.fMessageActive & LOG_FUNCS)
    49074907 {
    53775377
    53785378 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 (追記ここまで)
    53795387 return pVolInfo->ulFatEof;
    5388(追記) } (追記ここまで)
    53805389
    53815390 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 (追記ここまで)
    53825399 return pVolInfo->ulFatEof;
    5400(追記) } (追記ここまで)
    53835401
    53845402 fUpdateFSInfo = FALSE;
    54035421 {
    54045422 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 (追記ここまで)
    54055430 return pVolInfo->ulFatEof;
    54065431 }
    58915916//UCHAR szLongName1[FAT32MAXPATH];
    58925917PSZ pszLongName1;
    5918(追記) PSZ pszLongName2; (追記ここまで)
    58935919//USHORT pusUniName[256];
    58945920PUSHORT pusUniName;
    59015927 return pDir;
    59025928
    5903 pszLongName(削除) 1 (削除ここまで) = (PSZ)malloc((size_t)FAT32MAXPATH);
    5904 if (!pszLongName(削除) 1 (削除ここまで))
    5929 pszLongName(追記) 2 (追記ここまで) = (PSZ)malloc((size_t)FAT32MAXPATH);
    5930 if (!pszLongName(追記) 2 (追記ここまで))
    59055931 return pDir;
    5932(追記) (追記ここまで)
    5933(追記) pszLongName1 = pszLongName2; (追記ここまで)
    59065934
    59075935 pusUniName = (PUSHORT)malloc(256 * sizeof(USHORT));
    59085936 if (!pusUniName)
    5937(追記) { (追記ここまで)
    5938(追記) free(pszLongName2); (追記ここまで)
    59095939 return pDir;
    5940(追記) } (追記ここまで)
    59105941
    59115942 // @todo Use upcase table
    59165947
    59175948 if (!usNeededEntries)
    5949(追記) { (追記ここまで)
    5950(追記) free(pszLongName2); (追記ここまで)
    5951(追記) free(pusUniName); (追記ここまで)
    59185952 return pDir;
    5953(追記) } (追記ここまで)
    59195954
    59205955 pLN = (PDIRENTRY1)pDir;
    59525987 *pusNameHash = NameHash(pusUniName, DBCSStrlen(r));
    59535988
    5954 free(pusUniName);
    5955 free(pszLongName1);
    5989
    5990 if (pusUniName)
    5991 free(pusUniName);
    5992 if (pszLongName2)
    5993 free(pszLongName2);
    59565994
    59575995 return pLN;
  • trunk/src/ifs/ifscache.c

    r284 r286
    275275 ULONG ulCluster;
    276276
    277 (削除) (削除ここまで)for( ulCluster = ulStartCluster; ulCluster <= ulEndCluster; ulCluster++ )
    277 (追記) /* (追記ここまで)for( ulCluster = ulStartCluster; ulCluster <= ulEndCluster; ulCluster++ )
    278278 {
    279279 //ulNextCluster = GetNextCluster2( pVolInfo, NULL, ulCluster );
    291291 if (usSectors == 0)
    292292 // avoid reading zero sectors
    293 return ERROR_SECTOR_NOT_FOUND;(削除) (削除ここまで)
    293 return ERROR_SECTOR_NOT_FOUND;(追記) */ (追記ここまで)
    294294 }
    295295
  • trunk/src/ifs/ifsfile.c

    r284 r286
    835835 free(pDirOldStream);
    836836#endif
    837(追記) free(szLongName); (追記ここまで)
    837838 }
    838839 else
  • trunk/src/ufat32/chkdsk.c

    r283 r286
    109109USHORT fGetUpCaseTbl(PCDINFO pCD, PULONG pulFirstCluster, PULONGLONG pullLen, PULONG pulChecksum);
    110110void SetSHInfo1(PCDINFO pCD, PDIRENTRY1 pStreamEntry, PSHOPENINFO pSHInfo);
    111(追記) APIRET DelFile(PCDINFO pCD, PSZ pszFilename); (追記ここまで)
    111112
    112113USHORT _Far16 _Pascal _loadds INIT16(HMODULE hmod, ULONG flag);
    717718
    718719 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,
    720721 TYPE_DOUBLE, (DOUBLE)pCD->ulRecoveredClusters * pCD->ulClusterSize,
    721722 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); (追記ここまで)
    722726
    723727 if (pCD->ulLostClusters)
    14861490 if (pCD->fFix)
    14871491 {
    1488 unlink(Mark.szFileName);
    1492 DelFile(pCD, Mark.szFileName);
    1493 //unlink(Mark.szFileName);
    14891494 strcpy(Mark.szFileName, pbPath);
    14901495 Mark.fEAS = FILE_HAS_NO_EAS;
    21102115 if (pCD->fFix)
    21112116 {
    2112 unlink(Mark.szFileName);
    2117 DelFile(pCD, Mark.szFileName);
    2118 //unlink(Mark.szFileName);
    21132119 strcpy(Mark.szFileName, pbPath);
    21142120 Mark.fEAS = FILE_HAS_NO_EAS;
  • trunk/src/ufat32/fatfunc.c

    r283 r286
    9191USHORT fGetAllocBitmap(PCDINFO pCD, PULONG pulFirstCluster, PULONGLONG pullLen);
    9292void SetSHInfo1(PCDINFO pCD, PDIRENTRY1 pStreamEntry, PSHOPENINFO pSHInfo);
    93(追記) APIRET DelFile(PCDINFO pCD, PSZ pszFilename); (追記ここまで)
    9394
    9495void set_datetime(DIRENTRY *pDir);
    26882689
    26892690 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 (追記ここまで)
    26902699 return pCD->ulFatEof;
    2700(追記) } (追記ここまで)
    26912701
    26922702 fUpdateFSInfo = FALSE;
    27082718 rc = WriteFatSector(pCD, GetFatEntrySec(pCD, ulCluster));
    27092719 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 (追記ここまで)
    27102728 return pCD->ulFatEof;
    2729(追記) } (追記ここまで)
    27112730
    27122731 if (fUpdateFSInfo)
    40144033 return rc;
    40154034}
    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.

AltStyle によって変換されたページ (->オリジナル) /