當前位置:首頁 » 操作系統 » 硬碟序列號源碼

硬碟序列號源碼

發布時間: 2023-02-14 20:22:50

linux下怎麼用c獲取硬碟物理序列號

1、在Linux系統中通過C語言獲取硬碟序列號,可以藉助於ioctl()函數,該函數原型如下:

intioctl(intfd,unsignedlongrequest,...);
ioctl的第一個參數是文件標識符,用open()函數打開設備時獲取。
ioctl第二個參數為用於獲得指定文件描述符的標志號,獲取硬碟序列號,一般指明為HDIO_GET_IDENTITY。
ioctl的第三個參數為一些輔助參數,要獲取硬碟序列號,需要藉助於structhd_driveid結構體來保存硬碟信息,該結構體在Linux/hdreg.h中,structhd_driveid的聲明如下
structhd_driveid{
unsignedshortconfig;/lotsofobsoletebitflags*/
unsignedshortcyls;/*Obsolete,"physical"cyls*/
unsignedshortreserved2;/*reserved(word2)*/
unsignedshortheads;/*Obsolete,"physical"heads*/
unsignedshorttrack_bytes;/*unformattedbytespertrack*/
unsignedshortsector_bytes;/*unformattedbytespersector*/
unsignedshortsectors;/*Obsolete,"physical"sectorspertrack*/
unsignedshortvendor0;/*vendorunique*/
unsignedshortvendor1;/*vendorunique*/
unsignedshortvendor2;/*Retiredvendorunique*/
unsignedcharserial_no[20];/*0=not_specified*/
unsignedshortbuf_type;/*Retired*/
unsignedshortbuf_size;/*Retired,512byteincrements
*0=not_specified
*/
……
};


2、源代碼如下

#include<stdio.h>
//ioctl()的聲明頭文件
#include<sys/ioctl.h>
//硬碟參數頭文件,hd_driveid結構聲明頭文件
#include<linux/hdreg.h>
//文件控制頭文件
#include<sys/fcntl.h>
intmain()
{
//用於保存系統返回的硬碟數據信息
structhd_driveidid;
//這里以第一塊硬碟為例,用戶可自行修改
//用open函數打開獲取文件標識符,類似於windows下的句柄
intfd=open("/dev/sda",O_RDONLY|O_NONBLOCK);
//失敗返回
if(fd<0){
perror("/dev/sda");
return1;}
//調用ioctl()
if(!ioctl(fd,HDIO_GET_IDENTITY,&id))
{
printf("SerialNumber=%s ",id.serial_no);
}
return0;
}

編譯完成後,執行效果如下:

php如何獲取本地機(伺服器)的硬碟序列號

PHP沒有這些功能的,要知道PHP是跨平台的、重點為WEB服務編寫的工具。

不過你可以使用其它語言編寫一個控制台的EXE文件來獲取,然後PHP調用這個程序獲取結果,下面程序可以成功執行:

<?php
$s=`dir`;
echo $s;
?>

把DIR換為你獲取序列號的EXE文件名字既可

③ VB獲取硬碟物理序列號 源碼

Private Declare Function GetVolumeInformation _
Lib "kernel32" Alias "GetVolumeInformationA" _
(ByVal lpRootPathName As String, _
ByVal lpszVolumeNameBuffer As String, _
ByVal lVolumeNameSize As Long, _
lpVolumeSerialNumber As Long, _
lpMaximumComponentLength As Long, _
lpFileSystemFlags As Long, _
ByVal lpszFileSystemNameBuffer As String, _
ByVal nFileSystemNameSize As Long) As Long

Public Function GetVolumeSerialNumber(ByVal RootPath As String) As String

Dim lpszVolumeNameBuffer As String

Dim lpszFileSystemNameBuffer As String

Dim lVolumeNameSize As Long

Dim lpVolumeSerialNumber As Long

Dim lpMaximumComponentLength As Long

Dim lpFileSystemFlags As Long

Dim nFileSystemNameSize As Long

Dim lRetVal As Long

lpVolumeSerialNumber = 0

lpMaximumComponentLength = 0

lpFileSystemFlags = 0

lpszVolumeNameBuffer = Space$(255)

lpszFileSystemNameBuffer = Space(255)

lVolumeNameSize = Len(lpszVolumeNameBuffer)

nFileSystemNameSize = Len(lpszFileSystemNameBuffer)

lRetVal = GetVolumeInformation(RootPath, _
lpszVolumeNameBuffer, _
lVolumeNameSize, _
lpVolumeSerialNumber, _
lpMaximumComponentLength, _
lpFileSystemFlags, _
lpszFileSystemNameBuffer, _
nFileSystemNameSize)

