如何用C语言获取硬盘或主板或CPU的序列号

如何用C语言获取硬盘或主板或CPU的序列号,第1张

获取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编号等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9497478.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存