示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
 public static ushort CurrentAPM(IDENTIFY_DEVICE_DATA idData)
 {
     return(idData.CurrentAPMvalue);
 }
示例#5
0
        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);
        }
示例#6
0
        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);
        }