![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-01 21:08 |
共 48,037 主题排行 / 350,122 发帖 / 今日 2 篇 / 48,249 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 扩展int13读取 MBR(硬盘主引导区)的原程序,端口读硬盘序列号 |
| 可打印版本 8,316 / 27 |
| 第16楼 DOSforever | 发表于 2006-07-02 05:30 |
| 金牌会员 发帖 2,239 积分 4,639 | |
Originally posted by GOTOmsdos at 2006-6-30 20:41: 我也不理解你的用意,既然 int13h 扩展调用不再使用CHS参数了,你怎么知道能读写1024个柱面呢?(应该说是第1024个柱面吧)难道你还换算过? |
|
| 第17楼 qb45 | 发表于 2006-07-02 17:47 |
| 高级用户 发帖 194 积分 677 | |
Originally posted by GOTOmsdos at 2006-6-30 07:45 PM: 我的程序只是从原理上演示一下,只想能实现扩展INT13的读写,并没有做优化什么的,如果要精简,只有把MKI$(d2%) 改为MKI$(SADD(buffdat$)) 实际上没有什么大的意义,但表面上看确实少了两个变量! 我觉得编程中,做硬盘小工具是很有意思的,而且很有价值。 在486的电脑上,BIOS很老,不支持扩展INT13,所以不能读写大硬盘,但是很有意思,我们可以利用IO端口在486电脑上来实现读写137G以内容量的硬盘。 希望大家能互相研究研究! |
|
| 第18楼 qb45 | 发表于 2006-07-02 17:50 |
| 高级用户 发帖 194 积分 677 | |
|
也不知道大家对端口读写硬盘感兴趣不
|
|
| 第19楼 zyl910 | 发表于 2006-07-02 18:16 |
| 中级用户 发帖 126 积分 282 | |
Originally posted by qb45 at 2006-7-2 17:50: 极有兴趣! 找这方面资料找了很久了 |
|
| 第20楼 darkradx | 发表于 2006-07-03 00:58 |
| 高级用户 发帖 420 积分 972 | |
|
I/O方法, CIH里面似乎有用过
|
|
| 第21楼 GOTOmsdos | 发表于 2006-07-03 02:01 |
| 铂金会员 发帖 1,827 积分 5,154 | |
Originally posted by DOSforever at 2006-7-2 05:30 AM: 对啊,这几天在研究硬盘读写,有以换算到极限进行测试的。。 |
|
| 第22楼 asbai | 发表于 2006-07-04 00:23 |
| 高级用户 发帖 252 积分 653 | |
Originally posted by DOSforever at 2005-6-30 00:00: 所以说这种技术规范一定要看官方标准的~~ ![]() |
|
| 第23楼 darkradx | 发表于 2006-07-06 21:02 |
| 高级用户 发帖 420 积分 972 | |
| 第24楼 qb45 | 发表于 2006-07-09 10:56 |
| 高级用户 发帖 194 积分 677 | |
|
获得硬盘序列号(原程序)
这是一个用端口对硬盘编程例子 本程序在必须在DOS下运行,我在qb4.5版本下运行通过 主板上共有两个IDE接口,每个接口上又分主、从,所以可以接4个IDE设备,这4个端口号各不同,本程序用端口1F0-1F7是主板上的第一个IDE接口上的主接口,最常用的就是这个了。别的只是端口号不一样,编程方法原理一样。 |
|
| 第25楼 GOTOmsdos | 发表于 2006-07-13 20:40 |
| 铂金会员 发帖 1,827 积分 5,154 | |
|
支持QB45。。
|
|
| 第26楼 ninao99 | 发表于 2008-10-27 19:13 |
| 新手上路 发帖 5 积分 12 来自 山西省太原市小店区 | |
|
也编了个扩展int13 读硬盘程序(在win98 下测试通过) //rdiskc.c
#include <stdio.h> #include <math.h> #include <alloc.h> #include <string.h> #ifndef NULL #define NULL 0 #endif typedef struct DiskAddressPacket{ char PacketSize; char Reserved; unsigned int BlockCount; unsigned long BufferAddr; int BlockNum[4]; }*DAP,DiskAddrPack; extern void DREAD(DAP); int main(int argc,char *argv[]){ int length,i=0,j=0,k=0,line=16; unsigned char buffer[512]; DAP psi=(DAP)malloc(sizeof(DiskAddrPack)); if(argc==2&&!strcmp(argv[1],"/?")){ printf("\nbdexpen sector(0x,for 4 section) [line]\n\tline the line on show(must be 16 or 32)"); return 0; } if(argc!=5&&argc!=6) return -1; for(argv++,i=0;i<4;i++){ length=strlen(*argv); if(length!=4) return -2; for(j=0;j<4;j++){ if((*argv)[j]>='0'&&(*argv)[j]<='9') (*argv)[j]-='0'; else if((*argv)[j]>='a'&&(*argv)[j]<='f') (*argv)[j]=(*argv)[j]-'a'+10; else if((*argv)[j]>='A'&&(*argv)[j]<='F') (*argv)[j]=(*argv)[j]-'A'+10; else return -3; } psi->BlockNum[3-i]=(int)(*argv)[0]*16*16*16+(int)(*argv)[1]*16*16+(int)(*argv)[2]*16+(int)(*argv)[3]; argv++; } if(argc==6){ length=strlen(*argv); for(j=0,k=0,line=0;j<length;){ if((*argv)[k]<48||(*argv)[k]>57) return -4; line+=((int)(*argv)[k++]-48)*(int)(pow(10,--length)); } printf("%d\n",line); if(line!=16&&line!=32) line=16; } psi->PacketSize=16; psi->Reserved=0; psi->BlockCount=1; psi->BufferAddr=(unsigned long)buffer; DREAD(psi); for(j=0;j<512/line;j++){ printf("%3x:",j*line); for(k=0;k<line;k++){ printf("%4x",buffer[j*line+k]); if(k==7||k==15&&line==32||k==23) printf(" -"); } printf("\t "); for(k=0;k<line;k++){ if((buffer[j*line+k])<=128&&buffer[j*line+k]!='\n'&&buffer[j*line+k]!='\t') printf("%c",buffer[j*line+k]); else printf("\."); } printf("\n"); } free(psi); return 0; } //rdiska.asm .model small .data .code public _DREAD _DREAD proc push bp mov bp,sp push ds push si mov ah,42h mov dl,80h mov si,word ptr [bp+4] int 13h pop si pop ds pop bp ret _DREAD endp end 编译连接后可以执行,可以像dos命令一样调用,不过没有写使用方法,大概就是把你要读的扇区的线性地址用16位分4段每段4位用空格隔开输入。另外还设置了一个16行/32行显示的切换开关第5个参数。 |
|
| 第27楼 netwinxp | 发表于 2008-10-29 16:04 |
| 高级用户 发帖 366 积分 741 | |
在测试我的读写小硬盘的程序中,照理只能读写1023(3FF,1111111111)个柱面(0-1022) 对于支持INT13扩展的,只要最后的DAP地址是一样的,它们访问的就是同一个地方,CHS对它来说并没有多少实际意义,不支持的则会不一样,但问题是对于U盘来说,很多BIOS虽然报告支持INT13E,但事实上却是个假相(这也是U潘启动兼容性差的原因),这个问题的罪魁祸首是BIOS,其实符合ATA标准的硬盘真实的就是使用LBA地址来访问(不是古董型的硬盘真正的物理上不同柱面的扇区数不一样,CHS根本就没有意义)。 在486的电脑上,BIOS很老,不支持扩展INT13,所以不能读写大硬盘,但是很有意思,我们可以利用IO端口在486电脑上来实现读写137G以内容量的硬盘。 不可能的事,486的硬盘控制器芯片最多也就提供LBA28的地址,LBA48所需要的LBA地址是48位,所以无论如何也访问不了>137G的硬盘。 [ Last edited by netwinxp on 2008-11-5 at 17:46 ] |
|
| 第28楼 0zwb | 发表于 2008-11-20 17:53 |
| 新手上路 发帖 6 积分 11 | |
|
有没有最简单的修改硬盘号的工具?
|
|
| 上一页 1 2 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |