示例#1
0
 private static extern int DeviceIoControl(uint hDevice,
                                           uint dwIoControlCode,
                                           int lpInBuffer,
                                           int nInBufferSize,
                                           ref GETVERSIONOUTPARAMS lpOutBuffer,
                                           int nOutBufferSize,
                                           ref uint lpbytesReturned,
                                           int lpOverlapped);
示例#2
0
        public static string Read(byte drive)
        {
            OperatingSystem os = Environment.OSVersion;

            if (os.Platform != PlatformID.Win32NT)
            {
                throw new NotSupportedException("仅支持WindowsNT/2000/XP");
            }
            //我没有NT4,请哪位大大测试一下NT4下能不能用
            //if (os.Version.Major < 5) throw new NotSupportedException("仅支持WindowsNT/2000/XP");

            string driveName = "\\\\.\\PhysicalDrive" + drive.ToString();
            uint   device    = CreateFile(driveName,
                                          GENERIC_READ | GENERIC_WRITE,
                                          FILE_SHARE_READ | FILE_SHARE_WRITE,
                                          0, OPEN_EXISTING, 0, 0);

            if (device == INVALID_HANDLE_VALUE)
            {
                return("");
            }
            GETVERSIONOUTPARAMS verPara = new GETVERSIONOUTPARAMS();
            uint bytRv = 0;

            if (0 != DeviceIoControl(device, DFP_GET_VERSION,
                                     0, 0, ref verPara, Marshal.SizeOf(verPara),
                                     ref bytRv, 0))
            {
                if (verPara.bIDEDeviceMap > 0)
                {
                    byte             bIDCmd = (byte)(((verPara.bIDEDeviceMap >> drive & 0x10) != 0) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY);
                    SENDCMDINPARAMS  scip   = new SENDCMDINPARAMS();
                    SENDCMDOUTPARAMS scop   = new SENDCMDOUTPARAMS();

                    scip.cBufferSize = IDENTIFY_BUFFER_SIZE;
                    scip.irDriveRegs.bFeaturesReg    = 0;
                    scip.irDriveRegs.bSectorCountReg = 1;
                    scip.irDriveRegs.bCylLowReg      = 0;
                    scip.irDriveRegs.bCylHighReg     = 0;
                    scip.irDriveRegs.bDriveHeadReg   = (byte)(0xA0 | ((drive & 1) << 4));
                    scip.irDriveRegs.bCommandReg     = bIDCmd;
                    scip.bDriveNumber = drive;

                    if (0 != DeviceIoControl(device, DFP_RECEIVE_DRIVE_DATA,
                                             ref scip, Marshal.SizeOf(scip), ref scop,
                                             Marshal.SizeOf(scop), ref bytRv, 0))
                    {
                        StringBuilder s = new StringBuilder();
                        for (int i = 20; i < 40; i += 2)
                        {
                            s.Append((char)(scop.bBuffer[i + 1]));
                            s.Append((char)scop.bBuffer[i]);
                        }
                        CloseHandle(device);
                        return(s.ToString().Trim());
                    }
                }
            }
            CloseHandle(device);
            return("");
        }