public static bool APMSupported(IDENTIFY_DEVICE_DATA idData) { // APM support is represented by 3-rd bit (zero based) of word 83 int s = idData.Feature_set_support_083 & 0x08; return(s == 0x08); }
public static bool APMEnabled(IDENTIFY_DEVICE_DATA idData) { // APM state is represented by 3-rd bit of word 86 int s = idData.Feature_set_enabled_086 & 0x08; return(s == 0x08); }
public static bool?IsRotativeDevice(IDENTIFY_DEVICE_DATA idData) { //0401h-FFFEh for rotative, 1 for Solid state if (idData.NomMediaRotRate_217 == 1) { return(false); } if (idData.NomMediaRotRate_217 >= 0x0401 && idData.NomMediaRotRate_217 <= 0xFFFE) { return(true); } return(null); }
public static ushort CurrentAPM(IDENTIFY_DEVICE_DATA idData) { return(idData.CurrentAPMvalue); }
public static IDENTIFY_DEVICE_DATA?IdentifyDefice(string deviceName) { ATA_PASS_THROUGH_EX aptx = new ATA_PASS_THROUGH_EX(); ATADeviceQuiry adqry = new ATADeviceQuiry(); IDENTIFY_DEVICE_DATA idd = new IDENTIFY_DEVICE_DATA(); adqry.reqDataBuf = new byte[512]; adqry.header.Length = (ushort)Marshal.SizeOf(aptx); adqry.header.AtaFlags = ATA_FLAGS_DATA_IN; adqry.header.DataTransferLength = (ushort)adqry.reqDataBuf.Length; //512 adqry.header.DataBufferOffset = Marshal.OffsetOf(typeof(ATADeviceQuiry), "reqDataBuf"); adqry.header.TimeOutValue = 1; adqry.header.PreviousTaskFile = new IDEREGS(); adqry.header.CurrentTaskFile = new IDEREGS(); adqry.header.CurrentTaskFile.bCommandReg = WIN_IDENTIFYDEVICE; uint IOCTL_ATA_PASS_THROUGH = CTL_CODE( IOCTL_SCSI_BASE, 0x040b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); SafeFileHandle driveHandle = Kernel32Methods.CreateFileW( lpFileName: deviceName, dwDesiredAccess: Kernel32Methods.GENERIC_READ | Kernel32Methods.GENERIC_WRITE, // Administrative privilege is required dwShareMode: Kernel32Methods.FILE_SHARE_READ | Kernel32Methods.FILE_SHARE_WRITE, lpSecurityAttributes: IntPtr.Zero, dwCreationDisposition: Kernel32Methods.OPEN_EXISTING, dwFlagsAndAttributes: Kernel32Methods.FILE_ATTRIBUTE_NORMAL, hTemplateFile: IntPtr.Zero); if (driveHandle == null || driveHandle.IsInvalid) { #if DEBUG string message = GetErrorMessage(Marshal.GetLastWin32Error()); Console.WriteLine($"CreateFile (IdentifyDevice) with disk {deviceName} failed. Error: " + message); #endif driveHandle?.Close(); return(null); } uint returnBytesCount; bool result = Kernel32Methods.DeviceIoControl( hDevice: driveHandle, dwIoControlCode: IOCTL_ATA_PASS_THROUGH, lpInBuffer: ref adqry, nInBufferSize: (uint)Marshal.SizeOf(adqry), lpOutBuffer: ref adqry, nOutBufferSize: (uint)Marshal.SizeOf(adqry), lpBytesReturned: out returnBytesCount, lpOverlapped: IntPtr.Zero); driveHandle.Close(); if (result == false) { #if DEBUG string message = GetErrorMessage(Marshal.GetLastWin32Error()); Console.WriteLine($"DeviceIoControl (IdentifyDevice) with disk {deviceName} failed. Error: " + message); #endif return(null); } // Raw memory copy of reqDataBuf byte array to IDENTIFY_DEVICE struct IntPtr tempPtr = Marshal.AllocHGlobal(Marshal.SizeOf(idd)); Marshal.Copy(adqry.reqDataBuf, 0, tempPtr, adqry.reqDataBuf.Length); idd = (IDENTIFY_DEVICE_DATA)Marshal.PtrToStructure(tempPtr, idd.GetType()); Marshal.FreeHGlobal(tempPtr); return(idd); }
public static bool ReadPhysicalDriveInNtUsingSmart2(int drive) { using (var hDisk = OpenDisk(drive)) { ATA_PASS_THROUGH_EX apex = new ATA_PASS_THROUGH_EX(); apex.Length = (ushort)Marshal.SizeOf(apex); apex.AtaFlags = AtaFlags.ReceiveData; // 2 ATA_FLAGS_DATA_IN apex.DataTransferLength = 512; // The command returns a 512 byte package of info. apex.TimeOutValue = 10; // 10 second timeout. apex.DataBufferOffset = Marshal.OffsetOf(typeof(ATA_PASS_THROUGH_EX_WITH_BUFFER), "Data"); apex.CurrentTaskFile = new ATA_TASK_FILE(); // This contains the command we are requesting. apex.CurrentTaskFile = new ATA_TASK_FILE(AtaCommand.IdentifyDevice); // &HEC <-- the command "IDENTIFY DEVICE" //uint inBufferSize = (uint)Marshal.SizeOf(typeof(ATA_PASS_THROUGH_EX)) + apex.DataTransferLength; var apexb = new ATA_PASS_THROUGH_EX_WITH_BUFFER { Apt = apex }; uint inBufferSize = (uint)Marshal.SizeOf(typeof(ATA_PASS_THROUGH_EX_WITH_BUFFER)); //var sciPointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SENDCMDINPARAMS))); var apexHandle = Marshal.AllocHGlobal((int)inBufferSize); Marshal.StructureToPtr(apexb, apexHandle, true); uint bytesReturned = 0; var result = DeviceManagement.NativeMethods.DeviceIoControl(hDisk, IdeIoControlCode.IOCTL_ATA_PASS_THROUGH, apexHandle, inBufferSize, apexHandle, inBufferSize, ref bytesReturned, IntPtr.Zero); var apexValue = (ATA_PASS_THROUGH_EX_WITH_BUFFER)Marshal.PtrToStructure(apexHandle, typeof(ATA_PASS_THROUGH_EX_WITH_BUFFER)); var sddd = result; var i = 0; i++; IDENTIFY_DEVICE_DATA idd = new IDENTIFY_DEVICE_DATA(); var iddHandle = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IDENTIFY_DEVICE_DATA))); //Marshal.StructureToPtr(idd, iddHandle, true); ATA_PASS_THROUGH_DIRECT aptd = new ATA_PASS_THROUGH_DIRECT(); aptd.Length = (ushort)Marshal.SizeOf(typeof(ATA_PASS_THROUGH_DIRECT)); //(ushort)Marshal.SizeOf(aptd); aptd.AtaFlags = AtaFlags.ReceiveData; // 2 ATA_FLAGS_DATA_IN aptd.DataTransferLength = 512; // The command returns a 512 byte package of info. aptd.TimeOutValue = 10; // 10 second timeout. aptd.CurrentTaskFile = new ATA_TASK_FILE(); // This contains the command we are requesting. aptd.CurrentTaskFile = new ATA_TASK_FILE(AtaCommand.IdentifyDevice); // &HEC <-- the command "IDENTIFY DEVICE" aptd.DataBuffer = iddHandle; var apedHandle = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ATA_PASS_THROUGH_DIRECT))); Marshal.StructureToPtr(aptd, apedHandle, true); uint bytesReturned2 = 0; var result2 = DeviceManagement.NativeMethods.DeviceIoControl(hDisk, IdeIoControlCode.IOCTL_ATA_PASS_THROUGH_DIRECT, apedHandle, aptd.Length, apedHandle, aptd.Length, ref bytesReturned2, IntPtr.Zero); var jkjk = aptd.DataBuffer; var apedValue = (IDENTIFY_DEVICE_DATA)Marshal.PtrToStructure(jkjk, typeof(IDENTIFY_DEVICE_DATA)); var ddd = apedValue.ModelNumber; var jhh = new byte[512]; Marshal.Copy(aptd.DataBuffer, jhh, 0, 511); //var apedValue = (IDENTIFY_DEVICE_DATA)Marshal..PtrToStructure(aptd.DataBuffer, typeof(IDENTIFY_DEVICE_DATA)); var jj = result2; i++; } return(true); }