gpt4 book ai didi

c - 从驱动器扩展读取扇区 (INT 13h AH=42h)

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:07 25 4
gpt4 key购买 nike

我正在尝试将第一个硬盘驱动器的一个 block 读入内存。我尝试使用不同的 LBA,但它会将空间加载到缓冲区中。在下面的代码中,我添加了 for 循环,这样我就可以看到它是否加载了除空格之外的任何其他内容。你们知道为什么它只将空间加载到缓冲区吗?

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <bios.h>

struct DAP
{
unsigned char size;
unsigned char reserved1;
unsigned char blocks;
unsigned char reserved2;
unsigned char far *buffer;
unsigned long int lbalod;
unsigned long int lbahid;
} dap;

char st[80];
unsigned char buf[512];
FILE *fptr;
unsigned long int itrations = 16450559; //10gb
unsigned long int i = 0;

void main(void)
{
clrscr();
for(; i<itrations; i++)
{
dap.size = sizeof(dap);
dap.reserved1 = 0;
dap.blocks = 1;
dap.reserved2 = 0;
dap.buffer = (unsigned char far *)MK_FP(_DS, buf);
dap.lbalod = i;
dap.lbahid = 0;
_AH = 0x42;
_DL = 0x80;
_SI = (unsigned int)&dap;
geninterrupt(0x13);
printf("%lu: %s\n", i, buf);
}
}

它在使用 WinXP 设置的 VMWare 虚拟机上使用 Borland Turbo C。我也在 Windows 7 的 DOSBOX 上尝试过相同的操作。非常感谢任何帮助。

最佳答案

这些只是我的建议,希望对你调试有帮助。

  1. 打印sizeof(dap) 确保确实是16

  2. 在发出 INT 13h 之前插入 memset(buf, 'A', sizeof(buf)); 以便您可以检查 buf是否修改

  3. 尝试 printf("%lu: [%s]\n", i, buf); 代替,因为当 buf 包含 \0 围绕它的头部 printf 停在那里。大括号应用作标记。

  4. 打印 _AH_CF 应该包含返回码 INT 13h

关于c - 从驱动器扩展读取扇区 (INT 13h AH=42h),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21364984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com