回 帖 发 新 帖 刷新版面

主题:读取硬盘主引导区,保存恢复CMOS的源程序

启动QB请加参数 如:QB/L  这样你的程序可以支持中断调用
读取硬盘主引导区:
'$INCLUDE: 'qb.bi'
DIM SHARED ax, bx, cx, dx, es
buff$ = SPACE$(512) '设置磁盘缓冲区
bx = SADD(buff$)   '获得缓冲区的偏移地址
es = VARSEG(buff$) '获得缓冲区的段址
OPEN "savehd.dat" FOR BINARY AS #1
ax = &H201
cx = 1
dx = &H80
int13     ' 调用13号中断       
PUT #1, , buff$
CLOSE #1
PRINT "硬盘主引导区已被成功的保存到SAVEHD.DAT文件中!"
END

SUB int13
DIM InRegs AS RegTypeX
DIM OutRegs AS RegTypeX
InRegs.ax = ax
InRegs.bx = bx
InRegs.cx = cx
InRegs.dx = dx
InRegs.es = es
INTERRUPTX &H13, InRegs, OutRegs
ax = OutRegs.ax
bx = OutRegs.bx
cx = OutRegs.cx
dx = OutRegs.dx
es = OutRegs.es
END SUB
此程序用qb4.5编写通过!

回复列表 (共20个回复)

沙发

保存恢复清除CMOS : 
INPUT "输入文件名 =  ", file$
INPUT "SELECT 1 =SAVE ,2=LOAD 3=cle", S '1是存2是读3是清除CMOS
OPEN file$ FOR BINARY AS #1
d$ = "1"
SELECT CASE s  
       CASE 1 'SAVE CMOS  保存
        FOR i = 9 TO 128
           OUT &H70, i
           d = INP(&H71)
           d$ = CHR$(d)
           PUT #1, i, d$
        NEXT i
        PRINT file$; "Cmos保存成功 ,ok!!"
       CASE 2 'load cmos  恢复
         FOR i = 9 TO 128
            GET #1, i, d$
            d = ASC(d$)
            OUT &H70, i
            OUT &H71, d
         PRINT file$; "Cmos恢复成功 ,ok!!"
         NEXT i
CASE 3 'cls cmos   清除(慎用)
         FOR i = 1 TO 128
            OUT &H70, i
            OUT &H71, 0
         PRINT file$; "Cmos 成功清除,ok!!"
         NEXT i

END SELECT
CLOSE
END

板凳

qb45:
你的这段源码可以在QB45下编译者成功,但在QB7下编译有问题呀,(自动退出).
因为我要用QBWIN,只能用QB7,你看看什么地方要改一下才行?

3 楼

呵呵,我有意见!!!
程序1:win95以上的系统,禁止直接调用INT13。
嘿嘿,程序1只能在dos下使用

程序2的兼容性有问题啊,换个机器就有可能不成。
老大,你最好把你的主版BIOS版本也写上!

4 楼

老大我需要你的详细解释
可不可以啦!?

5 楼

我在WIN9X
QB45调试成功!
另外,我没有 用过QB71

6 楼

请问有什么办法可以解决还原精灵吗,比如从主引导区删除或者窃取密码

7 楼

8 楼

[quote]qb45:
你的这段源码可以在QB45下编译者成功,但在QB7下编译有问题呀,(自动退出).
因为我要用QBWIN,只能用QB7,你看看什么地方要改一下才行?[/quote]
(areyoung,这是一个传奇人物,很久没消息了。网站也过期了。)

顶这张贴原因很简单,是阿文的问题,直接用秋水的代码在7.1下无法通过。
原因就在AX的入口参数,我在运行代码时死机。
于是,我去查找一下入口参数,居然发现阿文还发到微软的网站去了:
[url]http://forums.microsoft.com/china/ShowPost.aspx?PostID=3326934&SiteID=15[/url]
我在这个地方找到ROM中断的入口参数:
[url]http://blog.csdn.net/ttzyanswer/archive/2008/01/17/2049175.aspx[/url]
(其实我有书的,但三更半夜的不好翻箱倒柜,现在网上能找得到的地方可真少)
[quote]ROM 中断 INT 13
 B.硬盘机I/O调用
 入口: AH =0-3, DL =驱动器号(硬盘80H,81H), 80=C, 81=D
       DH =头号(硬盘0-15), CH =道号(0-1023), CL =起始扇区号(1-17)
       AL =欲读写扇区数, ES:BX =内存缓冲区首址.
 返回: AL =实际读入扇区数,AH =磁盘状态; 进位标志CF =0,出错; =1,成功[/quote]
其实按照这个参数表来说,AH=2 并没有错,至于为什么通不过,我也不清楚,只是我尝试一下把 AH=0 后就通过了。
可是问题并没有解决。至于为什么?我也没搞懂。反正就这样的参数会死机,
随便改一改都没问题。

9 楼

问题是AH=0,程序原有功能还能实现吗

10 楼

