收藏文档:
 C Sharp  |   |  Java  |    
|  C Sharp>>C#原代码>>C#读硬盘序列号的原代码   打印 
 
C#读硬盘序列号的原代码
www.wenhui.org  2002-12-7  CSharp vs Java
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); private const uint GENERIC_READ = 0x80000000; 
private const uint GENERIC_WRITE = 0x40000000; 
private const uint FILE_SHARE_READ = 0x00000001; 
private const uint FILE_SHARE_WRITE = 0x00000002; 
private const uint OPEN_EXISTING = 3; 
private const uint INVALID_HANDLE_VALUE = 0xffffffff; 
private const uint DFP_GET_VERSION = 0x00074080; 
private const int IDE_ATAPI_IDENTIFY = 0xA1; // Returns ID sector for ATAPI. 
private const int IDE_ATA_IDENTIFY = 0xEC; // Returns ID sector for ATA. 
private const int IDENTIFY_BUFFER_SIZE = 512; 
private const uint DFP_RECEIVE_DRIVE_DATA = 0x0007c088; 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 ""; 


原作者:痕迹
来 源:本站
共有180位读者阅读过此文 【告诉好友】 
上篇文章:JDBC连接SQLServer2000 下篇文章:Java实现连接池程序(原码) 
 
□- 本周热门文章  □- 相关文章  
1.关于datagrid的打印[41]
2.Java2 RMI 入门[38]
3.Visual C#的Excel编程[36]
4.tyutyrut[0]
 C#读硬盘序列号的原代码
 
 CSharp VS Java