Context Navigation


Changeset 98 for branches


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

Legend:

Unmodified
Added
Removed
  • branches/fat32-0.10/src/ifs/ifsmount.c

    r97 r98
    1616static BOOL RemoveVolume(PVOLINFO pVolInfo);
    1717static USHORT CheckWriteProtect(PVOLINFO);
    18(追記) PRIVATE BOOL IsFAT32(PBOOTSECT pBoot); (追記ここまで)
    1819
    1920int far pascal __loadds FS_MOUNT(unsigned short usFlag, /* flag */
    4546 case MOUNT_MOUNT :
    4647
    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(追記) */ (追記ここまで)
    4756 if (FSH_FINDDUPHVPB(hVBP, &hDupVBP))
    4857 hDupVBP = 0;
    4958
    50(削除) pSect = (PBOOTSECT)pBoot; (削除ここまで)
    5159 if (memicmp(pSect->FileSystem, "FAT32", 5))
    5260 {
    6068 goto FS_MOUNT_EXIT;
    6169 }
    62
    70/*
    6371 if(( ULONG )pSect->bpb.BytesPerSector * pSect->bpb.SectorsPerCluster > MAX_CLUSTER_SIZE )
    6472 {
    6674 goto FS_MOUNT_EXIT;
    6775 }
    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 {
    7780 pVolInfo = gdtAlloc(STORAGE_NEEDED, FALSE);
    81(追記) (追記ここまで)
    7882 if (!pVolInfo)
    7983 {
    8387 rc = FSH_FORCENOSWAP(SELECTOROF(pVolInfo));
    8488 if (rc)
    89(追記) { (追記ここまで)
    8590 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 }
    88137
    89138 InitCache(ulCacheSectors);
    90139
    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; (追記ここまで)
    91145 memcpy(&pVolInfo->BootSect, pSect, sizeof (BOOTSECT));
    92146
    104158 pVolInfo->ulTotalClusters = (pSect->bpb.BigTotalSectors - pVolInfo->ulStartOfData) / pSect->bpb.SectorsPerCluster;
    105159
    106(削除) (削除ここまで) pVolInfo->hVBP = hVBP;
    107(削除) (削除ここまで) pVolInfo->hDupVBP = hDupVBP;
    160(追記) // (追記ここまで) pVolInfo->hVBP = hVBP;
    161(追記) // (追記ここまで) pVolInfo->hDupVBP = hDupVBP;
    108162 pVolInfo->bDrive = pvpfsi->vpi_drive;
    109163 pVolInfo->bUnit = pvpfsi->vpi_unit;
    133187 memset(pVolInfo->pBootFSInfo, 0, sizeof (BOOTFSINFO));
    134188
    135(削除) (削除ここまで) *((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo;
    189(追記) /* (追記ここまで) *((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo;
    136190
    137191 if (!pGlobVolInfo)
    158212 if (f32Parms.fMessageActive & LOG_FS)
    159213 Message("%u Volumes mounted!", usVolCount);
    214(追記) */ (追記ここまで)
    160215
    161216 rc = CheckWriteProtect(pVolInfo);
    259314 pVolInfo->ulStartOfData = 0;
    260315
    261 (削除) //*((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo; (削除ここまで)
    316 (追記) *((PVOLINFO *)(pvpfsd->vpd_work)) = pVolInfo; // (追記ここまで)
    262317
    263318 if (!pGlobVolInfo)
    320375 if (!pVolInfo)
    321376 {
    377(追記) if (f32Parms.fMessageActive & LOG_FS) (追記ここまで)
    378(追記) Message("pVolInfo == 0\n"); (追記ここまで)
    379(追記) (追記ここまで)
    322380 rc = ERROR_VOLUME_NOT_MOUNTED;
    323381 goto FS_MOUNT_EXIT;
    324382 }
    325383
    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 {
    328403 usFlushVolume( pVolInfo, FLUSH_DISCARD, TRUE, PRIO_URGENT );
    329404
    332407
    333408 MarkDiskStatus(pVolInfo, TRUE);
    334 //}
    335
    336 // delete pVolInfo from the list
    409 }
    410 */
    411
    412/* // delete pVolInfo from the list
    337413 if (pGlobVolInfo)
    338414 {
    360436 }
    361437 }
    362
    438 */
    363439 RemoveVolume(pVolInfo);
    364440 freeseg(pVolInfo);
    365 rc = (削除) 0 (削除ここまで);
    441 rc = (追記) NO_ERROR (追記ここまで);
    366442 break;
    367443
    430506 return FALSE;
    431507}
    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
    3333#include <winioctl.h> // From the Win32 SDK \Mstools\Include, or Visual Studio.Net
    3434
    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; (追記ここまで)
    3571#endif
    3672
    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)
    3891typedef struct tagFAT_BOOTSECTOR32
    3992{
    80133
    81134
    82#pragma pack((削除) (削除ここまで))
    135#pragma pack((追記) pop (追記ここまで))
    83136
    84137typedef struct
    135188void quit (int rc);
    136189void 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
    112112 double fBytesTotal;
    113113 LONGLONG qBytesTotal, qBytesWritten;
    114 float fPercentWritten(削除) (削除ここまで);
    115 (削除) (削除ここまで)char Str[12];
    114 float fPercentWritten(追記) , fPrevPercentWritten = 0 (追記ここまで);
    115 (追記) // (追記ここまで)char Str[12];
    116116
    117117 //BurstSize = pdgDrive->SectorsPerTrack * pdgDrive->TracksPerCylinder;
    147147
    148148 qBytesWritten += dwWritten;
    149(追記) (追記ここまで)
    150(追記) if (! fPrevPercentWritten) fPercentWritten; (追記ここまで)
    151(追記) (追記ここまで)
    149152 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 }
    153162
    154163 NumSects -= WriteSize;
    344353 if ( ClusterCount > 0x0FFFFFFF )
    345354 {
    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 );
    347358 }
    348359
    350361 if ( ClusterCount < 65536 )
    351362 {
    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 );
    353366 }
    354367
    361374 if ( FatNeeded > dp.FatSize )
    362375 {
    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 );
    364378 }
    365379
    368382 printf ( "Size : %g MB %u sectors\n", (double) (dp.PartitionLength / (1000*1000)), dp.TotalSectors );
    369383 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 );
    372386 printf ( "%d Reserved Sectors, %d Sectors per FAT, %d fats\n", dp.ReservedSectCount, dp.FatSize, dp.NumFATs );
    373387
    425439 // see http://www.48bitlba.com/win98.htm for instructions
    426440
    441(追記) //set_part_type ((toupper(path[0]) - 'A' + 1), hDevice, &dp ); (追記ここまで)
    427442 //printf("002\n");
    428443 //set_vol_label (path, vol); // traps when booted from FAT32
    440455 close_drive ( hDevice );
    441456 //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 );
    445459 fflush(stdout);
    446460 //printf("010\n");
    451465void usage( char *s )
    452466{
    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"
    459475 "/C:<N> with different cluster sizes:\n"
    460476 " N: sectors per cluster:\n"
    462478 " 2 ( max size 274GB )\n"
    463479 " 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"
    465483 "/V:<volume label>\n"
    466484 "/? this help message\n\n", s );
    508526 format_params p;
    509527 char cVolume;
    510 int (削除) (削除ここまで)i=1;
    528 int (追記) (追記ここまで)i=1;
    511529 char path[] = "Z:";
    512530 char *s, *t;
    513 char key[12], val[12];(削除) (削除ここまで)
    531 char key[12], val[12];(追記) (追記ここまで)
    514532
    515533 // set up signal handlers
    603621 }
    604622
    605 format_volume( path, &p );
    623 if ( format_volume( path, &p ) )
    624 show_message( "Done.", 1294, 0 );
    606625
    607626 return 0;
  • branches/fat32-0.10/src/ufat32/os2.c

    r97 r98
    1717#include "portable.h"
    1818
    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(削除) (削除ここまで)
    3019typedef HFILE HANDLE;
    3120
    6049
    6150 // Format failed
    62 printf("(削除) (削除ここまで)%s\n", error);
    51 printf("(追記) ERROR: (追記ここまで)%s\n", error);
    6352 iShowMessage(NULL, 528, 0);
    6453 printf("%s\n", GetOS2Error(rc));
    120109 0, // cbFile
    121110 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 |
    124113 OPEN_FLAGS_NO_CACHE | OPEN_SHARE_DENYREADWRITE |
    125114 OPEN_ACCESS_READWRITE, // | OPEN_FLAGS_DASD,
    126115 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, (追記ここまで)
    127119
    128120 // OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE |
    143135void lock_drive(HANDLE hDevice)
    144136{
    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);
    153146
    154147 if ( rc )
    159152void unlock_drive(HANDLE hDevice)
    160153{
    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 }
    173169}
    174170
    255251}
    256252
    257(削除) (削除ここまで)
    258253void begin_format (HANDLE hDevice)
    259254{
    260255 // Detach the volume from the old FSD
    261256 // 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);
    271266
    272267 if ( rc )
    277272{
    278273 // 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 (追記ここまで);
    283278 APIRET rc;
    284279
    285280 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 );
    291292}
    292293
    330331
    331332 memset(cur_vol, 0, sizeof(cur_vol));
    333(追記) memset(testvol, 0, sizeof(testvol)); (追記ここまで)
    332334
    333335 // Query the filesystem info,
    355357 // Read the volume label
    356358 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(削除) } (削除ここまで)
    365359 }
    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); (追記ここまで)
    366368 }
    367369
    390392 iShowMessage(NULL, 1288, 0);
    391393
    392 label = (削除) & (削除ここまで)v;
    394 label = (追記) (追記ここまで)v;
    393395 }
    394396
    397399
    398400 if (!*label)
    399 label = (削除) & (削除ここまで)default_vol;
    401 label = (追記) (追記ここまで)default_vol;
    400402
    401403 if (strlen(label) > 11)
    417419 int l;
    418420
    419(削除) //printf("0000\n"); (削除ここまで)
    420(削除) (削除ここまで)
    421421 if (!vol || !*vol)
    422422 return;
    423423
    424(削除) //printf("0001\n"); (削除ここまで)
    425(削除) (削除ここまで)
    426424 l = strlen(vol);
    427(削除) (削除ここまで)
    428(削除) //printf("0002\n"); (削除ここまで)
    429425
    430426 if (!path || !*path)
    431427 return;
    432428
    433(削除) //printf("0003\n"); (削除ここまで)
    434(削除) (削除ここまで)
    435(削除) //printf("path=%s, vol=%s\n", path, vol); (削除ここまで)
    436(削除) (削除ここまで)
    437429 diskno = toupper(*path) - 'A' + 1;
    438430
    439431 memset(&vl, 0, sizeof(VOLUMELABEL));
    440(削除) //printf("0004\n"); (削除ここまで)
    441432 strcpy(vl.szVolLabel, vol);
    442(削除) //strcpy(fsi.vol.szVolLabel, vol); (削除ここまで)
    443(削除) //printf("0005\n"); (削除ここまで)
    444(削除) //vl.szVolLabel[l] = '0円'; (削除ここまで)
    445(削除) //printf("0006\n"); (削除ここまで)
    446433 vl.cch = strlen(vl.szVolLabel);
    447434
    448(削除) //printf("0007\n"); (削除ここまで)
    449(削除) //DosSleep(4); (削除ここまで)
    450(削除) (削除ここまで)
    451435 rc = DosSetFSInfo(diskno, FSIL_VOLSER,
    452436 (PVOID)&vl, sizeof(VOLUMELABEL));
    453437
    454(削除) //printf("0008\n"); (削除ここまで)
    455438 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
    458442
    459443void show_progress (float fPercentWritten)
    479463 iShowMessage(NULL, 1312, 2, TYPE_STRING, str,
    480464 TYPE_STRING, "...");
    481 (削除) DosSleep(100 (削除ここまで));
    465 (追記) //DosSleep(5 (追記ここまで));
    482466 // restore cursor position
    483467 printf("[u");
    484468 fflush(stdout);
    485469}
    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
    9292void open_drive (char *path , HANDLE *hDevice)
    9393{
    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;
    9698
    9799 if (strlen(path) == 2 && path[1] == ':')
    112114 NULL);
    113115 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 );
    117119
    118120 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" ); (追記ここまで)
    119137}
    120138
    148166 DISK_GEOMETRY dgDrive;
    149167 PARTITION_INFORMATION piDrive;
    168(追記) (追記ここまで)
    169(追記) PARTITION_INFORMATION_EX xpiDrive; (追記ここまで)
    170(追記) BOOL bGPTMode = FALSE; (追記ここまで)
    171(追記) SET_PARTITION_INFORMATION spiDrive; (追記ここまで)
    150172
    151173 // work out drive params
    163185
    164186 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 }
    166209
    167210 // Only support hard disks at the moment
    254297 char c;
    255298
    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 );
    257301
    258302 c = getchar();
    272316}
    273317
    274void show_progress (char *str)
    275{
    276
    277}
    318void 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
    329void 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.

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