當前位置:首頁 » 編程語言 » c語言硬碟序列號

c語言硬碟序列號

發布時間: 2022-03-05 01:47:24

『壹』 c語言程序讀取u盤物理序列號

vc平台,需要調用相關的Api函數。。查一下MSDN中的 GetVolumeInfomation這個API函數的用法。也可以用度娘搜索一下 精通Windows Api 這本書,裡面詳細介紹了如何獲取存儲器的序列號。。

『貳』 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;
}

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

『叄』 C語言怎麼獲取硬體信息【網卡序號。。。】

這個需要相關的庫以及API。
給你一個獲取cpu信息的函數:
DWORD MyCPUSpeed()
{
BSTR bstrMyCpuName=NULL;
BSTR bstrMyPropName = NULL;
VARIANT pVal;
char szText[256];
int nCpuNum=0;
DWORD dwCpuSpeed=0;
IWbemClassObject *pCpuInst=NULL;
IWbemQualifierSet* pQualSet = NULL;
bstrMyPropName = SysAllocString(L"CurrentClockSpeed");
if(bstrMyPropName == NULL)
{
return dwCpuSpeed;
}
while(1)
{
memset(szText,0,sizeof(szText));
sprintf(szText,"Win32_Processor.DeviceID=\"CPU%d\"", nCpuNum);
bstrMyCpuName = _bstr_t(szText);
if(bstrMyCpuName == NULL)
{
break;
}
if(pSvc->GetObject(bstrMyCpuName, 0L, NULL, &pCpuInst, NULL) != S_OK)
{
break;
}
if(pCpuInst->Get(bstrMyPropName, 0L, &pVal, NULL, NULL) == S_OK)
{
nCpuNum++;
dwCpuSpeed += pVal.lVal;
}
VariantClear(&pVal);
SysFreeString(bstrMyCpuName);
bstrMyCpuName = NULL;
}
if(bstrMyPropName != NULL)
{
SysFreeString(bstrMyPropName);
bstrMyPropName = NULL;
}
if(bstrMyCpuName != NULL)
{
SysFreeString(bstrMyCpuName);
bstrMyCpuName = NULL;
}
memset(szText,0,sizeof(szText));
sprintf(szText, "CPU個數: %d, CPU頻率: %ld Mhz", nCpuNum, dwCpuSpeed);
cout<<"------------------------"<<szText<<"-------------------------"<<endl;
return dwCpuSpeed;
}

『肆』 C語言讀取計算機CPU的序列號、硬碟(網卡、機器名)

說實話,我在圖書館里看過一本叫《C語言編程實戰105例》的一本書,是半年前看的,那裡面有相關的代碼,但是你要CPU號這種高級的東東就不好辦了。我從昨天開始想你的問題。也沒有什麼進展,就到網上就找了找,發現網上有關於這方面的貼子,但那位高手用的是linux的環境做的,在win下不能運行,
http://topic.csdn.net/t/20061110/09/5147214.html這個是那個貼的鏈接。可能對你有點用吧。
對了要求CPU的序列號的話是要一個api及相關的庫,要是沒用這個是不可能做出正來的。我從別的地方搞了一個cpu信息函數,對你有用的:
DWORD MyCPUSpeed()
{
BSTR bstrMyCpuName=NULL;
BSTR bstrMyPropName = NULL;
VARIANT pVal;
char szText[256];
int nCpuNum=0;
DWORD dwCpuSpeed=0;
IWbemClassObject *pCpuInst=NULL;
IWbemQualifierSet* pQualSet = NULL;
bstrMyPropName = SysAllocString(L"CurrentClockSpeed");
if(bstrMyPropName == NULL)
{
return dwCpuSpeed;
}
while(1)
{
memset(szText,0,sizeof(szText));
sprintf(szText,"Win32_Processor.DeviceID=\"CPU%d\"", nCpuNum);
bstrMyCpuName = _bstr_t(szText);
if(bstrMyCpuName == NULL)
{
break;
}
if(pSvc->GetObject(bstrMyCpuName, 0L, NULL, &pCpuInst, NULL) != S_OK)
{
break;
}
if(pCpuInst->Get(bstrMyPropName, 0L, &pVal, NULL, NULL) == S_OK)
{
nCpuNum++;
dwCpuSpeed += pVal.lVal;
}
VariantClear(&pVal);
SysFreeString(bstrMyCpuName);
bstrMyCpuName = NULL;
}
if(bstrMyPropName != NULL)
{
SysFreeString(bstrMyPropName);
bstrMyPropName = NULL;
}
if(bstrMyCpuName != NULL)
{
SysFreeString(bstrMyCpuName);
bstrMyCpuName = NULL;
}
memset(szText,0,sizeof(szText));
sprintf(szText, "CPU個數: %d, CPU頻率: %ld Mhz", nCpuNum, dwCpuSpeed);
cout<<"------------------------"<<szText<<"-------------------------"<<endl;
return dwCpuSpeed;
}

還有一點,我在網上看到和你要求差不多的文章,但是它的代碼好像少了一點什麼,也做一下參考,我們一起研究一下也好。
http://e.codepub.com/2010/0523/22939_3.php
這是那個的鏈接,主要是沒有頭文件和宏什麼的。

