如何在Win95/98/NT下获取硬盘序列号

cy007 2000-07-23 10:33:00
...全文
771 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang1st 2000-11-27
  • 打赏
  • 举报
回复
编VXD可解决问题
我编了一个,要的话去我主页留言
http://hotstore.yeah.net
changxing 2000-07-28
  • 打赏
  • 举报
回复
不好吧,硬盘一格号就变
GetVolumeInformation(.....)就成
meijg 2000-07-27
  • 打赏
  • 举报
回复
你直接在nt下读注册表就行了,我试过了
cy007 2000-07-27
  • 打赏
  • 举报
回复
Hank,我们老板让我对程序进行加密,我想得到一个唯一的硬件ID,就这样想到了硬盘ID了,DOS下的程序我已经有了,可老板要求一定要在NT下用,真是不知如何办了!
meijg 2000-07-25
  • 打赏
  • 举报
回复
nt获2000下,访问注册表
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\MultifunctionAdapter\5\DiskController\0\DiskPeripheral\0
里面的键值Identifier的值就是硬盘序列号
cy007 2000-07-25
  • 打赏
  • 举报
回复
meijg,你的这个程序我也有,我想要的是95/98/NT下的程序
Hank 2000-07-25
  • 打赏
  • 举报
回复
如果你真的是要知道硬盘的物理ID号,也就是硬盘制造厂商的编号,我这儿有一个工具可以获得!是DOS下运行的,告诉我你的EMAIL地址。
另外,可以找硬盘供应商的低级格式化软件,可以直接获得参数!
不过我怀疑你要这个ID号干什么?是区分硬盘?因为这个ID号是不会重复的!
cy007 2000-07-24
  • 打赏
  • 举报
回复
meijg, 我要的是硬盘物理ID,在NT下读取必须写设备驱动吗?
meijg 2000-07-24
  • 打赏
  • 举报
回复
hank的方法是获取分区的序列号,正如david_jts说的,它是会改变的,如果要获取物理序列号,则要用到汇编编程,有现成的代码,我正在找
david_jts 2000-07-24
  • 打赏
  • 举报
回复
Dos下可访问端口获得硬盘的ID,但windows下端口被接管,不能这样做。
Hank是获取磁盘卷的序列号,格式磁盘后就改变了。
在软件发布里有获得硬盘的ID的程序,但没有给源程序,他是写了个vxd,在vxd里用访问端口的方法获得的。
Hank 2000-07-24
  • 打赏
  • 举报
回复
好像不可以直接获得硬盘的ID号,不过可以用API函数获得逻辑的序列号,具体可如下:

var pdw : pDWord;
mc, fl : dword;
begin
New(pdw);
GetVolumeInformation(pchar('C:\'),nil,0,pdw,mc,fl,nil,0);
result := inttostr(pdw^);
dispose(pdw);
end;

meijg 2000-07-24
  • 打赏
  • 举报
回复
我找到了,你拿去试试:
#include <stdlib.h>
#include <bios.h>
#include <dos.h>
#include <math.h>
#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];
printf("\nCopyright 2000.02.16 IDESCAN.");
//printf("\n ");
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 0GetAscii(diskData, 27, 46), */
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("\nFIX 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", 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", 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", 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", biosSec[loop]);
printf("\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() */

zsr 2000-07-23
  • 打赏
  • 举报
回复
95,98下可以用现成的控件,nt 下可直接读取注册表。
meijg 2000-07-23
  • 打赏
  • 举报
回复
你要的是硬盘的物理编号还是分区编号
一款用于共享软件加密的动态链接库文件,包含了获取硬盘物理序列号及BlowFish、MD5、SHA512、RIPEMD160、Secret16、MD5FileCheck、CRCFileCheck等多种强大加密算法,可以非常方便的用于软件的各类加密需求。支持VC/VB/BCB/Delphi等各类Windows平台下的开发工具,软件同时提供详细的函数定义说明、示例及各类开发工具使用的源代码。 软件功能: (1)可用于获取硬盘序列号(IDE/SCSI),支持Win9x/Me/NT/2000/XP。 (2)内置BlowFish、MD5、SHA512、RIPEMD160、Secret16、MD5FileCheck、 CRCFileCheck等多种强大加密算法来对软件进行加密保护。 (3)支持Window平台下的各类开发工具,如VC/VB/BCB/Delphi/PB/VFP等。 (4)可以非常方便的同时使用多种加密算法来对软件进行加密保护。 打包文件说明: Reg.dll-------------------加密算法动态链接库文件。 Reg.h---------------------在 VC(C/C++) 和 BCB 开发环境下的头文件。 Reg.lib-------------------在 VC(MFC) 开发环境下的 Library 文件。 Reg.bas-------------------在 VB 开发环境下的 Module 文件。 Readme.txt----------------纯文本格式说明文件。 Help.chm------------------函数接口详细定义说明文件。 MFC_TestEncryDll.zip------MFC调用Reg.dll进行加密示例。 VB6_TestEncryDll.zip------VB6调用Reg.dll进行加密示例。 CB5_TestEncryDll.zip------BCB5调用Reg.dll进行加密示例。 Delphi_TestEncryDll.zip---Delphi调用Reg.dll进行加密示例。 函数详细说明请参见Help.chm中具体函数说明部分及相关示例代码。

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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