- Timestamp:
- Feb 27, 2015, 5:44:52 AM (11 years ago)
- Author:
- Valery V. Sedletski
- Message:
-
Updated ufat32.dll fo Fat32Format 1.07. Eliminated some minor bugs. The bug with kernel trap when formatting the fat32 partition when booted from another fat32 partition.
- Location:
- branches/fat32-0.10/src
- Files:
-
- 5 edited
- ifs/ifsmount.c (modified) (13 diffs)
- include/fat32c.h (modified) (3 diffs)
- ufat32/format.c (modified) (12 diffs)
- ufat32/os2.c (modified) (13 diffs)
- ufat32/win32.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/fat32-0.10/src/ifs/ifsmount.c
r97 r98 16 16 static BOOL RemoveVolume(PVOLINFO pVolInfo); 17 17 static USHORT CheckWriteProtect(PVOLINFO); 18 (追記) PRIVATE BOOL IsFAT32(PBOOTSECT pBoot); (追記ここまで) 18 19 19 20 int far pascal __loadds FS_MOUNT(unsigned short usFlag, /* flag */ … … 45 46 case MOUNT_MOUNT : 46 47 48 (追記) pSect = (PBOOTSECT)pBoot; (追記ここまで) 49 (追記) /* (追記ここまで) 50 (追記) if (!IsFAT32((BOOTSECT far *)pBoot)) (追記ここまで) 51 (追記) { (追記ここまで) 52 (追記) rc = ERROR_VOLUME_NOT_MOUNTED; (追記ここまで) 53 (追記) goto FS_MOUNT_EXIT; (追記ここまで) 54 (追記) } (追記ここまで) 55 (追記) */ (追記ここまで) 47 56 if (FSH_FINDDUPHVPB(hVBP, &hDupVBP)) 48 57 hDupVBP = 0; 49 58 50 (削除) pSect = (PBOOTSECT)pBoot; (削除ここまで)51 59 if (memicmp(pSect->FileSystem, "FAT32", 5)) 52 60 { … … 60 68 goto FS_MOUNT_EXIT; 61 69 } 62 70 /* 63 71 if(( ULONG )pSect->bpb.BytesPerSector * pSect->bpb.SectorsPerCluster > MAX_CLUSTER_SIZE ) 64 72 { … … 66 74 goto FS_MOUNT_EXIT; 67 75 } 68 69 pvpfsi->vpi_vid = pSect->ulVolSerial; 70 pvpfsi->vpi_bsize = pSect->bpb.BytesPerSector; 71 pvpfsi->vpi_totsec = pSect->bpb.BigTotalSectors; 72 pvpfsi->vpi_trksec = pSect->bpb.SectorsPerTrack; 73 pvpfsi->vpi_nhead = pSect->bpb.Heads; 74 memset(pvpfsi->vpi_text, 0, sizeof pvpfsi->vpi_text); 75 memcpy(pvpfsi->vpi_text, pSect->VolumeLabel, sizeof pSect->VolumeLabel); 76 76 */ 77 if (!hDupVBP) /* initial mounting of the volume */ 78 // if(( ULONG )pSect->bpb.BytesPerSector * pSect->bpb.SectorsPerCluster > MAX_CLUSTER_SIZE ) 79 { 77 80 pVolInfo = gdtAlloc(STORAGE_NEEDED, FALSE); 81 (追記) (追記ここまで) 78 82 if (!pVolInfo) 79 83 { … … 83 87 rc = FSH_FORCENOSWAP(SELECTOROF(pVolInfo)); 84 88 if (rc) 89 (追記) { (追記ここまで) 85 90 FatalMessage("FSH_FORCENOSWAP on VOLINFO Segment failed, rc=%u", rc); 86 87 memset(pVolInfo, 0, (size_t)STORAGE_NEEDED); 91 rc = ERROR_GEN_FAILURE; 92 goto FS_MOUNT_EXIT; 93 } 94 95 *((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo; 96 memset(pVolInfo, 0, (size_t)STORAGE_NEEDED); 97 pVolInfo->pNextVolInfo = NULL; 98 99 // pvpfsi->vpi_vid = pSect->ulVolSerial; 100 // pvpfsi->vpi_bsize = pSect->bpb.BytesPerSector; 101 // pvpfsi->vpi_totsec = pSect->bpb.BigTotalSectors; 102 // pvpfsi->vpi_trksec = pSect->bpb.SectorsPerTrack; 103 // pvpfsi->vpi_nhead = pSect->bpb.Heads; 104 // memset(pvpfsi->vpi_text, 0, sizeof pvpfsi->vpi_text); 105 // memcpy(pvpfsi->vpi_text, pSect->VolumeLabel, sizeof pSect->VolumeLabel); 106 107 if (!pGlobVolInfo) 108 { 109 pGlobVolInfo = pVolInfo; 110 } 111 else 112 { 113 pNext = pGlobVolInfo; 114 while(pNext->pNextVolInfo) 115 { 116 pNext = pNext->pNextVolInfo; 117 } 118 pNext->pNextVolInfo = pVolInfo; 119 } 120 pvpfsi->vpi_vid = pSect->ulVolSerial; 121 pvpfsi->vpi_bsize = pSect->bpb.BytesPerSector; 122 pvpfsi->vpi_totsec = pSect->bpb.BigTotalSectors; 123 pvpfsi->vpi_trksec = pSect->bpb.SectorsPerTrack; 124 pvpfsi->vpi_nhead = pSect->bpb.Heads; 125 memset(pvpfsi->vpi_text, 0, sizeof pvpfsi->vpi_text); 126 memcpy(pvpfsi->vpi_text, pSect->VolumeLabel, sizeof pSect->VolumeLabel); 127 } 128 else /* remount of volume */ 129 { 130 FSH_GETVOLPARM(hDupVBP,&pvpfsi,&pvpfsd); /* Get the volume dependent/independent structure from the original volume block */ 131 pVolInfo = *((PVOLINFO *)(pvpfsd->vpd_work)); /* Get the pointer to the FAT32 Volume structure from the original block */ 132 hVBP = hDupVBP; /* indicate that the old duplicate will become the remaining block */ 133 /* since the new VPB will be discarded if there already is an old one according to IFS.INF */ 134 // rc = ERROR_NOT_ENOUGH_MEMORY; 135 // goto FS_MOUNT_EXIT; 136 } 88 137 89 138 InitCache(ulCacheSectors); 90 139 140 (追記) /* continue mount in both cases: (追記ここまで) 141 (追記) for a first time mount it's an initializaton (追記ここまで) 142 (追記) for the n-th remount it's a reinitialization of the old VPB (追記ここまで) 143 (追記) */ (追記ここまで) 144 (追記) pVolInfo->hVBP = hVBP; (追記ここまで) 91 145 memcpy(&pVolInfo->BootSect, pSect, sizeof (BOOTSECT)); 92 146 … … 104 158 pVolInfo->ulTotalClusters = (pSect->bpb.BigTotalSectors - pVolInfo->ulStartOfData) / pSect->bpb.SectorsPerCluster; 105 159 106 (削除) (削除ここまで)pVolInfo->hVBP = hVBP;107 (削除) (削除ここまで)pVolInfo->hDupVBP = hDupVBP;160 (追記) // (追記ここまで) pVolInfo->hVBP = hVBP; 161 (追記) // (追記ここまで) pVolInfo->hDupVBP = hDupVBP; 108 162 pVolInfo->bDrive = pvpfsi->vpi_drive; 109 163 pVolInfo->bUnit = pvpfsi->vpi_unit; … … 133 187 memset(pVolInfo->pBootFSInfo, 0, sizeof (BOOTFSINFO)); 134 188 135 (削除) (削除ここまで)*((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo;189 (追記) /* (追記ここまで) *((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo; 136 190 137 191 if (!pGlobVolInfo) … … 158 212 if (f32Parms.fMessageActive & LOG_FS) 159 213 Message("%u Volumes mounted!", usVolCount); 214 (追記) */ (追記ここまで) 160 215 161 216 rc = CheckWriteProtect(pVolInfo); … … 259 314 pVolInfo->ulStartOfData = 0; 260 315 261 (削除) //*((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo; (削除ここまで)316 (追記) *((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo; // (追記ここまで) 262 317 263 318 if (!pGlobVolInfo) … … 320 375 if (!pVolInfo) 321 376 { 377 (追記) if (f32Parms.fMessageActive & LOG_FS) (追記ここまで) 378 (追記) Message("pVolInfo == 0\n"); (追記ここまで) 379 (追記) (追記ここまで) 322 380 rc = ERROR_VOLUME_NOT_MOUNTED; 323 381 goto FS_MOUNT_EXIT; 324 382 } 325 383 326 //if (!pVolInfo->hDupVBP) 327 //{ 384 //if (FSH_FINDDUPHVPB(hVBP, &hDupVBP)) 385 //hDupVBP = 0; 386 387 if (!pVolInfo->hDupVBP) 388 //if (!hDupVBP) 389 { 390 if (f32Parms.fMessageActive & LOG_FS) 391 Message("hDupVBP == 0\n"); 392 393 usFlushVolume( pVolInfo, FLUSH_DISCARD, TRUE, PRIO_URGENT ); 394 395 //if (f32Parms.usDirtySectors) // vs 396 UpdateFSInfo(pVolInfo); // 397 398 MarkDiskStatus(pVolInfo, TRUE); 399 } 400 /* 401 if (!pVolInfo->hDupVBP) 402 { 328 403 usFlushVolume( pVolInfo, FLUSH_DISCARD, TRUE, PRIO_URGENT ); 329 404 … … 332 407 333 408 MarkDiskStatus(pVolInfo, TRUE); 334 //} 335 336 // delete pVolInfo from the list 409 } 410 */ 411 412 /* // delete pVolInfo from the list 337 413 if (pGlobVolInfo) 338 414 { … … 360 436 } 361 437 } 362 438 */ 363 439 RemoveVolume(pVolInfo); 364 440 freeseg(pVolInfo); 365 rc = (削除) 0 (削除ここまで);441 rc = (追記) NO_ERROR (追記ここまで); 366 442 break; 367 443 … … 430 506 return FALSE; 431 507 } 508 (追記) (追記ここまで) 509 (追記) static BOOL IsFAT32(BOOTSECT far *pSect) (追記ここまで) 510 (追記) { (追記ここまで) 511 (追記) /* (追記ここまで) 512 (追記) check for FAT32 according to the Microsoft FAT32 specification (追記ここまで) 513 (追記) */ (追記ここまで) 514 (追記) PBPB pbpb; (追記ここまで) 515 (追記) ULONG FATSz; (追記ここまで) 516 (追記) ULONG TotSec; (追記ここまで) 517 (追記) ULONG RootDirSectors; (追記ここまで) 518 (追記) ULONG NonDataSec; (追記ここまで) 519 (追記) ULONG DataSec; (追記ここまで) 520 (追記) ULONG CountOfClusters; (追記ここまで) 521 (追記) (追記ここまで) 522 (追記) if (!pSect) (追記ここまで) 523 (追記) { (追記ここまで) 524 (追記) return FALSE; (追記ここまで) 525 (追記) } /* endif */ (追記ここまで) 526 (追記) (追記ここまで) 527 (追記) pbpb = &pSect->bpb; (追記ここまで) 528 (追記) (追記ここまで) 529 (追記) if (!pbpb->BytesPerSector) (追記ここまで) 530 (追記) { (追記ここまで) 531 (追記) return FALSE; (追記ここまで) 532 (追記) } (追記ここまで) 533 (追記) (追記ここまで) 534 (追記) if (pbpb->BytesPerSector != SECTOR_SIZE) (追記ここまで) 535 (追記) { (追記ここまで) 536 (追記) return FALSE; (追記ここまで) 537 (追記) } (追記ここまで) 538 (追記) (追記ここまで) 539 (追記) if(( ULONG )pSect->bpb.BytesPerSector * pSect->bpb.SectorsPerCluster > MAX_CLUSTER_SIZE ) (追記ここまで) 540 (追記) { (追記ここまで) 541 (追記) return FALSE; (追記ここまで) 542 (追記) } (追記ここまで) 543 (追記) (追記ここまで) 544 (追記) RootDirSectors = ((pbpb->RootDirEntries * 32UL) + (pbpb->BytesPerSector-1UL)) / pbpb->BytesPerSector; (追記ここまで) 545 (追記) (追記ここまで) 546 (追記) if (pbpb->SectorsPerFat) (追記ここまで) 547 (追記) { (追記ここまで) 548 (追記) FATSz = pbpb->SectorsPerFat; (追記ここまで) 549 (追記) } (追記ここまで) 550 (追記) else (追記ここまで) 551 (追記) { (追記ここまで) 552 (追記) FATSz = pbpb->BigSectorsPerFat; (追記ここまで) 553 (追記) } /* endif */ (追記ここまで) 554 (追記) (追記ここまで) 555 (追記) if (pbpb->TotalSectors) (追記ここまで) 556 (追記) { (追記ここまで) 557 (追記) TotSec = pbpb->TotalSectors; (追記ここまで) 558 (追記) } (追記ここまで) 559 (追記) else (追記ここまで) 560 (追記) { (追記ここまで) 561 (追記) TotSec = pbpb->BigTotalSectors; (追記ここまで) 562 (追記) } /* endif */ (追記ここまで) 563 (追記) (追記ここまで) 564 (追記) NonDataSec = pbpb->ReservedSectors (追記ここまで) 565 (追記) + (pbpb->NumberOfFATs * FATSz) (追記ここまで) 566 (追記) + RootDirSectors; (追記ここまで) 567 (追記) (追記ここまで) 568 (追記) if (TotSec < NonDataSec) (追記ここまで) 569 (追記) { (追記ここまで) 570 (追記) return FALSE; (追記ここまで) 571 (追記) } /* endif */ (追記ここまで) 572 (追記) (追記ここまで) 573 (追記) DataSec = TotSec - NonDataSec; (追記ここまで) 574 (追記) CountOfClusters = DataSec / pbpb->SectorsPerCluster; (追記ここまで) 575 (追記) (追記ここまで) 576 (追記) if ((CountOfClusters >= 65525UL) && !memicmp(pSect->FileSystem, "FAT32", 5)) (追記ここまで) 577 (追記) { (追記ここまで) 578 (追記) return TRUE; (追記ここまで) 579 (追記) } (追記ここまで) 580 (追記) else (追記ここまで) 581 (追記) { (追記ここまで) 582 (追記) return FALSE; (追記ここまで) 583 (追記) } /* endif */ (追記ここまで) 584 (追記) } (追記ここまで) -
branches/fat32-0.10/src/include/fat32c.h
r97 r98 33 33 #include <winioctl.h> // From the Win32 SDK \Mstools\Include, or Visual Studio.Net 34 34 35 (追記) // This is just so it will build with old versions of Visual Studio. Yeah, I know... (追記ここまで) 36 (追記) #ifndef IOCTL_DISK_GET_PARTITION_INFO_EX (追記ここまで) 37 (追記) #define IOCTL_DISK_GET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE, 0x0012, METHOD_BUFFERED, FILE_ANY_ACCESS) (追記ここまで) 38 (追記) (追記ここまで) 39 (追記) typedef struct _PARTITION_INFORMATION_MBR { (追記ここまで) 40 (追記) BYTE PartitionType; (追記ここまで) 41 (追記) BOOLEAN BootIndicator; (追記ここまで) 42 (追記) BOOLEAN RecognizedPartition; (追記ここまで) 43 (追記) DWORD HiddenSectors; (追記ここまで) 44 (追記) } PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR; (追記ここまで) 45 (追記) (追記ここまで) 46 (追記) typedef struct _PARTITION_INFORMATION_GPT { (追記ここまで) 47 (追記) GUID PartitionType; // Partition type. See table 16-3. (追記ここまで) 48 (追記) GUID PartitionId; // Unique GUID for this partition. (追記ここまで) 49 (追記) DWORD64 Attributes; // See table 16-4. (追記ここまで) 50 (追記) WCHAR Name [36]; // Partition Name in Unicode. (追記ここまで) 51 (追記) } PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT; (追記ここまで) 52 (追記) (追記ここまで) 53 (追記) (追記ここまで) 54 (追記) typedef enum _PARTITION_STYLE { (追記ここまで) 55 (追記) PARTITION_STYLE_MBR, (追記ここまで) 56 (追記) PARTITION_STYLE_GPT, (追記ここまで) 57 (追記) PARTITION_STYLE_RAW (追記ここまで) 58 (追記) } PARTITION_STYLE; (追記ここまで) 59 (追記) (追記ここまで) 60 (追記) typedef struct _PARTITION_INFORMATION_EX { (追記ここまで) 61 (追記) PARTITION_STYLE PartitionStyle; (追記ここまで) 62 (追記) LARGE_INTEGER StartingOffset; (追記ここまで) 63 (追記) LARGE_INTEGER PartitionLength; (追記ここまで) 64 (追記) DWORD PartitionNumber; (追記ここまで) 65 (追記) BOOLEAN RewritePartition; (追記ここまで) 66 (追記) union { (追記ここまで) 67 (追記) PARTITION_INFORMATION_MBR Mbr; (追記ここまで) 68 (追記) PARTITION_INFORMATION_GPT Gpt; (追記ここまで) 69 (追記) } DUMMYUNIONNAME; (追記ここまで) 70 (追記) } PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX; (追記ここまで) 35 71 #endif 36 72 37 #pragma pack(1) 73 #ifndef FSCTL_ALLOW_EXTENDED_DASD_IO 74 #define FSCTL_ALLOW_EXTENDED_DASD_IO 0x00090083 75 #endif 76 77 #endif 78 79 #define MAX_MESSAGE 2048 80 81 #define BLOCK_SIZE 0x4000 82 #define MAX_MESSAGE 2048 83 #define TYPE_LONG 0 84 #define TYPE_STRING 1 85 #define TYPE_PERC 2 86 #define TYPE_LONG2 3 87 #define TYPE_DOUBLE 4 88 #define TYPE_DOUBLE2 5 89 90 #pragma pack(push, 1) 38 91 typedef struct tagFAT_BOOTSECTOR32 39 92 { … … 80 133 81 134 82 #pragma pack( (削除) (削除ここまで))135 #pragma pack((追記) pop (追記ここまで)) 83 136 84 137 typedef struct … … 135 188 void quit (int rc); 136 189 void show_progress (float fPercentWritten); 190 (追記) void show_message (char *pszMsg, unsigned short usMsg, unsigned short usNumFields, ...); (追記ここまで) -
branches/fat32-0.10/src/ufat32/format.c
r97 r98 112 112 double fBytesTotal; 113 113 LONGLONG qBytesTotal, qBytesWritten; 114 float fPercentWritten (削除) (削除ここまで);115 (削除) (削除ここまで)char Str[12];114 float fPercentWritten(追記) , fPrevPercentWritten = 0 (追記ここまで); 115 (追記) // (追記ここまで)char Str[12]; 116 116 117 117 //BurstSize = pdgDrive->SectorsPerTrack * pdgDrive->TracksPerCylinder; … … 147 147 148 148 qBytesWritten += dwWritten; 149 (追記) (追記ここまで) 150 (追記) if (! fPrevPercentWritten) fPercentWritten; (追記ここまで) 151 (追記) (追記ここまで) 149 152 fPercentWritten = ( qBytesWritten / qBytesTotal ) * 100; 150 151 // percent written indication 152 show_progress(fPercentWritten); 153 //sprintf(Str, "%.2f%%...", fPercentWritten); 154 155 if ( fPercentWritten - fPrevPercentWritten >= 5 ) 156 { 157 // update progress indicator if it has grown by >= 5% 158 fPrevPercentWritten = fPercentWritten; 159 // percent written indication 160 show_progress(fPercentWritten); 161 } 153 162 154 163 NumSects -= WriteSize; … … 344 353 if ( ClusterCount > 0x0FFFFFFF ) 345 354 { 346 die ( "This drive has more than 2^28 clusters, try to specify a larger cluster size or use the default (i.e. don't use -cXX)\n", -3 ); 355 die ( "This drive has more than 2^28 clusters, \n" 356 "try to specify a larger cluster size or use \n" 357 "the default (i.e. don't use -cXX)\n", -3 ); 347 358 } 348 359 … … 350 361 if ( ClusterCount < 65536 ) 351 362 { 352 die ( "FAT32 must have at least 65536 clusters, try to specify a smaller cluster size or use the default (i.e. don't use -cXX)\n", -4 ); 363 die ( "FAT32 must have at least 65536 clusters, \n" 364 "try to specify a smaller cluster size or \n" 365 "use the default (i.e. don't use -cXX)\n", -4 ); 353 366 } 354 367 … … 361 374 if ( FatNeeded > dp.FatSize ) 362 375 { 363 die ( "This drive is too big for this version of fat32format, check for an upgrade\n", -5 ); 376 die ( "This drive is too big for this version \n" 377 "of fat32format, check for an upgrade\n", -5 ); 364 378 } 365 379 … … 368 382 printf ( "Size : %g MB %u sectors\n", (double) (dp.PartitionLength / (1000*1000)), dp.TotalSectors ); 369 383 printf ( "%d Bytes Per Sector, Cluster size %d bytes\n", dp.BytesPerSect, dp.SectorsPerCluster * dp.BytesPerSect ); 370 printf ( "Volume Serial No. is %x:%x\n", VolumeId (削除) >>16, VolumeId& (削除ここまで)0xffff );371 printf ( "Volume label is %s\n", (削除) (削除ここまで)vol );384 printf ( "Volume Serial No. is %x:%x\n", VolumeId(追記) >> 16, VolumeId & (追記ここまで)0xffff ); 385 printf ( "Volume label is %s\n", (追記) (追記ここまで)vol ); 372 386 printf ( "%d Reserved Sectors, %d Sectors per FAT, %d fats\n", dp.ReservedSectCount, dp.FatSize, dp.NumFATs ); 373 387 … … 425 439 // see http://www.48bitlba.com/win98.htm for instructions 426 440 441 (追記) //set_part_type ((toupper(path[0]) - 'A' + 1), hDevice, &dp ); (追記ここまで) 427 442 //printf("002\n"); 428 443 //set_vol_label (path, vol); // traps when booted from FAT32 … … 440 455 close_drive ( hDevice ); 441 456 //printf("009\n"); 442 //set_vol_label (path, vol); // traps when booted from FAT32 443 //set_part_type ((toupper(path[0]) - 'A' + 1), hDevice, &dp ); 444 printf ( "Done.\n" ); 457 set_vol_label (path, vol); // traps when booted from FAT32 458 ////set_part_type ((toupper(path[0]) - 'A' + 1), hDevice, &dp ); 445 459 fflush(stdout); 446 460 //printf("010\n"); … … 451 465 void usage( char *s ) 452 466 { 453 printf ( "\nFat32format, ver. 1.05, see http://www.ridgecrop.demon.co.uk/fat32format.htm \n" 454 "Use with care - Ridgecrop are not liable for data lost using this tool \n" 455 "Modified by osFree project for ufat32.dll \n" 456 "This software is covered by the GPL \n" 457 "--------------------------------------------------\n" 458 "Usage: c:\\> %s <d>: [options]\n\n" 467 printf ( "\nFat32format, ver. 1.07, \n" 468 "see http://www.ridgecrop.demon.co.uk/fat32format.htm\n" 469 "Modified and ported to OS/2 by osFree project \n" 470 "(http://osfree.org) for ufat32.dll.\n" 471 "This software is covered by the GPL.\n" 472 "Use with care - Ridgecrop are not liable\n" 473 "for data lost using this tool.\n" 474 "Usage:[c:\\] %s <d>: [options]\n\n" 459 475 "/C:<N> with different cluster sizes:\n" 460 476 " N: sectors per cluster:\n" … … 462 478 " 2 ( max size 274GB )\n" 463 479 " 4 ( max size 549GB )\n" 464 " 8 ( max size 1TB ) ... until 128 sectors per cluster. \n" 480 " 8 ( max size 1TB. \n" 481 " ... \n" 482 " 128 - use 128 sectors per cluster (64K clusters)\n" 465 483 "/V:<volume label>\n" 466 484 "/? this help message\n\n", s ); … … 508 526 format_params p; 509 527 char cVolume; 510 int (削除) (削除ここまで)i=1;528 int (追記) (追記ここまで)i=1; 511 529 char path[] = "Z:"; 512 530 char *s, *t; 513 char key[12], val[12]; (削除) (削除ここまで)531 char key[12], val[12];(追記) (追記ここまで) 514 532 515 533 // set up signal handlers … … 603 621 } 604 622 605 format_volume( path, &p ); 623 if ( format_volume( path, &p ) ) 624 show_message( "Done.", 1294, 0 ); 606 625 607 626 return 0; -
branches/fat32-0.10/src/ufat32/os2.c
r97 r98 17 17 #include "portable.h" 18 18 19 (削除) #define MAX_MESSAGE 2048 (削除ここまで)20 (削除) (削除ここまで)21 (削除) #define BLOCK_SIZE 0x4000 (削除ここまで)22 (削除) #define MAX_MESSAGE 2048 (削除ここまで)23 (削除) #define TYPE_LONG 0 (削除ここまで)24 (削除) #define TYPE_STRING 1 (削除ここまで)25 (削除) #define TYPE_PERC 2 (削除ここまで)26 (削除) #define TYPE_LONG2 3 (削除ここまで)27 (削除) #define TYPE_DOUBLE 4 (削除ここまで)28 (削除) #define TYPE_DOUBLE2 5 (削除ここまで)29 (削除) (削除ここまで)30 19 typedef HFILE HANDLE; 31 20 … … 60 49 61 50 // Format failed 62 printf(" (削除) (削除ここまで)%s\n", error);51 printf("(追記) ERROR: (追記ここまで)%s\n", error); 63 52 iShowMessage(NULL, 528, 0); 64 53 printf("%s\n", GetOS2Error(rc)); … … 120 109 0, // cbFile 121 110 0, // ulAttribute 122 OPEN_ACTION_ (削除) (削除ここまで)OPEN_IF_EXISTS,123 (削除) (削除ここまで)OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_WRITE_THROUGH |111 OPEN_ACTION_(追記) FAIL_IF_NEW | OPEN_ACTION_ (追記ここまで)OPEN_IF_EXISTS, 112 (追記) // (追記ここまで)OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_WRITE_THROUGH | 124 113 OPEN_FLAGS_NO_CACHE | OPEN_SHARE_DENYREADWRITE | 125 114 OPEN_ACCESS_READWRITE, // | OPEN_FLAGS_DASD, 126 115 NULL); // peaop2 116 (追記) (追記ここまで) 117 (追記) //! OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS, (追記ここまで) 118 (追記) //! OPEN_FLAGS_DASD | OPEN_FLAGS_NO_CACHE | OPEN_ACCESS_READONLY | OPEN_SHARE_DENYREADWRITE, (追記ここまで) 127 119 128 120 // OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE | … … 143 135 void lock_drive(HANDLE hDevice) 144 136 { 145 unsigned char cmdinfo = '0円'; 146 unsigned long parmlen = sizeof(cmdinfo); 147 unsigned long datalen = sizeof(cmdinfo); 148 APIRET rc; 149 150 rc = DosDevIOCtl( hDevice, IOCTL_DISK, DSK_LOCKDRIVE, &cmdinfo, 151 sizeof(cmdinfo), &parmlen, &cmdinfo, // Param packet 152 sizeof(cmdinfo), &datalen); 137 unsigned char parminfo = 0; 138 unsigned char datainfo = 0; 139 unsigned long parmlen = 1; 140 unsigned long datalen = 1; 141 APIRET rc; 142 143 rc = DosDevIOCtl( hDevice, IOCTL_DISK, DSK_LOCKDRIVE, &parminfo, 144 parmlen, &parmlen, &datainfo, // Param packet 145 datalen, &datalen); 153 146 154 147 if ( rc ) … … 159 152 void unlock_drive(HANDLE hDevice) 160 153 { 161 unsigned char cmdinfo = '0円'; 162 unsigned long parmlen = sizeof(cmdinfo); 163 unsigned long datalen = sizeof(cmdinfo); 164 APIRET rc; 165 166 rc = DosDevIOCtl( hDevice, IOCTL_DISK, DSK_UNLOCKDRIVE, &cmdinfo, 167 sizeof(cmdinfo), &parmlen, &cmdinfo, // Param packet 168 sizeof(cmdinfo), &datalen); 169 170 if ( rc ) 171 die( "Failed to unlock device" , rc ); 172 154 unsigned char parminfo = 0; 155 unsigned char datainfo = 0; 156 unsigned long parmlen = 1; 157 unsigned long datalen = 1; 158 APIRET rc; 159 160 rc = DosDevIOCtl( hDevice, IOCTL_DISK, DSK_UNLOCKDRIVE, &parminfo, 161 parmlen, &parmlen, &datainfo, // Param packet 162 datalen, &datalen); 163 164 if ( rc ) 165 { 166 printf( "WARNING: Failed to unlock device, rc = %lu!\n" , rc ); 167 printf( "WARNING: probably, you need to reboot for changes to take in effect.\n" ); 168 } 173 169 } 174 170 … … 255 251 } 256 252 257 (削除) (削除ここまで)258 253 void begin_format (HANDLE hDevice) 259 254 { 260 255 // Detach the volume from the old FSD 261 256 // and attach to the new one 262 unsigned char (削除) cmdinfo = 0; (削除ここまで)263 unsigned (削除) long parmlen = sizeof(cmdinfo); (削除ここまで)264 unsigned (削除) char fsdname[] = "FAT32"; (削除ここまで)265 unsigned long datalen (削除) = sizeof(fsdname) (削除ここまで);266 APIRET rc; (削除) (削除ここまで)267 268 rc = DosDevIOCtl( hDevice, IOCTL_DISK, DSK_BEGINFORMAT, & (削除) cmd (削除ここまで)info,269 (削除) sizeof(cmdinfo), &parmlen, fsdname (削除ここまで),270 (削除) sizeof(fsdname) (削除ここまで), &datalen);257 unsigned char (追記) parminfo[] = "FAT32"; // FSD name (追記ここまで) 258 unsigned (追記) char datainfo = 0; (追記ここまで) 259 unsigned (追記) long parmlen = sizeof(parminfo); (追記ここまで) 260 unsigned long datalen (追記) = 1 (追記ここまで); 261 APIRET rc;(追記) (追記ここまで) 262 263 rc = DosDevIOCtl( hDevice, IOCTL_DISK, DSK_BEGINFORMAT, &(追記) parm (追記ここまで)info, 264 (追記) parmlen, &parmlen, &datainfo (追記ここまで), 265 (追記) datalen (追記ここまで), &datalen); 271 266 272 267 if ( rc ) … … 277 272 { 278 273 // Redetermine media 279 unsigned char (削除) cmd (削除ここまで)info = 0;280 unsigned (削除) long parmlen = sizeof(cmdinfo) (削除ここまで);281 unsigned (削除) char reserved = 0 (削除ここまで);282 unsigned long datalen (削除) = sizeof(reserved) (削除ここまで);274 unsigned char (追記) parm (追記ここまで)info = 0; 275 unsigned (追記) char datainfo = 0 (追記ここまで); 276 unsigned (追記) long parmlen = 1 (追記ここまで); 277 unsigned long datalen (追記) = 1 (追記ここまで); 283 278 APIRET rc; 284 279 285 280 rc = DosDevIOCtl( hDevice, IOCTL_DISK, DSK_REDETERMINEMEDIA, 286 &cmdinfo, sizeof(cmdinfo), &parmlen, // Param packet 287 &reserved, sizeof(reserved), &datalen); 288 289 if ( rc ) 290 die( "Failed to do final remount!", rc ); 281 &parminfo, parmlen, &parmlen, // Param packet 282 &datainfo, datalen, &datalen); 283 284 if ( rc ) 285 { 286 printf( "WARNING: Failed to do final remount, rc = %lu!\n" , rc ); 287 printf( "WARNING: probably, you need to reboot for changes to take in effect.\n" ); 288 } 289 290 //if ( rc ) 291 // die( "Failed to do final remount!", rc ); 291 292 } 292 293 … … 330 331 331 332 memset(cur_vol, 0, sizeof(cur_vol)); 333 (追記) memset(testvol, 0, sizeof(testvol)); (追記ここまで) 332 334 333 335 // Query the filesystem info, … … 355 357 // Read the volume label 356 358 gets(testvol); 357 (削除) (削除ここまで)358 (削除) if (stricmp(testvol, cur_vol)) (削除ここまで)359 (削除) { (削除ここまで)360 (削除) // Incorrect volume label for (削除ここまで)361 (削除) // disk %c is entered! (削除ここまで)362 (削除) iShowMessage(NULL, 636, 0); (削除ここまで)363 (削除) quit (1); (削除ここまで)364 (削除) } (削除ここまで)365 359 } 360 (追記) } (追記ここまで) 361 (追記) (追記ここまで) 362 (追記) if (*testvol && *cur_vol && stricmp(testvol, cur_vol)) (追記ここまで) 363 (追記) { (追記ここまで) 364 (追記) // Incorrect volume label for (追記ここまで) 365 (追記) // disk %c is entered! (追記ここまで) 366 (追記) iShowMessage(NULL, 636, 0); (追記ここまで) 367 (追記) quit (1); (追記ここまで) 366 368 } 367 369 … … 390 392 iShowMessage(NULL, 1288, 0); 391 393 392 label = (削除) & (削除ここまで)v;394 label = (追記) (追記ここまで)v; 393 395 } 394 396 … … 397 399 398 400 if (!*label) 399 label = (削除) & (削除ここまで)default_vol;401 label = (追記) (追記ここまで)default_vol; 400 402 401 403 if (strlen(label) > 11) … … 417 419 int l; 418 420 419 (削除) //printf("0000\n"); (削除ここまで)420 (削除) (削除ここまで)421 421 if (!vol || !*vol) 422 422 return; 423 423 424 (削除) //printf("0001\n"); (削除ここまで)425 (削除) (削除ここまで)426 424 l = strlen(vol); 427 (削除) (削除ここまで)428 (削除) //printf("0002\n"); (削除ここまで)429 425 430 426 if (!path || !*path) 431 427 return; 432 428 433 (削除) //printf("0003\n"); (削除ここまで)434 (削除) (削除ここまで)435 (削除) //printf("path=%s, vol=%s\n", path, vol); (削除ここまで)436 (削除) (削除ここまで)437 429 diskno = toupper(*path) - 'A' + 1; 438 430 439 431 memset(&vl, 0, sizeof(VOLUMELABEL)); 440 (削除) //printf("0004\n"); (削除ここまで)441 432 strcpy(vl.szVolLabel, vol); 442 (削除) //strcpy(fsi.vol.szVolLabel, vol); (削除ここまで)443 (削除) //printf("0005\n"); (削除ここまで)444 (削除) //vl.szVolLabel[l] = '0円'; (削除ここまで)445 (削除) //printf("0006\n"); (削除ここまで)446 433 vl.cch = strlen(vl.szVolLabel); 447 434 448 (削除) //printf("0007\n"); (削除ここまで)449 (削除) //DosSleep(4); (削除ここまで)450 (削除) (削除ここまで)451 435 rc = DosSetFSInfo(diskno, FSIL_VOLSER, 452 436 (PVOID)&vl, sizeof(VOLUMELABEL)); 453 437 454 (削除) //printf("0008\n"); (削除ここまで)455 438 if ( rc ) 456 printf ("Warning: failed to set the volume label, rc=%lu\n", rc); 457 } 439 printf ("WARNING: failed to set the volume label, rc=%lu\n", rc); 440 } 441 458 442 459 443 void show_progress (float fPercentWritten) … … 479 463 iShowMessage(NULL, 1312, 2, TYPE_STRING, str, 480 464 TYPE_STRING, "..."); 481 (削除) DosSleep(100 (削除ここまで));465 (追記) //DosSleep(5 (追記ここまで)); 482 466 // restore cursor position 483 467 printf("[u"); 484 468 fflush(stdout); 485 469 } 470 (追記) (追記ここまで) 471 (追記) void show_message (char *pszMsg, unsigned short usMsg, unsigned short usNumFields, ...) (追記ここまで) 472 (追記) { (追記ここまで) 473 (追記) va_list va; (追記ここまで) 474 (追記) UCHAR szBuf[1024]; (追記ここまで) 475 (追記) (追記ここまで) 476 (追記) va_start(va, usNumFields); (追記ここまで) 477 (追記) vsprintf ( szBuf, pszMsg, va ); (追記ここまで) 478 (追記) va_end( va ); (追記ここまで) 479 (追記) (追記ここまで) 480 (追記) //iShowMessage(NULL, usMsg, usNumFields, va); (追記ここまで) 481 (追記) puts (szBuf); (追記ここまで) 482 (追記) } (追記ここまで) -
branches/fat32-0.10/src/ufat32/win32.c
r97 r98 92 92 void open_drive (char *path , HANDLE *hDevice) 93 93 { 94 char DriveDevicePath[]="\\\\.\\Z:"; // for CreateFile 95 char *p = path; 94 char DriveDevicePath[]="\\\\.\\Z:"; // for CreateFile 95 char *p = path; 96 ULONG cbRet; 97 BOOL bRet; 96 98 97 99 if (strlen(path) == 2 && path[1] == ':') … … 112 114 NULL); 113 115 if ( *hDevice == INVALID_HANDLE_VALUE ) 114 die( "Failed to open device - close any files before formatting, (削除) (削除ここまで)"115 "and make sure you have Admin rights when using fat32format (削除) (削除ここまで)"116 "Are you SURE you're formatting the RIGHT DRIVE!!! (削除) (削除ここまで)", -1 );116 die( "Failed to open device - close any files before formatting,(追記) \n (追記ここまで)" 117 "and make sure you have Admin rights when using fat32format(追記) \n (追記ここまで)" 118 "Are you SURE you're formatting the RIGHT DRIVE!!!(追記) \n (追記ここまで)", -1 ); 117 119 118 120 hDev = *hDevice; 121 (追記) (追記ここまで) 122 (追記) bRet = DeviceIoControl( (追記ここまで) 123 (追記) (HANDLE) hDevice, // handle to device (追記ここまで) 124 (追記) FSCTL_ALLOW_EXTENDED_DASD_IO, // dwIoControlCode (追記ここまで) 125 (追記) NULL, // lpInBuffer (追記ここまで) 126 (追記) 0, // nInBufferSize (追記ここまで) 127 (追記) NULL, // lpOutBuffer (追記ここまで) 128 (追記) 0, // nOutBufferSize (追記ここまで) 129 (追記) &cbRet, // number of bytes returned (追記ここまで) 130 (追記) NULL // OVERLAPPED structure (追記ここまで) 131 (追記) ); (追記ここまで) 132 (追記) (追記ここまで) 133 (追記) if ( !bRet ) (追記ここまで) 134 (追記) printf ( "Failed to allow extended DASD on device" ); (追記ここまで) 135 (追記) else (追記ここまで) 136 (追記) printf ( "FSCTL_ALLOW_EXTENDED_DASD_IO OK\n" ); (追記ここまで) 119 137 } 120 138 … … 148 166 DISK_GEOMETRY dgDrive; 149 167 PARTITION_INFORMATION piDrive; 168 (追記) (追記ここまで) 169 (追記) PARTITION_INFORMATION_EX xpiDrive; (追記ここまで) 170 (追記) BOOL bGPTMode = FALSE; (追記ここまで) 171 (追記) SET_PARTITION_INFORMATION spiDrive; (追記ここまで) 150 172 151 173 // work out drive params … … 163 185 164 186 if ( !bRet ) 165 die( "Failed to get parition info", -10 ); 187 { 188 //die( "Failed to get parition info", -10 ); 189 190 printf ( "IOCTL_DISK_GET_PARTITION_INFO failed, \n" 191 "trying IOCTL_DISK_GET_PARTITION_INFO_EX\n" ); 192 193 bRet = DeviceIoControl ( hDevice, 194 IOCTL_DISK_GET_PARTITION_INFO_EX, 195 NULL, 0, &xpiDrive, sizeof(xpiDrive), 196 &cbRet, NULL); 197 198 if (!bRet) 199 die( "Failed to get partition info (both regular and _ex)", -11 ); 200 201 memset ( &piDrive, 0, sizeof(piDrive) ); 202 piDrive.StartingOffset.QuadPart = xpiDrive.StartingOffset.QuadPart; 203 piDrive.PartitionLength.QuadPart = xpiDrive.PartitionLength.QuadPart; 204 piDrive.HiddenSectors = (DWORD) (xpiDrive.StartingOffset.QuadPart / dgDrive.BytesPerSector); 205 206 bGPTMode = ( xpiDrive.PartitionStyle == PARTITION_STYLE_MBR ) ? 0 : 1; 207 printf ( "IOCTL_DISK_GET_PARTITION_INFO_EX ok, GPTMode=%d\n", bGPTMode ); 208 } 166 209 167 210 // Only support hard disks at the moment … … 254 297 char c; 255 298 256 printf ( "Warning ALL data on drive '%s' will be lost irretrievably, are you sure\n(y/n) ", path ); 299 printf ( "Warning ALL data on drive '%s' will be \n" 300 "lost irretrievably, are you sure\n(y/n) ", path ); 257 301 258 302 c = getchar(); … … 272 316 } 273 317 274 void show_progress (char *str) 275 { 276 277 } 318 void show_progress (float fPercentWritten) 319 { 320 static char f = 0; 321 322 if (! f) 323 { 324 printf("Percent written: "); 325 f = 1; 326 } 327 } 328 329 void show_message (char *pszMsg, unsigned short usMsg, unsigned short usNumFields, ...) 330 { 331 va_list va; 332 UCHAR szBuf[1024]; 333 334 va_start(va, usNumFields); 335 vsprintf ( szBuf, pszMsg, va ); 336 va_end( va ); 337 338 puts(szBuf); 339 }
Note:
See TracChangeset
for help on using the changeset viewer.