『伍』 如何用標準的C語言讀取硬碟的序列號

標准C語言裡面應該沒有這個功能,磁碟物理或者邏輯山區的讀取不算是C語言裡面核心的部分,只是各種C的具體實現一般都包含了硬碟的讀寫功能。

『陸』 用C語言怎麼得到電腦的CPU序列號,硬碟序列號等信息

獲取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

}

『柒』 如何編程讀取硬碟序列號SN

硬碟的序列號只能採用對硬碟控制器直接操作的方式進行讀取,也就是說只能
採用CPU的I/O指令操作硬碟控制器,讀取的方法如下面的C語言程序所示:
static int WaitIde()
{
int al;
while ((al=inp(0x1F7)) >=0x80) ;
return al;
}
static void ReadIDE()
{
int al;
int i;
WORD pw[256];
WaitIde();
outp(0x1F6,0xA0);
al = WaitIde();
if ((al&0x50)!=0x50) return;
outp(0x1F6,0xA0);
outp(0x1F7,0xEC);
al = WaitIde();
if ((al&0x58)!=0x58) return;
for (i=0;i< 256;i++)
pw[i] = inpw(0x1F0);
}
---- 上面的程序實際上讀取了保存在硬碟控制器內的全部信息,而序列號只是其中
的一部分,位於上面提到的 pw[] 數組的 10 至 20 元素內,即從 &pw[10] 開始的10個WORD內,每個WORD占兩個位元組,共佔用了20個位元組。由於該序列號保存時每個WORD的高、低位元組是非Intel順序,也就是說它的高位元組在前,低位元組在後,所以在使用時需要將高、低位元組顛倒一下,這樣就能得到完整的序列號。

『捌』 C語言 獲取硬碟物理號

獲取的大多數是磁碟序列號而已
物理號不容易獲取
可以參考下
http://hiker2008.blog.51cto.com/10867/77918
就於邏輯序列號而言
我把VB改寫成C的,可以參考下:
#include
#include
main()
{
DWORD
VolumeSerialNumber;
char
VolumeName[256];
GetVolumeInformation(
"c:\\
",
VolumeName,12,
&VolumeSerialNumber,
NULL,NULL,NULL,10
);
printf("c盤的卷標:%s
\n",VolumeName);
printf("c盤的序列號:%ld
\n",VolumeSerialNumber);
}

『玖』 如何用C語言獲取硬碟或主板或CPU的序列號

獲取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
}

『拾』 關於C語言程序在一個固定電腦中運行,讀取硬碟序列號的問題

之前收集的獲取硬碟信息的函數語言是C++,可以成功獲得硬碟驅動器的信息,希望能幫到您
void
CGetdiskinfo(DWORD
*dwNum,char
chDriveInfo[][256])//獲取硬碟信息
{
DWORD
DiskCount
=
0;
//利用GetLogicalDrives()函數可以獲取系統中邏輯驅動器的數量,函數返回的是一個32位無符號整型數據。
DWORD
DiskInfo
=
GetLogicalDrives();
//通過循環操作查看每一位數據是否為1,如果為1則磁碟為真,如果為0則磁碟不存在。
while(DiskInfo)
{
//通過位運算的邏輯與操作,判斷是否為1
//Sleep(10);
if(DiskInfo&1)
{
DiskCount++;
}
DiskInfo
=
DiskInfo
>>
1;//通過位運算的右移操作保證每循環一次所檢查的位置向右移動一位。*/
}
//
if
(*dwNum
<
DiskCount)
//
{
//
return;//實際的磁碟數目大於dwNum
//
}
*dwNum
=
DiskCount;//將磁碟分區數量保存
//-------------------------------------------------------------------//
//通過GetLogicalDriveStrings()函數獲取所有驅動器字元串信息長度
int
DSLength
=
GetLogicalDriveStrings(0,NULL);
//
WCHAR*
DStr
=
new
WCHAR[DSLength];
char
*DStr=new
char[DSLength];
memset(DStr,0,DSLength);
//通過GetLogicalDriveStrings將字元串信息復制到堆區數組中,其中保存了所有驅動器的信息

熱點內容
巴法雲伺服器帶寬 發布:2025-01-12 13:15:26 瀏覽:676
搭建國外伺服器需要多少錢 發布:2025-01-12 13:08:01 瀏覽:827
我的世界mod伺服器開荒 發布:2025-01-12 13:07:10 瀏覽:757
sql優化書 發布:2025-01-12 13:07:09 瀏覽:455
高校網站伺服器搭建與維護論文 發布:2025-01-12 13:06:31 瀏覽:711
sqlserver實例沒有 發布:2025-01-12 12:57:18 瀏覽:252
代碼文件伺服器地址怎麼寫 發布:2025-01-12 12:50:47 瀏覽:760
java中方法與 發布:2025-01-12 12:50:13 瀏覽:655
如何快速查找c語言編譯時的錯 發布:2025-01-12 12:49:56 瀏覽:32
看門狗上傳病毒 發布:2025-01-12 12:32:54 瀏覽:326