- 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
- branches/fat32-0.9/src/ifsfile.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/fat32-0.9/src/ifsfile.c
r55 r71 619 619 } 620 620 621 621 #if 0 622 622 /****************************************************************** 623 623 * … … 846 846 return rc; 847 847 } 848 (追記) (追記ここまで) 848 849 849 850 /****************************************************************** … … 1119 1120 return rc; 1120 1121 } 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 (追記ここまで) 1121 1936 1122 1937 /****************************************************************** … … 1881 2696 return 0; 1882 2697 } 1883 (削除) (削除ここまで)
Note:
See TracChangeset
for help on using the changeset viewer.