// public ulong SeekU(ulong offset, SeekOrigin origin) { ulong n = 0; if (!DeviceIO.SetFilePointerEx(this.fileHandle, offset, out n, (uint)origin)) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } return(n); }
/// <summary> /// Function to Write Data Pattern that is in buffer to disk sectors /// </summary> /// <param name="writeBuffer">The buffer that has the pattern of data to write</param> /// <param name="writeOffset">The byte offset in writeBuffer from which to begin copying bytes to the stream</param> /// <param name="writeCount">The maximum number of bytes to write</param> /// <returns></returns> public unsafe void Write(byte[] writeBuffer, uint writeOffset, uint writeCount) { uint BytesWritten = 0; UInt64 newFilePtr = 0; long sectorStart = -1; long sectorEnd = -1; while (true) { Console.WriteLine("Enter start sector to overwrite from : "); Wipe.sectorStart = Convert.ToUInt64(Console.ReadLine()); Console.WriteLine("\nEnter end sector to write till : "); Wipe.sectorEnd = Convert.ToUInt64(Console.ReadLine()); if (sectorStart < sectorEnd) { break; } else { Console.WriteLine("\nStart sector cannot be greater than end Sector.....Try again!!!\n"); } } long sectorDiff = sectorEnd - sectorStart; int size = Wipe.sectorWriteSize;// ((sectorDiff > 32) ? ((sectorDiff > 1024) ? (512 * 2 * 64) : (512 * 2 * 4)) : 512); //512 * 2 * 1024; ulong distanceToMove = (ulong)(sectorStart * size); Console.WriteLine("\nWriting entered pattern to disk\n"); try { fixed(byte *writeBufferPointer = writeBuffer) { DeviceIO.SetFilePointerEx(this.fileHandle, distanceToMove, out newFilePtr, DeviceIO.FILE_BEGIN); for (long i = sectorStart; i <= sectorEnd; i += (size / 512)) { if (!DeviceIO.WriteFile(this.fileHandle, writeBufferPointer + writeOffset, (uint)size, &BytesWritten, IntPtr.Zero)) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } //sectorStart += (size / 512); if (i % 100 == 0) { drawTextProgressBar((int)i, (int)sectorEnd); } } Console.WriteLine("After WriteFile"); } } catch (Exception e) { Console.WriteLine(e.Message); } }
/// <summary> /// Function to Read Data into the Buffer from disk /// </summary> /// <param name="readBuffer">bytes read from the current disk.</param> /// <param name="readOffset"> byte offset in readBuffer at which to begin storing the data read from the current stream.</param> /// <param name="readCount">The maximum number of bytes to be read from the current stream.</param> /// <returns> /// Number of bytes read into the buffer. /// </returns> public unsafe uint Read(byte[] readBuffer, uint readOffset, uint readCount) { uint BytesRead = 0; UInt64 newFilePtr = 0; uint size = 512;// ((sectorDiff > 32) ? ((sectorDiff > 1024) ? (512 * 2 * 64 ) : (512 * 2 * 4)) : 512); ulong distanceToMove = (ulong)(Wipe.sectorStart * size); Console.WriteLine("\nVerifying Write Pattern....\n"); fixed(byte *readBufferPointer = readBuffer) { DeviceIO.SetFilePointerEx(this.fileHandle, distanceToMove, out newFilePtr, DeviceIO.FILE_BEGIN); for (ulong i = Wipe.sectorStart; i <= Wipe.sectorEnd; i += ((ulong)size / 512)) { if (!DeviceIO.ReadFile(this.fileHandle, readBufferPointer + readOffset, size, &BytesRead, IntPtr.Zero)) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } if (!readBuffer.SequenceEqual(toWrite)) { Wipe.sectorErrorCount++; } /*else * { * Console.WriteLine("Could not verify"); * }*/ //Wipe.sectorStart += ((ulong)size / 512); } Console.WriteLine("Verification Complete....."); return(BytesRead); } }