C#程序获得cpu,硬盘的序列号

C#程序获得cpu,硬盘的序列号
C#程序获得cpu,硬盘的序列号

使用c#获得cpu,硬盘的序列号(源码)

出处:https://www.360docs.net/doc/a06135865.html,

//首先在项目中选中右键“引用”→“添加引用”→打开一个界面,切换到.NET选项卡,添//加System.Management“确定”即可。如下图:

using System;

using System.Runtime.InteropServices;

using System.Management;

namespace Hardware

{

///

/// Hardware_Mac 的摘要说明。

///

public class HardwareInfo

{

//取机器名

public string GetHostName()

{

return https://www.360docs.net/doc/a06135865.html,.Dns.GetHostName();

}

//取CPU编号

public String GetCpuID()

{

try

{

ManagementClass mc = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = mc.GetInstances();

String strCpuID = null ;

foreach( ManagementObject mo in moc )

{

strCpuID = mo.Properties["ProcessorId"].Value.ToString(); break;

}

return strCpuID;

}

catch

{

return "";

}

}//end method

//取第一块硬盘编号

public String GetHardDiskID()

{

try

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");

String strHardDiskID = null ;

foreach(ManagementObject mo in searcher.Get())

{

strHardDiskID = mo["SerialNumber"].ToString().Trim();

break;

}

return strHardDiskID ;

}

catch

{

return "";

}

}//end

public enum NCBCONST

{

NCBNAMSZ =16, /* absolute length of a net name */

MAX_LANA =254, /* lana's in range 0 to MAX_LANA inclusive */

NCBENUM =0x37, /* NCB ENUMERATE LANA NUMBERS */

NRC_GOODRET =0x00, /* good return */ NCBRESET =0x32, /* NCB RESET */

NCBASTAT =0x33, /* NCB ADAPTER STATUS */

NUM_NAMEBUF =30, /* Number of NAME's BUFFER */

}

[StructLayout(LayoutKind.Sequential)]

public struct ADAPTER_STATUS

[MarshalAs(UnmanagedType.ByValArray, SizeConst=6)] public byte[] adapter_address;

public byte rev_major;

public byte reserved0;

public byte adapter_type;

public byte rev_minor;

public ushort duration;

public ushort frmr_recv;

public ushort frmr_xmit;

public ushort iframe_recv_err;

public ushort xmit_aborts;

public uint xmit_success;

public uint recv_success;

public ushort iframe_xmit_err;

public ushort recv_buff_unavail;

public ushort t1_timeouts;

public ushort ti_timeouts;

public uint reserved1;

public ushort free_ncbs;

public ushort max_cfg_ncbs;

public ushort max_ncbs;

public ushort xmit_buf_unavail;

public ushort max_dgram_size;

public ushort pending_sess;

public ushort max_cfg_sess;

public ushort max_sess;

public ushort max_sess_pkt_size;

public ushort name_count;

}

[StructLayout(LayoutKind.Sequential)]

public struct NAME_BUFFER

{

[MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)] public byte[] name;

public byte name_num;

public byte name_flags;

}

[StructLayout(LayoutKind.Sequential)]

public struct NCB

{

public byte ncb_command;

public byte ncb_retcode;

public byte ncb_lsn;

public byte ncb_num;

public IntPtr ncb_buffer;

public ushort ncb_length;

[MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)] public byte[] ncb_callname;

[MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)] public byte[] ncb_name;

public byte ncb_rto;

public byte ncb_sto;

public IntPtr ncb_post;

public byte ncb_lana_num;

public byte ncb_cmd_cplt;

[MarshalAs(UnmanagedType.ByValArray, SizeConst=10)]

public byte[] ncb_reserve;

public IntPtr ncb_event;

}

[StructLayout(LayoutKind.Sequential)]

public struct LANA_ENUM

{

public byte length;

[MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.MAX_LANA)]

public byte[] lana;

}

[StructLayout(LayoutKind.Auto)]

public struct ASTAT

{

public ADAPTER_STATUS adapt;

[MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NUM_NAMEBUF)] public NAME_BUFFER[] NameBuff;

}

public class Win32API

{

[DllImport("NETAPI32.DLL")]

public static extern char Netbios(ref NCB ncb);

}

public string GetMacAddress()

{

string addr="";

try

{

int cb;

ASTAT adapter;

NCB Ncb=new NCB();

char uRetCode;

LANA_ENUM lenum;

Ncb.ncb_command = (byte)NCBCONST.NCBENUM;

cb = Marshal.SizeOf(typeof(LANA_ENUM));

Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);

Ncb.ncb_length = (ushort)cb;

uRetCode = https://www.360docs.net/doc/a06135865.html,bios(ref Ncb);

lenum = (LANA_ENUM)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(LANA_ENUM)); Marshal.FreeHGlobal(Ncb.ncb_buffer);

if(uRetCode != (short)NCBCONST.NRC_GOODRET)

return "";

