예제 #1
0
 private static void Refresh()
 {
     foreach (DiskInfo info in CreateDiskInfos(GetDisks()))
     {
         if (info.Model == "Linux UMS disk 0 USB Device" && info.Partitions > 1) // probably a bad way of filtering?
         {
             try
             {
                 IEnumerable <PartitionInfo> partitions =
                     CreatePartitionInfos(GetPartitions())
                     .Where((p) => info.Index == p.DiskIndex)
                     .OrderBy((p) => p.Index);
                 if (!partitions.Any())
                 {
                     continue; // obv the NAND should have *some* partitions
                 }
                 PartitionInfo lastPartition = partitions.Last();
                 long          length        = (long)(lastPartition.Size + lastPartition.StartingOffset);
                 // thx windows for ignoring the GPT backup AND reporting the size of the disk incorrectly...
                 long missingLength = (0x747BFFE00 - 0x727800000) + 0x200; // (start of GPT backup - end of USER) + length of GPT backup
                 length += missingLength;
                 DeviceStream stream      = new DeviceStream(info.PhysicalName, length);
                 IStorage     diskStorage = new CachedStorage(stream.AsStorage().AsReadOnly(), info.SectorSize * 100, 4, true);
                 if (InsertNAND(diskStorage, true))
                 {
                     CurrentDisk = info;
                     break;
                 }
             }
             catch (UnauthorizedAccessException)
             {
                 MessageBox.Show("Cannot get direct access drive due to lack of permissions.\nReopen HACGUI as administrator to use the plugged in NAND.");
             }
         }
     }
 }
예제 #2
0
        private static bool FindEmuMMC(DriveInfo drive)
        {
            DirectoryInfo root      = drive.RootDirectory;
            FileInfo      emummcIni = root.GetFile("emuMMC/emummc.ini");

            if (emummcIni.Exists)
            {
                // find the DiskDrive associated with this drive letter
                VolumeInfo volume = AllVolumes
                                    .Where(x => x.Caption == drive.Name).FirstOrDefault();

                LogicalDiskInfo logicalDisk = AllLogicalDisks
                                              .Where(x => x.DeviceID == volume.DriveLetter).FirstOrDefault();

                IEnumerable <PartitionInfo> partitionsFromLogicalDisk = ToDiskPartitions(logicalDisk);
                if (!partitionsFromLogicalDisk.Any())
                {
                    return(false);
                }

                DiskInfo disk = AllDisks.Where(x => x.Index == partitionsFromLogicalDisk.First().DiskIndex).FirstOrDefault();

                IEnumerable <PartitionInfo> partitions = AllPartitions.Where(x => x.DiskIndex == disk.Index);

                // parse ini
                FileIniDataParser parser = new FileIniDataParser();

                IniData ini = parser.ReadFile(emummcIni.FullName);
                ini.SectionKeySeparator = '/';

                if (!ini.TryGetKey("emummc/sector", out string sectorStr))
                {
                    return(false);
                }

                ulong sector = ulong.Parse(sectorStr.Replace("0x", ""), System.Globalization.NumberStyles.HexNumber);

                PartitionInfo partition = partitions.Where(x =>
                                                           (sector * x.BlockSize)
                                                           - 0x1000000 /* hekate's 16MB padding to protect the emuMMC */

                                                           == x.StartingOffset).FirstOrDefault();

                bool usingEmummc = partition != null;
                if (usingEmummc)
                {
                    MessageBoxResult r = MessageBox.Show("emuMMC was detected on this SD card. Do you want to open that instead of sysMMC content?", "emuMMC", MessageBoxButton.YesNo);
                    if (r == MessageBoxResult.No)
                    {
                        usingEmummc = false;
                    }
                }

                if (usingEmummc)
                {
                    DeviceStream stream      = new DeviceStream(disk.PhysicalName, disk.Length);
                    IStorage     diskStorage = new CachedStorage(stream.AsStorage().AsReadOnly(), disk.SectorSize * 100, 4, true);
                    long         offset      = (long)partition.StartingOffset;
                    offset += 0x1000000; // account for hekate's padding
                    offset += 0x400000;  // BOOT0
                    offset += 0x400000;  // BOOT1


                    NANDService.InsertNAND(diskStorage.Slice(offset, (long)partition.Size), false);
                }

                return(usingEmummc);
            }

            return(false);
        }