vc如何得到硬盘序列号

gxrj 2000-12-15 10:25:00
...全文
1786 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lu0 2000-12-26
  • 打赏
  • 举报
回复
DINGKAI现在还是CFIDO的程序员区的管理员???
lu0 2000-12-26
  • 打赏
  • 举报
回复
我的版本在NT下也能运行...
请到
http://lu0.126.com
下载.
dsc 2000-12-25
  • 打赏
  • 举报
回复
获取硬盘型号、序列号、修订号.....
请访问 http://www.csdn.net/cnshare/soft/soft4806.shtm
DragonCheng 2000-12-15
  • 打赏
  • 举报
回复
gxrj说的是对的,硬盘是不会变的。而用GetVolumeInformation()得到的ID是格式化后的驱动器卷标号,他会随着格式花儿变化。
但是有些硬盘没有ID,所以说如果只用次方法来进行加密是不全面的。
ivefire 2000-12-15
  • 打赏
  • 举报
回复
BOOL GetVolumeInformation(
LPCTSTR lpRootPathName, // address of root directory of the
// file system
LPTSTR lpVolumeNameBuffer, // address of name of the volume
DWORD nVolumeNameSize, // length of lpVolumeNameBuffer
LPDWORD lpVolumeSerialNumber, // address of volume serial number 在这儿
LPDWORD lpMaximumComponentLength,
// address of system's maximum
// filename length
LPDWORD lpFileSystemFlags, // address of file system flags
LPTSTR lpFileSystemNameBuffer, // address of name of file system
DWORD nFileSystemNameSize // length of lpFileSystemNameBuffer
);
Hank 2000-12-15
  • 打赏
  • 举报
回复
Subject: 关于硬盘序列号的探讨!
Newsgroups: programr.china

大家好:

近来在CFIDO和E-mail中一直有朋友询问关于如何能在Windows下用VB来
获取硬盘序列号的问题, 因为在VB的for Windows中版本中没有了端口存取
函数, 所以就写了一个HDIDE16.DLL的东东, 放在主页上免费发放, 并且
HDIDE32版本的即将出台, 孰知却遭到 XXX 肆意践踏, 理由如下:
---- CUT ----
WX> 好久一来, 一直未能发现有用VB来获取硬盘序列号的东东,
WX> 以致于VB的程序 不能得到很好的保护, 所以昨天做了个HDIDE16.DLL,
RT> 太烦了吧!
RT> 不是我想给你泼冷水,你的WINAPI知识有点欠乏!
RT> 取计算机硬盘序列号及卷名的函数是:
RT> 这个老早我就用了.
RT> 加密方法很多种,也不一定用硬盘序列号.
RT> 可惜不能说. :)))
--- CUT ---

对此, 我表示强烈的抗议, 并且为避免由此引起的误导, 特将基本的常识区
分如下, 附有完整的对比源程序:

关于盘序列号有两种:

硬盘序列号: 英文名 Hard Disk Serial Number, 该号是出厂时生产厂家为
区别产品而设置的, 是唯一的, 是只读的, 利用硬盘序列号的
加密往往是利用其唯一和只读的特性, 大多是针对有序列号的
IDE HDD而言, 对于没有序列号或SCSI HDD硬盘则无能为力,
这也是利用它进行加密的局限性.
卷的序列号: 英文名 Volume Serial Number, 该号既可指软磁盘要得, 如:
A:盘和B:盘的, 又可以指硬盘的逻辑盘, 如: C:, D:...的,
是高级格式化时随机产生的, 是可以修改的, 所以利用其进行
加密, 其唯一性还可, 而其可修改性对于安全而言就大打折扣
了.

那么如何获得它们呢? 这要视不同的平台而论, 核心实现方法如下:

DOS平台 Windows 3.X Windows 9.X

硬盘序列号: 端口I/O 端口I/O Ring0级I/O

卷的序列号: 中断调用 WINAPI WINAPI


为方便大家验证, 特贴如下两程序用TC或BC编译后运行在DOS下即可:

/* 程序1: 获得IDE硬盘C的序列号 */
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.h>
#include <string.h>

char *getascii (unsigned int in_data [], int off_start, int off_end);

void main (void)
{
unsigned int dd [256]; /* DiskData */
unsigned int dd_off; /* DiskData offset */

while (inp (0x1F7) != 0x50) /* Wait for controller not busy */
;

outp (0x1F6, 0xA0); /* Get first/second drive */

outp (0x1F7, 0xEC); /* Get drive info data */

while (inp (0x1F7) != 0x58) /* Wait for data ready */
;

for (dd_off = 0; dd_off != 256; dd_off++) /* Read "sector" */
dd [dd_off] = inpw (0x1F0);

printf ("The Serial Number Hard Disk [C] is %s", getascii (dd, 10, 19));

}

char *getascii (unsigned int in_data [], int off_start, int off_end)
{
static char ret_val [255];
int loop, loop1;

for (loop = off_start, loop1 = 0; loop <= off_end; loop++)
{
ret_val [loop1++] = (char) (in_data [loop] / 256); /* Get High byte */
ret_val [loop1++] = (char) (in_data [loop] % 256); /* Get Low byte */
}
ret_val [loop1] = ""; /* Make sure it ends in a NULL character */
return (ret_val);
}

/* 程序2: 获得逻辑盘C的序列号 */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <dos.h>

void main(void)
{
char serial_no[10];
union REGS r;
struct SREGS s;
unsigned sno1, sno2;

r.x.ax = 0x6900;
r.h.bl = 3; /* A:=1, B:=2, C:=3 etc. */
segread(&s);
intdosx(&r, &r, &s);
if (r.x.cflag)
*serial_no = "";
else
{
sno2 = *((unsigned far *)MK_FP(s.ds, r.x.dx+2));
sno1 = *((unsigned far *)MK_FP(s.ds, r.x.dx+4));
sprintf(serial_no, "%04X-%04X
", sno1, sno2);
}
printf("The Serial Number of Login Disk [C] is %s", serial_no );

}

在Windows 3.X中:

硬盘序列号: 使用端口I/O即可, 将以上程序稍加修改并用VC或BC做成DLL
即可在VB中调用, 本人就是这样做的.
卷的序列号: 用那位朋友所说的WINAPI函数GetVolumeInformation即可.

在Windows 9.X中:

硬盘序列号: 必须使用VxD技术, 即便不写VxD文件, 要获得Ring0级的访问权
才能获得, 否则程序工作在Ring3级会死在以下语句处:
while (inp (0x1F7) != 0x50) /* Wait for controller not busy */
详细技术请访问http://dingkai.sdxf.com

卷的序列号: 用那位朋友所说的WINAPI函数GetVolumeInformation即可.

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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