你到kingron.myetang.com主页下载一个资料包,里边就有。
解决方案 »
- ExpressQuantumGrid和ehlib这两个控件该如何取舍?它们有什么优缺点?
- delphi的帮助文件哪里有?要安装吗?
- 求教:如何用delphi发现局域网上所有的主机并列出其主机名??求教原代码!!
- 哪里可以下载到INSTALL SHIELD FOR DELPHI6?分不够再加!
- 如何用DBGrid实时显示酒店房态??
- 我想把原来做的单机的,改为网络版的,应该怎么做?还有好斗不太清楚的,谢谢了!
- 在CSDN上,我怎么看了我提的问题,一点击问题时就会出现下面的问题:
- 经常在一些表格中见到 N/A ,它到底是是什么意思?
- 各位各位,帮忙进来看看这个线程的问题!!!!!!!!!!!!!!!!!!!!!
- 请教一调用存储过程的问题??
- 各位大拿,是关于mapX的问题
- 一个菜问题,如何得到sql存储过程返回的输出参数?
void __fastcall TForm1::Button10Click(TObject *Sender)
{
/*GUID guid;
char address[30];
if(CoCreateGuid(&guid)!=S_OK)
ShowMessage("Error");
else
{
sprintf(address,
"%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X",
guid.Data4[0],guid.Data4[1],guid.Data4[2],guid.Data4[3],
guid.Data4[4],guid.Data4[5],guid.Data4[6],guid.Data4[7]);
address[25] ='\0';
ShowMessage(address);
} */typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT; ASTAT Adapter;
NCB ncb;
UCHAR uRetCode;
AnsiString MachineName;
char NetName[50];
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = 0;
uRetCode = Netbios( &ncb );
if (uRetCode!=0)
ShowMessage("网卡初始化失败!");
memset(&ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = 0;
memset(ncb.ncb_callname,' ',NCBNAMSZ);
MachineName=Edit1->Text.UpperCase();
strncpy(ncb.ncb_callname,MachineName.c_str(),MachineName.Length());
ncb.ncb_buffer = (char *) &Adapter;
ncb.ncb_length = sizeof(Adapter); uRetCode = Netbios( &ncb );
if ( uRetCode == 0 )
{
AnsiString Address;
int i;
Address="";
for(i=0;i<6;i++)
{
Address+=IntToHex((int)Adapter.adapt.adapter_address[i],2);
}
ShowMessage(Address);
}
}
//---------------------------------------------------------------------------
cpuid用汇编,但是只有pII才有,以前的是"genie intel"之类的.
标 题:转载 软件诊所论坛:李伟帖的一篇《关于硬盘序列号的探讨! 》。以前有人问过这方面的问题 (4千字)
发信人:看雪
时 间:2000-6-27 19:31:08
详细信息:From: "Wang Xianbing" <[email protected]>
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即可.
我欢迎每一位热情, 诚挚的朋友! 拒绝狂妄. 让我们携起手来, 从小做起, 共通推动民族软件发展!
~~~ 赏屯 光辉软件工作室 - 王献冰 屯屯屯屯屯屯屯屯屯屯[][[X]? ? ===> 振兴民族软件 抗击北约暴行 <=== ?~~~ 韧屯 URL: http://glowsoft.126.com E-mail: [email protected] 屯图
请访问 http://www.csdn.net/cnshare/soft/soft4806.shtm
WHILE ( Port[$1f7] <> $58 ) DO ;
编译出错,请教一下何解?Unit HardDisk;
INTERFACE
FUNCTION GetHardDiskNaam : STRING;
FUNCTION GetHardDiskSerieNummer : STRING;
FUNCTION GetHardDiskControlleNummer : STRING;
PROCEDURE GetHardDiskGegevens;
CONST
CodeerTabel : ARRAY[0..24] OF BYTE =
(3,1,2,1,4,1,3,2,6,4,6,5,1,2,6,4,2,6,3,4,6,2,4,1,2);
TYPE
CharArray = ARRAY[0..24] OF CHAR;
VAR
HardDiskGegevens : ARRAY[1..256] OF INTEGER;
HardDiskNaam : CharArray;
SerieNummer : CharArray;
ControlleNummer : CharArray;
C_HardDiskNaam: STRING;
C_HardDiskSerieNummer : STRING;
C_HardDiskControlleNummer : STRING;
C_LicentieNaam: STRING;
IMPLEMENTATION
FUNCTION GetHardDiskNaam : STRING;
VAR
Teller : INTEGER;
Lus : INTEGER;
BEGIN
GetHardDiskNaam := '';
Teller := 1;
FOR Lus := 1 TO 18 DO
BEGIN
HardDiskNaam[Teller] := CHR( ( HardDiskGegevens[27+Lus] DIV 256 ));
Inc(Teller);
HardDiskNaam[Teller] := CHR( ( HardDiskGegevens[27+Lus] MOD 256 ));
Inc(Teller);
END;
GetHardDiskNaam := HardDiskNaam;
END;
FUNCTION GetHardDiskSerieNummer : STRING;
VAR
Teller : INTEGER;
Lus : INTEGER;
BEGIN
GetHardDiskSerieNummer := '';
Teller := 1;
FOR Lus := 1 TO 8 DO
BEGIN
SerieNummer[Teller] := CHR( ( HardDiskGegevens[10+Lus] DIV 256 ));
Inc(Teller);
SerieNummer[Teller] := CHR( ( HardDiskGegevens[10+Lus] MOD 256 ));
Inc(Teller);
END;
GetHardDiskSerieNummer := SerieNummer;
END;
FUNCTION GetHardDiskControlleNummer : STRING;
VAR
Teller : INTEGER;
Lus : INTEGER;
BEGIN
GetHardDiskControlleNummer := '';
Teller := 1;
FOR Lus := 1 TO 3 DO
BEGIN
ControlleNummer[Teller] := CHR( ( HardDiskGegevens[23+Lus] DIV 256 ));
Inc(Teller);
ControlleNummer[Teller] := CHR( ( HardDiskGegevens[23+Lus] MOD 256 ));
Inc(Teller);
END;
GetHardDiskControlleNummer := ControlleNummer;
END;
PROCEDURE GetHardDiskGegevens;
VAR
Lus : INTEGER;
BEGIN
WHILE ( Port[$1f7] <> $50) DO ;
Port[$1F6] := $A0 ;
Port[$1F7] := $EC ;
WHILE ( Port[$1f7] <> $58 ) DO ;
FOR Lus := 1 TO 256 DO
BEGIN
HardDiskGegevens[Lus] := Portw[$1F0] ;
END;
END;
END.