小弟只有20分,还望各位高手大小通吃。--如何获取硬盘的出厂序列号

jkai 2001-09-10 11:06:42
我想获得硬盘的出厂序列号(不是要驱动器的卷标),请问有何好方法?
...全文
156 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bardo 2002-01-22
  • 打赏
  • 举报
回复
这个程序一定是对的;须注意的是如果返回的是逻辑驱动器则是Volume

'even this will bring up same result:
'you will get two different serail number for the two drives.
'It seems as if logical drives get their own serial number...
Private 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
Private Sub Form_Load()
'KPD-Team 1998
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Dim Serial As Long, VName As String, FSName As String
'Create buffers
VName = String$(255, Chr$(0))
FSName = String$(255, Chr$(0))
'get the volume information
GetVolumeInformation "C:\", VName, 255, Serial, 0, 0, FSName, 255
'Strip the extra chr$(0)'s
VName = Left$(VName, InStr(1, VName, Chr$(0)) - 1)
FSName = Left$(FSName, InStr(1, FSName, Chr$(0)) - 1)
MsgBox "The Volume name of C:\ is '" + VName + "', the File system name of C:\ is '" + FSName + "' and the serial number of C:\ is '" + Trim(Str$(Serial)) + "'", vbInformation + vbOKOnly, App.Title
End Sub
y1g1y1 2002-01-22
  • 打赏
  • 举报
回复
http://ygyuan.go.163.com/
http://ygyuan.3322.net/
下载并安装"雁留声名录系统",然后你就可以得到第一个硬盘的序列号了!

Private Declare Function GetDiskSN Lib "GetDiskSN.dll" (ByVal lpszSN As String) As Double

Dim s As String
s = String(1024, Chr(0))
GetDiskSN (s)
s = Trim(Replace(s, Chr(0), ""))
msgbox s
NowCan 2001-09-14
  • 打赏
  • 举报
回复
哦,忘了,这里是VB。
NowCan 2001-09-14
  • 打赏
  • 举报
回复
那个dll还有个问题,就是不能用于WinNT、Win2000。因此我估计它是直接读写端口实现的。如下
#include <stdio.h>

char *GetAscii(unsigned int inData[], int offStart, int offEnd);
int main(void)
{
unsigned int diskData[256]; /* Disk data */
unsigned int offset; /* Disk data offset */
int loop;
int numDrv; /* Number of IDE hard drives */
union REGS registers;
unsigned int biosCyl[2]; /* Cylinders, Heads, Sectors */
unsigned int biosHead[2];
unsigned int biosSec [2];
numDrv = peekb(0x40, 0x75); /* BIOS Data area, Number of Hard disks */
for (loop = 0; loop < numDrv; loop++)
{
while (inp(0x01f7) != 0x50); /* Wait for controller not busy */
outp(0x01f6, (loop == 0 ? 0xa0 : 0xb0)); /* Get first/second drive */
outp(0x01f7, 0xec); /* Get drive info data */
while (inp(0x1f7) != 0x58); /* Wait for data ready */
for (offset = 0; offset != 256; offset++) /* Read "sector" */
diskData[offset] = inpw(0x1f0);
/* Get BIOS drive info */
registers.h.ah = 0x08; /* Get drive info */
registers.h.dl = 0x80 + loop; /* Drive is 80H for Disk 0, 81H for Disk 1 */
int86(0x13, ?isters, ?isters);
if (!registers.x.cflag) /* All OK if carry not set */
{
biosHead[loop] = registers.h.dh + 1; /* Heads are from 0 */
biosSec[loop] = registers.h.cl & 0x3f; /* sec is bits 5 - 0 */
/* +1 because starts from 0 and +1 for FDISK leaving one out */
biosCyl[loop] = ((registers.h.cl & 0xc0) << 2) + registers.h.ch + 2;
} /* end of if */
printf("DRIVE %d:\n", loop);
printf("Model Number______________________: %s\n", GetAscii(diskData, 27, 46));
printf("Serial Number_____________________: %s\n", GetAscii(diskData, 10, 19));
printf("Controller Revision Number________: %s\n\n", GetAscii(diskData, 23, 26));
printf("Able to do Double Word Transfer___: %6s\n", (diskData[48] == 0 ? "No" : "Yes"));
printf("Controller type___________________: %04X\n", diskData[20]);
printf("Controller buffer size (bytes)____: %6u\n", diskData[21] * 512);
printf("Number of ECC bytes transferred___: %6u\n", diskData[22]);
printf("Number of sectors per interrupt___: %6u\n\n", diskData[47]);
printf("Hard Disk Reports\n");
printf("Number of Cylinders (Fixed)_______: %6u\n", diskData[1]);
printf("Number of Heads___________________: %6u\n", diskData[3]);
printf("Number of Sectors per Track_______: %6u\n\n", diskData[6]);
printf("BIOS Reports\n");
printf("Number of Cylinders_______________: %6u\n", biosCyl[loop]);
printf("Number of Heads___________________: %6u\n", biosHead[loop]);
printf("Number of Sectors per Track_______: %6u\n\n", biosSec[loop]);
printf("Press any key to continue...\n\n");
getch();
} /* end of for */
return 0;
} /* main() */
char *GetAscii(unsigned int inData[], int offStart, int offEnd)
{
static char retVal[255];
int loop, loop1;
for (loop = offStart, loop1 = 0; loop <= offEnd; loop++)
{
retVal[loop1++] = (char )(inData[loop] / 256); /* Get High byte */
retVal[loop1++] = (char )(inData[loop] % 256); /* Get Low byte */
} /* end of for */
retVal[loop1] = '\0'; /* Make sure it ends in a NULL character */
return retVal;
} /* GetAscii() */

