Context Navigation


Changeset 71 for branches


Ignore:
Timestamp:
Dec 2, 2008, 3:01:48 PM (17 years ago)
Author:
KO Myung-Hun
Message:

Improved Read/Write performance. By Lars.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/fat32-0.9/src/ifsfile.c

    r55 r71
    619619}
    620620
    621
    621#if 0
    622622/******************************************************************
    623623*
    846846 return rc;
    847847}
    848(追記) (追記ここまで)
    848849
    849850/******************************************************************
    11191120 return rc;
    11201121}
    1122(追記) #else (追記ここまで)
    1123(追記) /****************************************************************** (追記ここまで)
    1124(追記) * (追記ここまで)
    1125(追記) ******************************************************************/ (追記ここまで)
    1126(追記) int far pascal FS_READ( (追記ここまで)
    1127(追記) struct sffsi far * psffsi, /* psffsi */ (追記ここまで)
    1128(追記) struct sffsd far * psffsd, /* psffsd */ (追記ここまで)
    1129(追記) char far * pData, /* pData */ (追記ここまで)
    1130(追記) unsigned short far * pLen, /* pLen */ (追記ここまで)
    1131(追記) unsigned short usIOFlag /* IOflag */ (追記ここまで)
    1132(追記) ) (追記ここまで)
    1133(追記) { (追記ここまで)
    1134(追記) USHORT rc; (追記ここまで)
    1135(追記) PVOLINFO pVolInfo; (追記ここまで)
    1136(追記) POPENINFO pOpenInfo = GetOpenInfo(psffsd); (追記ここまで)
    1137(追記) USHORT usBytesRead; (追記ここまで)
    1138(追記) USHORT usBytesToRead; (追記ここまで)
    1139(追記) PBYTE pbCluster; (追記ここまで)
    1140(追記) ULONG ulClusterSector; (追記ここまで)
    1141(追記) USHORT usClusterOffset; (追記ここまで)
    1142(追記) USHORT usBytesPerCluster; (追記ここまで)
    1143(追記) (追記ここまで)
    1144(追記) (追記ここまで)
    1145(追記) usBytesToRead = *pLen; (追記ここまで)
    1146(追記) usBytesRead = 0; (追記ここまで)
    1147(追記) *pLen = 0; (追記ここまで)
    1148(追記) pbCluster = NULL; (追記ここまで)
    1149(追記) (追記ここまで)
    1150(追記) if (f32Parms.fMessageActive & LOG_FS) (追記ここまで)
    1151(追記) Message("FS_READ, %u bytes at offset %ld", (追記ここまで)
    1152(追記) usBytesToRead, psffsi->sfi_position); (追記ここまで)
    1153(追記) (追記ここまで)
    1154(追記) pVolInfo = GetVolInfo(psffsi->sfi_hVPB); (追記ここまで)
    1155(追記) if (IsDriveLocked(pVolInfo)) (追記ここまで)
    1156(追記) { (追記ここまで)
    1157(追記) rc = ERROR_DRIVE_LOCKED; (追記ここまで)
    1158(追記) goto FS_READEXIT; (追記ここまで)
    1159(追記) } (追記ここまで)
    1160(追記) (追記ここまで)
    1161(追記) if (!((psffsi->sfi_mode & 0xFUL) == OPEN_ACCESS_READONLY) && (追記ここまで)
    1162(追記) !((psffsi->sfi_mode & 0xFUL) == OPEN_ACCESS_READWRITE)) (追記ここまで)
    1163(追記) { (追記ここまで)
    1164(追記) rc = ERROR_ACCESS_DENIED; (追記ここまで)
    1165(追記) goto FS_READEXIT; (追記ここまで)
    1166(追記) } (追記ここまで)
    1167(追記) (追記ここまで)
    1168(追記) if (!usBytesToRead) (追記ここまで)
    1169(追記) { (追記ここまで)
    1170(追記) rc = NO_ERROR; (追記ここまで)
    1171(追記) goto FS_READEXIT; (追記ここまで)
    1172(追記) } (追記ここまで)
    1173(追記) (追記ここまで)
    1174(追記) pbCluster = malloc(pVolInfo->usClusterSize); (追記ここまで)
    1175(追記) if (!pbCluster) (追記ここまで)
    1176(追記) { (追記ここまで)
    1177(追記) rc = ERROR_NOT_ENOUGH_MEMORY; (追記ここまで)
    1178(追記) goto FS_READEXIT; (追記ここまで)
    1179(追記) } (追記ここまで)
    1180(追記) (追記ここまで)
    1181(追記) if (psffsi->sfi_mode & OPEN_FLAGS_DASD) (追記ここまで)
    1182(追記) { (追記ここまで)
    1183(追記) ULONG ulSector; (追記ここまで)
    1184(追記) USHORT usSectorOffset; (追記ここまで)
    1185(追記) USHORT usRemaining; (追記ここまで)
    1186(追記) USHORT usBytesPerSector; (追記ここまで)
    1187(追記) USHORT usNumSectors; (追記ここまで)
    1188(追記) (追記ここまで)
    1189(追記) char far *pBufPosition = pData; (追記ここまで)
    1190(追記) (追記ここまで)
    1191(追記) usBytesPerSector = pVolInfo->BootSect.bpb.BytesPerSector; (追記ここまで)
    1192(追記) usBytesRead = 0; (追記ここまで)
    1193(追記) (追記ここまで)
    1194(追記) if (pOpenInfo->fSectorMode) (追記ここまで)
    1195(追記) { (追記ここまで)
    1196(追記) USHORT usTotNumBytes; (追記ここまで)
    1197(追記) (追記ここまで)
    1198(追記) if (usBytesToRead > (USHRT_MAX/usBytesPerSector)) (追記ここまで)
    1199(追記) { (追記ここまで)
    1200(追記) rc = ERROR_TRANSFER_TOO_LONG; (追記ここまで)
    1201(追記) goto FS_READEXIT; (追記ここまで)
    1202(追記) } (追記ここまで)
    1203(追記) (追記ここまで)
    1204(追記) usTotNumBytes = usBytesToRead * usBytesPerSector; (追記ここまで)
    1205(追記) (追記ここまで)
    1206(追記) rc = MY_PROBEBUF(PB_OPWRITE, pBufPosition, usTotNumBytes); (追記ここまで)
    1207(追記) if (rc) (追記ここまで)
    1208(追記) { (追記ここまで)
    1209(追記) Message("Protection VIOLATION in FS_READ! (SYS%d)", rc); (追記ここまで)
    1210(追記) goto FS_READEXIT; (追記ここまで)
    1211(追記) } (追記ここまで)
    1212(追記) (追記ここまで)
    1213(追記) /* (追記ここまで)
    1214(追記) for sector mode, offsets are actually sectors (追記ここまで)
    1215(追記) and Number of Bytes to read are actually (追記ここまで)
    1216(追記) Number of sectors to read (追記ここまで)
    1217(追記) */ (追記ここまで)
    1218(追記) ulSector = psffsi->sfi_position; (追記ここまで)
    1219(追記) usSectorOffset = 0; (追記ここまで)
    1220(追記) usRemaining = 0; (追記ここまで)
    1221(追記) usNumSectors = usBytesToRead; (追記ここまで)
    1222(追記) if (ulSector > (pVolInfo->BootSect.bpb.BigTotalSectors - (ULONG)usNumSectors)) (追記ここまで)
    1223(追記) { (追記ここまで)
    1224(追記) usNumSectors = (USHORT)(pVolInfo->BootSect.bpb.BigTotalSectors - ulSector); (追記ここまで)
    1225(追記) } (追記ここまで)
    1226(追記) usBytesToRead = usNumSectors; (追記ここまで)
    1227(追記) } (追記ここまで)
    1228(追記) else (追記ここまで)
    1229(追記) { (追記ここまで)
    1230(追記) rc = MY_PROBEBUF(PB_OPWRITE, pData, usBytesToRead); (追記ここまで)
    1231(追記) if (rc) (追記ここまで)
    1232(追記) { (追記ここまで)
    1233(追記) Message("Protection VIOLATION in FS_READ! (SYS%d)", rc); (追記ここまで)
    1234(追記) goto FS_READEXIT; (追記ここまで)
    1235(追記) } (追記ここまで)
    1236(追記) (追記ここまで)
    1237(追記) ulSector = (ULONG)(psffsi->sfi_position / (ULONG)usBytesPerSector); (追記ここまで)
    1238(追記) usSectorOffset = (USHORT)(psffsi->sfi_position % (ULONG)usBytesPerSector); (追記ここまで)
    1239(追記) usRemaining = (usSectorOffset + usBytesToRead) % usBytesPerSector; (追記ここまで)
    1240(追記) usNumSectors = (usBytesToRead - usRemaining)/usBytesPerSector; (追記ここまで)
    1241(追記) (追記ここまで)
    1242(追記) if (ulSector > (pVolInfo->BootSect.bpb.BigTotalSectors - (ULONG)usNumSectors - (ULONG)(usRemaining ? 1 : 0))) (追記ここまで)
    1243(追記) { (追記ここまで)
    1244(追記) usNumSectors = (USHORT)(pVolInfo->BootSect.bpb.BigTotalSectors - ulSector); (追記ここまで)
    1245(追記) usRemaining = 0; (追記ここまで)
    1246(追記) } (追記ここまで)
    1247(追記) usBytesToRead = usNumSectors*usBytesPerSector; (追記ここまで)
    1248(追記) } (追記ここまで)
    1249(追記) (追記ここまで)
    1250(追記) if (ulSector >= pVolInfo->BootSect.bpb.BigTotalSectors) (追記ここまで)
    1251(追記) { (追記ここまで)
    1252(追記) rc = ERROR_SECTOR_NOT_FOUND; (追記ここまで)
    1253(追記) goto FS_READEXIT; (追記ここまで)
    1254(追記) } (追記ここまで)
    1255(追記) (追記ここまで)
    1256(追記) if (usSectorOffset) (追記ここまで)
    1257(追記) { (追記ここまで)
    1258(追記) rc = ReadSector(pVolInfo, ulSector, 1, pbCluster, usIOFlag); (追記ここまで)
    1259(追記) if (rc) (追記ここまで)
    1260(追記) { (追記ここまで)
    1261(追記) goto FS_READEXIT; (追記ここまで)
    1262(追記) } (追記ここまで)
    1263(追記) memcpy(pBufPosition,pbCluster + usSectorOffset,usBytesPerSector-usSectorOffset); (追記ここまで)
    1264(追記) pBufPosition += (usBytesPerSector - usSectorOffset); (追記ここまで)
    1265(追記) psffsi->sfi_position += (usBytesPerSector - usSectorOffset); (追記ここまで)
    1266(追記) usBytesRead += (usBytesPerSector - usSectorOffset); (追記ここまで)
    1267(追記) } (追記ここまで)
    1268(追記) (追記ここまで)
    1269(追記) if (usNumSectors) (追記ここまで)
    1270(追記) { (追記ここまで)
    1271(追記) rc = ReadSector(pVolInfo, ulSector, usNumSectors, pBufPosition, usIOFlag); (追記ここまで)
    1272(追記) if (rc) (追記ここまで)
    1273(追記) { (追記ここまで)
    1274(追記) goto FS_READEXIT; (追記ここまで)
    1275(追記) } (追記ここまで)
    1276(追記) pBufPosition += (ULONG)((ULONG)usNumSectors*(ULONG)usBytesPerSector); (追記ここまで)
    1277(追記) psffsi->sfi_position += usBytesToRead; (追記ここまで)
    1278(追記) usBytesRead += usBytesToRead; (追記ここまで)
    1279(追記) } (追記ここまで)
    1280(追記) (追記ここまで)
    1281(追記) if (usRemaining) (追記ここまで)
    1282(追記) { (追記ここまで)
    1283(追記) rc = ReadSector(pVolInfo, ulSector, 1, pbCluster, usIOFlag); (追記ここまで)
    1284(追記) if (rc) (追記ここまで)
    1285(追記) { (追記ここまで)
    1286(追記) goto FS_READEXIT; (追記ここまで)
    1287(追記) } (追記ここまで)
    1288(追記) memcpy(pBufPosition,pbCluster,usRemaining); (追記ここまで)
    1289(追記) pBufPosition += usRemaining; (追記ここまで)
    1290(追記) psffsi->sfi_position += usRemaining; (追記ここまで)
    1291(追記) usBytesRead += usRemaining; (追記ここまで)
    1292(追記) } (追記ここまで)
    1293(追記) (追記ここまで)
    1294(追記) *pLen = usBytesRead; (追記ここまで)
    1295(追記) rc = NO_ERROR; (追記ここまで)
    1296(追記) } (追記ここまで)
    1297(追記) else (追記ここまで)
    1298(追記) { (追記ここまで)
    1299(追記) char far *pBufPosition = pData; (追記ここまで)
    1300(追記) (追記ここまで)
    1301(追記) rc = MY_PROBEBUF(PB_OPWRITE, pData, usBytesToRead); (追記ここまで)
    1302(追記) if (rc) (追記ここまで)
    1303(追記) { (追記ここまで)
    1304(追記) Message("Protection VIOLATION in FS_READ! (SYS%d)", rc); (追記ここまで)
    1305(追記) goto FS_READEXIT; (追記ここまで)
    1306(追記) } (追記ここまで)
    1307(追記) (追記ここまで)
    1308(追記) pOpenInfo->pSHInfo->fMustCommit = TRUE; (追記ここまで)
    1309(追記) if (pOpenInfo->ulCurCluster == FAT_EOF) (追記ここまで)
    1310(追記) pOpenInfo->ulCurCluster = PositionToOffset(pVolInfo, pOpenInfo, psffsi->sfi_position); (追記ここまで)
    1311(追記) (追記ここまで)
    1312(追記) /* (追記ここまで)
    1313(追記) First, handle the first part that does not align on a cluster border (追記ここまで)
    1314(追記) */ (追記ここまで)
    1315(追記) usBytesPerCluster = pVolInfo->usClusterSize; (追記ここまで)
    1316(追記) usClusterOffset = (USHORT)(psffsi->sfi_position % usBytesPerCluster); /* get remainder */ (追記ここまで)
    1317(追記) if (追記ここまで)
    1318(追記) ( (追記ここまで)
    1319(追記) (pOpenInfo->ulCurCluster != FAT_EOF) && (追記ここまで)
    1320(追記) (psffsi->sfi_position < psffsi->sfi_size) && (追記ここまで)
    1321(追記) (usBytesToRead) && (追記ここまで)
    1322(追記) (usClusterOffset) (追記ここまで)
    1323(追記) ) (追記ここまで)
    1324(追記) { (追記ここまで)
    1325(追記) USHORT usCurrBytesToRead; (追記ここまで)
    1326(追記) USHORT usSectorsToRead; (追記ここまで)
    1327(追記) USHORT usSectorsPerCluster; (追記ここまで)
    1328(追記) (追記ここまで)
    1329(追記) usSectorsPerCluster = pVolInfo->BootSect.bpb.SectorsPerCluster; (追記ここまで)
    1330(追記) usSectorsToRead = usSectorsPerCluster; (追記ここまで)
    1331(追記) (追記ここまで)
    1332(追記) /* compute the number of bytes (追記ここまで)
    1333(追記) to the cluster end or (追記ここまで)
    1334(追記) as much as fits into the user buffer (追記ここまで)
    1335(追記) or how much remains to be read until file end (追記ここまで)
    1336(追記) whatever is the smallest (追記ここまで)
    1337(追記) */ (追記ここまで)
    1338(追記) usCurrBytesToRead = (usBytesPerCluster - usClusterOffset); (追記ここまで)
    1339(追記) usCurrBytesToRead = min(usCurrBytesToRead,usBytesToRead); (追記ここまで)
    1340(追記) usCurrBytesToRead = (USHORT)min((ULONG)usCurrBytesToRead,psffsi->sfi_size-psffsi->sfi_position); (追記ここまで)
    1341(追記) if (usCurrBytesToRead) (追記ここまで)
    1342(追記) { (追記ここまで)
    1343(追記) ulClusterSector = pVolInfo->ulStartOfData + (pOpenInfo->ulCurCluster-2)*usSectorsPerCluster; (追記ここまで)
    1344(追記) (追記ここまで)
    1345(追記) rc = ReadSector(pVolInfo, ulClusterSector,usSectorsToRead,pbCluster, usIOFlag); (追記ここまで)
    1346(追記) if (rc) (追記ここまで)
    1347(追記) { (追記ここまで)
    1348(追記) goto FS_READEXIT; (追記ここまで)
    1349(追記) } (追記ここまで)
    1350(追記) memcpy(pBufPosition, pbCluster + usClusterOffset, usCurrBytesToRead); (追記ここまで)
    1351(追記) (追記ここまで)
    1352(追記) pBufPosition += usCurrBytesToRead; (追記ここまで)
    1353(追記) psffsi->sfi_position += usCurrBytesToRead; (追記ここまで)
    1354(追記) usBytesRead += usCurrBytesToRead; (追記ここまで)
    1355(追記) usBytesToRead -= usCurrBytesToRead; (追記ここまで)
    1356(追記) } (追記ここまで)
    1357(追記) (追記ここまで)
    1358(追記) if ((usClusterOffset + usCurrBytesToRead) >= usBytesPerCluster) (追記ここまで)
    1359(追記) { (追記ここまで)
    1360(追記) pOpenInfo->ulCurCluster = GetNextCluster(pVolInfo, pOpenInfo->ulCurCluster); (追記ここまで)
    1361(追記) if (!pOpenInfo->ulCurCluster) (追記ここまで)
    1362(追記) { (追記ここまで)
    1363(追記) pOpenInfo->ulCurCluster = FAT_EOF; (追記ここまで)
    1364(追記) } (追記ここまで)
    1365(追記) } (追記ここまで)
    1366(追記) } (追記ここまで)
    1367(追記) (追記ここまで)
    1368(追記) (追記ここまで)
    1369(追記) /* (追記ここまで)
    1370(追記) Second, handle the part that aligns on a cluster border and is a multiple of the cluster size (追記ここまで)
    1371(追記) */ (追記ここまで)
    1372(追記) if (追記ここまで)
    1373(追記) ( (追記ここまで)
    1374(追記) (pOpenInfo->ulCurCluster != FAT_EOF) && (追記ここまで)
    1375(追記) (psffsi->sfi_position < psffsi->sfi_size) && (追記ここまで)
    1376(追記) (usBytesToRead) (追記ここまで)
    1377(追記) ) (追記ここまで)
    1378(追記) { (追記ここまで)
    1379(追記) ULONG ulCurrCluster = pOpenInfo->ulCurCluster; (追記ここまで)
    1380(追記) ULONG ulNextCluster = ulCurrCluster; (追記ここまで)
    1381(追記) USHORT usCurrBytesToRead = 0; (追記ここまで)
    1382(追記) USHORT usSectorsPerCluster = pVolInfo->BootSect.bpb.SectorsPerCluster; (追記ここまで)
    1383(追記) USHORT usClustersToProcess = 0; (追記ここまで)
    1384(追記) USHORT usAdjacentClusters = 1; (追記ここまで)
    1385(追記) (追記ここまで)
    1386(追記) usCurrBytesToRead = (USHORT)min((ULONG)usBytesToRead,psffsi->sfi_size - psffsi->sfi_position); (追記ここまで)
    1387(追記) (追記ここまで)
    1388(追記) usClustersToProcess = usCurrBytesToRead / usBytesPerCluster; /* get the number of full clusters */ (追記ここまで)
    1389(追記) (追記ここまで)
    1390(追記) while (usClustersToProcess && (ulCurrCluster != FAT_EOF)) (追記ここまで)
    1391(追記) { (追記ここまで)
    1392(追記) ulNextCluster = GetNextCluster(pVolInfo, ulCurrCluster); (追記ここまで)
    1393(追記) if (!ulNextCluster) (追記ここまで)
    1394(追記) { (追記ここまで)
    1395(追記) ulNextCluster = FAT_EOF; (追記ここまで)
    1396(追記) } (追記ここまで)
    1397(追記) (追記ここまで)
    1398(追記) usClustersToProcess -= 1; (追記ここまで)
    1399(追記) (追記ここまで)
    1400(追記) if ( (追記ここまで)
    1401(追記) (ulNextCluster != FAT_EOF) && (追記ここまで)
    1402(追記) (ulNextCluster == (ulCurrCluster+1)) && (追記ここまで)
    1403(追記) (usClustersToProcess) (追記ここまで)
    1404(追記) ) (追記ここまで)
    1405(追記) { (追記ここまで)
    1406(追記) usAdjacentClusters += 1; (追記ここまで)
    1407(追記) } (追記ここまで)
    1408(追記) else (追記ここまで)
    1409(追記) { (追記ここまで)
    1410(追記) USHORT usCurrBytesToRead = usAdjacentClusters * usBytesPerCluster; (追記ここまで)
    1411(追記) USHORT usSectorsToRead = usAdjacentClusters * usSectorsPerCluster; (追記ここまで)
    1412(追記) (追記ここまで)
    1413(追記) ulClusterSector = pVolInfo->ulStartOfData + (pOpenInfo->ulCurCluster-2)*usSectorsPerCluster; (追記ここまで)
    1414(追記) rc = ReadSector(pVolInfo, ulClusterSector,usSectorsToRead,pBufPosition, usIOFlag); (追記ここまで)
    1415(追記) if (rc) (追記ここまで)
    1416(追記) { (追記ここまで)
    1417(追記) goto FS_READEXIT; (追記ここまで)
    1418(追記) } (追記ここまで)
    1419(追記) pBufPosition += usCurrBytesToRead; (追記ここまで)
    1420(追記) psffsi->sfi_position += usCurrBytesToRead; (追記ここまで)
    1421(追記) usBytesRead += usCurrBytesToRead; (追記ここまで)
    1422(追記) usBytesToRead -= usCurrBytesToRead; (追記ここまで)
    1423(追記) usAdjacentClusters = 1; (追記ここまで)
    1424(追記) pOpenInfo->ulCurCluster = ulNextCluster; (追記ここまで)
    1425(追記) } (追記ここまで)
    1426(追記) ulCurrCluster = ulNextCluster; (追記ここまで)
    1427(追記) } (追記ここまで)
    1428(追記) } (追記ここまで)
    1429(追記) (追記ここまで)
    1430(追記) /* (追記ここまで)
    1431(追記) Third, handle the part that aligns on a cluster border but does not make up a complete cluster (追記ここまで)
    1432(追記) */ (追記ここまで)
    1433(追記) if (追記ここまで)
    1434(追記) ( (追記ここまで)
    1435(追記) (pOpenInfo->ulCurCluster != FAT_EOF) && (追記ここまで)
    1436(追記) (psffsi->sfi_position < psffsi->sfi_size) && (追記ここまで)
    1437(追記) (usBytesToRead) (追記ここまで)
    1438(追記) ) (追記ここまで)
    1439(追記) { (追記ここまで)
    1440(追記) USHORT usCurrBytesToRead; (追記ここまで)
    1441(追記) USHORT usSectorsToRead; (追記ここまで)
    1442(追記) USHORT usSectorsPerCluster; (追記ここまで)
    1443(追記) (追記ここまで)
    1444(追記) usSectorsToRead = pVolInfo->BootSect.bpb.SectorsPerCluster; (追記ここまで)
    1445(追記) usSectorsPerCluster = usSectorsToRead; (追記ここまで)
    1446(追記) (追記ここまで)
    1447(追記) usCurrBytesToRead = (USHORT)min((ULONG)usBytesToRead,psffsi->sfi_size - psffsi->sfi_position); (追記ここまで)
    1448(追記) if (usCurrBytesToRead) (追記ここまで)
    1449(追記) { (追記ここまで)
    1450(追記) ulClusterSector = pVolInfo->ulStartOfData + (pOpenInfo->ulCurCluster-2)*usSectorsPerCluster; (追記ここまで)
    1451(追記) rc = ReadSector(pVolInfo, ulClusterSector,usSectorsToRead,pbCluster, usIOFlag); (追記ここまで)
    1452(追記) if (rc) (追記ここまで)
    1453(追記) { (追記ここまで)
    1454(追記) goto FS_READEXIT; (追記ここまで)
    1455(追記) } (追記ここまで)
    1456(追記) memcpy(pBufPosition,pbCluster,usCurrBytesToRead); (追記ここまで)
    1457(追記) (追記ここまで)
    1458(追記) psffsi->sfi_position += usCurrBytesToRead; (追記ここまで)
    1459(追記) usBytesRead += usCurrBytesToRead; (追記ここまで)
    1460(追記) usBytesToRead -= usCurrBytesToRead; (追記ここまで)
    1461(追記) } (追記ここまで)
    1462(追記) } (追記ここまで)
    1463(追記) (追記ここまで)
    1464(追記) *pLen = usBytesRead; (追記ここまで)
    1465(追記) psffsi->sfi_tstamp |= ST_SREAD | ST_PREAD; (追記ここまで)
    1466(追記) rc = NO_ERROR; (追記ここまで)
    1467(追記) } (追記ここまで)
    1468(追記) (追記ここまで)
    1469(追記) FS_READEXIT: (追記ここまで)
    1470(追記) (追記ここまで)
    1471(追記) if( pbCluster ) (追記ここまで)
    1472(追記) free( pbCluster ); (追記ここまで)
    1473(追記) (追記ここまで)
    1474(追記) if (f32Parms.fMessageActive & LOG_FS) (追記ここまで)
    1475(追記) Message("FS_READ returned %u (%u bytes read)", rc, *pLen); (追記ここまで)
    1476(追記) return rc; (追記ここまで)
    1477(追記) } (追記ここまで)
    1478(追記) (追記ここまで)
    1479(追記) /****************************************************************** (追記ここまで)
    1480(追記) * (追記ここまで)
    1481(追記) ******************************************************************/ (追記ここまで)
    1482(追記) int far pascal FS_WRITE( (追記ここまで)
    1483(追記) struct sffsi far * psffsi, /* psffsi */ (追記ここまで)
    1484(追記) struct sffsd far * psffsd, /* psffsd */ (追記ここまで)
    1485(追記) char far * pData, /* pData */ (追記ここまで)
    1486(追記) unsigned short far * pLen, /* pLen */ (追記ここまで)
    1487(追記) unsigned short usIOFlag /* IOflag */ (追記ここまで)
    1488(追記) ) (追記ここまで)
    1489(追記) { (追記ここまで)
    1490(追記) USHORT rc; (追記ここまで)
    1491(追記) PVOLINFO pVolInfo; (追記ここまで)
    1492(追記) POPENINFO pOpenInfo = GetOpenInfo(psffsd); (追記ここまで)
    1493(追記) USHORT usBytesWritten; (追記ここまで)
    1494(追記) USHORT usBytesToWrite; (追記ここまで)
    1495(追記) PBYTE pbCluster; (追記ここまで)
    1496(追記) ULONG ulClusterSector; (追記ここまで)
    1497(追記) USHORT usClusterOffset; (追記ここまで)
    1498(追記) USHORT usBytesPerCluster; (追記ここまで)
    1499(追記) (追記ここまで)
    1500(追記) usBytesToWrite = *pLen; (追記ここまで)
    1501(追記) usBytesWritten = 0; (追記ここまで)
    1502(追記) *pLen = 0; (追記ここまで)
    1503(追記) pbCluster = NULL; (追記ここまで)
    1504(追記) (追記ここまで)
    1505(追記) if (f32Parms.fMessageActive & LOG_FS) (追記ここまで)
    1506(追記) Message("FS_WRITE, %u bytes at offset %ld, ioflag %X, size = %lu", (追記ここまで)
    1507(追記) usBytesToWrite, psffsi->sfi_position, usIOFlag, psffsi->sfi_size); (追記ここまで)
    1508(追記) (追記ここまで)
    1509(追記) pVolInfo = GetVolInfo(psffsi->sfi_hVPB); (追記ここまで)
    1510(追記) if (IsDriveLocked(pVolInfo)) (追記ここまで)
    1511(追記) { (追記ここまで)
    1512(追記) rc = ERROR_DRIVE_LOCKED; (追記ここまで)
    1513(追記) goto FS_WRITEEXIT; (追記ここまで)
    1514(追記) } (追記ここまで)
    1515(追記) (追記ここまで)
    1516(追記) if (pVolInfo->fWriteProtected) (追記ここまで)
    1517(追記) { (追記ここまで)
    1518(追記) rc = ERROR_WRITE_PROTECT; (追記ここまで)
    1519(追記) goto FS_WRITEEXIT; (追記ここまで)
    1520(追記) } (追記ここまで)
    1521(追記) (追記ここまで)
    1522(追記) if (!((psffsi->sfi_mode & 0xFUL) == OPEN_ACCESS_WRITEONLY) && (追記ここまで)
    1523(追記) !((psffsi->sfi_mode & 0xFUL) == OPEN_ACCESS_READWRITE)) (追記ここまで)
    1524(追記) { (追記ここまで)
    1525(追記) rc = ERROR_ACCESS_DENIED; (追記ここまで)
    1526(追記) goto FS_WRITEEXIT; (追記ここまで)
    1527(追記) } (追記ここまで)
    1528(追記) (追記ここまで)
    1529(追記) if (!usBytesToWrite) (追記ここまで)
    1530(追記) { (追記ここまで)
    1531(追記) rc = NO_ERROR; (追記ここまで)
    1532(追記) goto FS_WRITEEXIT; (追記ここまで)
    1533(追記) } (追記ここまで)
    1534(追記) (追記ここまで)
    1535(追記) (追記ここまで)
    1536(追記) pbCluster = malloc(pVolInfo->usClusterSize); (追記ここまで)
    1537(追記) if (!pbCluster) (追記ここまで)
    1538(追記) { (追記ここまで)
    1539(追記) rc = ERROR_NOT_ENOUGH_MEMORY; (追記ここまで)
    1540(追記) goto FS_WRITEEXIT; (追記ここまで)
    1541(追記) } (追記ここまで)
    1542(追記) (追記ここまで)
    1543(追記) if (psffsi->sfi_mode & OPEN_FLAGS_DASD) (追記ここまで)
    1544(追記) { (追記ここまで)
    1545(追記) ULONG ulSector; (追記ここまで)
    1546(追記) USHORT usSectorOffset; (追記ここまで)
    1547(追記) USHORT usRemaining; (追記ここまで)
    1548(追記) USHORT usBytesPerSector; (追記ここまで)
    1549(追記) USHORT usNumSectors; (追記ここまで)
    1550(追記) (追記ここまで)
    1551(追記) char far *pBufPosition = pData; (追記ここまで)
    1552(追記) (追記ここまで)
    1553(追記) usBytesPerSector = pVolInfo->BootSect.bpb.BytesPerSector; (追記ここまで)
    1554(追記) usBytesWritten = 0; (追記ここまで)
    1555(追記) (追記ここまで)
    1556(追記) if (pOpenInfo->fSectorMode) (追記ここまで)
    1557(追記) { (追記ここまで)
    1558(追記) USHORT usTotNumBytes; (追記ここまで)
    1559(追記) (追記ここまで)
    1560(追記) if (usBytesToWrite > (USHRT_MAX/usBytesPerSector)) (追記ここまで)
    1561(追記) { (追記ここまで)
    1562(追記) rc = ERROR_TRANSFER_TOO_LONG; (追記ここまで)
    1563(追記) goto FS_WRITEEXIT; (追記ここまで)
    1564(追記) } (追記ここまで)
    1565(追記) (追記ここまで)
    1566(追記) usTotNumBytes = usBytesToWrite * usBytesPerSector; (追記ここまで)
    1567(追記) (追記ここまで)
    1568(追記) rc = MY_PROBEBUF(PB_OPWRITE, pBufPosition, usTotNumBytes); (追記ここまで)
    1569(追記) if (rc) (追記ここまで)
    1570(追記) { (追記ここまで)
    1571(追記) Message("Protection VIOLATION in FS_READ! (SYS%d)", rc); (追記ここまで)
    1572(追記) goto FS_WRITEEXIT; (追記ここまで)
    1573(追記) } (追記ここまで)
    1574(追記) (追記ここまで)
    1575(追記) /* (追記ここまで)
    1576(追記) for sector mode, offsets are actually sectors (追記ここまで)
    1577(追記) and Number of Bytes to write are actually (追記ここまで)
    1578(追記) Number of sectors to write (追記ここまで)
    1579(追記) */ (追記ここまで)
    1580(追記) ulSector = psffsi->sfi_position; (追記ここまで)
    1581(追記) usSectorOffset = 0; (追記ここまで)
    1582(追記) usRemaining = 0; (追記ここまで)
    1583(追記) usNumSectors = usBytesToWrite; (追記ここまで)
    1584(追記) if (ulSector > (pVolInfo->BootSect.bpb.BigTotalSectors - (ULONG)usNumSectors)) (追記ここまで)
    1585(追記) { (追記ここまで)
    1586(追記) usNumSectors = (USHORT)(pVolInfo->BootSect.bpb.BigTotalSectors - ulSector); (追記ここまで)
    1587(追記) } (追記ここまで)
    1588(追記) usBytesToWrite = usNumSectors; (追記ここまで)
    1589(追記) } (追記ここまで)
    1590(追記) else (追記ここまで)
    1591(追記) { (追記ここまで)
    1592(追記) rc = MY_PROBEBUF(PB_OPWRITE, pData, usBytesToWrite); (追記ここまで)
    1593(追記) if (rc) (追記ここまで)
    1594(追記) { (追記ここまで)
    1595(追記) Message("Protection VIOLATION in FS_READ! (SYS%d)", rc); (追記ここまで)
    1596(追記) goto FS_WRITEEXIT; (追記ここまで)
    1597(追記) } (追記ここまで)
    1598(追記) (追記ここまで)
    1599(追記) ulSector = (ULONG)(psffsi->sfi_position / (ULONG)usBytesPerSector); (追記ここまで)
    1600(追記) usSectorOffset = (USHORT)(psffsi->sfi_position % (ULONG)usBytesPerSector); (追記ここまで)
    1601(追記) usRemaining = (usSectorOffset + usBytesToWrite) % usBytesPerSector; (追記ここまで)
    1602(追記) usNumSectors = (usBytesToWrite - usRemaining)/usBytesPerSector; (追記ここまで)
    1603(追記) (追記ここまで)
    1604(追記) if (ulSector > (pVolInfo->BootSect.bpb.BigTotalSectors - (ULONG)usNumSectors - (ULONG)(usRemaining ? 1 : 0))) (追記ここまで)
    1605(追記) { (追記ここまで)
    1606(追記) usNumSectors = (USHORT)(pVolInfo->BootSect.bpb.BigTotalSectors - ulSector); (追記ここまで)
    1607(追記) usRemaining = 0; (追記ここまで)
    1608(追記) } (追記ここまで)
    1609(追記) usBytesToWrite = usNumSectors*usBytesPerSector; (追記ここまで)
    1610(追記) } (追記ここまで)
    1611(追記) (追記ここまで)
    1612(追記) if (ulSector >= pVolInfo->BootSect.bpb.BigTotalSectors) (追記ここまで)
    1613(追記) { (追記ここまで)
    1614(追記) rc = ERROR_SECTOR_NOT_FOUND; (追記ここまで)
    1615(追記) goto FS_WRITEEXIT; (追記ここまで)
    1616(追記) } (追記ここまで)
    1617(追記) (追記ここまで)
    1618(追記) if (ulSector > (pVolInfo->BootSect.bpb.BigTotalSectors - (ULONG)usNumSectors - (ULONG)(usRemaining ? 1 : 0))) (追記ここまで)
    1619(追記) { (追記ここまで)
    1620(追記) rc = ERROR_SECTOR_NOT_FOUND; (追記ここまで)
    1621(追記) goto FS_WRITEEXIT; (追記ここまで)
    1622(追記) } (追記ここまで)
    1623(追記) (追記ここまで)
    1624(追記) if (usSectorOffset) (追記ここまで)
    1625(追記) { (追記ここまで)
    1626(追記) rc = ReadSector(pVolInfo, ulSector, 1, pbCluster, usIOFlag); (追記ここまで)
    1627(追記) if (rc) (追記ここまで)
    1628(追記) { (追記ここまで)
    1629(追記) goto FS_WRITEEXIT; (追記ここまで)
    1630(追記) } (追記ここまで)
    1631(追記) memcpy(pbCluster + usSectorOffset, pBufPosition, usBytesPerSector-usSectorOffset); (追記ここまで)
    1632(追記) rc = WriteSector(pVolInfo, ulSector, 1, pbCluster, usIOFlag); (追記ここまで)
    1633(追記) if (rc) (追記ここまで)
    1634(追記) { (追記ここまで)
    1635(追記) goto FS_WRITEEXIT; (追記ここまで)
    1636(追記) } (追記ここまで)
    1637(追記) (追記ここまで)
    1638(追記) pBufPosition += (usBytesPerSector - usSectorOffset); (追記ここまで)
    1639(追記) psffsi->sfi_position += (usBytesPerSector - usSectorOffset); (追記ここまで)
    1640(追記) usBytesWritten += (usBytesPerSector - usSectorOffset); (追記ここまで)
    1641(追記) } (追記ここまで)
    1642(追記) (追記ここまで)
    1643(追記) if (usNumSectors) (追記ここまで)
    1644(追記) { (追記ここまで)
    1645(追記) rc = WriteSector(pVolInfo, ulSector, usNumSectors, pBufPosition, usIOFlag); (追記ここまで)
    1646(追記) if (rc) (追記ここまで)
    1647(追記) { (追記ここまで)
    1648(追記) goto FS_WRITEEXIT; (追記ここまで)
    1649(追記) } (追記ここまで)
    1650(追記) pBufPosition += (ULONG)((ULONG)usNumSectors*(ULONG)usBytesPerSector); (追記ここまで)
    1651(追記) psffsi->sfi_position += usBytesToWrite; (追記ここまで)
    1652(追記) usBytesWritten += usBytesToWrite; (追記ここまで)
    1653(追記) } (追記ここまで)
    1654(追記) (追記ここまで)
    1655(追記) if (usRemaining) (追記ここまで)
    1656(追記) { (追記ここまで)
    1657(追記) rc = ReadSector(pVolInfo, ulSector, 1, pbCluster, usIOFlag); (追記ここまで)
    1658(追記) if (rc) (追記ここまで)
    1659(追記) { (追記ここまで)
    1660(追記) goto FS_WRITEEXIT; (追記ここまで)
    1661(追記) } (追記ここまで)
    1662(追記) memcpy(pbCluster, pBufPosition, usRemaining); (追記ここまで)
    1663(追記) rc = WriteSector(pVolInfo, ulSector, 1, pbCluster, usIOFlag); (追記ここまで)
    1664(追記) if (rc) (追記ここまで)
    1665(追記) { (追記ここまで)
    1666(追記) goto FS_WRITEEXIT; (追記ここまで)
    1667(追記) } (追記ここまで)
    1668(追記) (追記ここまで)
    1669(追記) pBufPosition += usRemaining; (追記ここまで)
    1670(追記) psffsi->sfi_position += usRemaining; (追記ここまで)
    1671(追記) usBytesWritten += usRemaining; (追記ここまで)
    1672(追記) } (追記ここまで)
    1673(追記) (追記ここまで)
    1674(追記) *pLen = usBytesWritten; (追記ここまで)
    1675(追記) rc = NO_ERROR; (追記ここまで)
    1676(追記) } (追記ここまで)
    1677(追記) else (追記ここまで)
    1678(追記) { (追記ここまで)
    1679(追記) char far *pBufPosition = pData; (追記ここまで)
    1680(追記) (追記ここまで)
    1681(追記) /* (追記ここまで)
    1682(追記) No writes if file is larger than 7FFFFFFF (= 2Gb) (追記ここまで)
    1683(追記) */ (追記ここまで)
    1684(追記) if (psffsi->sfi_position >= LONG_MAX) (追記ここまで)
    1685(追記) { (追記ここまで)
    1686(追記) rc = NO_ERROR; (追記ここまで)
    1687(追記) goto FS_WRITEEXIT; (追記ここまで)
    1688(追記) } (追記ここまで)
    1689(追記) (追記ここまで)
    1690(追記) rc = MY_PROBEBUF(PB_OPREAD, pData, usBytesToWrite); (追記ここまで)
    1691(追記) if (rc) (追記ここまで)
    1692(追記) { (追記ここまで)
    1693(追記) Message("Protection VIOLATION in FS_WRITE! (SYS%d)", rc); (追記ここまで)
    1694(追記) goto FS_WRITEEXIT; (追記ここまで)
    1695(追記) } (追記ここまで)
    1696(追記) (追記ここまで)
    1697(追記) pOpenInfo->pSHInfo->fMustCommit = TRUE; (追記ここまで)
    1698(追記) (追記ここまで)
    1699(追記) (追記ここまで)
    1700(追記) if ((ULONG)LONG_MAX - psffsi->sfi_position < (ULONG)usBytesToWrite) (追記ここまで)
    1701(追記) usBytesToWrite = (USHORT)((ULONG)LONG_MAX - psffsi->sfi_position); (追記ここまで)
    1702(追記) (追記ここまで)
    1703(追記) if (psffsi->sfi_position + usBytesToWrite > psffsi->sfi_size) (追記ここまで)
    1704(追記) { (追記ここまで)
    1705(追記) ULONG ulLast = FAT_EOF; (追記ここまで)
    1706(追記) (追記ここまで)
    1707(追記) if ( (追記ここまで)
    1708(追記) pOpenInfo->ulCurCluster == FAT_EOF && (追記ここまで)
    1709(追記) psffsi->sfi_position == psffsi->sfi_size && (追記ここまで)
    1710(追記) !(psffsi->sfi_size % pVolInfo->usClusterSize) (追記ここまで)
    1711(追記) ) (追記ここまで)
    1712(追記) ulLast = pOpenInfo->pSHInfo->ulLastCluster; (追記ここまで)
    1713(追記) (追記ここまで)
    1714(追記) rc = NewSize(pVolInfo, psffsi, psffsd, (追記ここまで)
    1715(追記) psffsi->sfi_position + usBytesToWrite, usIOFlag); (追記ここまで)
    1716(追記) if (rc) (追記ここまで)
    1717(追記) goto FS_WRITEEXIT; (追記ここまで)
    1718(追記) (追記ここまで)
    1719(追記) if (ulLast != FAT_EOF) (追記ここまで)
    1720(追記) { (追記ここまで)
    1721(追記) pOpenInfo->ulCurCluster = GetNextCluster(pVolInfo, ulLast); (追記ここまで)
    1722(追記) if (!pOpenInfo->ulCurCluster) (追記ここまで)
    1723(追記) pOpenInfo->ulCurCluster = FAT_EOF; (追記ここまで)
    1724(追記) (追記ここまで)
    1725(追記) if (pOpenInfo->ulCurCluster == FAT_EOF) (追記ここまで)
    1726(追記) { (追記ここまで)
    1727(追記) Message("FS_WRITE (INIT) No next cluster available!"); (追記ここまで)
    1728(追記) CritMessage("FAT32: FS_WRITE (INIT) No next cluster available!"); (追記ここまで)
    1729(追記) } (追記ここまで)
    1730(追記) } (追記ここまで)
    1731(追記) } (追記ここまで)
    1732(追記) (追記ここまで)
    1733(追記) if (pOpenInfo->ulCurCluster == FAT_EOF) (追記ここまで)
    1734(追記) pOpenInfo->ulCurCluster = PositionToOffset(pVolInfo, pOpenInfo, psffsi->sfi_position); (追記ここまで)
    1735(追記) (追記ここまで)
    1736(追記) if (pOpenInfo->ulCurCluster == FAT_EOF) (追記ここまで)
    1737(追記) { (追記ここまで)
    1738(追記) Message("FS_WRITE (INIT2) No next cluster available!"); (追記ここまで)
    1739(追記) CritMessage("FAT32: FS_WRITE (INIT2) No next cluster available!"); (追記ここまで)
    1740(追記) rc = ERROR_INVALID_HANDLE; (追記ここまで)
    1741(追記) goto FS_WRITEEXIT; (追記ここまで)
    1742(追記) } (追記ここまで)
    1743(追記) (追記ここまで)
    1744(追記) /* (追記ここまで)
    1745(追記) First, handle the first part that does not align on a cluster border (追記ここまで)
    1746(追記) */ (追記ここまで)
    1747(追記) usBytesPerCluster = pVolInfo->usClusterSize; (追記ここまで)
    1748(追記) usClusterOffset = (USHORT)(psffsi->sfi_position % usBytesPerCluster); (追記ここまで)
    1749(追記) if (追記ここまで)
    1750(追記) ( (追記ここまで)
    1751(追記) (pOpenInfo->ulCurCluster != FAT_EOF) && (追記ここまで)
    1752(追記) (psffsi->sfi_position < psffsi->sfi_size) && (追記ここまで)
    1753(追記) (usBytesToWrite) && (追記ここまで)
    1754(追記) (usClusterOffset) (追記ここまで)
    1755(追記) ) (追記ここまで)
    1756(追記) { (追記ここまで)
    1757(追記) USHORT usCurrBytesToWrite; (追記ここまで)
    1758(追記) USHORT usSectorsToWrite; (追記ここまで)
    1759(追記) USHORT usSectorsPerCluster; (追記ここまで)
    1760(追記) (追記ここまで)
    1761(追記) usSectorsPerCluster = pVolInfo->BootSect.bpb.SectorsPerCluster; (追記ここまで)
    1762(追記) usSectorsToWrite = usSectorsPerCluster; (追記ここまで)
    1763(追記) (追記ここまで)
    1764(追記) /* compute the number of bytes (追記ここまで)
    1765(追記) to the cluster end or (追記ここまで)
    1766(追記) as much as fits into the user buffer (追記ここまで)
    1767(追記) or how much remains to be read until file end (追記ここまで)
    1768(追記) whatever is the smallest (追記ここまで)
    1769(追記) */ (追記ここまで)
    1770(追記) usCurrBytesToWrite = (usBytesPerCluster - usClusterOffset); (追記ここまで)
    1771(追記) usCurrBytesToWrite = min(usCurrBytesToWrite,usBytesToWrite); (追記ここまで)
    1772(追記) usCurrBytesToWrite = (USHORT)min((ULONG)usCurrBytesToWrite,psffsi->sfi_size-psffsi->sfi_position); (追記ここまで)
    1773(追記) if (usCurrBytesToWrite) (追記ここまで)
    1774(追記) { (追記ここまで)
    1775(追記) ulClusterSector = pVolInfo->ulStartOfData + (pOpenInfo->ulCurCluster-2)*usSectorsPerCluster; (追記ここまで)
    1776(追記) (追記ここまで)
    1777(追記) rc = ReadSector(pVolInfo, ulClusterSector,usSectorsToWrite,pbCluster, usIOFlag); (追記ここまで)
    1778(追記) if (rc) (追記ここまで)
    1779(追記) { (追記ここまで)
    1780(追記) goto FS_WRITEEXIT; (追記ここまで)
    1781(追記) } (追記ここまで)
    1782(追記) memcpy(pbCluster + usClusterOffset, pBufPosition, usCurrBytesToWrite); (追記ここまで)
    1783(追記) (追記ここまで)
    1784(追記) rc = WriteSector(pVolInfo, ulClusterSector,usSectorsToWrite,pbCluster, usIOFlag); (追記ここまで)
    1785(追記) if (rc) (追記ここまで)
    1786(追記) { (追記ここまで)
    1787(追記) goto FS_WRITEEXIT; (追記ここまで)
    1788(追記) } (追記ここまで)
    1789(追記) (追記ここまで)
    1790(追記) pBufPosition += usCurrBytesToWrite; (追記ここまで)
    1791(追記) psffsi->sfi_position += usCurrBytesToWrite; (追記ここまで)
    1792(追記) usBytesWritten += usCurrBytesToWrite; (追記ここまで)
    1793(追記) usBytesToWrite -= usCurrBytesToWrite; (追記ここまで)
    1794(追記) } (追記ここまで)
    1795(追記) (追記ここまで)
    1796(追記) (追記ここまで)
    1797(追記) if ((usClusterOffset + usCurrBytesToWrite) >= usBytesPerCluster) (追記ここまで)
    1798(追記) { (追記ここまで)
    1799(追記) pOpenInfo->ulCurCluster = GetNextCluster(pVolInfo, pOpenInfo->ulCurCluster); (追記ここまで)
    1800(追記) if (!pOpenInfo->ulCurCluster) (追記ここまで)
    1801(追記) { (追記ここまで)
    1802(追記) pOpenInfo->ulCurCluster = FAT_EOF; (追記ここまで)
    1803(追記) } (追記ここまで)
    1804(追記) } (追記ここまで)
    1805(追記) } (追記ここまで)
    1806(追記) (追記ここまで)
    1807(追記) /* (追記ここまで)
    1808(追記) Second, handle the part that aligns on a cluster border and is a multiple of the cluster size (追記ここまで)
    1809(追記) */ (追記ここまで)
    1810(追記) if (追記ここまで)
    1811(追記) ( (追記ここまで)
    1812(追記) (pOpenInfo->ulCurCluster != FAT_EOF) && (追記ここまで)
    1813(追記) (psffsi->sfi_position < psffsi->sfi_size) && (追記ここまで)
    1814(追記) (usBytesToWrite) (追記ここまで)
    1815(追記) ) (追記ここまで)
    1816(追記) { (追記ここまで)
    1817(追記) ULONG ulCurrCluster = pOpenInfo->ulCurCluster; (追記ここまで)
    1818(追記) ULONG ulNextCluster = ulCurrCluster; (追記ここまで)
    1819(追記) USHORT usCurrBytesToWrite = 0; (追記ここまで)
    1820(追記) USHORT usSectorsPerCluster = pVolInfo->BootSect.bpb.SectorsPerCluster; (追記ここまで)
    1821(追記) USHORT usClustersToProcess = 0; (追記ここまで)
    1822(追記) USHORT usAdjacentClusters = 1; (追記ここまで)
    1823(追記) (追記ここまで)
    1824(追記) usCurrBytesToWrite = (USHORT)min((ULONG)usBytesToWrite,psffsi->sfi_size - psffsi->sfi_position); (追記ここまで)
    1825(追記) (追記ここまで)
    1826(追記) usClustersToProcess = usCurrBytesToWrite / usBytesPerCluster; /* get the number of full clusters */ (追記ここまで)
    1827(追記) (追記ここまで)
    1828(追記) while (usClustersToProcess && (ulCurrCluster != FAT_EOF)) (追記ここまで)
    1829(追記) { (追記ここまで)
    1830(追記) ulNextCluster = GetNextCluster(pVolInfo, ulCurrCluster); (追記ここまで)
    1831(追記) if (!ulNextCluster) (追記ここまで)
    1832(追記) { (追記ここまで)
    1833(追記) ulNextCluster = FAT_EOF; (追記ここまで)
    1834(追記) } (追記ここまで)
    1835(追記) (追記ここまで)
    1836(追記) usClustersToProcess -= 1; (追記ここまで)
    1837(追記) (追記ここまで)
    1838(追記) if ( (追記ここまで)
    1839(追記) (ulNextCluster != FAT_EOF) && (追記ここまで)
    1840(追記) (ulNextCluster == (ulCurrCluster+1)) && (追記ここまで)
    1841(追記) (usClustersToProcess) && (追記ここまで)
    1842(追記) (usBytesToWrite >= (usAdjacentClusters+1) * usBytesPerCluster ) (追記ここまで)
    1843(追記) ) (追記ここまで)
    1844(追記) { (追記ここまで)
    1845(追記) usAdjacentClusters += 1; (追記ここまで)
    1846(追記) } (追記ここまで)
    1847(追記) else (追記ここまで)
    1848(追記) { (追記ここまで)
    1849(追記) USHORT usCurrBytesToWrite = usAdjacentClusters * usBytesPerCluster; (追記ここまで)
    1850(追記) USHORT usSectorsToWrite = usAdjacentClusters * usSectorsPerCluster; (追記ここまで)
    1851(追記) (追記ここまで)
    1852(追記) ulClusterSector = pVolInfo->ulStartOfData + (pOpenInfo->ulCurCluster-2)*usSectorsPerCluster; (追記ここまで)
    1853(追記) rc = WriteSector(pVolInfo, ulClusterSector,usSectorsToWrite,pBufPosition, usIOFlag); (追記ここまで)
    1854(追記) if (rc) (追記ここまで)
    1855(追記) { (追記ここまで)
    1856(追記) goto FS_WRITEEXIT; (追記ここまで)
    1857(追記) } (追記ここまで)
    1858(追記) (追記ここまで)
    1859(追記) pBufPosition += usCurrBytesToWrite; (追記ここまで)
    1860(追記) psffsi->sfi_position += usCurrBytesToWrite; (追記ここまで)
    1861(追記) usBytesWritten += usCurrBytesToWrite; (追記ここまで)
    1862(追記) usBytesToWrite -= usCurrBytesToWrite; (追記ここまで)
    1863(追記) usAdjacentClusters = 1; (追記ここまで)
    1864(追記) pOpenInfo->ulCurCluster = ulNextCluster; (追記ここまで)
    1865(追記) } (追記ここまで)
    1866(追記) ulCurrCluster = ulNextCluster; (追記ここまで)
    1867(追記) } (追記ここまで)
    1868(追記) } (追記ここまで)
    1869(追記) (追記ここまで)
    1870(追記) (追記ここまで)
    1871(追記) /* (追記ここまで)
    1872(追記) Third, handle the part that aligns on a cluster border but does not make up a complete cluster (追記ここまで)
    1873(追記) */ (追記ここまで)
    1874(追記) if (追記ここまで)
    1875(追記) ( (追記ここまで)
    1876(追記) (pOpenInfo->ulCurCluster != FAT_EOF) && (追記ここまで)
    1877(追記) (psffsi->sfi_position < psffsi->sfi_size) && (追記ここまで)
    1878(追記) (usBytesToWrite) (追記ここまで)
    1879(追記) ) (追記ここまで)
    1880(追記) { (追記ここまで)
    1881(追記) USHORT usCurrBytesToWrite; (追記ここまで)
    1882(追記) USHORT usSectorsToWrite; (追記ここまで)
    1883(追記) USHORT usSectorsPerCluster; (追記ここまで)
    1884(追記) (追記ここまで)
    1885(追記) usSectorsToWrite = pVolInfo->BootSect.bpb.SectorsPerCluster; (追記ここまで)
    1886(追記) usSectorsPerCluster = usSectorsToWrite; (追記ここまで)
    1887(追記) (追記ここまで)
    1888(追記) usCurrBytesToWrite = (USHORT)min((ULONG)usBytesToWrite,psffsi->sfi_size - psffsi->sfi_position); (追記ここまで)
    1889(追記) if (usCurrBytesToWrite) (追記ここまで)
    1890(追記) { (追記ここまで)
    1891(追記) ulClusterSector = pVolInfo->ulStartOfData + (pOpenInfo->ulCurCluster-2)*usSectorsPerCluster; (追記ここまで)
    1892(追記) rc = ReadSector(pVolInfo, ulClusterSector,usSectorsToWrite,pbCluster, usIOFlag); (追記ここまで)
    1893(追記) if (rc) (追記ここまで)
    1894(追記) { (追記ここまで)
    1895(追記) goto FS_WRITEEXIT; (追記ここまで)
    1896(追記) } (追記ここまで)
    1897(追記) memcpy(pbCluster, pBufPosition, usCurrBytesToWrite); (追記ここまで)
    1898(追記) (追記ここまで)
    1899(追記) rc = WriteSector(pVolInfo, ulClusterSector,usSectorsToWrite,pbCluster, usIOFlag); (追記ここまで)
    1900(追記) if (rc) (追記ここまで)
    1901(追記) { (追記ここまで)
    1902(追記) goto FS_WRITEEXIT; (追記ここまで)
    1903(追記) } (追記ここまで)
    1904(追記) (追記ここまで)
    1905(追記) psffsi->sfi_position += usCurrBytesToWrite; (追記ここまで)
    1906(追記) usBytesWritten += usCurrBytesToWrite; (追記ここまで)
    1907(追記) usBytesToWrite -= usCurrBytesToWrite; (追記ここまで)
    1908(追記) } (追記ここまで)
    1909(追記) } (追記ここまで)
    1910(追記) (追記ここまで)
    1911(追記) *pLen = usBytesWritten; (追記ここまで)
    1912(追記) if (usBytesWritten) (追記ここまで)
    1913(追記) { (追記ここまで)
    1914(追記) psffsi->sfi_tstamp |= ST_SWRITE | ST_PWRITE; (追記ここまで)
    1915(追記) pOpenInfo->fCommitAttr = TRUE; (追記ここまで)
    1916(追記) pOpenInfo->pSHInfo->bAttr |= FILE_ARCHIVED; (追記ここまで)
    1917(追記) psffsi->sfi_DOSattr |= FILE_ARCHIVED; (追記ここまで)
    1918(追記) } (追記ここまで)
    1919(追記) (追記ここまで)
    1920(追記) (追記ここまで)
    1921(追記) if (usIOFlag & DVIO_OPWRTHRU) (追記ここまで)
    1922(追記) rc = FS_COMMIT(FS_COMMIT_ONE, usIOFlag, psffsi, psffsd); (追記ここまで)
    1923(追記) else (追記ここまで)
    1924(追記) rc = NO_ERROR; (追記ここまで)
    1925(追記) } (追記ここまで)
    1926(追記) (追記ここまで)
    1927(追記) FS_WRITEEXIT: (追記ここまで)
    1928(追記) if( pbCluster ) (追記ここまで)
    1929(追記) free( pbCluster ); (追記ここまで)
    1930(追記) (追記ここまで)
    1931(追記) if (f32Parms.fMessageActive & LOG_FS) (追記ここまで)
    1932(追記) Message("FS_WRITE returned %u (%u bytes written)", rc, *pLen); (追記ここまで)
    1933(追記) return rc; (追記ここまで)
    1934(追記) } (追記ここまで)
    1935(追記) #endif (追記ここまで)
    11211936
    11221937/******************************************************************
    18812696 return 0;
    18822697}
    1883(削除) (削除ここまで)
Note: See TracChangeset for help on using the changeset viewer.

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