还是获取硬盘序列号的问题(100分)

  • 主题发起人 主题发起人 chinahawk
  • 开始时间 开始时间
C

chinahawk

Unregistered / Unconfirmed
GUEST, unregistred user!
已经问过一次了,再问一次,加100分,有谁知道可以到第二页上再贴一次,总计300分
都给你!
另外如果知道读取主板或CUP序列号的方法也可以,不过千万不要用API,API是得不到
真正的序列号的!!!

GetVolumeInformation读的是逻辑盘的序列号,不一定是硬盘真正的序列号
,哪位大虾知道真正硬盘序列号的读法,请指教!!!另外我了解到ROM取的F000:000
到F000:FFFF区的信息是不变的,有谁知道读ROM区的方法,及ROM区相应位置的信息一
并请指教,多谢!!
 
http://www.delphibbs.com/delphibbs/dispq.asp?LID=339210
 
温柔一刀,C程序我看不懂,怎么办?
 
后面不是有delphi程序吗?
 
就是有两个错误的哪个程序吗?
 
TO》温柔一刀,深度历险上的控件如何找到?
 
>>深度历险上的控件如何找到?

不知道你指什么,反正我没听说。

>>就是有两个错误的哪个程序吗?

我不知道有几个错误,但是应该很接近的,
尤其是我指出了的那个错误改正之后。
 
TO》温柔一刀
程序是编译过了,可是一运行就死机,帮我看看如何

unit Getsn;

interface

uses
Windows, SysUtils, Classes;

type
TGetsn = class(TComponent)
private

protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;

var
pw:array[1..256] of word;
idt,int_idt:dword;
Base:dword;
Entry:word;

function inp(rdx:WORD):byte;
function inpw(rdx:WORD):word;
procedure outp(rdx:WORD;ral:integer);
function WaitIde:integer;
procedure ReadIDE;
procedure NowInRing0;
procedure GetIDEInfo;
function harddisksn:string;

implementation
function inp(rdx:WORD):byte;Assembler;
asm
xor eax, eax
mov dx, rdx
in al, dx
mov result,al
end;

function inpw(rdx:WORD):word;Assembler;
asm
xor eax, eax
mov dx, rdx
in ax, dx
mov result,ax;
end;

procedure outp(rdx:WORD;ral:integer);Assembler;
asm
mov dx, rdx
mov eax, ral
out dx, al
end;

function WaitIde:integer;
var
al:word;
begin
al:=inp($1F7);
while (al<$80)do
al:=inp($1F7);
result:=al;
end;


procedure ReadIDE;
var
al,i:byte;
begin
WaitIde;
outp($1F6,$A0);
al:= WaitIde;
if ((al and $50)<>$50) then exit;
outp($1F6,$A0);
outp($1F7,$EC);
al:=WaitIde;
if ((al and $58)<>$58) then exit;
for i:=0 to 255 do
pw:=inpw($1F0);
end;

procedure NowInRing0;Assembler;
asm
push ebp
mov ebp,esp
call ReadIDE;
cli
mov ebx, int_idt
mov ax, Entry
mov word ptr[ebx-4], ax
mov eax, Base
shr eax, 16
mov [ebx+2], ax
sti
leave
iretd
end;


procedure GetIDEInfo;Assembler;
var
dwExcept:DWORD;
begin
dwexcept:=dword(addr(nowinring0));
asm
mov eax, fs:[0]
push eax
sidt [esp-02h]
pop ebx
mov idt, ebx
add ebx, $1C
mov int_idt, ebx
mov eax, [ebx]
mov [Base], eax
mov ax, [ebx-4]
mov [Entry], ax
cli
mov esi, dwExcept
push esi
mov [ebx-4], si
shr esi, 16
mov [ebx+2], si
pop esi
sti //到这里死机
int 3
end;

end;
function harddisksn:string;
var
s:array[1..80] of char;
i,j:integer;
begin
GetIDEInfo;
j:=0;
for i:=0 to 9 do
while (j<=19) do
begin
s[j]:=chr(pw[10+i]shr 8);
j:=j+1;
s[j]:=chr(pw[10+i]and $FF);
j:=j+1;
end;
s[j]:=chr(0);
result:=s;
end;


end.
 
试试这个:
var
dwExcept:Pointer;
begin

dwExcept := addr(NowInRing0);

别的暂时没看出来,总之保证转换的没错就可以。
 
谢谢,我试一试!
 
还是不行,我看转换的似乎是没有问题,请您再帮我看一看!
另外,你贴上的C程序是用哪一种C做的,怎么在函数中没有返回值?
还有就是开始的两个INCLUDE后应跟哪些单元?
C中__DECLSPEC(NAKED)是什么意思?
干脆将你转的D程序发一份给我,可以吗?
E:chinahaek@chinaren.com
谢谢!
 
有好几个问题,我都分不清了,再看一下这个贴子:
http://www.delphibbs.com/delphibbs/dispq.asp?LID=339210

我在那里回答了几个问题,而且也有他转的delphi程序,对照一下。
 
我试过了,还是死机!
 
把你的程序发给我(源代码zip)
 
sorry.I don't know
 
有一个控件可以很容易的实现对硬盘散区的读写,当然也可以读系列号了。如果需要可以发
mail给我,我连我写的演示程序一起发。
 
多人接受答案了。
 
bluely,可不可以给我发一份,有急用。多谢了。
 
后退
顶部