硬盤public class IDE { [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct IDSECTOR { public ushort wGenConfig; public ushort wNumCyls; public ushort wReserved; public ushort wNumHeads; public ushort wBytesPerTrack; public ushort wBytesPerSector; public ushort wSectorsPerTrack; [ MarshalAs( UnmanagedType.ByValArray, SizeConst=3)] public ushort [] wVendorUnique; [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=20)] public string sSerialNumber; public ushort wBufferType; public ushort wBufferSize; public ushort wECCSize; [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=8)] public string sFirmwareRev; [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=40)] public string sModelNumber; public ushort wMoreVendorUnique; public ushort wDoubleWordIO; public ushort wCapabilitIEs; public ushort wReserved1; public ushort wPIOTiming; public ushort wDMATiming; public ushort wBS; public ushort wNumCurrentCyls; public ushort wNumCurrentHeads; public ushort wNumCurrentSectorsPerTrack; public uint ulCurrentSectorCapacity; public ushort wMultSectorStuff; public uint ulTotalAddressableSectors; public ushort wSingleWordDMA; public ushort wMultiWordDMA; [ MarshalAs( UnmanagedType.ByValArray, SizeConst=128 )] public byte [] bReserved; }
[StructLayout(LayoutKind.Sequential)] internal struct DRIVERSTATUS { public byte bDriverError; public byte bIDEStatus; [ MarshalAs( UnmanagedType.ByValArray, SizeConst=2 )] public byte [] bReserved; [ MarshalAs( UnmanagedType.ByValArray, SizeConst=2 )] public uint [] dwReserved; }
[StructLayout(LayoutKind.Sequential)] internal struct SENDCMDOUTPARAMS { public uint cBufferSize; public DRIVERSTATUS DriverStatus; [ MarshalAs( UnmanagedType.ByValArray, SizeConst=513 )] public byte [] bBuffer; }
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct SRB_IO_CONTROL { public uint HeaderLength; [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=8 )] public string Signature; public uint Timeout; public uint ControlCode; public uint ReturnCode; public uint Length; }
[StructLayout(LayoutKind.Sequential)] internal struct IDEREGS { public byte bFeaturesReg; public byte bSectorCountReg; public byte bSectorNumberReg; public byte bCylLowReg; public byte bCylHighReg; public byte bDriveHeadReg; public byte bCommandReg; public byte bReserved; }
[StructLayout(LayoutKind.Sequential)] internal struct SENDCMDINPARAMS { public uint cBufferSize; public IDEREGS irDriveRegs; public byte bDriveNumber; [ MarshalAs( UnmanagedType.ByValArray, SizeConst=3 )] public byte [] bReserved; [ MarshalAs( UnmanagedType.ByValArray, SizeConst=4 )] public uint [] dwReserved; public byte bBuffer; }
[StructLayout(LayoutKind.Sequential)] internal struct GETVERSIONOUTPARAMS { public byte bVersion; public byte bRevision; public byte bReserved; public byte bIDEDeviceMap; public uint fCapabilitIEs; [ MarshalAs( UnmanagedType.ByValArray, SizeConst=4 )] public uint [] dwReserved; // For future use. }
[DllImport("kernel32.dll")] private static extern int CloseHandle(uint hObject);
[DllImport("kernel32.dll")] private static extern int DeviceIoControl(uint hDevice, uint dwIoControlCode, ref SENDCMDINPARAMS lpInBuffer, int nInBufferSize, ref SENDCMDOUTPARAMS lpOutBuffer, int nOutBufferSize, ref uint lpbytesReturned, int lpOverlapped);
[DllImport("kernel32.dll")] private static extern int DeviceIoControl(uint hDevice, uint dwIoControlCode, int lpInBuffer, int nInBufferSize, ref GETVERSIONOUTPARAMS lpOutBuffer, int nOutBufferSize, ref uint lpbytesReturned, int lpOverlapped);
[DllImport("kernel32.dll")] private static extern uint CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, int lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, int hTemplateFile);
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");