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(); }
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); }
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(); }
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); } }