/** Tries to restore the original FS on the drive using the FS descriptor provided @return standard error code. */ static TInt DoRestoreFS(RFs& aFs, TInt aDrive, CFileSystemDescriptor* apFsDesc) { TInt nRes; Log(_L("# DoRestoreFS drv:%d\n"), aDrive); //-- 1. check that there is no FS installed { TBuf<128> fsName; nRes = aFs.FileSystemName(fsName, aDrive); if(nRes == KErrNone) {//-- probably no file system installed at all Log(_L("# This drive already has FS intalled:%S \n"), &fsName); return KErrAlreadyExists; } } TPtrC ptrN (apFsDesc->FsName()); TPtrC ptrExt(apFsDesc->PrimaryExtName()); Log(_L("# Mounting FS:%S, Prim ext:%S, synch:%d\n"), &ptrN, &ptrExt, apFsDesc->DriveIsSynch()); if(ptrExt.Length() >0) {//-- there is a primary extension to be mounted nRes = aFs.AddExtension(ptrExt); if(nRes != KErrNone && nRes != KErrAlreadyExists) { return nRes; } nRes = aFs.MountFileSystem(ptrN, ptrExt, aDrive, apFsDesc->DriveIsSynch()); } else { nRes = aFs.MountFileSystem(ptrN, aDrive, apFsDesc->DriveIsSynch()); } if(nRes != KErrNone) { Log(_L("# Mount failed! code:%d\n"),nRes); } return nRes; }
TInt MountNTFS() { TBuf<256> cmd; User::CommandLine(cmd); TLex cmdlex(cmd); cmdlex.SkipSpace(); TUint c = (TUint)cmdlex.Get(); if (c>='a' && c<='z') c-=0x20; if (c<'A' || c>'Z') return KErrArgument; TBuf<4> driveLetter; driveLetter.SetLength(1); driveLetter[0] = (TText)c; RDebug::Print(_L("Drive %S"), &driveLetter); TInt driveNumber = TInt(c-'A') + TInt(EDriveA); TInt r; driveLetter.Append(_L(":\\")); RDebug::Print(_L("Add file system: %S"), &KFileSystemDllName); r=TheFs.AddFileSystem(KFileSystemDllName); if (r!=KErrNone && r!=KErrAlreadyExists) { RDebug::Print(_L("Failed: %d"), r); return r; } TFullName name; r = TheFs.FileSystemName(name, driveNumber); if (name.Length() != 0) { RDebug::Print(_L("Dismounting %S on drive %S\r\n"), &name, &driveLetter); r=TheFs.DismountFileSystem(name, driveNumber); RDebug::Print(_L("Dismount ret=%d"), r); } RDebug::Print(_L("Mount NTFS on drive %S\r\n"), &driveLetter); r = TheFs.MountFileSystem(KFileSystemName, driveNumber); RDebug::Print(_L("Mount r=%d"),r); return KErrNone; }
/** Dismount the original FS from the drive and mount MsFS instead */ static void MountMsFs(TInt driveNumber) { TInt x = console->WhereX(); TInt y = console->WhereY(); //-- 1. try dismounting the original FS CFileSystemDescriptor* fsDesc = DoDismountOrginalFS(fs, driveNumber); unmountedFsList[driveNumber] = fsDesc; console->SetPos(0, 10); if(fsDesc) { TPtrC ptrN(fsDesc->FsName()); LogPrint(_L("drv:%d FS:%S Dismounted OK"),driveNumber, &ptrN); } else { LogPrint(_L("drv:%d Dismount FS Failed!"),driveNumber); } console->ClearToEndOfLine(); //-- 2. try to mount the "MSFS" TInt error; error = fs.MountFileSystem(KMsFs, driveNumber); console->SetPos(0, 11); LogPrint(_L("MSFS Mount: %S (%d)"), (error?&KError:&KOk), error); console->ClearToEndOfLine(); if (!error) msfsMountedList[driveNumber] = ETrue; // restore console position console->SetPos(x,y); }