- Timestamp:
- Nov 9, 2016, 10:36:26 PM (9 years ago)
- Author:
- Valery V. Sedletski
- Message:
-
fat32.ifs: Code cleanup and formatting in FS_MOUNT.
- File:
-
- 1 edited
- branches/fat32-0.10/src/ifs/ifsmount.c (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/fat32-0.10/src/ifs/ifsmount.c
r152 r154 48 48 49 49 } RP_GETDRIVERCAPS, FAR *PRP_GETDRIVERCAPS; 50 (削除) (削除ここまで)51 (削除) (削除ここまで)52 (削除) //static BOOL RemoveVolume(PVOLINFO pVolInfo); (削除ここまで)53 (削除) //static USHORT CheckWriteProtect(PVOLINFO); (削除ここまで)54 50 55 51 PRIVATE BOOL RemoveVolume(PVOLINFO pVolInfo); … … 75 71 USHORT usVolCount; 76 72 77 (削除) //PBOOTSECT pSect; (削除ここまで)78 (削除) //PVOLINFO pVolInfo; (削除ここまで)79 (削除) //PVOLINFO pNext, pPrev; (削除ここまで)80 (削除) //USHORT hDupVBP; (削除ここまで)81 (削除) //USHORT rc; (削除ここまで)82 (削除) (削除ここまで)83 73 P_DriverCaps pDevCaps; 84 74 P_VolChars pVolChars; … … 99 89 { 100 90 case MOUNT_MOUNT : 101 (削除) (削除ここまで)102 91 pSect = (PBOOTSECT)pBoot; 103 92 104 (削除) // if (FSH_FINDDUPHVPB(hVBP, &hDupVBP)) (削除ここまで)105 (削除) // hDupVBP = 0; (削除ここまで)106 (削除) (削除ここまで)107 (削除) // pSect = (PBOOTSECT)pBoot; (削除ここまで)108 (削除) // if (memicmp(pSect->FileSystem, "FAT32", 5)) (削除ここまで)109 93 if (!IsFAT32(pSect)) 110 94 { … … 116 100 hDupVBP = 0; 117 101 118 // if (pSect->bpb.BytesPerSector != SECTOR_SIZE) 119 // { 120 // rc = ERROR_VOLUME_NOT_MOUNTED; 121 // goto FS_MOUNT_EXIT; 122 // } 123 124 if (!hDupVBP) /* initial mounting of the volume */ 125 // if(( ULONG )pSect->bpb.BytesPerSector * pSect->bpb.SectorsPerCluster > MAX_CLUSTER_SIZE ) 102 if (!hDupVBP) /* initial mounting of the volume */ 126 103 { 127 104 pVolInfo = gdtAlloc(STORAGE_NEEDED, FALSE); … … 139 116 } 140 117 *((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo; 141 (削除) // rc = ERROR_VOLUME_NOT_MOUNTED; (削除ここまで)142 (削除) // goto FS_MOUNT_EXIT; (削除ここまで)143 (削除) // } (削除ここまで)144 118 145 119 memset(pVolInfo, 0, (size_t)STORAGE_NEEDED); 146 120 pVolInfo->pNextVolInfo = NULL; 147 (削除) (削除ここまで)148 (削除) // pvpfsi->vpi_vid = pSect->ulVolSerial; (削除ここまで)149 (削除) // pvpfsi->vpi_bsize = pSect->bpb.BytesPerSector; (削除ここまで)150 (削除) // pvpfsi->vpi_totsec = pSect->bpb.BigTotalSectors; (削除ここまで)151 (削除) // pvpfsi->vpi_trksec = pSect->bpb.SectorsPerTrack; (削除ここまで)152 (削除) // pvpfsi->vpi_nhead = pSect->bpb.Heads; (削除ここまで)153 (削除) // memset(pvpfsi->vpi_text, 0, sizeof pvpfsi->vpi_text); (削除ここまで)154 (削除) // memcpy(pvpfsi->vpi_text, pSect->VolumeLabel, sizeof pSect->VolumeLabel); (削除ここまで)155 121 156 122 if (!pGlobVolInfo) … … 167 133 pNext->pNextVolInfo = pVolInfo; 168 134 } 169 (削除) (削除ここまで)pvpfsi->vpi_vid = pSect->ulVolSerial;170 (削除) (削除ここまで)pvpfsi->vpi_bsize = pSect->bpb.BytesPerSector;171 (削除) (削除ここまで)pvpfsi->vpi_totsec = pSect->bpb.BigTotalSectors;172 (削除) (削除ここまで)pvpfsi->vpi_trksec = pSect->bpb.SectorsPerTrack;173 (削除) (削除ここまで)pvpfsi->vpi_nhead = pSect->bpb.Heads;174 (削除) (削除ここまで)memset(pvpfsi->vpi_text, 0, sizeof pvpfsi->vpi_text);175 (削除) (削除ここまで)memcpy(pvpfsi->vpi_text, pSect->VolumeLabel, sizeof pSect->VolumeLabel);135 (追記) (追記ここまで)pvpfsi->vpi_vid = pSect->ulVolSerial; 136 (追記) (追記ここまで)pvpfsi->vpi_bsize = pSect->bpb.BytesPerSector; 137 (追記) (追記ここまで)pvpfsi->vpi_totsec = pSect->bpb.BigTotalSectors; 138 (追記) (追記ここまで)pvpfsi->vpi_trksec = pSect->bpb.SectorsPerTrack; 139 (追記) (追記ここまで)pvpfsi->vpi_nhead = pSect->bpb.Heads; 140 (追記) (追記ここまで)memset(pvpfsi->vpi_text, 0, sizeof pvpfsi->vpi_text); 141 (追記) (追記ここまで)memcpy(pvpfsi->vpi_text, pSect->VolumeLabel, sizeof pSect->VolumeLabel); 176 142 } 177 143 else /* remount of volume */ 178 // pVolInfo = gdtAlloc(STORAGE_NEEDED, FALSE); 179 // if (!pVolInfo) 180 { 181 FSH_GETVOLPARM(hDupVBP,&pvpfsi,&pvpfsd); /* Get the volume dependent/independent structure from the original volume block */ 144 { 145 FSH_GETVOLPARM(hDupVBP,&pvpfsi,&pvpfsd); /* Get the volume dependent/independent structure from the original volume block */ 182 146 pVolInfo = *((PVOLINFO *)(pvpfsd->vpd_work)); /* Get the pointer to the FAT32 Volume structure from the original block */ 183 hVBP = hDupVBP; /* indicate that the old duplicate will become the remaining block */ 184 /* since the new VPB will be discarded if there already is an old one according to IFS.INF */ 185 // rc = ERROR_NOT_ENOUGH_MEMORY; 186 // goto FS_MOUNT_EXIT; 187 } 188 // rc = FSH_FORCENOSWAP(SELECTOROF(pVolInfo)); 189 // if (rc) 190 // FatalMessage("FSH_FORCENOSWAP on VOLINFO Segment failed, rc=%u", rc); 191 // 192 // memset(pVolInfo, 0, (size_t)STORAGE_NEEDED); 193 // 194 // InitCache(ulCacheSectors); //// ? 147 hVBP = hDupVBP; /* indicate that the old duplicate will become the remaining block */ 148 /* since the new VPB will be discarded if there already is an old one according to IFS.INF */ 149 } 195 150 196 151 /* continue mount in both cases: … … 198 153 for the n-th remount it's a reinitialization of the old VPB 199 154 */ 200 (削除) //pVolInfo->hVBP = hVBP; (削除ここまで)201 155 memcpy(&pVolInfo->BootSect, pSect, sizeof (BOOTSECT)); 202 156 … … 215 169 pVolInfo->ulTotalClusters = (pSect->bpb.BigTotalSectors - pVolInfo->ulStartOfData) / pSect->bpb.SectorsPerCluster; 216 170 217 pVolInfo->hVBP = hVBP; (削除) // (削除ここまで)218 pVolInfo->hDupVBP = hDupVBP; (削除) // (削除ここまで)171 pVolInfo->hVBP = hVBP;(追記) (追記ここまで) 172 pVolInfo->hDupVBP = hDupVBP;(追記) (追記ここまで) 219 173 220 174 pVolInfo->bDrive = pvpfsi->vpi_drive; … … 245 199 memset(pVolInfo->pBootFSInfo, 0, sizeof (BOOTFSINFO)); 246 200 247 rc = CheckWriteProtect(pVolInfo); 248 if (rc && rc != ERROR_WRITE_PROTECT) 249 { 250 251 // *((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo; 252 // 253 // if (!pGlobVolInfo) 254 // { 255 // pGlobVolInfo = pVolInfo; 256 // usVolCount = 1; 257 // } 258 // else 259 // { 260 // pNext = pGlobVolInfo; 261 // usVolCount = 1; 262 // if (pNext->bDrive == pvpfsi->vpi_drive && !pVolInfo->hDupVBP) 263 // pVolInfo->hDupVBP = pNext->hVBP; 264 // while (pNext->pNextVolInfo) 265 // { 266 // pNext = (PVOLINFO)pNext->pNextVolInfo; 267 // if (pNext->bDrive == pvpfsi->vpi_drive && !pVolInfo->hDupVBP) 268 // pVolInfo->hDupVBP = pNext->hVBP; 269 // usVolCount++; 270 // } 271 // pNext->pNextVolInfo = pVolInfo; 272 // usVolCount++; 273 // } 274 // if (f32Parms.fMessageActive & LOG_FS) 275 // Message("%u Volumes mounted!", usVolCount); 276 // 277 // rc = CheckWriteProtect(pVolInfo); 278 // if (rc && rc != ERROR_WRITE_PROTECT) 279 // { 201 rc = CheckWriteProtect(pVolInfo); 202 if (rc && rc != ERROR_WRITE_PROTECT) 203 { 280 204 Message("Cannot access drive, rc = %u", rc); 281 205 goto FS_MOUNT_EXIT; 282 (削除) (削除ここまで)}206 (追記) (追記ここまで)} 283 207 if (rc == ERROR_WRITE_PROTECT) 284 208 pVolInfo->fWriteProtected = TRUE; … … 290 214 pVolInfo->fDiskCleanOnMount = TRUE; 291 215 292 (削除) (削除ここまで)if (f32Parms.fCalcFree ||216 (追記) (追記ここまで)if (f32Parms.fCalcFree || 293 217 pVolInfo->pBootFSInfo->ulFreeClusters == 0xFFFFFFFF || 294 218 /*!pVolInfo->fDiskClean ||*/ 295 219 pVolInfo->BootSect.bpb.FSinfoSec == 0xFFFF) 296 GetFreeSpace(pVolInfo); 297 298 // if (!pVolInfo->hDupVBP && 299 // (f32Parms.fCalcFree || 300 // pVolInfo->pBootFSInfo->ulFreeClusters == 0xFFFFFFFF || 301 // /*!pVolInfo->fDiskClean ||*/ 302 // pVolInfo->BootSect.bpb.FSinfoSec == 0xFFFF)) 303 // GetFreeSpace(pVolInfo); 304 305 pDevCaps = pvpfsi->vpi_pDCS; 306 pVolChars = pvpfsi->vpi_pVCS; 307 308 if (!pDevCaps) 309 { 310 Message("Strategy2 not found, searching Device Driver chain !"); 311 pDevCaps = ReturnDriverCaps(pvpfsi->vpi_unit); 312 } 313 314 if (f32Parms.fMessageActive & LOG_FS) 315 { 316 if (pDevCaps->Capabilities & GDC_DD_Read2) 317 Message("Read2 supported"); 318 if (pDevCaps->Capabilities & GDC_DD_DMA_Word) 319 Message("DMA on word alligned buffers supported"); 320 if (pDevCaps->Capabilities & GDC_DD_DMA_Byte) 321 Message("DMA on byte alligned buffers supported"); 322 if (pDevCaps->Capabilities & GDC_DD_Mirror) 323 Message("Disk Mirroring supported"); 324 if (pDevCaps->Capabilities & GDC_DD_Duplex) 325 Message("Disk Duplexing supported"); 326 if (pDevCaps->Capabilities & GDC_DD_No_Block) 327 Message("Strategy2 does not block"); 328 if (pDevCaps->Capabilities & GDC_DD_16M) 329 Message(">16M supported"); 330 } 331 332 if (pDevCaps->Strategy2) 333 { 334 if (f32Parms.fMessageActive & LOG_FS) 335 { 336 Message("Strategy2 address at %lX", pDevCaps->Strategy2); 337 Message("ChgPriority address at %lX", pDevCaps->ChgPriority); 338 } 339 340 pVolInfo->pfnStrategy = (STRATFUNC)pDevCaps->Strategy2; 341 pVolInfo->pfnPriority = (STRATFUNC)pDevCaps->ChgPriority; 342 } 343 344 rc = 0; 345 break; 346 347 case MOUNT_ACCEPT : 348 349 if (FSH_FINDDUPHVPB(hVBP, &hDupVBP)) 350 hDupVBP = 0; 351 352 if (pvpfsi->vpi_bsize != SECTOR_SIZE) 353 { 354 rc = ERROR_VOLUME_NOT_MOUNTED; 355 goto FS_MOUNT_EXIT; 356 } 357 358 pVolInfo = gdtAlloc(STORAGE_NEEDED, FALSE); 359 if (!pVolInfo) 360 { 361 rc = ERROR_NOT_ENOUGH_MEMORY; 362 goto FS_MOUNT_EXIT; 363 } 364 rc = FSH_FORCENOSWAP(SELECTOROF(pVolInfo)); 365 if (rc) 366 FatalMessage("FSH_FORCENOSWAP on VOLINFO Segment failed, rc=%u", rc); 367 368 memset(pVolInfo, 0, (size_t)STORAGE_NEEDED); 369 370 //InitCache(ulCacheSectors); 371 372 memset(&pVolInfo->BootSect, 0, sizeof (BOOTSECT)); 373 pVolInfo->BootSect.bpb.BigTotalSectors = pvpfsi->vpi_totsec; 374 pVolInfo->BootSect.bpb.BytesPerSector = pvpfsi->vpi_bsize; 375 pVolInfo->fWriteProtected = FALSE; 376 pVolInfo->fDiskCleanOnMount = FALSE; 377 378 pVolInfo->hVBP = hVBP; 379 pVolInfo->hDupVBP = hDupVBP; //// ? 380 pVolInfo->bDrive = pvpfsi->vpi_drive; 381 pVolInfo->bUnit = pvpfsi->vpi_unit; 382 pVolInfo->pNextVolInfo = NULL; 383 384 // the volume is being formatted 385 pVolInfo->fFormatInProgress = TRUE; 386 387 // fake values assuming sector == cluster 388 pVolInfo->ulClusterSize = pvpfsi->vpi_bsize; 389 pVolInfo->ulTotalClusters = pvpfsi->vpi_totsec; 390 391 pVolInfo->usRASectors = usDefaultRASectors; 392 393 // undefined 394 pVolInfo->ulStartOfData = 0; 395 396 *((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo; // 397 398 if (!pGlobVolInfo) 399 { 400 pGlobVolInfo = pVolInfo; 401 usVolCount = 1; 402 } 403 else 404 { 405 pNext = pGlobVolInfo; 406 usVolCount = 1; 407 if (pNext->bDrive == pvpfsi->vpi_drive && !pVolInfo->hDupVBP) 408 pVolInfo->hDupVBP = pNext->hVBP; 409 while (pNext->pNextVolInfo) 410 { 411 pNext = (PVOLINFO)pNext->pNextVolInfo; 412 if (pNext->bDrive == pvpfsi->vpi_drive && !pVolInfo->hDupVBP) 413 pVolInfo->hDupVBP = pNext->hVBP; 414 usVolCount++; 415 } 416 pNext->pNextVolInfo = pVolInfo; 417 usVolCount++; 418 } 419 if (f32Parms.fMessageActive & LOG_FS) 420 Message("%u Volumes mounted!", usVolCount); 220 GetFreeSpace(pVolInfo); 421 221 422 222 pDevCaps = pvpfsi->vpi_pDCS; … … 462 262 break; 463 263 264 (追記) case MOUNT_ACCEPT : (追記ここまで) 265 (追記) if (FSH_FINDDUPHVPB(hVBP, &hDupVBP)) (追記ここまで) 266 (追記) hDupVBP = 0; (追記ここまで) 267 (追記) (追記ここまで) 268 (追記) if (pvpfsi->vpi_bsize != SECTOR_SIZE) (追記ここまで) 269 (追記) { (追記ここまで) 270 (追記) rc = ERROR_VOLUME_NOT_MOUNTED; (追記ここまで) 271 (追記) goto FS_MOUNT_EXIT; (追記ここまで) 272 (追記) } (追記ここまで) 273 (追記) (追記ここまで) 274 (追記) pVolInfo = gdtAlloc(STORAGE_NEEDED, FALSE); (追記ここまで) 275 (追記) if (!pVolInfo) (追記ここまで) 276 (追記) { (追記ここまで) 277 (追記) rc = ERROR_NOT_ENOUGH_MEMORY; (追記ここまで) 278 (追記) goto FS_MOUNT_EXIT; (追記ここまで) 279 (追記) } (追記ここまで) 280 (追記) rc = FSH_FORCENOSWAP(SELECTOROF(pVolInfo)); (追記ここまで) 281 (追記) if (rc) (追記ここまで) 282 (追記) FatalMessage("FSH_FORCENOSWAP on VOLINFO Segment failed, rc=%u", rc); (追記ここまで) 283 (追記) (追記ここまで) 284 (追記) memset(pVolInfo, 0, (size_t)STORAGE_NEEDED); (追記ここまで) 285 (追記) (追記ここまで) 286 (追記) memset(&pVolInfo->BootSect, 0, sizeof (BOOTSECT)); (追記ここまで) 287 (追記) pVolInfo->BootSect.bpb.BigTotalSectors = pvpfsi->vpi_totsec; (追記ここまで) 288 (追記) pVolInfo->BootSect.bpb.BytesPerSector = pvpfsi->vpi_bsize; (追記ここまで) 289 (追記) pVolInfo->fWriteProtected = FALSE; (追記ここまで) 290 (追記) pVolInfo->fDiskCleanOnMount = FALSE; (追記ここまで) 291 (追記) (追記ここまで) 292 (追記) pVolInfo->hVBP = hVBP; (追記ここまで) 293 (追記) pVolInfo->hDupVBP = hDupVBP; //// ? (追記ここまで) 294 (追記) pVolInfo->bDrive = pvpfsi->vpi_drive; (追記ここまで) 295 (追記) pVolInfo->bUnit = pvpfsi->vpi_unit; (追記ここまで) 296 (追記) pVolInfo->pNextVolInfo = NULL; (追記ここまで) 297 (追記) (追記ここまで) 298 (追記) // the volume is being formatted (追記ここまで) 299 (追記) pVolInfo->fFormatInProgress = TRUE; (追記ここまで) 300 (追記) (追記ここまで) 301 (追記) // fake values assuming sector == cluster (追記ここまで) 302 (追記) pVolInfo->ulClusterSize = pvpfsi->vpi_bsize; (追記ここまで) 303 (追記) pVolInfo->ulTotalClusters = pvpfsi->vpi_totsec; (追記ここまで) 304 (追記) (追記ここまで) 305 (追記) pVolInfo->usRASectors = usDefaultRASectors; (追記ここまで) 306 (追記) (追記ここまで) 307 (追記) // undefined (追記ここまで) 308 (追記) pVolInfo->ulStartOfData = 0; (追記ここまで) 309 (追記) (追記ここまで) 310 (追記) *((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo; (追記ここまで) 311 (追記) (追記ここまで) 312 (追記) if (!pGlobVolInfo) (追記ここまで) 313 (追記) { (追記ここまで) 314 (追記) pGlobVolInfo = pVolInfo; (追記ここまで) 315 (追記) usVolCount = 1; (追記ここまで) 316 (追記) } (追記ここまで) 317 (追記) else (追記ここまで) 318 (追記) { (追記ここまで) 319 (追記) pNext = pGlobVolInfo; (追記ここまで) 320 (追記) usVolCount = 1; (追記ここまで) 321 (追記) if (pNext->bDrive == pvpfsi->vpi_drive && !pVolInfo->hDupVBP) (追記ここまで) 322 (追記) pVolInfo->hDupVBP = pNext->hVBP; (追記ここまで) 323 (追記) while (pNext->pNextVolInfo) (追記ここまで) 324 (追記) { (追記ここまで) 325 (追記) pNext = (PVOLINFO)pNext->pNextVolInfo; (追記ここまで) 326 (追記) if (pNext->bDrive == pvpfsi->vpi_drive && !pVolInfo->hDupVBP) (追記ここまで) 327 (追記) pVolInfo->hDupVBP = pNext->hVBP; (追記ここまで) 328 (追記) usVolCount++; (追記ここまで) 329 (追記) } (追記ここまで) 330 (追記) pNext->pNextVolInfo = pVolInfo; (追記ここまで) 331 (追記) usVolCount++; (追記ここまで) 332 (追記) } (追記ここまで) 333 (追記) if (f32Parms.fMessageActive & LOG_FS) (追記ここまで) 334 (追記) Message("%u Volumes mounted!", usVolCount); (追記ここまで) 335 (追記) (追記ここまで) 336 (追記) pDevCaps = pvpfsi->vpi_pDCS; (追記ここまで) 337 (追記) pVolChars = pvpfsi->vpi_pVCS; (追記ここまで) 338 (追記) (追記ここまで) 339 (追記) if (!pDevCaps) (追記ここまで) 340 (追記) { (追記ここまで) 341 (追記) Message("Strategy2 not found, searching Device Driver chain !"); (追記ここまで) 342 (追記) pDevCaps = ReturnDriverCaps(pvpfsi->vpi_unit); (追記ここまで) 343 (追記) } (追記ここまで) 344 (追記) (追記ここまで) 345 (追記) if (f32Parms.fMessageActive & LOG_FS) (追記ここまで) 346 (追記) { (追記ここまで) 347 (追記) if (pDevCaps->Capabilities & GDC_DD_Read2) (追記ここまで) 348 (追記) Message("Read2 supported"); (追記ここまで) 349 (追記) if (pDevCaps->Capabilities & GDC_DD_DMA_Word) (追記ここまで) 350 (追記) Message("DMA on word alligned buffers supported"); (追記ここまで) 351 (追記) if (pDevCaps->Capabilities & GDC_DD_DMA_Byte) (追記ここまで) 352 (追記) Message("DMA on byte alligned buffers supported"); (追記ここまで) 353 (追記) if (pDevCaps->Capabilities & GDC_DD_Mirror) (追記ここまで) 354 (追記) Message("Disk Mirroring supported"); (追記ここまで) 355 (追記) if (pDevCaps->Capabilities & GDC_DD_Duplex) (追記ここまで) 356 (追記) Message("Disk Duplexing supported"); (追記ここまで) 357 (追記) if (pDevCaps->Capabilities & GDC_DD_No_Block) (追記ここまで) 358 (追記) Message("Strategy2 does not block"); (追記ここまで) 359 (追記) if (pDevCaps->Capabilities & GDC_DD_16M) (追記ここまで) 360 (追記) Message(">16M supported"); (追記ここまで) 361 (追記) } (追記ここまで) 362 (追記) (追記ここまで) 363 (追記) if (pDevCaps->Strategy2) (追記ここまで) 364 (追記) { (追記ここまで) 365 (追記) if (f32Parms.fMessageActive & LOG_FS) (追記ここまで) 366 (追記) { (追記ここまで) 367 (追記) Message("Strategy2 address at %lX", pDevCaps->Strategy2); (追記ここまで) 368 (追記) Message("ChgPriority address at %lX", pDevCaps->ChgPriority); (追記ここまで) 369 (追記) } (追記ここまで) 370 (追記) (追記ここまで) 371 (追記) pVolInfo->pfnStrategy = (STRATFUNC)pDevCaps->Strategy2; (追記ここまで) 372 (追記) pVolInfo->pfnPriority = (STRATFUNC)pDevCaps->ChgPriority; (追記ここまで) 373 (追記) } (追記ここまで) 374 (追記) (追記ここまで) 375 (追記) rc = 0; (追記ここまで) 376 (追記) break; (追記ここまで) 377 (追記) (追記ここまで) 464 378 case MOUNT_VOL_REMOVED: 465 379 case MOUNT_RELEASE: … … 469 383 { 470 384 if (f32Parms.fMessageActive & LOG_FS) 471 (削除) (削除ここまで)Message("pVolInfo == 0\n");385 (追記) (追記ここまで)Message("pVolInfo == 0\n"); 472 386 473 387 rc = ERROR_VOLUME_NOT_MOUNTED; … … 475 389 } 476 390 477 //if (!pVolInfo->hDupVBP) 478 // { 479 // if (f32Parms.fMessageActive & LOG_FS) 480 // Message("hDupVBP == 0\n"); 481 482 usFlushVolume( pVolInfo, FLUSH_DISCARD, TRUE, PRIO_URGENT ); 483 484 //if (f32Parms.usDirtySectors) // vs 485 UpdateFSInfo(pVolInfo); // 486 487 MarkDiskStatus(pVolInfo, TRUE); 488 // } 391 usFlushVolume( pVolInfo, FLUSH_DISCARD, TRUE, PRIO_URGENT ); 392 UpdateFSInfo(pVolInfo); 393 MarkDiskStatus(pVolInfo, TRUE); 489 394 490 395 // delete pVolInfo from the list 491 (削除) /* if (pGlobVolInfo) (削除ここまで)492 (削除) { (削除ここまで)493 (削除) pNext = pPrev = pGlobVolInfo; (削除ここまで)494 (削除) (削除ここまで)495 (削除) // search for pVolInfo in the list (削除ここまで)496 (削除) while (pNext != pVolInfo) (削除ここまで)497 (削除) { (削除ここまで)498 (削除) pPrev = pNext; (削除ここまで)499 (削除) pNext = (PVOLINFO)pNext->pNextVolInfo; (削除ここまで)500 (削除) } (削除ここまで)501 (削除) (削除ここまで)502 (削除) // found (削除ここまで)503 (削除) if (pNext == pVolInfo) (削除ここまで)504 (削除) { (削除ここまで)505 (削除) if (pPrev == pVolInfo) // the very 1st list item (削除ここまで)506 (削除) pGlobVolInfo = NULL; (削除ここまで)507 (削除) else (削除ここまで)508 (削除) { (削除ここまで)509 (削除) // delete it (削除ここまで)510 (削除) pNext = pNext->pNextVolInfo; (削除ここまで)511 (削除) pPrev->pNextVolInfo = pNext; (削除ここまで)512 (削除) } (削除ここまで)513 (削除) usVolCount--; (削除ここまで)514 (削除) } (削除ここまで)515 (削除) } */ (削除ここまで)516 (削除) (削除ここまで)517 396 RemoveVolume(pVolInfo); 518 (削除) // free() should free a selector as well (削除ここまで)519 (削除) //freeseg(pVolInfo); (削除ここまで)520 397 *(PVOLINFO *)(pvpfsd->vpd_work) = NULL; 521 398 free(pVolInfo); … … 531 408 if (f32Parms.fMessageActive & LOG_FS) 532 409 Message("FS_MOUNT returned %u\n", rc); 533 (削除) (削除ここまで)534 410 535 411 _asm pop es; … … 593 469 static BOOL IsFAT32(PBOOTSECT pSect) 594 470 { 595 /* 596 check for FAT32 according to the Microsoft FAT32 specification 597 */ 598 PBPB pbpb; 599 ULONG FATSz; 600 ULONG TotSec; 601 ULONG RootDirSectors; 602 ULONG NonDataSec; 603 ULONG DataSec; 604 ULONG CountOfClusters; 605 606 if (!pSect) 607 { 608 return FALSE; 609 } /* endif */ 610 611 pbpb = &pSect->bpb; 612 613 if (!pbpb->BytesPerSector) 614 { 471 /* 472 * check for FAT32 according to the Microsoft FAT32 specification 473 */ 474 PBPB pbpb; 475 ULONG FATSz; 476 ULONG TotSec; 477 ULONG RootDirSectors; 478 ULONG NonDataSec; 479 ULONG DataSec; 480 ULONG CountOfClusters; 481 482 if (!pSect) 483 { 615 484 return FALSE; 616 } 617 618 if (pbpb->BytesPerSector != SECTOR_SIZE) 619 { 620 return FALSE; 621 } 622 623 if(( ULONG )pSect->bpb.BytesPerSector * pSect->bpb.SectorsPerCluster > MAX_CLUSTER_SIZE ) 624 { 625 return FALSE; 626 } 627 628 RootDirSectors = ((pbpb->RootDirEntries * 32UL) + (pbpb->BytesPerSector-1UL)) / pbpb->BytesPerSector; 629 630 if (pbpb->SectorsPerFat) 631 { 632 FATSz = pbpb->SectorsPerFat; 633 } 634 else 635 { 636 FATSz = pbpb->BigSectorsPerFat; 637 } /* endif */ 638 639 if (pbpb->TotalSectors) 640 { 641 TotSec = pbpb->TotalSectors; 642 } 643 else 644 { 645 TotSec = pbpb->BigTotalSectors; 646 } /* endif */ 647 648 NonDataSec = pbpb->ReservedSectors 649 + (pbpb->NumberOfFATs * FATSz) 650 + RootDirSectors; 651 652 if (TotSec < NonDataSec) 653 { 654 return FALSE; 655 } /* endif */ 656 657 DataSec = TotSec - NonDataSec; 658 CountOfClusters = DataSec / pbpb->SectorsPerCluster; 659 660 if ((CountOfClusters >= 65525UL) && !memicmp(pSect->FileSystem, "FAT32", 5)) 661 { 662 return TRUE; 663 } 664 else 665 { 666 return FALSE; 667 } /* endif */ 485 } /* endif */ 486 487 pbpb = &pSect->bpb; 488 489 if (!pbpb->BytesPerSector) 490 { 491 return FALSE; 492 } 493 494 if (pbpb->BytesPerSector != SECTOR_SIZE) 495 { 496 return FALSE; 497 } 498 499 if(( ULONG )pbpb->BytesPerSector * pbpb->SectorsPerCluster > MAX_CLUSTER_SIZE ) 500 { 501 return FALSE; 502 } 503 504 RootDirSectors = ((pbpb->RootDirEntries * 32UL) + (pbpb->BytesPerSector-1UL)) / pbpb->BytesPerSector; 505 506 if (pbpb->SectorsPerFat) 507 { 508 FATSz = pbpb->SectorsPerFat; 509 } 510 else 511 { 512 FATSz = pbpb->BigSectorsPerFat; 513 } /* endif */ 514 515 if (pbpb->TotalSectors) 516 { 517 TotSec = pbpb->TotalSectors; 518 } 519 else 520 { 521 TotSec = pbpb->BigTotalSectors; 522 } /* endif */ 523 524 NonDataSec = pbpb->ReservedSectors 525 + (pbpb->NumberOfFATs * FATSz) 526 + RootDirSectors; 527 528 if (TotSec < NonDataSec) 529 { 530 return FALSE; 531 } /* endif */ 532 533 DataSec = TotSec - NonDataSec; 534 CountOfClusters = DataSec / pbpb->SectorsPerCluster; 535 536 if ((CountOfClusters < 65525UL) || memicmp(pSect->FileSystem, "FAT32", 5)) 537 { 538 return FALSE; 539 } /* endif */ 540 541 return TRUE; 668 542 } 669 543 … … 673 547 P_DriverCaps ReturnDriverCaps(UCHAR ucUnit) 674 548 { 675 RP_GETDRIVERCAPS rp={0}; 676 PRP_GETDRIVERCAPS pRH = &rp; 677 PFN pStrat = NULL; 678 SEL dsSel = 0; 679 SEL SAS_selector; 680 struct SAS far *pSas; 681 struct SAS_dd_section far *pDDSection; 682 struct SysDev far *pDD; 683 684 SAS_selector = SaSSel(); 685 pSas = (struct SAS far *)MAKEP(SAS_selector,0); 686 pDDSection = (struct SAS_dd_section far *)MAKEP(SAS_selector,pSas->SAS_dd_data); 687 pDD = (struct SysDev far *)MAKEP(SAS_selector,pDDSection->SAS_dd_bimodal_chain); 688 689 while (pDD && (pDD != (struct SysDev far *)-1)) 690 { 691 if ( 692 (memicmp(&pDD->SDevName[1],"Disk DD",7) == 0) && // found OS2DASD.DMD 693 (pDD->SDevAtt == (DEV_NON_IBM | DEVLEV_1 | DEV_30)) // found OS2DASD.DMD 694 ) 695 { 696 pStrat = (PFN)MAKEP(pDD->SDevProtCS,pDD->SDevStrat); 697 dsSel = pDD->SDevProtDS; 698 699 if (pStrat) 700 { 701 702 pRH->rph.Len = sizeof(rp); 703 pRH->rph.Unit = ucUnit; 704 pRH->rph.Cmd = CMDGetDevSupport; 705 706 _asm { 707 push ds 708 push es 709 push bx 710 mov ax,dsSel 711 mov ds,ax 712 mov es,word ptr pRH+2 713 mov bx,word ptr pRH 714 call dword ptr pStrat 715 pop bx 716 pop es 717 pop ds 718 } 719 return pRH->pDCS; 549 RP_GETDRIVERCAPS rp={0}; 550 PRP_GETDRIVERCAPS pRH = &rp; 551 PFN pStrat = NULL; 552 SEL dsSel = 0; 553 SEL SAS_selector; 554 struct SAS far *pSas; 555 struct SAS_dd_section far *pDDSection; 556 struct SysDev far *pDD; 557 558 SAS_selector = SaSSel(); 559 pSas = (struct SAS far *)MAKEP(SAS_selector,0); 560 pDDSection = (struct SAS_dd_section far *)MAKEP(SAS_selector,pSas->SAS_dd_data); 561 pDD = (struct SysDev far *)MAKEP(SAS_selector,pDDSection->SAS_dd_bimodal_chain); 562 563 while (pDD && (pDD != (struct SysDev far *)-1)) 564 { 565 if ( 566 (memicmp(&pDD->SDevName[1],"Disk DD",7) == 0) && // found OS2DASD.DMD 567 (pDD->SDevAtt == (DEV_NON_IBM | DEVLEV_1 | DEV_30)) // found OS2DASD.DMD 568 ) 569 { 570 pStrat = (PFN)MAKEP(pDD->SDevProtCS,pDD->SDevStrat); 571 dsSel = pDD->SDevProtDS; 572 573 if (pStrat) 574 { 575 576 pRH->rph.Len = sizeof(rp); 577 pRH->rph.Unit = ucUnit; 578 pRH->rph.Cmd = CMDGetDevSupport; 579 580 _asm 581 { 582 push ds 583 push es 584 push bx 585 mov ax,dsSel 586 mov ds,ax 587 mov es,word ptr pRH+2 588 mov bx,word ptr pRH 589 call dword ptr pStrat 590 pop bx 591 pop es 592 pop ds 593 } 594 return pRH->pDCS; 720 595 } 721 596 722 597 break; 723 (削除) (削除ここまで)}724 (削除) (削除ここまで)pDD = (struct SysDev far *)pDD->SDevNext;725 (削除) (削除ここまで)}726 (削除) (削除ここまで)return NULL;598 (追記) (追記ここまで)} 599 (追記) (追記ここまで)pDD = (struct SysDev far *)pDD->SDevNext; 600 (追記) (追記ここまで)} 601 (追記) (追記ここまで)return NULL; 727 602 } 728 603 729 604 #pragma optimize("",on) 730 (削除) (削除ここまで)
Note:
See TracChangeset
for help on using the changeset viewer.