
获取CPU序列号要使用
汇编指令
比较麻烦
static
DWORD
g_eax;
//
存储返回的eax
static
DWORD
g_ebx;
//
存储返回的ebx
static
DWORD
g_ecx;
//
存储返回的ecx
static
DWORD
g_edx;
//
存储返回的edx
void
Executecpuid(DWORD
veax)
{
asm("cpuid"
:"=a"(g_eax),
"=b"(g_ebx),
"=c"(g_ecx),
"=d"(g_edx)
:"a"(g_eax));
}
int
isSupport;
void
GetSerialNumber(WORD
nibble[6])
{
Executecpuid(1);
//
执行cpuid,参数为
eax
=
1
isSupport
=
g_edx
&
(1<<18);
//
edx是否为1代表CPU是否存在序列号
if
(FALSE
==
isSupport)
//
不支持,返回false
{
return
;
}
Executecpuid(3);
//
执行cpuid,参数为
eax
=
3
memcpy(&nibble[4],
&g_eax,
4);
//
eax为最高位的两个WORD
memcpy(&nibble[0],
&g_ecx,
8);
//
ecx
和
edx为低位的4个WORD
}
function GetVolumeID : string;
var
vVolumeNameBuffer: array[0255]of Char;
vVolumeSerialNumber: DWORD;
vMaximumComponentLength: DWORD;
vFileSystemFlags: DWORD;
vFileSystemNameBuffer: array[0255]of Char;
begin
if GetVolumeInformation('C:\', vVolumeNameBuffer, SizeOf(vVolumeNameBuffer),
@vVolumeSerialNumber, vMaximumComponentLength, vFileSystemFlags,
vFileSystemNameBuffer, SizeOf(vFileSystemNameBuffer)) then
begin
Result := IntToHex(vVolumeSerialNumber, 8);
end;
end;
同LS BS 4L &易语言LZ的问题应该是没有声明一个RegistryKeyRegistryKey regNew_GetDisk = RegistryLocalMachineOpenSubKey(@\"\\HardWare\\Devicemap\\Scsi\\Scsi port 0\\Scsi Bus 0\\Target Id\\\\Logical Unit Id 0\", false);string Value = regNew_GetDiskGetValue(\"Identifier\",\"none\")ToString ();MessageBoxShow(Value);regNew_GetDiskClose();注意引用MicrosoftWin32 namespace
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Set objWMIService = GetObject("winmgmts:\\\root\CIMV2")
Set colItems = objWMIServiceExecQuery("SELECT FROM Win32_DiskDrive", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
WScriptEcho "硬盘序列号: " & objItemSignature
WScriptEcho
Next
直接保存成vbs,双击,运行就可以看到了
Option Explicit
Private Declare Function IsWinNT Lib "DiskIDDLL " () As Long
Private Declare Function ReadPhysicalDrive9X Lib "DiskIDDLL " _
(ByVal driveID As Long, ByVal lpBuffer As Long, ByVal bufLen As Long) As Long
Private Declare Function ReadPhysicalDriveInNT Lib "DiskIDDLL " _
(ByVal driveID As Long, ByVal lpBuffer As Long, ByVal bufLen As Long) As Long
Private Type DRIVER_INFO_OK
ModalNumber(39) As Byte
SerialNumber(19) As Byte
ControlNum(7) As Byte
DriveType As Long
Cylinders As Long
Heads As Long
Sectors As Long
End Type
Public Function GetDiskID_Demo()
'获取硬盘信息的演示程序。
Dim x As DRIVER_INFO_OK
Dim i As Long
If IsWinNT = 1 Then
i = ReadPhysicalDriveInNT(ByVal 0&, ByVal VarPtr(x), LenB(x))
Else
i = ReadPhysicalDrive9X(ByVal 0&, ByVal VarPtr(x), LenB(x))
End If
MsgBox "BufLen: " & LenB(x)
Dim s As String
s = StrConv(xModalNumber, vbUnicode)
s = Left(s, InStr(1, s, ChrW(0)) - 1)
MsgBox "硬件厂商代码为: " + s
s = StrConv(xSerialNumber, vbUnicode)
s = Left(s, InStr(1, s, ChrW(0)) - 1)
MsgBox "硬盘序列号为: " + s
End Function
BOOL __fastcall DoIdentify( HANDLE hPhysicalDriveIOCTL,
PSENDCMDINPARAMS pSCIP,
PSENDCMDOUTPARAMS pSCOP,
BYTE btIDCmd,
BYTE btDriveNum,
PDWORD pdwBytesReturned)
{
pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE;
pSCIP->irDriveRegsbFeaturesReg = 0;
pSCIP->irDriveRegsbSectorCountReg = 1;
pSCIP->irDriveRegsbSectorNumberReg = 1;
pSCIP->irDriveRegsbCylLowReg = 0;
pSCIP->irDriveRegsbCylHighReg = 0;
pSCIP->irDriveRegsbDriveHeadReg = (btDriveNum & 1) 0xB0 : 0xA0;
pSCIP->irDriveRegsbCommandReg = btIDCmd;
pSCIP->bDriveNumber = btDriveNum;
pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE;
return DeviceIoControl( hPhysicalDriveIOCTL,
SMART_RCV_DRIVE_DATA,
(LPVOID)pSCIP,
sizeof(SENDCMDINPARAMS) - 1,
(LPVOID)pSCOP,
sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
pdwBytesReturned, NULL);
}
char __fastcall ConvertToString(DWORD dwDiskData[256], int nFirstIndex, int nLastIndex)
{
static char szResBuf[1024];
char ss[256];
int nIndex = 0;
int nPosition = 0;
for(nIndex = nFirstIndex; nIndex <= nLastIndex; nIndex++)
{
ss[nPosition] = (char)(dwDiskData[nIndex] / 256);
nPosition++;
// Get low BYTE for 2nd character
ss[nPosition] = (char)(dwDiskData[nIndex] % 256);
nPosition++;
}
// End the string ss[nPosition] = '\0';
int i, index=0;
for(i=0; i<nPosition; i++)
{
if(ss[i]==0 || ss[i]==32) continue;
szResBuf[index]=ss[i];
index++;
}
szResBuf[index]=0;
return szResBuf;
}
int GetID() //主函数
{
//创建设备对象,得到设备句柄,设备为硬盘。
CString sFilePath;
sFilePathFormat("\\\\\\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(gvopVersionParamsbIDEDeviceMap <= 0) return -2;
//发送SMART_RCV_DRIVE_DATA设备请求,获取硬盘详细信息。
// IDE or ATAPI IDENTIFY cmd
int btIDCmd = 0;
SENDCMDINPARAMS InParams;
int nDrive =0;
btIDCmd = (gvopVersionParamsbIDEDeviceMap >> nDrive & 0x10) IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
// 输出参数
BYTE btIDOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
if(DoIdentify(hFile,
&InParams,
(PSENDCMDOUTPARAMS)btIDOutCmd,
(BYTE)btIDCmd,
(BYTE)nDrive, &dwBytesReturned) == FALSE) return -3;
::CloseHandle(hFile);
DWORD dwDiskData[256]; USHORT pIDSector; // 对应结构IDSECTOR,见头文件
pIDSector = (USHORT)((SENDCMDOUTPARAMS)btIDOutCmd)->bBuffer; for(int i=0; i < 256; i++) dwDiskData[i] = pIDSector[i];
// 取系列号
ZeroMemory(szSerialNumber, sizeof(szSerialNumber));
strcpy(szSerialNumber, ConvertToString(dwDiskData, 10, 19));
// 取模型号
ZeroMemory(szModelNumber, sizeof(szModelNumber));
strcpy(szModelNumber, ConvertToString(dwDiskData, 27, 46));
return 0;}
以上就是关于如何用C语言获取硬盘或主板或CPU的序列号全部的内容,包括:如何用C语言获取硬盘或主板或CPU的序列号、如何用delphi获取硬盘的唯一的序列号码(S N)、如何用C#获取硬盘ID编号等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)