qjxqjx 2001-09-14
  • 打赏
  • 举报
回复
gz
pengcheng 2001-09-14
  • 打赏
  • 举报
回复
up
vbkiller 2001-09-14
  • 打赏
  • 举报
回复
gz
jkai 2001-09-14
  • 打赏
  • 举报
回复
  大家有没有注意到?在format后会出现一个xxxx-xxxx的序列号,这就是用GetVolumeInformation所能得到的序列号,然而我并不需要这个而是硬盘的物理序列号,每个硬盘只有一个、固化在ROM内,号称全球唯一。
  我发现的这个DLL的确可以取到物理序列号,但它要注册,我需要时间用ultraedit将它解密。
Homo 2001-09-13
  • 打赏
  • 举报
回复
Private Declare Function GetVolumeInformation Lib _
"kernel32.dll" Alias "GetVolumeInformationA" (ByVal _
lpRootPathName As String, ByVal lpVolumeNameBuffer As _
String, ByVal nVolumeNameSize As Integer, _
lpVolumeSerialNumber As Long, lpMaximumComponentLength _
As Long, lpFileSystemFlags As Long, ByVal _
lpFileSystemNameBuffer As String, ByVal _
nFileSystemNameSize As Long) As Long



'代码如下:



Function GetSerialNumber(strDrive As String) As Long

Dim SerialNum As Long

Dim Res As Long

Dim Temp1 As String

Dim Temp2 As String

Temp1 = String$(255, Chr$(0))

Temp2 = String$(255, Chr$(0))

Res = GetVolumeInformation(strDrive, Temp1, _
Len(Temp1), SerialNum, 0, 0, Temp2, Len(Temp2))

GetSerialNumber = SerialNum

End Function


Private Sub form_load()


'使用该函数:



MsgBox GetSerialNumber("c:\")



'它将告诉你C驱的磁盘序号。

End Sub
jkai 2001-09-13
  • 打赏
  • 举报
回复
  原来在CSDN有这样的DLL下载,下载地点是http://www.csdn.net/cnshare/soft/4/4806.html,大家一起来Down吧。
sunbf 2001-09-10
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/Topic/277/277190.shtm
http://www.csdn.net/expert/Topic/263/263492.shtm
tianye 2001-09-10
  • 打赏
  • 举报
回复
观望,我也想知道
Re: 《 Linux磁盘与文件系统管理命令 》   ---------------------------------------内容提要: 01/16)命令fdisk           :磁盘区工具02/16)命令partprobe  :更新内核的硬盘区表信息(即区即刻生效)03/16)命令 tune2fs     :调整 ext2/ext3/ext4 文件系统参数04/16)命令 parted       :磁盘区工具(大小通吃)05/16)命令 mkfs          :创建Linux文件系统06/16)命令 dumpe2fs :导出ext2/ext3/ext4文件系统信息07/16)命令 resize2fs   :调整ext2/ext3/ext4文件系统大小08/16)命令 fsck           :检查并修复Linux文件系统09/16)命令 dd             :转换或复制文件10/16)命令 mount       :挂载文件系统11/16)命令 umount     :卸载文件系统12/16)命令 df              :报告文件系统磁盘空间的使用情况13/16)命令 mkswap    :创建交换区14/16)命令 swapon     :激活交换区15/16)命令 swapoff     :关闭交换区16/16)命令 sync           :刷新文件系统缓冲区17/17)附录                   :NFS 网络文件服务器到安装;客户端的挂载 -t nfs;及新区的权限测试  本人在教学和实战过程中发现,即便是有一定运维经验的人,可能已经能够搭建一定复杂度的Linux架构,但是在来来回回的具体操作中,还是体现出CLI(命令界面)功底不够扎实,甚至操作的非常‘拙’、处处露‘怯’。 对一个士兵来说,枪就是他的武器,对于一个程序员来说,各种library(工具库)就是他的武器;而对于Linux运维人员来说,无疑命令行工具CLI(命令界面)就是他们的武器;高手和小白之间的差距往往就体现在对于这些“武器”的掌握和熟练程度上。有时候一个参数就能够解决的事情,小白们可能要写一个复杂的Shell脚本才能搞定,这就是对CLI(命令界面)没有理解参悟透彻导致。 研磨每一个命令就是擦拭手中的作战武器,平时不保养不理解,等到作战的时候,一定不能够将手中的武器发挥到最好,所以我们要平心、静气和专注,甘坐冷板凳一段时间,才能练就一身非凡的内功! 本教程从实战出发,结合当下流行或最新的Linux(v6/7/8 版本)同时演示,将命令行结合到解决企业实战问题中来,体现出教学注重实战的务实精神,希望从事或未来从事运维的同学,能够认真仔细的学完Linux核心命令的整套课程。 本课程系列将逐步推出,看看我教学的进度和您学习的步伐,孰占鳌头! 注:关于教学环境搭建,可以参考本人其它课程系列,本教学中就不再赘述! 《参透 VMware 桌面级虚拟化》 《在虚拟机中安装模版机(包括应用软件等)》 《SecureCRT 连接 GNS3/Linux 的安全精密工具》 

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