for(int i=0; i < lenum.length ;i++)

{

Ncb.ncb_command = (byte)NCBCONST.NCBRESET;

Ncb.ncb_lana_num = https://www.360docs.net/doc/a06135865.html,na[i];

uRetCode = https://www.360docs.net/doc/a06135865.html,bios(ref Ncb);

if(uRetCode != (short)NCBCONST.NRC_GOODRET)

return "";

Ncb.ncb_command = (byte)NCBCONST.NCBASTAT;

Ncb.ncb_lana_num = https://www.360docs.net/doc/a06135865.html,na[i];

Ncb.ncb_callname[0]=(byte)'*';

cb = Marshal.SizeOf(typeof(ADAPTER_STATUS)) +

Marshal.SizeOf(typeof(NAME_BUFFER))*(int)NCBCONST.NUM_NAMEBUF;

Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);

Ncb.ncb_length = (ushort)cb;

uRetCode = https://www.360docs.net/doc/a06135865.html,bios(ref Ncb);

adapter.adapt = (ADAPTER_STATUS)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(ADAPTER_STATUS));

Marshal.FreeHGlobal(Ncb.ncb_buffer);

if (uRetCode == (short)NCBCONST.NRC_GOODRET)

{

if(i>0)

addr += ":";

addr = string.Format("{0,2:X}{1,2:X}{2,2:X}{3,2:X}{4,2:X}{5,2:X}", adapter.adapt.adapter_address[0],

adapter.adapt.adapter_address[1],

adapter.adapt.adapter_address[2],

adapter.adapt.adapter_address[3],

adapter.adapt.adapter_address[4],

adapter.adapt.adapter_address[5]);

}

}

}

catch

{}

return addr.Replace(' ', '0');

}

}

}

机器码获取生成注册码

机器码获取生成注册码 通过获取硬盘的物理序列号和网卡MAC地址,为您的程序提供了获取唯一的机器码,你可以根据此码,生成自己产品注册码,有效防止软件的盗版可以自己根据获取到的硬盘序列号和网卡MAC地址进行一定的加密算法生成,唯一的机器码. 给自己的软件制作注册码.从今天起,您开发的的任何软件如果您愿意都可以为之加密 --为您的软件制作一款注册机!当您看完这篇文章时, 您就可以理直气壮的告诉您的用户 : "喂, 想用我的软件是吧 ? 掏钱!". 呵呵, 这当然只是给自己壮胆的话, 现在连万能注册机都有了, 人家还怕啥 ? 不过只要您想想微软, 人家再牛B的加密技术都会被国人"鄙视"? 但人家不也在中国大把大把的捞钱吗?OK, 不扯了, 我们进入正题.同一般的软件注册一样, 我们这里的注册是这样进行的: 1. 首先根据用户的硬件信息生成24位的机器码 -- 相当于种子,用于生成随机数 2. 采用注册机根据特征数字生成一个24位注册码 -- 相当于伪随机数生成器, 输出长度自己定, 最后用一个格式化函数,将随机数映射到ASCII字符集合 3. 用户输入注册码注册成功 假设客户很喜欢您的软件, 也假设他没有破解, 他需要通过以下方式向您取得注册码: (1).如果他能上网, 他需要把机器码用Email发给您; (2).如果他不能上网, 他可以把机器码用手机短信的方式发给您. (3).如果他没有手机, 他可以带着机器码然后坐火车到您的办公室想您要一个注册码. --第3条只是为了让您看帖子的时候别太枯燥了, 抱歉. 现在, 您拿到了客户的机器码后, 如果您同时也收到了他汇的钱, 呵呵, 好像给软件加密就是为了要钱吧? 那么您就可以用客户的机器码生成一个唯一的注册码再用同样的方式给用户, 最后, 用户输入注册码即可! 需要强调的是客户机器的硬件信息获取方式是有很多种选择的. 这里我们选择最放心的两个硬件: CUP的序列号和硬盘的卷标号. 好了,下面您就可以一步一步制作一款软件注册机了. 步骤一: 获得CUP序列号和硬盘序列号的实现代码如下:Java代码 #region 获取cpu的序列号 public string getCpu() { string strCpu = null; ManagementClass myCpu = new ManagementClass("win32_Processor");

VC++获取网卡MAC、硬盘序列号、CPU+ID、BIOS编号

