读磁片磁区

2016-02-19 15:06 4 1 收藏

下面是个简单易学的读磁片磁区教程,图老师小编详细图解介绍包你轻松学会,喜欢的朋友赶紧get起来吧!

【 tulaoshi.com - 编程语言 】

  一、以前的dos版要读、写、格式化第0轨的第1个磁区,程式大致如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  

char buffer[512];
reg.x.dx=0 ;  /* for drive a *
reg.x.cx=0x0001 /* for boot sector */
reg.x.bx=fp_off(buffer);
sreg.es=fp_seg(buffer);
resg.x.ax=0x0201;  /* 02 for read, 03 for write ,05 for format */
int86x(0x13,&reg,&reg,&sreg);

  那麽在windows 下转换为呼叫 deviceiocontrol 以便格式化、读取、写入该磁轨,dioc_registers 这struct 在套上 dos 下 int21对hdd或fdd 的各项参数如要格式化是int21也是有, 但windows下也另有提供。

#pragma pack(push, 1)
struct dioc_registers {
   dword reg_ebx;
   dword reg_edx;
   dword reg_ecx;
   dword reg_eax;
   dword reg_edi;
   dword reg_esi;
   dword reg_flags;
};
#pragma pack(pop)
sdiskimageinfo-hdevice = ::createfile(".vwin32", 0, 0, null, 0, file_flag_delete_on_close, null);
if( sdiskimageinfo-hdevice == invalid_handle_value)
  brunnext = false;
// reset floppy disk
  reg.reg_ebx = 0;
  reg.reg_eax = 0x0000;    // ioctl for block devices
  reg.reg_edx = sdiskimageinfo-driver;
  reg.reg_edi = 0; reg.reg_esi= 0;
  reg.reg_flags = 0x0001;   // assume error (carry flag is set)
  dwresult = ::deviceiocontrol( sdiskimageinfo-hdevice, vwin32_dioc_dos_int13, &reg, sizeof(dioc_registers), &reg,
sizeof(dioc_registers), &cb, 0);
// seek floppy
    reg.reg_ebx = 0;
    reg.reg_eax = 0x0c00;    // ioctl for block devices
    reg.reg_ecx = ( sdiskimageinfo-nc 8) | sdiskimageinfo-ns;
    reg.reg_edx = ( sdiskimageinfo-nh 8) | sdiskimageinfo-driver;
    reg.reg_edi = 0;
reg.reg_esi= 0;
    reg.reg_flags = 0x0001;   // assume error (carry flag is set)
    dwresult = ::deviceiocontrol( sdiskimageinfo-hdevice,
vwin32_dioc_dos_int13,
                   &reg, sizeof(dioc_registers), &reg,
sizeof(dioc_registers), &cb, 0);
// read floppy
r_creatediskimagefile:
    reg.reg_ebx = 0;
    reg.reg_eax = 0x0200 | 0x01;    // ioctl for block devices
    reg.reg_ecx = ( sdiskimageinfo-nc 8) | sdiskimageinfo-ns;
    reg.reg_edx = ( sdiskimageinfo-nh 8) | sdiskimageinfo-driver;
    reg.reg_ebx = (dword) &m_buf;
    reg.reg_edi = 0;
reg.reg_esi= 0;
    reg.reg_flags = 0x0001;   // assume error (carry flag is set)
    dwresult = ::deviceiocontrol( hdevice, vwin32_dioc_dos_int13,
                   &reg, sizeof(dioc_registers), &reg,
sizeof(dioc_registers), &cb, 0);
    if (!dwresult || (reg.reg_flags & 0x0001))
    {
}

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1608876.html

延伸阅读
  在linux 中每一个进程都由task_struct 数据结构来定义. task_struct就是我们通常所说的PCB. 她是对进程控制的唯一手段也是最有效的手段. 当我们调用fork() 时, 系统会为我们产生一个task_struct结构.然后从父进程,那里继承一些数据, 并把新的进程插入到进程树中, 以待进行进程管理.因此了解task_struct的结构对于我们理解任务 调度...
  今天开始我的读核罹难记.第一次读内核,整整上学时的考试前.胡里胡涂的就过去了,没甚收获.这次我发誓要彻底读一次. 面对近50 m 的源码,困惑是难免的所以我决定先从大面上把握,再在某一些具体的点上切入.这样一来linux 的启动过程便十分重要,因此我先用dmesg命令察看一下linux启动时打出的消息.(我想源文件应在/usr/src/linux/init/main...
  进来忙得不得了,这时才体会出工作和在学校真的不同.有时候自己想做的事,很难如愿.不过我这一段时间没有太偷懒.对于linux 的386 保护模式,内存管理,作了一个初步的学习.当初学习操作系统课时老觉得理论没用. 如今,真的时间了,才知道理论知识是多么的缺乏.也许是书到用时方恨少 闲话少说 目前,linux 被移植到了各种机器上.如apple 等....
  这几天看的东西,前辈有书指导,不用我费口舌, 简单介绍一下 搞清楚了 linux的启动过程,对于整个系统分析来说.连一个开头都不算.所做的只是知道了系统启动是一些函数的条用顺序.恰如某位朋友来信建议的那样, 如果这样照顺序硬读,实是自残.好在sunmoon 有一定的自知之明.如此这样下去,等不懂得东西多了.那我就不能坚持了,所以我的原则是?...
钉钉如何查看发布的群公告已读/未读情况?   群聊窗口中点击群公告未读可以看到详细的未读人员;

经验教程

215

收藏

37

精华推荐

读核日记(四)

读核日记(四)

双子海陆空

儿童点读笔

儿童点读笔

id是瘠薄

畅读如何关注杂志

畅读如何关注杂志

说虎干哎你我

微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部