我再把阿文的代码发到这里来改吧:
代码太长发不上来。
而且我还把你的代码改了两次:
1.包含原MBR数据的方法:
[quote]b$=b$+"FA33C08EC08ED88ED0BC007C8BF4FBFCBF0006B90001F3A5EAD1060000000E908D364406BA0202B0C050B402FEC2CD108A1CB9010058FEC050B409CD1058463C"
b$=b$+"DC75E6C30E0E0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C8B8B8B0F6F74200A0D0000807C040C741A807C040E7414817C0A0100730D8B4C028B14B2"
b$=b$+"80B80102CD13C3568BC387DEBE0006C7041000C7440201008944048C5C068B47088944088B470A89440AC7440C0000C7440E0000B280BBAA55B80042CD135EC3"
b$=b$+"B90400BEBE07F60480750583C610E2F6C3803E1D06FE7523B80103BBB807BA8000C747020000C707000081EBB801B90100C6061D0600CD13E99600B802028BDF"
b$=b$+"B90200BA8000CD1372468BFE8BF3B90002F3A5BE000881BCFE01AA55753281BCFE0355AA752AB90002BB0000AD03D8E2FB83FB00751AE827027415A01D063CFF"
b$=b$+"7505E89D01EB043C00770CE8DE007312E86DFF742CEB102C103C0473EEE8A00074E956E8B3015EBB007CE8FAFE720D813EFE7D55AA7505B8007C50C3BE2006EB"
b$=b$+"03B80006B707B90000BA4F18CD10EB05CD10C3CD18B91C00BAC100BB0010B80011BD200ACD10B700E875FEC30000000000000000000000000000000000000000"
b$=b$+"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055AA"
b$=b$+"B410F6E48BF081C6BE078A44043C0074063C0574023C0FC39C2E803E000A0074052EFE0E000A9D2EFF2E080A909090909090BB20008B07A3080A8B4702A30A0A"
b$=b$+"FAC70718088C4F02FB833E0D0A007408E82EFF909090EB1A833E0F0A007413833E0D0A007406909090909090BE000BE80FFFA0000A3C007430B411CD1674F3B4"
b$=b$+"10CD16833E0D0A00740C3B06040A75068B360D0AEB11833E0F0A0074D53B06060A75CF8B360F0AFECCBB2000FA8B0E080A890F8B0E0A0A894F02FB9C56909090"
b$=b$+"9090905E9D7502F9C3F8C38A4C0490B11283FE007403884C04C38A4C0490B10CEBEF8B36130AE8F1FF8B360D0AE8DBFFE8F5008B36110AC60480C6061D7C00B9"
b$=b$+"4000BEBE07BFBE7DF3A4B80103BB007CB90100BA8000CD13C3E8CC00C60480E8B8FFC6061D7C003B36110A7405C6061D7CFF8B36130AE892FFEBC45657BEF00B"
b$=b$+"B90B00F3A65FE30CBEE00BB90B00F3A6E3025EC35E89360D0AC35E89360F0AC3B90400BEBE07518A44043C00744D3C0574573C0F74533C15744F3C1F744B8B44"
b$=b$+"0A8B5C083B06170A771372063B1E150A770BA3170A891E150A8936110ABB00E0E8C4FC7216813EFEE155AA720EBF2BE0E888FFE306BF47E0E880FF5983C610E2"
b$=b$+"A5A10D0A0B060F0AC3803E66060074EB8936130AEBE5000000000000000000000000000000000000BBBE07B90400C6070083C310E2F8C300000000000000AA55"
b$=b$+"323000000044008500000000000000000000000000FFFFFFFF0000000000000000030CF0A0A0A0A0A0A0A0A0F00E010000807E0101FE1008F82010F04020E000"
b$=b$+"01412137210101F71111121214284700101010FC101010FE101010101000FE000C0602010302020404080810204080000000000000808040202010080E040000"
b$=b$+"000000000000007F000000000000000000000000000004FE000000000000000020202739417AA721F92523212A34280020207C24FE247C207C20FE20A0601E00"
b$=b$+"21212137A9A9A2232224242830232C20000000FE40404848D0606090880E0400080F102F480F080F04070C122106186000FC00F808F808F800F8106080601E04"
b$=b$+"003F0204081F030C3F100408102042017C80202040802010F88CA090888484001010232044F80913207C00001DE102044020FE40408804FE9490909012120E00"
b$=b$+"00000000000000000000000000000000004730230007F01312131213161A120240FC40F840FE00F808F808F80808281010101013FE10141B30D1111010115620"
b$=b$+"402020FE044040FE88109060588E0400000000000000000C0C0000000C0C00000000FF60606060617F6160606060F0000000848C3C0C0C0C0C0C0C0C0C0C3F00"
b$=b$+"00003C66C3C3C3C3C3C3C3C3C3663C00000000000000000000000000000000004449595F53455256494345000000000049424D5F5345525649434500F46E55AA"
for i=1 to len(b$) step 2
    a$=a$+chr$(asc("&H"+mid$(b$,i,2)))
next[/quote]
2.分离原MBR文件,[url=http://file.pfan.cn/upfile/200806070234145.rar]附HDMBR.DAT文件[/url]
    Open "HdMbr.dat" FOR BINARY AS #1
    a$=input$(1536,1)
    close #1

还有一些代码,忍不住动手改了一些:
比如  SS$ = mid$(buff$,433,510-433+1)
510-433+1 这是一个常数的式子,直接用计算器算一下结果放进去就可以了,没必要让程序运行的时候又计算一次,当然,这不会把程序的执行速度造成明显的影响,只是我们需要养成这样的一个好习惯。
还有 buff$ = mid$(a$,1,432) + SS$ +  mid$(a$,511,1536-511+1)  可以改成:
     buff$ = left$(a$,432)  + ss$ +  mid$(a$,511)

我来回复

您尚未登录,请登录后再回复。点此登录或注册