public AtaPassThroughDirect(AtaFlags AtaFlags = default, byte PathId = default, byte TargetId = default, byte Lun = default, byte ReservedAsUchar = default, uint TimeOutValue = default, uint ReservedAsUlong = default, uint DataTransferLength = default, IntPtr DataBuffer = default, ushort Feature = default, ushort SectorCouont = default, ushort SectorNumber = default, uint Cylinder = default, byte DeviceHead = default, byte Command = default, ushort Reserved = default) => (Length, this.AtaFlags, this.PathId, this.TargetId, this.Lun, this.ReservedAsUchar, this.TimeOutValue, this.ReservedAsUlong, this.DataTransferLength, _DataBuffer, (CurrentTaskFile, PreviousTaskFile))
= ((ushort)Marshal.SizeOf <AtaPassThroughDirect>(), AtaFlags, PathId, TargetId, Lun, ReservedAsUchar, TimeOutValue, ReservedAsUlong, DataTransferLength, DataBuffer.ToInt32(), CreateTaskFiles(AtaFlags, Feature, SectorCouont, SectorNumber, Cylinder, DeviceHead, Command, Reserved));
public AtaPassThroughExWithSmartData(AtaFlags AtaFlags = default, byte PathId = default, byte TargetId = default, byte Lun = default, byte ReservedAsUchar = default, uint TimeOutValue = default, uint ReservedAsUlong = default, TaskFile TaskFile = default, SmartData SmartData = default) => (Length, this.AtaFlags, this.PathId, this.TargetId, this.Lun, this.ReservedAsUchar, this.TimeOutValue, this.ReservedAsUlong, DataTransferLength, DataBufferOffset, this.TaskFile, this.SmartData)
public AtaPassThroughEx32WithIdentifyDevice(AtaFlags AtaFlags = default, byte PathId = default, byte TargetId = default, byte Lun = default, byte ReservedAsUchar = default, uint TimeOutValue = default, uint ReservedAsUlong = default, TaskFile TaskFile = default, IdentifyDevice IdentifyDevice = default) => (Length, this.AtaFlags, this.PathId, this.TargetId, this.Lun, this.ReservedAsUchar, this.TimeOutValue, this.ReservedAsUlong, this.DataTransferLength, this.DataBufferOffset, this.TaskFile, this.IdentifyDevice)
public static (byte[] CurrentTaskFile, byte[] PreviousTaskFile) CreateTaskFiles(AtaFlags AtaFlags, ushort Feature, ushort SectorCouont, ushort SectorNumber, uint Cylinder, byte DeviceHead, byte Command, ushort Reserved) { if ((AtaFlags & AtaFlags.AF_48BIT_COMMAND) == AtaFlags.AF_48BIT_COMMAND) { unchecked { return(CurrentTaskFile : new byte[8] { (byte)(Feature & 0x00FF), (byte)(SectorCouont & 0x00FF), (byte)(SectorNumber & 0x00FF), (byte)(Cylinder & 0x0000_00FF), (byte)((Cylinder & 0x0000_FF00) >> 8), DeviceHead, Command, (byte)(Reserved & 0x00FF), }, PreviousTaskFile : new byte[8] {
/// <summary> /// IOCTL_ATA_PASS_THROUGH IOCTL ( https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ntddscsi/ni-ntddscsi-ioctl_ata_pass_through ) /// </summary> /// <param name="IoControl"></param> /// <param name="Header"></param> /// <param name="Data"></param> /// <param name="AtaFlags"></param> /// <param name="PathId"></param> /// <param name="TargetId"></param> /// <param name="Lun"></param> /// <param name="ReservedAsUchar"></param> /// <param name="TimeOutValue"></param> /// <param name="ReservedAsUlong"></param> /// <param name="Feature"></param> /// <param name="SectorCouont"></param> /// <param name="SectorNumber"></param> /// <param name="Cylinder"></param> /// <param name="DeviceHead"></param> /// <param name="Command"></param> /// <param name="Reserved"></param> /// <param name="DataSize"></param> /// <returns></returns> public static bool AtaPassThrough(this IoControl IoControl, out IAtaPassThroughEx Header, out byte[] Data, AtaFlags AtaFlags, byte PathId = default, byte TargetId = default, byte Lun = default, byte ReservedAsUchar = default, uint TimeOutValue = default, uint ReservedAsUlong = default, ushort Feature = default, ushort SectorCouont = default, ushort SectorNumber = default, uint Cylinder = default, byte DeviceHead = default, byte Command = default, ushort Reserved = default, uint DataSize = default) { var _Size = Marshal.SizeOf <AtaPassThroughEx>(); var DataTransferLength = DataSize; var DataBufferOffset = DataSize == 0 ? 0 : _Size; Header = IntPtr.Size == 8 ? (IAtaPassThroughEx) new AtaPassThroughEx( AtaFlags: AtaFlags, PathId: PathId, TargetId: TargetId, Lun: Lun, ReservedAsUchar: ReservedAsUchar, TimeOutValue: TimeOutValue, ReservedAsUlong: ReservedAsUlong, Feature: Feature, SectorCouont: SectorCouont, SectorNumber: SectorNumber, Cylinder: Cylinder, DeviceHead: DeviceHead, Command: Command, Reserved: Reserved, DataTransferLength: DataTransferLength, DataBufferOffset: DataBufferOffset ): IntPtr.Size == 4 ? new AtaPassThroughEx32( AtaFlags: AtaFlags, PathId: PathId, TargetId: TargetId, Lun: Lun, ReservedAsUchar: ReservedAsUchar, TimeOutValue: TimeOutValue, ReservedAsUlong: ReservedAsUlong, Feature: Feature, SectorCouont: SectorCouont, SectorNumber: SectorNumber, Cylinder: Cylinder, DeviceHead: DeviceHead, Command: Command, Reserved: Reserved, DataTransferLength: DataTransferLength, DataBufferOffset: DataBufferOffset ): throw new NotSupportedException(); var Size = (uint)(_Size + DataSize); var Ptr = Marshal.AllocCoTaskMem((int)Size); using (Disposable.Create(() => Marshal.FreeCoTaskMem(Ptr))) { Marshal.StructureToPtr(Header, Ptr, false); var result = IoControl.DeviceIoControl(IOControlCode.AtaPassThrough, Ptr, Size, out var _); Header = result ? (AtaPassThroughEx)Marshal.PtrToStructure(Ptr, typeof(AtaPassThroughEx)) : default; if (DataSize > 0) { Data = new byte[DataSize]; Marshal.Copy(IntPtr.Add(Ptr, _Size), Data, 0, Data.Length); } else { Data = default; } return(result); } }
/// <summary> /// /// </summary> /// <param name="IoControl"></param> /// <param name="AtaFlags"></param> /// <param name="PathId"></param> /// <param name="TargetId"></param> /// <param name="Lun"></param> /// <param name="ReservedAsUchar"></param> /// <param name="TimeOutValue"></param> /// <param name="ReservedAsUlong"></param> /// <param name="DataTransferLength"></param> /// <param name="DataBuffer"></param> /// <param name="Feature"></param> /// <param name="SectorCouont"></param> /// <param name="SectorNumber"></param> /// <param name="Cylinder"></param> /// <param name="DeviceHead"></param> /// <param name="Command"></param> /// <param name="Reserved"></param> /// <returns></returns> public static AtaPassThroughDirect AtaPassThroughDirect(this IoControl IoControl, AtaFlags AtaFlags = default, byte PathId = default, byte TargetId = default, byte Lun = default, byte ReservedAsUchar = default, uint TimeOutValue = default, uint ReservedAsUlong = default, uint DataTransferLength = default, IntPtr DataBuffer = default, ushort Feature = default, ushort SectorCouont = default, ushort SectorNumber = default, uint Cylinder = default, byte DeviceHead = default, byte Command = default, ushort Reserved = default) { if (!AtaPassThroughDirect(IoControl, out var Header, AtaFlags, PathId, TargetId, Lun, ReservedAsUchar, TimeOutValue, ReservedAsUlong, DataTransferLength, DataBuffer, Feature, SectorCouont, SectorNumber, Cylinder, DeviceHead, Command, Reserved)) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } return(Header); }
/// <summary> /// IOCTL_ATA_PASS_THROUGH_DIRECT IOCTL ( https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ntddscsi/ni-ntddscsi-ioctl_ata_pass_through_direct ) /// </summary> /// <param name="IoControl"></param> /// <param name="Header"></param> /// <param name="AtaFlags"></param> /// <param name="PathId"></param> /// <param name="TargetId"></param> /// <param name="Lun"></param> /// <param name="ReservedAsUchar"></param> /// <param name="TimeOutValue"></param> /// <param name="ReservedAsUlong"></param> /// <param name="DataTransferLength"></param> /// <param name="DataBuffer"></param> /// <param name="Feature"></param> /// <param name="SectorCouont"></param> /// <param name="SectorNumber"></param> /// <param name="Cylinder"></param> /// <param name="DeviceHead"></param> /// <param name="Command"></param> /// <param name="Reserved"></param> /// <returns></returns> public static bool AtaPassThroughDirect(this IoControl IoControl, out AtaPassThroughDirect Header, AtaFlags AtaFlags = default, byte PathId = default, byte TargetId = default, byte Lun = default, byte ReservedAsUchar = default, uint TimeOutValue = default, uint ReservedAsUlong = default, uint DataTransferLength = default, IntPtr DataBuffer = default, ushort Feature = default, ushort SectorCouont = default, ushort SectorNumber = default, uint Cylinder = default, byte DeviceHead = default, byte Command = default, ushort Reserved = default) { Header = new AtaPassThroughDirect( AtaFlags: AtaFlags, PathId: PathId, TargetId: TargetId, Lun: Lun, ReservedAsUchar: ReservedAsUchar, TimeOutValue: TimeOutValue, ReservedAsUlong: ReservedAsUlong, Feature: Feature, SectorCouont: SectorCouont, SectorNumber: SectorNumber, Cylinder: Cylinder, DeviceHead: DeviceHead, Command: Command, Reserved: Reserved, DataTransferLength: DataTransferLength, DataBuffer: DataBuffer ); return(IoControl.DeviceIoControl(IOControlCode.AtaPassThroughDirect, ref Header, out var _)); }
/// <summary> /// /// </summary> /// <param name="IoControl"></param> /// <param name="AtaFlags"></param> /// <param name="PathId"></param> /// <param name="TargetId"></param> /// <param name="Lun"></param> /// <param name="ReservedAsUchar"></param> /// <param name="TimeOutValue"></param> /// <param name="ReservedAsUlong"></param> /// <param name="Feature"></param> /// <param name="SectorCouont"></param> /// <param name="SectorNumber"></param> /// <param name="Cylinder"></param> /// <param name="DeviceHead"></param> /// <param name="Command"></param> /// <param name="Reserved"></param> /// <param name="DataSize"></param> /// <returns></returns> public static (IAtaPassThroughEx Header, byte[] Data) AtaPassThrough(this IoControl IoControl, AtaFlags AtaFlags, byte PathId = default, byte TargetId = default, byte Lun = default, byte ReservedAsUchar = default, uint TimeOutValue = default, uint ReservedAsUlong = default, ushort Feature = default, ushort SectorCouont = default, ushort SectorNumber = default, uint Cylinder = default, byte DeviceHead = default, byte Command = default, ushort Reserved = default, uint DataSize = default) { if (!AtaPassThrough(IoControl, Header: out var Header, Data: out var Data, AtaFlags: AtaFlags, PathId: PathId, TargetId: TargetId, Lun: Lun, ReservedAsUchar: ReservedAsUchar, TimeOutValue: TimeOutValue, ReservedAsUlong: ReservedAsUlong, Feature: Feature, SectorCouont: SectorCouont, SectorNumber: SectorNumber, Cylinder: Cylinder, DeviceHead: DeviceHead, Command: Command, Reserved: Reserved, DataSize: DataSize)) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } return(Header, Data); }