分享
 
 
 

C#读硬盘序列号的原代码

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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 "";

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有