GetVolumeSerialNumber = Hex$(lpVolumeSerialNumber)

End Function

Private Sub Command1_Click()
Dim sRetVal As String

sRetVal = GetVolumeSerialNumber("C:\")

MsgBox "VolumeSerialNumber is: " & sRetVal

End Sub

只需在窗體建一個COMMAND1。

④ vb6怎樣讀取win10下硬碟序列號

vb6讀取win10下硬碟序列號方法如下:


1、是指硬碟物理序列號,格式化沒有變化。

2、支持vista 及win10系統。

3、支持多塊硬碟(有的電腦裝有幾塊硬碟)

4、支持串口及並口硬碟。

5、最好是源碼或dll 等,代碼如下:

  • Visual Basic code

'-------------------添加類模塊clsMainInfo-------------------------

Option Explicit

Private Const VER_PLATFORM_WIN32S = 0

Private Const VER_PLATFORM_WIN32_WINDOWS = 1

Private Const VER_PLATFORM_WIN32_NT = 2

Private Const DFP_RECEIVE_DRIVE_DATA = &H7C088

Private Const FILE_SHARE_READ = &H1

Private Const FILE_SHARE_WRITE = &H2

Private Const GENERIC_READ = &H80000000

Private Const GENERIC_WRITE = &H40000000

Private Const OPEN_EXISTING = 3

Private Const Create_NEW = 1

Private Enum HDINFO

HD_MODEL_NUMBER

HD_SERIAL_NUMBER

HD_FIRMWARE_REVISION

End Enum

Private Type OSVERSIONINFO

dwOSVersionInfoSize As Long

dwMajorVersion As Long

dwMinorVersion As Long

dwBuildNumber As Long

dwPlatformId As Long

szCSDVersion As String * 128

End Type

Private Type IDEREGS

bFeaturesReg As Byte

bSectorCountReg As Byte

bSectorNumberReg As Byte

bCylLowReg As Byte

bCylHighReg As Byte

bDriveHeadReg As Byte

bCommandReg As Byte

bReserved As Byte

End Type

Private Type SENDCMDINPARAMS

cBufferSize As Long

irDriveRegs As IDEREGS

bDriveNumber As Byte

bReserved(1 To 3) As Byte

dwReserved(1 To 4) As Long

End Type

Private Type DRIVERSTATUS

bDriveError As Byte

bIDEStatus As Byte

bReserved(1 To 2) As Byte

dwReserved(1 To 2) As Long

End Type

Private Type SENDCMDOUTPARAMS

cBufferSize As Long

DStatus As DRIVERSTATUS

bBuffer(1 To 512) As Byte

End Type

Private Declare Function GetVersionEx _

Lib "kernel32" Alias "GetVersionExA" _

(lpVersionInformation As OSVERSIONINFO) As Long

Private Declare Function CreateFile _

Lib "kernel32" Alias "CreateFileA" _

(ByVal lpFileName As String, _

ByVal dwDesiredAccess As Long, _

ByVal dwShareMode As Long, _

ByVal lpSecurityAttributes As Long, _

ByVal dwCreationDisposition As Long, _

ByVal dwFlagsAndAttributes As Long, _

ByVal hTemplateFile As Long) As Long

Private Declare Function CloseHandle _

Lib "kernel32" _

(ByVal hObject As Long) As Long

Private Declare Function DeviceIoControl _

Lib "kernel32" _

(ByVal hDevice As Long, _

ByVal dwIoControlCode As Long, _

lpInBuffer As Any, _

ByVal nInBufferSize As Long, _

lpOutBuffer As Any, _

ByVal nOutBufferSize As Long, _

lpBytesReturned As Long, _

ByVal lpOverlapped As Long) As Long

Private Declare Sub ZeroMemory _

Lib "kernel32" Alias "RtlZeroMemory" _

(dest As Any, _

ByVal numBytes As Long)

Private Declare Sub CopyMemory _

Lib "kernel32" Alias "RtlMoveMemory" _

(Destination As Any, _

Source As Any, _

ByVal Length As Long)

Private Declare Function GetLastError _

Lib "kernel32" () As Long

Private mvarCurrentDrive As Byte

Private mvarPlatform As String

Public Function GetModelNumber() As String

GetModelNumber = CmnGetHDData(HD_MODEL_NUMBER)

End Function

Public Function GetSerialNumber() As String

GetSerialNumber = CmnGetHDData(HD_SERIAL_NUMBER)

End Function

Public Function GetFirmwareRevision() As String

GetFirmwareRevision = CmnGetHDData(HD_FIRMWARE_REVISION)

End Function

Public Property Let CurrentDrive(ByVal vData As Byte)

If vData < 0 Or vData > 3 Then

Err.Raise 10000, , "Illegal Drive Number"

End If

mvarCurrentDrive = vData

End Property

Public Property Get CurrentDrive() As Byte

CurrentDrive = mvarCurrentDrive

End Property

Public Property Get Platform() As String

Platform = mvarPlatform

End Property

Private Sub Class_Initialize()

Dim OS As OSVERSIONINFO

OS.dwOSVersionInfoSize = Len(OS)

Call GetVersionEx(OS)

mvarPlatform = "Unk"

Select Case OS.dwPlatformId

Case Is = VER_PLATFORM_WIN32S

mvarPlatform = "32S"

Case Is = VER_PLATFORM_WIN32_WINDOWS

If OS.dwMinorVersion = 0 Then

mvarPlatform = "W95"

Else

mvarPlatform = "W98"

End If

Case Is = VER_PLATFORM_WIN32_NT

mvarPlatform = "WNT"

End Select

End Sub

Private Function CmnGetHDData(hdi As HDINFO) As String

Dim bin As SENDCMDINPARAMS

Dim bout As SENDCMDOUTPARAMS

Dim hdh As Long

Dim br As Long

Dim ix As Long

Dim hddfr As Long

Dim hddln As Long

Dim s As String

Select Case hdi

Case HD_MODEL_NUMBER

hddfr = 55

hddln = 40

Case HD_SERIAL_NUMBER

hddfr = 21

hddln = 20

Case HD_FIRMWARE_REVISION

hddfr = 47

hddln = 8

Case Else

Err.Raise 10001, "Illegal HD Data type"

End Select

Select Case mvarPlatform

Case "WNT"

hdh = CreateFile("\.PhysicalDrive" & mvarCurrentDrive, GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)

Case "W95", "W98"

hdh = CreateFile("\.Smartvsd", 0, 0, 0, Create_NEW, 0, 0)

Case Else

Err.Raise 10002, , "Illegal platform (only WNT, W98 or W95)"

End Select

If hdh = 0 Then

Err.Raise 10003, , "Error on CreateFile"

End If

ZeroMemory bin, Len(bin)

ZeroMemory bout, Len(bout)

With bin

.bDriveNumber = mvarCurrentDrive

.cBufferSize = 512

With .irDriveRegs

If (mvarCurrentDrive And 1) Then

.bDriveHeadReg = &HB0

Else

.bDriveHeadReg = &HA0

End If

.bCommandReg = &HEC

.bSectorCountReg = 1

.bSectorNumberReg = 1

End With

End With

DeviceIoControl hdh, DFP_RECEIVE_DRIVE_DATA, bin, Len(bin), bout, Len(bout), br, 0

s = vbNullString

For ix = hddfr To hddfr + hddln - 1 Step 2

If bout.bBuffer(ix + 1) = 0 Then Exit For

s = s & Chr(bout.bBuffer(ix + 1))

If bout.bBuffer(ix) = 0 Then Exit For

s = s & Chr(bout.bBuffer(ix))

Next ix

CloseHandle hdh

CmnGetHDData = Trim(s)

End Function

  • Visual Basic code

Option Explicit

'純vb的獲取硬碟序列號代碼 (摘自枕善居)

'窗體放置1個ComBox,命名為cbDrive,1個ListBox,命名為lstMain,一個CommandButton,命名為cmdGo,添加如下代碼

Dim h As clsMainInfo

Private Sub cmdGo_Click()

Dim hT As Long

Dim uW() As Byte

Dim dW() As Byte

Dim pW() As Byte

Set h = New clsMainInfo

With h

.CurrentDrive = Val(cbDrive.Text)

lstMain.Clear

lstMain.AddItem "當前驅動器: " & .CurrentDrive

lstMain.AddItem ""

lstMain.AddItem "硬碟型號: " & .GetModelNumber

lstMain.AddItem "序列號: " & .GetSerialNumber

lstMain.AddItem "固件版本: " & .GetFirmwareRevision

End With

Set h = Nothing

End Sub

Private Sub Form_Load()

cbDrive.AddItem 0

cbDrive.AddItem 1

cbDrive.AddItem 2

cbDrive.AddItem 3

cbDrive.ListIndex = 0

End Sub

⑤ win10系統硬碟序列號怎麼看

首先打開運行窗口,在運行窗口中輸入cmd進入命令提示符。

然後在命令提示符中執行命令diskpart來查看硬碟序列號。

⑥ 求獲取SCSI硬碟物理序列號的VB源代碼

一、關於SCSI硬碟
SCSI的硬碟很多根本沒有物理序列號,很多有序列號也無法得到。

這取決於SCSI卡,打個比方,一個單位對果信息公開,公布其每個單位的個人姓名與身份證號,那外界才能知道這個單位的每個人的這方面的情況,如果這個單位不公開,僅告訴你這個單位能為你做什麼,那你就沒辦法了。

很多SCSI卡接上硬碟後,它的硬碟是以一個整體來面向外界的,比如典型的RAID5,4個甚至更多的硬碟對外界來說,就象是在操作一個硬碟一樣,至於數據的保存和處理是經過SCSI這個中間層去接管的,外界根本無法獲知SCSI卡裡面的詳情(表現在win中,就是看起來它就是只有一個硬碟)。

如果實在要知道SCSI卡後面硬碟的詳情,那得了解某個SCSI卡的硬體介面的具體代碼,而這個代碼各SCSI卡是完全不同的,多數也是根本不公開的。

二、關於IDE硬碟。
IDE硬碟的序列號是比較容易得到的,也很容易在網上搜到相關的資料。但必需提示的一點是,IDE硬碟並不是所有的品牌、型號都擁有物理序號。

SATA沒有試過,不是很清想,你可以用IDE的代碼去試試。

三、在當前,抓硬碟物理序號只有一個用處,那就是得到機器唯一特徵。很抱歉地說,現在的機器不會,也不允許讓你通過一個硬體來得到機器的物征,因為這會給用戶自身的安全帶來很大的問題!曾經Intel不是想通過在CPU上加上ID來確定機器身份嗎?後來因為絕大多數人的反感和抵制而中途而廢。

四、在當前,想得到一個機器的特徵,只能通過多個硬體來確定!如硬碟型號、主板型號、內存型號、CPU型號等等。

⑦ 誰有C#根據各種機器碼自動生成「序列號」的程序源碼

if (label2.Text != "") { //把機器碼存入數組中 setIntCode();//初始化127位數組 for (int i = 1; i < Charcode.Length; i++)//把機器碼存入數組中 { Charcode[i] = Convert.ToChar(label2.Text.Substring(i - 1, 1)); }// for (int j = 1; j < intNumber.Length; j++)//把字元的ASCII值存入一個整數組中。 { intNumber[j] = intCode[Convert.ToInt32(Charcode[j])] + Convert.ToInt32(Charcode[j]); } string strAsciiName = null;//用於存儲機器碼 for (int j = 1; j < intNumber.Length; j++) { //MessageBox.Show((Convert.ToChar(intNumber[j])).ToString()); if (intNumber[j] >= 48 && intNumber[j] <= 57)//判斷字元ASCII值是否0-9之間 { strAsciiName += Convert.ToChar(intNumber[j]).ToString(); } else if (intNumber[j] >= 65 && intNumber[j] <= 90)//判斷字元ASCII值是否A-Z之間 { strAsciiName += Convert.ToChar(intNumber[j]).ToString(); } else if (intNumber[j] >= 97 && intNumber[j] <= 122)//判斷字元ASCII值是否a-z之間 { strAsciiName += Convert.ToChar(intNumber[j]).ToString(); } else//判斷字元ASCII值不在以上范圍內 { if (intNumber[j] > 122)//判斷字元ASCII值是否大於z { strAsciiName += Convert.ToChar(intNumber[j] - 10).ToString(); } else { strAsciiName += Convert.ToChar(intNumber[j] - 9).ToString(); } } label3.Text = strAsciiName;//得到注冊碼 } } else { MessageBox.Show("請選生成機器碼","注冊提示"); }

麻煩採納,謝謝!

熱點內容
我的世界怎麼把材質包裝進伺服器電腦版 發布:2025-07-27 12:33:57 瀏覽:395
手游吃雞90幀要什麼配置 發布:2025-07-27 12:31:41 瀏覽:823
壓生庚演算法 發布:2025-07-27 12:31:37 瀏覽:443
伺服器版本更新是什麼意思 發布:2025-07-27 12:25:42 瀏覽:574
安卓畫畫軟體是什麼 發布:2025-07-27 12:25:40 瀏覽:642
python編程入門第3版pdf 發布:2025-07-27 12:25:04 瀏覽:871
唐燃油與h7配置哪個好 發布:2025-07-27 12:24:12 瀏覽:787
上傳圖片兼容ie8 發布:2025-07-27 12:17:45 瀏覽:550
如何配置債券賺錢 發布:2025-07-27 12:17:32 瀏覽:920
安卓主力機備用機選什麼 發布:2025-07-27 12:15:58 瀏覽:873