VC++获取网卡MAC、硬盘序列号、CPU ID、BIOS编号 以下代码可以取得系统特征码(网卡MAC、硬盘序列号、CPU ID、BIOS编号) BYTE szSystemInfo[4096]; // 在程序执行完毕后,此处存储取得的系统特征码 UINT uSystemInfoLen = 0; // 在程序执行完毕后,此处存储取得的系统特征码的长度 // 网卡MAC 地址,注意: MAC 地址是可以在注册表中修改的 { UINT uErrorCode=0; IP_ADAPTER_INFO iai; ULONG uSize = 0; DWORD dwResult = GetAdaptersInfo( &iai, &uSize ); if( dwResult == ERROR_BUFFER_OVERFLOW ) { IP_ADAPTER_INFO* piai=( IP_ADAPTER_INFO* )HeapAlloc( GetProcessHeap( ), 0, uSize ); if( piai != NULL ) { dwResult = GetAdaptersInfo( piai, &uSize ); if( ERROR_SUCCESS == dwResult ) { IP_ADAPTER_INFO* piai2 = piai; while(piai2!=NULL &&(uSystemInfoLen+piai2->AddressLength )< 4096U) { CopyMemory(szSystemInfo+uSystemInfoLen,piai2->Address, piai2->AddressLength ); uSystemInfoLen += piai2->AddressLength; piai2 = piai2->Next; } } else { uErrorCode = 0xF0000000U + dwResult; } VERIFY( HeapFree( GetProcessHeap( ), 0, piai ) ); } else { return FALSE; } } else { uErrorCode = 0xE0000000U + dwResult; } if( uErrorCode != 0U ) { return FALSE; } }

NET获取硬盘序列号的几个方法

最近作软件注册,收集了很多.NET相关的获取硬盘物理序列号的方法,主要分为使用WMI方式和API方式。但这些方法均可能有问题。 1,使用WMI方式,有的机器根本取不到硬盘序列号,有的方式在Vista下面会报错。 常用的使用WMI的方式主要有下面一些方式: class HardDrive { private string model = null; private string type = null; private string serialNo = null; public string Model { get {return model;} set {model = value;} } public string Type { get {return type;} set {type = value;} } public string SerialNo { get {return serialNo;} set {serialNo = value;} } } class TestProgram { ///

/// The main entry point for the application. /// [STAThread] static void Main(string[] args) { //在Vista下面失败 ArrayList hdCollection = new ArrayList(); ManagementObjectSearcher searcher = new

ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); foreach(ManagementObject wmi_HD in searcher.Get()) { HardDrive hd = new HardDrive(); hd.Model = wmi_HD["Model"].ToString(); hd.Type = wmi_HD["InterfaceType"].ToString(); hdCollection.Add(hd); } searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia"); int i = 0; foreach(ManagementObject wmi_HD in searcher.Get()) { // get the hard drive from collection // using index HardDrive hd = (HardDrive)hdCollection[i]; // get the hardware serial no. if (wmi_HD["SerialNumber"] == null) hd.SerialNo = "None"; else hd.SerialNo = wmi_HD["SerialNumber"].ToString(); ++i; } // Display available hard drives foreach(HardDrive hd in hdCollection) { Console.WriteLine("Model\t\t: " + hd.Model); Console.WriteLine("Type\t\t: " + hd.Type); Console.WriteLine("Serial No.\t: " + hd.SerialNo); Console.WriteLine(); } // Pause application Console.WriteLine("Press [Enter] to exit..."); Console.ReadLine(); } }

Linux下获取CPUID、硬盘序列号与MAC地址

Linux下获取CPUID、硬盘序列号与 MAC地址 在很多系统软件的开发中,需要使用一些系统的唯一性信息。所以,得到主机的CPUID、硬盘序列号及网卡的MAC地址,就成个一件很重要的应用。 本人经过一番google即自己的钻研,基本上实现了这几个功能。需要的准备知识有: 1.GCC的嵌入汇编,具体的GCC嵌入汇编知识,请参考相关手册 2.ioctl系统调用,具体的调用方法,请查看手册页 获取CPUID 按照网上提供的说明,CPUID并不是所有的Intel CPU都支持的。如果支持,汇编调用为:eax置0000_0003,调用cpuid。 以下为实现代码(在我的CPU上,并没有得到): #define cpuid(in,a,b,c,d) asm("cpuid": "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (in)); static int getcpuid (char *id, size_t max) { int i; unsigned long li, maxi, maxei, ebx, ecx, edx, unused; cpuid (0, maxi, unused, unused, unused); maxi &= 0xffff; if (maxi < 3) { return -1; } cpuid (3, eax, ebx, ecx, edx); snprintf (id, max, "%08lx %08lx %08lx %08lx", eax, ebx, ecx, edx); fprintf (stdout, "get cpu id: %s\n", id); return 0; } 获取硬盘序列号 这个的实现,采用的是读取/etc/mtab文件,找到/(即根目录)挂载的设备文件,然后打开它,再用系统调用 ioctl来实现的。 ioctl第二个参数为HDIO_GET_IDENTITY, 获得指定文件描述符的标志号 ioctl的第三个参数为struct hd_driveid *,在linux/hdreg.h中,struct hd_driveid 的声明有 struct hd_driveid { unsigned short config; /* lots of obsolete bit flags */ unsigned short cyls; /* Obsolete, "physical" cyls */ unsigned short reserved2; /* reserved (word 2) */ unsigned short heads; /* Obsolete, "physical" heads */ unsigned short track_bytes; /* unformatted bytes per track */ unsigned short sector_bytes; /* unformatted bytes per sector */ unsigned short sectors; /* Obsolete, "physical" sectors per track */ unsigned short vendor0; /* vendor unique */ unsigned short vendor1; /* vendor unique */

VC获得硬盘序列号

VC 之获取硬盘序列号 上一回,一帆风给大家讲了讲如何读取计算机的MAC地址,这次聊聊怎么获取硬盘序列号。硬盘物理序列号是硬盘的出厂序列号,它是全球都是唯一的,不会随着系统的安装、硬盘的格式化等操作而改变,跟mac地址一样都具有唯一性。1,第一步:创建设备对象,得到设备句柄,设备为硬盘。 { CString sFilePath; sFilePath.Format("\\\\.\\PHYSICALDRIVE%d", driver); HANDLE hFile=::CreateFile(sFilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); DWORD dwBytesReturned; GETVERSIONINPARAMS gvopVersionParams; DeviceIoControl(hFile, //向设备对象发送SMART_GET_VERSION设备请求,获取硬盘属性 SMART_GET_VERSION, NULL, 0, &gvopVersionParams, sizeof(gvopVersionParams), &dwBytesReturned, NULL); if(gvopVersionParams.bIDEDeviceMap <= 0) return -2; 2。第二步,发送SMART_RCV_DRIVE_DATA设备请求,获取硬盘详细信息。 // IDE or ATAPI IDENTIFY cmd int btIDCmd = 0; SENDCMDINPARAMS InParams; int nDrive =0; btIDCmd = (gvopVersionParams.bIDEDeviceMap >> nDrive & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY; // 输出参数 BYTE btIDOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1]; if(DoIdentify(hFile, &InParams,

C++获取硬盘序列号

作者自己已经在vs2008下编译通过,此代码获取的是机器的硬盘物理序列号(唯一的,即使格式化硬盘也不变) main.cpp #include "GetHDSerial.h" #include #include #include using namespace std; int main(int argc,char** argv){ CGetHDSerial* disk = new CGetHDSerial; char *diskNumber=disk->GetHDSerial();//获取硬盘序列号 std::cout< #include #define SENDIDLENGTH sizeof (SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE #define IDENTIFY_BUFFER_SIZE 512 #define FILE_DEVICE_SCSI 0x0000001b #define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501) #define IOCTL_SCSI_MINIPORT 0x0004D008 // see NTDDSCSI.H for definition #define IDE_ATAPI_IDENTIFY 0xA1 // Returns ID sector for ATAPI. #define IDE_ATA_IDENTIFY 0xEC // Returns ID sector for ATA. #define IOCTL_GET_DRIVE_INFO 0x0007c088 #define IOCTL_GET_VERSION 0x00074080 typedef struct _IDSECTOR { USHORT wGenConfig; USHORT wNumCyls; USHORT wReserved; USHORT wNumHeads; USHORT wBytesPerTrack; USHORT wBytesPerSector; USHORT wSectorsPerTrack; USHORT wVendorUnique[3]; CHAR sSerialNumber[20]; USHORT wBufferType;

机器码获取生成注册码

机器码获取生成注册码 2010年07月11日星期日 18:06 转载自xhg83 最终编辑xhg83 通过获取硬盘的物理序列号和网卡MAC地址,为您的程序提供了获取唯一的机器码,你可以根据此码,生成自己产品注册码,有效防止软件的盗版可以自己根据获取到的硬盘序列号和网卡MAC地址进行一定的加密算法生成,唯一的机器码. 给自己的软件制作注册码 从今天起, 您开发的的任何软件如果您愿意都可以为之加密 --为您的软件制作一款注册机! 当您看完这篇文章时, 您就可以理直气壮的告诉您的用户 : "喂, 想用我的软件是吧 ? 掏钱!". 呵呵, 这当然只是给自己壮胆的话, 现在连万能注册机都有了, 人家还怕啥 ? 不过只要您想想微软, 人家再牛B的加密技术都会被 国人"鄙视"? 但人家不也在中国大把大把的捞钱吗? OK, 不扯了, 我们进入正题. 同一般的软件注册一样, 我们这里的注册是这样进行的: 1. 首先根据用户的硬件信息生成24位的机器码 -- 相当于种子,用于生成随机数 2. 采用注册机根据特征数字生成一个24位注册码 -- 相当于伪随机数生成器, 输出长度自己定, 最后用一个格式化函数,将随机数映射到ASCII字符集合

3. 用户输入注册码注册成功 假设客户很喜欢您的软件, 也假设他没有破解, 他需要通过以下方式向您取得注册码: (1).如果他能上网, 他需要把机器码用Email发给您; (2).如果他不能上网, 他可以把机器码用手机短信的方式发给您. (3).如果他没有手机, 他可以带着机器码然后坐火车到您的办公室想您要一个注册码. --第3条只是为了让您看帖子的时候别太枯燥了, 抱歉. 现在, 您拿到了客户的机器码后, 如果您同时也收到了他汇的钱, 呵呵, 好像给软件加密就是为了要钱吧? 那么您就可以用客户的机器码生成一个唯一的注册码再用同样的方式给用户, 最后, 用户输入注册码即可! 需要强调的是客户机器的硬件信息获取方式是有很多种选择的. 这里我们选择最放心的两个硬件: CUP的序列号和硬盘的卷标号. 好了, 下面您就可以一步一步制作一款软件注册机了. 步骤一: 获得CUP序列号和硬盘序列号的实现代码如下:

vb获取硬盘序列号利用硬盘序列号计算软件注册码-vb

vb获取硬盘序列号:利用硬盘序列号计算软件注册码-vb教程 疯狂代码 https://www.360docs.net/doc/a06135865.html,/ ?:http:/https://www.360docs.net/doc/a06135865.html,/VisualBasic/Article15611.html 盘序列号计算软件注册码。在模块中加入下列声明: Public Declare Function GetVolumeInformation Lib \"kernel32\" _ Alias \"GetVolumeInformationA\" (ByVal lpRootPathName As String, _ ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, _ lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, _ lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, _ ByVal nFileSystemNameSize As Long) As Long ′得到某一磁盘分区的信息,如C:窗体代码如下: Option Explicit Private Regid, Localid As LongPrivate Sub CmdLocalID_Click() ′根据C盘序列号得到原ID Dim Driver, VolName, Fsys As String Dim volNumber, MCM, FSF As Long Driver = \"c:\\\" Dim res As Long res = GetVolumeInformation(Driver, VolName, 127, volNumber, MCM, FSF, Fsys, 127) ′volNumber是C盘序列号 Localid = volNumber / 2 + 123456789 Text1.Text = Localid End SubPrivate Sub CmdRegID_Click() ′根据原ID算出注册ID If IsNumeric(Text1.Text) Then Regid = CLng(Text1.Text) / 4 * 3 + 987654321 Else ′error End If Text2.Text = Regid End SubPrivate Sub CmndCheckID_Click() ′验证注册ID Dim Driver, VolName, Fsys As String Dim volNumber, MCM, FSF As Long Driver = \"c:\\\" Dim res As Long

如何得到硬盘序列号[C#]

如何得到硬盘序列号[C#] 部门: xxx 时间: xxx 整理范文,仅供参考,可下载自行编辑

硬盘序列号来获取硬盘信息,而不需要写VXD或者DRIVER。这样这个问题就解决了,我对它进行了封装,大量使用了P/Invoke技术,一个完整的Library。支持Windows 98-2003。b5E2RGbCAP 使用上很简单: HardDiskInfo hdd = AtapiDevice.GetHddInfo(0>。 // 第一个硬盘p1EanqFDPw Console.WriteLine("Module Number: {0}", hdd.ModuleNumber>。DXDiTa9E3d Console.WriteLine("Serial Number: {0}", hdd.SerialNumber>。RTCrpUDGiT Console.WriteLine("Firmware: {0}", hdd.Firmware>。Console.WriteLine("Capacity: {0} M", hdd.Capacity>。5PCzVD7HxA 下面是全部代码:

硬盘序列号识别

硬盘序列号识别 一、希捷(Seagate) ST“X,XXXX,XX,XXX”,也就是说其硬盘编号可以分为四部分。 首先,“ST”代表的是“Seagate”,也就是说是希捷公司的产品。 然后第一部分的“X”是表示其硬盘外形和尺寸。“1”表示3.5英寸,厚度为41mm的全高硬盘;“3”表示3.5英寸,厚度为25mm的半高硬盘;“4”表示5.25英寸,厚度为82mm的硬盘;“5”表示尺寸为3.5英寸,厚度为19mm 的硬盘;“9”表示为尺寸2.5英寸的硬盘。 第二部分的四个“X”是表示硬盘的容量,通常由3到4位数字组成,单位是GB。如:“1600”就是表示这硬盘的容量为160GB,而“400”或者“800”就表示其容量为40GB或者80GB了。 第三部分的两个“X”为硬盘标志,由主标志和副标志所组成。前一个数字是主标志,在Seagate的IDE硬盘中都是指硬盘的碟片数,如数字“2”则表示该硬盘采用了2张盘片。而在Seagate的SCSI硬盘中,其主标识则是指硬盘的转速了。有了主标识当然就会有副标识了,而后一个数字就是副标识。它是只有当主标识相同或者无效时,副标识才有意义。它一般代表硬盘的性能和代数,当数字越大,表示的代数越高,性能越好,此款硬盘也就越新。 第三部分的三个“X”主要由1到3个字母所组成,表示硬盘接口类型等。一般的桌面IDE硬盘较为简单,但如果包括了现在和早期的SCSI硬盘的话,其含义就变得较为复杂了。 “A”表示为ATA UDMA/33或UDMA/66 IDE的接口 “AS”表示为Serial ATA150的接口 “AG”表示为笔记本电脑专用的ATA的接口 “N”表示为50针Ultra SCSI的接口,其数据传输率为20MB/s “W”表示为68针Ultra SCSI接口,其数据传输率为40MB/s “WC”表示为80针Ultra SCSI的接口 “FC”表示为光纤,可提供高达100MB/s的数据传输率,并且支持热拔插 “WD”表示为68针Ultra Wide SCSI的接口 “LW”表示为68针Ultra-2 SCSI(LVD)的接口 “LC”表示为80针Ultra-2 SCSI(LVD)的接口 我们以Seagate酷鱼硬盘“ST3160023AS”为例子,通过例子的编号我们可以知道该硬盘是希捷公司生产的3.5英寸厚度为25mm的半高硬盘,其采用2张硬盘盘片,总容量是160GB的Serial ATA150。另外,如果你看到硬盘上印刷着“7200.7”等字符的,就说明这是希捷新推出的单碟容量80GB的硬盘系列;看到“Barracuda 7200.7 Plus”等字符,我们就了解到了这个系列的产品是采用8MB缓存,Serial ATA 150接口或者Ultra ATA 100接口的高端产品 二、三星(SAMSUNG) 目前三星硬盘均属SpinPoint系列,此系列又分为P和V两大类。编号标注形式为“系列型号+转速+容量+缓存+磁头数目+接口类型”。 我们亦可以简单的表示为“X,X,XXX,X,X”五部分。 第一部分的“X”表示硬盘产品系列。这里的“S”就表示为“SpinPoint”系列。 第二部分的“X”表示三星硬盘各系列不同转速的产品。 “V”表示V系列硬盘,转速为5400 RPM/分 “P”表示P系列硬盘,转速为7200 RPM/分

C语言获得硬盘序列号

C++获取硬盘序列号 #include #include #include #pragma argsused #define DFP_GET_VERSION 0x00074080 #define DFP_SEND_DRIVE_COMMAND 0x0007c084 #define DFP_RECEIVE_DRIVE_DA TA 0x0007c088 //#pragma pack(1) typedef struct _GETVERSIONOUTPARAMS { BYTE bVersion; //Binary driver version. BYTE bRevision; //Binary driver revision. BYTE bReserved; //Not used. BYTE bIDEDeviceMap; //Bit map of IDE devices. DWORD fCapabilities; //Bit mask of driver capabilities. DWORD dwReserved[4]; //For future use. } GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOU TPARAMS; typedef struct _IDEREGS { BYTE bFeaturesReg; //Used for specifying SMART "commands". BYTE bSectorCountReg; //IDE sector count register BYTE bSectorNumberReg; //IDE sector number register BYTE bCylLowReg; // IDE low order cylinder value BYTE bCylHighReg; // IDE high order cylinder value BYTE bDriveHeadReg; // IDE drive/head register BYTE bCommandReg; // Actual IDE command. BYTE bReserved; // reserved for future use. Must be zero. } IDEREGS, *PIDEREGS, *LPIDEREGS; typedef struct _SENDCMDINPARAMS { DWORD cBufferSize; // Buffer size in bytes IDEREGS irDriveRegs; // Structure with drive register values. BYTE bDriveNumber; // Physical drive number to send // command to (0,1,2,3). BYTE bReserved[3]; // Reserved for future expansion. DWORD dwReserved[4]; // For future use. //BYTE bBuffer[1]; // Input buffer. } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS; typedef struct _DRIVERSTA TUS { BYTE bDriverError; // Error code from driver, // or 0 if no error. BYTE bIDEStatus; // Contents of IDE Error register. // Only valid when bDriverError

C#程序获得cpu,硬盘的序列号

使用c#获得cpu,硬盘的序列号(源码) 出处:https://www.360docs.net/doc/a06135865.html, //首先在项目中选中右键“引用”→“添加引用”→打开一个界面,切换到.NET选项卡,添//加System.Management“确定”即可。如下图: using System; using System.Runtime.InteropServices; using System.Management; namespace Hardware { ///

/// Hardware_Mac 的摘要说明。 /// public class HardwareInfo { //取机器名 public string GetHostName() {

return https://www.360docs.net/doc/a06135865.html,.Dns.GetHostName(); } //取CPU编号 public String GetCpuID() { try { ManagementClass mc = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = mc.GetInstances(); String strCpuID = null ; foreach( ManagementObject mo in moc ) { strCpuID = mo.Properties["ProcessorId"].Value.ToString(); break; } return strCpuID; } catch { return ""; } }//end method //取第一块硬盘编号 public String GetHardDiskID() { try

获取硬盘序列号

用api函数读取硬盘的序列号 关于盘序列号有两种: 硬盘序列号: 英文名Hard Disk Serial Number, 该号是出厂时生产厂家 为 区别产品而设置的, 是唯一的, 是只读的, 利用硬盘序列号的 加密往往是利用其唯一和只读的特性, 大多是针对有序列号的 IDE HDD而言, 对于没有序列号或SCSI HDD硬盘则无能为力, 这也是利用它进行加密的局限性. 卷的序列号: 英文名Volume Serial Number, 该号既可指软磁盘要 得, 如: A:盘和B:盘的, 又可以指硬盘的逻辑盘, 如: C:, D:...的, 是高级格式化时随机产生的, 是可以修改的, 所以利用其进行 加密, 在写程序时我们想对每一台计算机都生成一个唯一的标识,而且在一此共享软件中我们也看到,软件在不同的机器上生成了不同的标识,这是如何实现的呢,其实是软件有一部分程序读取了,本地计算机的一部分硬件参数(如硬盘序列号,网卡序列号等等),再通过一系列算法而得到了一个唯一标识,其实我们也可以通过一个api函数生成我们的唯一标识,由于硬盘人人都有,而网卡不一定每个人都有,所以以读硬盘序列号为例, 下面就先介绍一下我们要用到的api函数 BOOL GetVolumeInformation( LPCTSTR lpRootPathName, // 硬盘的路径 LPTSTR lpVolumeNameBuffer, // 硬盘的卷标 DWORD nVolumeNameSize, // 卷标的字符串长度 LPDWORD lpVolumeSerialNumber, // 硬盘的序列号 LPDWORD lpMaximumComponentLength, // 最大的文件长度 LPDWORD lpFileSystemFlags, // 文件系统的一此标志 LPTSTR lpFileSystemNameBuffer, // 存储所在盘符的分区类型的长指针变量DWORD nFileSystemNameSize // 分区类型的长指针变量所指向的字符串长度 ); 如果上述函数成功就返回一个非0值。 光说不做,是不行了,我们还得实践一下:// 最大的文件长度 首选用MFC AppWizard建立一个基于Dialog base的对话框工程,名为GetHardID,点击finish。 加一个按钮,双击它,点击ok,并在对应的函数中加入如下代码: LPCTSTR lpRootPathName="c:\\"; //取C盘 LPTSTR lpVolumeNameBuffer=new char[12];//磁盘卷标 DWORD nVolumeNameSize=12;// 卷标的字符串长度 DWORD VolumeSerialNumber;//硬盘序列号 DWORD MaximumComponentLength;// 最大的文件长度 LPTSTR lpFileSystemNameBuffer=new char[10];// 存储所在盘符的分区类型的长

硬盘参数读取程序 - 硬盘型号、容量、序列号、固件版本等for Windows 98MENT2000XP

文件示意图: //--------------------------------------------------------------------------- #include #pragma hdrstop //--------------------------------------------------------------------------- USEFORM("UnitHdDisk.cpp", FormHdParams); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{ try { Application->Initialize(); Application->CreateForm(__classid(TFormHdParams), &FormHdParams); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); }

} return 0; } //--------------------------------------------------------------------------- /*-------------------------------------------------------------------------*\ | | | IDE 硬盘参数读取程序| | ~~~~~~~~~~~~~~~~~~~~ | | Copyright (C) 1997-2003, Victor Chen | | Email: victor@https://www.360docs.net/doc/a06135865.html, | | Homepage: https://www.360docs.net/doc/a06135865.html, | |

如何通过LABVIEW获取硬盘ID

通过LabVIEW获取硬盘序列号 网上这类的帖子很多,不过差不多都是通过调用动态链接库实现的。准确的说实现获取硬盘序列号的工作是由其他语言编写的DLL来实现的。今天我的这例子不用调用动态链接库,直接由LabVIEW来获取硬盘的序列号。 这种方式在一个论坛上看见过,本想参考参考,不过楼主把VI加密了,索性自己做一个和大家分享,讨论讨论。 本程序读取的是硬盘的物理序列号,不同于DLL调用的方法,本方法获取的是硬盘唯一真正物理ID(是固化在硬盘BISO里的SN不是分区的SN),不会出现重复,也不可能被修改(或者说难度很大,而且还有危险,网上看到过说一个叫PC-3000的可以修改,没有尝试过,有哪位胆大拿自己硬盘试验一下,把结果共享一下吧)。可用在软件加密中。 1、原理 大家知道,硬盘相对于CPU来说属于外部设备,而CPU访问外部设备其实就是对外部IO的端口操作,这是硬盘的底层操作,对硬盘的任何操作都可以的,这样只要我们搞清楚如何通过IO指令对硬盘操作和硬盘物理序列号存放的寄存器就可以轻松读取我们所要的硬盘物理序列号了。下面是从网络上搜集的一些资料。 硬盘读写端口的具体含义 对硬盘进行操作的常用端口是1f0h~1f7h号端口,各端口含义如下: 端口号读还是写具体含义 1F0H 读/写用来传送读/写的数据(其内容是正在传输的一个字节的数据) 1F1H 读用来读取错误码 1F2H 读/写用来放入要读写的扇区数量 1F3H 读/写用来放入要读写的扇区号码 1F4H 读/写用来存放读写柱面的低8位字节 1F5H 读/写用来存放读写柱面的高2位字节(其高6位恒为0) 1F6H 读/写用来存放要读/写的磁盘号及磁头号 第7位恒为 1 第6位恒为0 第5位恒为 1 第4位为0代表第一块硬盘、为1代表第二块硬盘 第3~0位用来存放要读/写的磁头号 1f7H 读用来存放读操作后的状态 第7位控制器忙碌 第6位磁盘驱动器准备好了 第5位写入错误 第4位搜索完成 第3位为1时扇区缓冲区没有准备好 第2位是否正确读取磁盘数据 第1位磁盘每转一周将此位设为1, 第0位之前的命令因发生错误而结束 写该位端口为命令端口,用来发出指定命令 为50h 格式化磁道

关于VC获取硬盘序列号

【注意】本文代码可以在XP系统下成功,但在WIN7 系统中不行,因为WIN7 对直接打开磁盘驱动器做了限制,必须要管理员授权。否则以普通用户身份运行会在CreateFile 时返回INV ALID_HANDLE_V ALUE(5:没有权限),从而无法获取硬盘序列号。如何在WIN7 下面不需要以管理员身份运行就可以得到硬盘序列号呢,因为涉及一些软件保护的敏感信息,故暂不在此处发表。 网上有不少相关的问题回答和博客,帖子,讲到这件事。不过我比较不满的是很多人他们都不会说自己的代码是否参考,引用,也不说原创。而且我发现他们有照搬别人的代码的嫌疑。比如说检出序列号字符串的那个辅助函数(好像叫做 ConvertToString),其实这个实现主要是用于颠倒字节顺序,但是它的实现方式就是合理的吗,效率上是可以的吗,代码是优美的吗?在我看来老外这里用的方法不合理。而且它把WORD 数组先灌入一个DWORD 数组,然后再调用ConvertToString 这样的函数去做字节转化,在我看来完全是脱裤子放屁,闲的蛋疼。而且里面用了一个1KB 的static 数组去存储结果,在返回这个地址,让调用方去把结果拷走,你不拷走会发生什么后果呢,你下次再调用,这个地址里的内容又变了。所以这样一个函数如果不看实现,光给你这么一个原型声明(char* ConvertToString...),是一定会让用户发生困惑的。你返给我的是个什么地址,该地址是持久的吗?需要我去释放吗?而我们中国人可倒是好,直接Copy 过来,也不看。好一点的中国人还会大概看一下这个步骤,罗列出具体步骤,不好的就直接把代码贴上去了,他根本也不问也不管里面的代码是什么啊!而那代码我看起来不爽,所以我调试通过以后就想改成比较正确的适合别人使用的方式。 为此,我参考了一些资料。当然,里面有的细节我还没有完全弄明白,比如SENDCMDINPARAMS 里有一些寄存器变量,这个是输入的参数,可是要我怎么设呢,MSDN 网站也语焉不详,为此我只能照搬原来的代码,因为不明细节,所以也只能如此了。 最早我看那个辅助函数就觉得很奇怪,为什么要调用这个辅助函数呢,后来我看了另一个中国人的博客,他指出是对返回的数据的WORD 里面的字节序做调整。所以我才明白这个函数原来主要是把字节进行两两颠倒,好比一串连续的字节:01 23 45 67 89,必须转接成10 32 54 76 98 这个样子。因为识别设备返回值是一个WORD [256] 数组(512 Bytes),应用程序调用DeviceIoControl 像设备驱动程序发送命令(识别设备),然后DeviceIoControl 把结果填充到这个WORD 数组。这个WORD 数组就是驱动程序给出的识别设备的结果,具体是哪个设备,主要是由提供给DeviceIoControl 的第一个参数(设备句柄)来甄别的,设备句柄通过CreateFile 获得。哪么识别设备的结果是256 个WORD(相当于uint16),哪么他们的含义是如何规定的呢,这个属于ATA / ATAPI 的技术标准,是一个统一规定,内容可以搜索网络,有三份文档(PDF文档)详细给出了A TA/ATAPI 的技术规范,当然不同的资料上你会看到里面给出的定义还略微不同,应该是历史发展的原因。也就是这个标准规定了比如WORD 数组里哪些是硬盘的序列号等,所以你会看到代码里有通过对硬编码的WORD 数组索引范围,获取相关信息。现在你就知道了,这些索引值,都是这些文档里的规定。ATA、ATAPI 是什么呢,英文大概是AT Attachment with Packet Interface ,我们不去管它了。 下面是我对网络上那些代码进行修改后得到的代码,是一个win32 console 程序。没有那么多废话,可读性,可用性比网络上的代码更好(你可以看到我整理后的代码非常简短)。当然,如果我们把硬盘序列号作为分发软件时绑定物理硬件使用,实际上就没必要再去做调

相关文档
最新文档