예제 #1
0
        private void write(string disk, byte[] header, byte[] sectors)
        {
            const uint OPEN_EXISTING         = 3;
            const uint GENERIC_WRITE         = (0x40000000);
            const uint FSCTL_LOCK_VOLUME     = 0x00090018;
            const uint FSCTL_UNLOCK_VOLUME   = 0x0009001c;
            const uint FSCTL_DISMOUNT_VOLUME = 0x00090020;

            string ldrive = "PhysicalDrive" + disk;

            if (variables.debugme)
            {
                Console.WriteLine(ldrive);
            }

            bool   success = false;
            int    intOut;
            string deviceId = @"\\.\" + ldrive;

            var diskGeometry = DiskGeometry.FromDevice(@"\\.\" + ldrive.Replace("\\", ""));

            List <string> logicaldrives = GetLetters(Convert.ToInt32(ldrive.Replace(@"PhysicalDrive", "").Replace("\\", "").Replace(".", "").ToString()));

            SafeFileHandle diskHandle = CreateFile(deviceId, GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

            if (diskHandle.IsInvalid)
            {
                int lastError = Marshal.GetLastWin32Error();
                Console.WriteLine(@"!! Error ({0}): {1}", lastError, new Win32Exception(lastError).Message);
                Console.WriteLine(deviceId + " open error.");
                return;
            }
            if (variables.debugme)
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": opened.");
            }

            List <SafeFileHandle> lhandles = new List <SafeFileHandle>();
            List <string>         lnames   = new List <string>();
            int i = 0;

            if (variables.debugme)
            {
                Console.WriteLine(logicaldrives.Count);
            }
            foreach (string logdrive in logicaldrives)
            {
                if (variables.debugme)
                {
                    Console.WriteLine("Opening logical drives");
                }
                string ldevid = @"\\.\" + logdrive.Replace("\\", "").Replace(".", "");
                if (variables.debugme)
                {
                    Console.WriteLine(ldevid);
                }
                SafeFileHandle ldiskHandle = CreateFile(ldevid, GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                if (ldiskHandle.IsInvalid)
                {
                    Console.WriteLine(ldevid + " open error.");
                    break;
                }
                if (variables.debugme)
                {
                    Console.WriteLine(ldevid + " " + Marshal.GetHRForLastWin32Error().ToString() + ": opened.");
                }
                lhandles.Add(ldiskHandle);
                lnames.Add(ldevid);

                success = DeviceIoControl(ldiskHandle, FSCTL_LOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
                if (!success)
                {
                    Console.WriteLine(ldevid + " lock error.");
                    CloseHandle(ldiskHandle);
                    break;
                }

                if (variables.debugme)
                {
                    Console.WriteLine(ldevid + " " + Marshal.GetHRForLastWin32Error().ToString() + ": locked.");
                }

                success = DeviceIoControl(ldiskHandle, FSCTL_DISMOUNT_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
                if (!success)
                {
                    Console.WriteLine(ldevid + " " + Marshal.GetHRForLastWin32Error().ToString() + ": dismount error.");
                    DeviceIoControl(ldiskHandle, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
                    CloseHandle(ldiskHandle);
                    return;
                }
            }
            success = DeviceIoControl(diskHandle, FSCTL_LOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
            if (!success)
            {
                Console.WriteLine(deviceId + " lock error.");
                CloseHandle(diskHandle);
                return;
            }

            if (variables.debugme)
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": locked.");
            }

            success = DeviceIoControl(diskHandle, FSCTL_DISMOUNT_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
            if (!success)
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": dismount error.");
                DeviceIoControl(diskHandle, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
                CloseHandle(diskHandle);
                return;
            }

            if (variables.debugme)
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unmounted.");
            }

            //uint numTotalSectors = 0x795FFF;//DiskSize / 512;
            //uint numTotalSectors = 0x702000;
            uint sector      = diskGeometry.BytesPerSector;
            long totaltracks = 33;

            byte[] junkBytes = new byte[(int)sector];

            if (variables.debugme)
            {
                Console.WriteLine(totaltracks);
            }
            FileStream fw = new FileStream(diskHandle, FileAccess.ReadWrite);

            for (uint sectorNum = 0; sectorNum < totaltracks; sectorNum++)
            {
                Buffer.BlockCopy(sectors, (int)sectorNum * 0x200, junkBytes, 0, 0x200);

                fw.Write(junkBytes, 0, (int)sector);
            }

            fw.Seek(diskGeometry.MaximumLinearAddress - 0x200, SeekOrigin.Begin);
            fw.Write(header, 0, 0x200);


            i = 0;
            foreach (SafeFileHandle sfh in lhandles)
            {
                success = DeviceIoControl(sfh, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
                if (success)
                {
                    if (variables.debugme)
                    {
                        Console.WriteLine(lnames[i] + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unlocked.");
                    }
                }
                else
                {
                    Console.WriteLine(lnames[i] + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unlock error: " + Marshal.GetHRForLastWin32Error().ToString());
                }
                i++;
            }


            success = DeviceIoControl(diskHandle, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
            if (success)
            {
                if (variables.debugme)
                {
                    Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unlocked.");
                }
            }
            else
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unlock error: " + Marshal.GetHRForLastWin32Error().ToString());
            }

            i = 0;
            foreach (SafeFileHandle sfh in lhandles)
            {
                success = CloseHandle(sfh);
                if (success)
                {
                    if (variables.debugme)
                    {
                        Console.WriteLine(lnames[i] + " " + Marshal.GetHRForLastWin32Error().ToString() + ": handle closed.");
                    }
                }
                else
                {
                    Console.WriteLine(lnames[i] + " " + Marshal.GetHRForLastWin32Error().ToString() + ": close handle error: " + Marshal.GetHRForLastWin32Error().ToString());
                }
                i++;
            }


            success = CloseHandle(diskHandle);
            if (success)
            {
                if (variables.debugme)
                {
                    Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": handle closed.");
                }
            }
            else
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": close handle error: " + Marshal.GetHRForLastWin32Error().ToString());
            }
            try
            {
                fw.Close();
            }
            catch (Exception) { }
            Environment.GetLogicalDrives();
        }
예제 #2
0
        private int read(string filename)
        {
            if (String.IsNullOrEmpty(filename))
            {
                return(0);
            }
            if (listView1.SelectedItems.Count == 0)
            {
                return(0);
            }

            if (File.Exists(filename))
            {
                if (DialogResult.Cancel == MessageBox.Show("File already exists, it will be DELETED! Press ok to continue", "File Already Exists", MessageBoxButtons.OKCancel, MessageBoxIcon.Information))
                {
                    Console.WriteLine("Cancelled");
                    return(0);
                }
                ;

                try
                {
                    File.Delete(filename);
                }
                catch (Exception ex) { if (variables.debugme)
                                       {
                                           Console.WriteLine(ex.ToString());
                                       }
                                       return(0); }
            }

            string ldrive = listView1.SelectedItems[0].SubItems[1].Text;

            Console.WriteLine(ldrive);
            var diskGeometry = DiskGeometry.FromDevice(@"\\.\" + ldrive.Replace("\\", ""));

            if (diskGeometry == null)
            {
                Console.WriteLine("Failed to get DiskGeometry.");
                return(0);
            }

            uint track  = diskGeometry.BytesPerSector * (diskGeometry.Sector + 1);
            long tracks = 0x600;

            if (chkFullDump.Checked)
            {
                tracks = diskGeometry.DiskSize / track;
            }

            long      i         = 0;
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();
            try
            {
                Console.WriteLine("Reading from {0} to {1}", ldrive, filename);
                FileStream fs   = new FileStream(CreateFile(@"\\.\" + ldrive.Replace("\\", ""), FileAccess.Read, FileShare.Read, 0, FileMode.Open, 0, IntPtr.Zero), FileAccess.Read);
                FileStream fw   = new FileStream(filename, FileMode.OpenOrCreate);
                byte[]     temp = new byte[track];
                while (i < tracks && !variables.escapeloop)
                {
                    UpdateProgres((int)((i * 100) / tracks));
                    UpdateBloc(((i * track) / 1024 / 1024).ToString("F0") + "MB");
                    i++;
                    fs.Read(temp, 0, (int)track);
                    fw.Write(temp, 0, (int)track);
                }
                fs.Close();
                fw.Close();
                UpdateBloc("");
                UpdateProgres(100);
                stopwatch.Stop();
                Console.WriteLine("Done!");
                Console.WriteLine("in {0}:{1:D2} min:sec", stopwatch.Elapsed.Minutes + (stopwatch.Elapsed.Hours * 60), stopwatch.Elapsed.Seconds);
            }
            catch (Exception ex) { Console.WriteLine(ex.ToString() + i); }
            return(1);
        }
예제 #3
0
        private void erase_v1()
        {
            const uint OPEN_EXISTING         = 3;
            const uint GENERIC_WRITE         = (0x40000000);
            const uint FSCTL_LOCK_VOLUME     = 0x00090018;
            const uint FSCTL_UNLOCK_VOLUME   = 0x0009001c;
            const uint FSCTL_DISMOUNT_VOLUME = 0x00090020;

            if (listView1.SelectedItems.Count == 0)
            {
                return;
            }
            string ldrive = listView1.SelectedItems[0].SubItems[0].Text;

            if (variables.debugme)
            {
                Console.WriteLine(ldrive);
            }

            bool          success = false;
            int           intOut;
            string        deviceId      = @"\\.\" + ldrive;
            var           diskGeometry  = DiskGeometry.FromDevice(@"\\.\" + ldrive.Replace("\\", ""));
            List <string> logicaldrives = GetLetters(Convert.ToInt32(ldrive.Replace(@"PhysicalDrive", "").Replace("\\", "").Replace(".", "").ToString()));

            SafeFileHandle diskHandle = CreateFile(deviceId, GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

            if (diskHandle.IsInvalid)
            {
                Console.WriteLine(deviceId + " open error.");
                return;
            }
            if (variables.debugme)
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": opened.");
            }

            List <SafeFileHandle> lhandles = new List <SafeFileHandle>();
            List <string>         lnames   = new List <string>();
            int i = 0;

            if (variables.debugme)
            {
                Console.WriteLine(logicaldrives.Count);
            }
            foreach (string logdrive in logicaldrives)
            {
                if (variables.debugme)
                {
                    Console.WriteLine("Opening logical drives");
                }
                string ldevid = @"\\.\" + logdrive.Replace("\\", "").Replace(".", "");
                if (variables.debugme)
                {
                    Console.WriteLine(ldevid);
                }
                SafeFileHandle ldiskHandle = CreateFile(ldevid, GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                if (ldiskHandle.IsInvalid)
                {
                    Console.WriteLine(ldevid + " open error.");
                    break;
                }
                if (variables.debugme)
                {
                    Console.WriteLine(ldevid + " " + Marshal.GetHRForLastWin32Error().ToString() + ": opened.");
                }
                lhandles.Add(ldiskHandle);
                lnames.Add(ldevid);

                success = DeviceIoControl(ldiskHandle, FSCTL_LOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
                if (!success)
                {
                    Console.WriteLine(ldevid + " lock error.");
                    CloseHandle(ldiskHandle);
                    break;
                }

                if (variables.debugme)
                {
                    Console.WriteLine(ldevid + " " + Marshal.GetHRForLastWin32Error().ToString() + ": locked.");
                }

                success = DeviceIoControl(ldiskHandle, FSCTL_DISMOUNT_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
                if (!success)
                {
                    Console.WriteLine(ldevid + " " + Marshal.GetHRForLastWin32Error().ToString() + ": dismount error.");
                    DeviceIoControl(ldiskHandle, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
                    CloseHandle(ldiskHandle);
                    return;
                }
            }
            success = DeviceIoControl(diskHandle, FSCTL_LOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
            if (!success)
            {
                Console.WriteLine(deviceId + " lock error.");
                CloseHandle(diskHandle);
                return;
            }

            if (variables.debugme)
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": locked.");
            }

            success = DeviceIoControl(diskHandle, FSCTL_DISMOUNT_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
            if (!success)
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": dismount error.");
                DeviceIoControl(diskHandle, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
                CloseHandle(diskHandle);
                return;
            }

            if (variables.debugme)
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unmounted.");
            }

            //uint numTotalSectors = 0x795FFF;//DiskSize / 512;
            //uint numTotalSectors = 0x702000;
            uint track       = diskGeometry.BytesPerSector * (diskGeometry.Sector + 1);
            long totaltracks = diskGeometry.DiskSize / track;

            byte[] junkBytes = new byte[(int)track];

            if (variables.debugme)
            {
                Console.WriteLine(totaltracks);
            }
            FileStream fw     = new FileStream(diskHandle, FileAccess.ReadWrite);
            uint       offset = 0;

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();
            for (uint sectorNum = 0; sectorNum < totaltracks; sectorNum++)
            {
                if (variables.escapeloop)
                {
                    break;
                }
                int numBytesWritten = (int)diskGeometry.BytesPerSector;
                //int moveToHigh;
                try
                {
                    offset++;
                    int value = (int)((offset * 100) / totaltracks);
                    //if (offset % 1000 == 0) Console.WriteLine(offset + " " + value);
                    UpdateProgres(value);
                }
                catch (Exception ex) { Console.WriteLine("{0} - {1} - {2}", offset, sectorNum, ex.ToString()); break; }


                //uint rvalsfp = SetFilePointer(diskHandle, sectorNum * numBytesPerSector, out moveToHigh, EMoveMethod.Begin);

                //Console.WriteLine("File pointer set " + Marshal.GetHRForLastWin32Error().ToString() + ": " + (sectorNum * numBytesPerSector).ToString());

                fw.Write(junkBytes, 0, (int)track);

                //int rval = WriteFile(diskHandle, junkBytes, junkBytes.Length, out numBytesWritten, IntPtr.Zero);

                if (numBytesWritten != junkBytes.Length)
                {
                    //Console.WriteLine("Write error on track " + sectorNum.ToString() + " from " + (sectorNum * numBytesPerSector).ToString() + "-" + moveToHigh.ToString() + " " + Marshal.GetHRForLastWin32Error().ToString() + ": Only " + numBytesWritten.ToString() + "/" + junkBytes.Length.ToString() + " bytes written.");
                    //break;
                }
                else
                {
                    //Console.WriteLine("Write success " + Marshal.GetHRForLastWin32Error().ToString() + ": " + numBytesWritten.ToString() + "/" + junkBytes.Length.ToString() + " bytes written.");
                }
            }
            stopwatch.Stop();
            Console.WriteLine("Done!");
            Console.WriteLine("in {0}:{1:D2} min:sec", stopwatch.Elapsed.Minutes + (stopwatch.Elapsed.Hours * 60), stopwatch.Elapsed.Seconds);

            i = 0;
            foreach (SafeFileHandle sfh in lhandles)
            {
                success = DeviceIoControl(sfh, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
                if (success)
                {
                    if (variables.debugme)
                    {
                        Console.WriteLine(lnames[i] + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unlocked.");
                    }
                }
                else
                {
                    Console.WriteLine(lnames[i] + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unlock error: " + Marshal.GetHRForLastWin32Error().ToString());
                }
                i++;
            }


            success = DeviceIoControl(diskHandle, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
            if (success)
            {
                if (variables.debugme)
                {
                    Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unlocked.");
                }
            }
            else
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unlock error: " + Marshal.GetHRForLastWin32Error().ToString());
            }

            i = 0;
            foreach (SafeFileHandle sfh in lhandles)
            {
                success = CloseHandle(sfh);
                if (success)
                {
                    if (variables.debugme)
                    {
                        Console.WriteLine(lnames[i] + " " + Marshal.GetHRForLastWin32Error().ToString() + ": handle closed.");
                    }
                }
                else
                {
                    Console.WriteLine(lnames[i] + " " + Marshal.GetHRForLastWin32Error().ToString() + ": close handle error: " + Marshal.GetHRForLastWin32Error().ToString());
                }
                i++;
            }


            success = CloseHandle(diskHandle);
            if (success)
            {
                if (variables.debugme)
                {
                    Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": handle closed.");
                }
            }
            else
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": close handle error: " + Marshal.GetHRForLastWin32Error().ToString());
            }
            try
            {
                fw.Close();
            }
            catch (Exception) { }
            Environment.GetLogicalDrives();
        }
예제 #4
0
        private void enumerate()
        {
            Environment.GetLogicalDrives();
            listView1.Items.Clear();
            List <string> pdrives = GetPhysicalDriveList();
            int           i       = 0;

            foreach (string info in pdrives)
            {
                int           driveNumber = Convert.ToInt32(info.Replace(@"PhysicalDrive", ""));
                List <string> letter      = GetLetters(driveNumber);
                if (variables.debugme)
                {
                    Console.WriteLine("{0} - {1}", info, letter.Count);
                }
                if (letter.Count == 0)
                {
                    ListViewItem lvi = new ListViewItem();
                    lvi.Text = info;
                    lvi.SubItems.Add("");
                    lvi.SubItems.Add("");
                    lvi.SubItems.Add("");
                    lvi.SubItems.Add("");
                    var x = DiskGeometry.FromDevice(@"\\.\PHYSICALDRIVE" + driveNumber);
                    if (x != null)
                    {
                        lvi.SubItems.Add(((x.DiskSize / 1024f) / 1024f).ToString());
                    }
                    else
                    {
                        lvi.SubItems.Add("");
                    }
                    listView1.Items.Add(lvi);
                }
                else
                {
                    int j = 0;
                    foreach (string drive in letter)
                    {
                        if (variables.debugme)
                        {
                            Console.WriteLine("{0} - {1}", info, drive);
                        }
                        ListViewItem lvi = new ListViewItem();
                        lvi.Text = info;
                        DriveInfo driv = new DriveInfo(drive.Replace(@"\\.\", ""));
                        lvi.SubItems.Add(driv.Name);
                        lvi.SubItems.Add(driv.DriveType.ToString());
                        if (driv.IsReady == true)
                        {
                            lvi.SubItems.Add(driv.VolumeLabel);
                            lvi.SubItems.Add(driv.DriveFormat);
                            lvi.SubItems.Add((driv.TotalSize / (1024f) / 1024f).ToString());
                            if (variables.debugme)
                            {
                                Console.WriteLine("Drive is ready");
                            }
                        }
                        else
                        {
                            lvi.SubItems.Add("");
                            lvi.SubItems.Add("");
                            var x = DiskGeometry.FromDevice(@"\\.\PHYSICALDRIVE" + driveNumber);
                            if (x != null)
                            {
                                lvi.SubItems.Add(((x.DiskSize / 1024f) / 1024f).ToString());
                            }
                            else
                            {
                                lvi.SubItems.Add("");
                            }
                        }
                        if (driv.DriveType == DriveType.Removable || showall)
                        {
                            listView1.Items.Add(lvi);
                        }
                        j++;
                        UpdateProgres(((i + j) * 100) / (pdrives.Count * letter.Count));
                    }
                }
                //lvi.SubItems.Add(string.Join("", getletters(Convert.ToInt32(info[info.Length -1].ToString()))));
                i++;
                UpdateProgres((i * 100) / pdrives.Count);
            }
        }