Mail Archives: djgpp/2006/04/16/09:31:58
X-Authentication-Warning: | delorie.com: mail set sender to djgpp-bounces using -f
|
From: | John Elliott <jce AT seasip DOT demon DOT co DOT uk>
|
Newsgroups: | comp.os.msdos.djgpp
|
Subject: | Reading sectors: Error 0x701F
|
Date: | Sun, 16 Apr 2006 14:24:26 +0100
|
Lines: | 121
|
Message-ID: | <e1tgib$ns9$1$8300dec7@news.demon.co.uk>
|
NNTP-Posting-Host: | seasip.demon.co.uk
|
Mime-Version: | 1.0
|
X-Trace: | news.demon.co.uk 1145193867 24457 62.49.4.197 (16 Apr 2006 13:24:27 GMT)
|
X-Complaints-To: | abuse AT demon DOT net
|
NNTP-Posting-Date: | Sun, 16 Apr 2006 13:24:27 +0000 (UTC)
|
X-Accept-Language: | en-gb, en, en-us
|
User-Agent: | Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040115
|
To: | djgpp AT delorie DOT com
|
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp
|
Reply-To: | djgpp AT delorie DOT com
|
I'm trying to write a program that reads sectors from a hard drive
using either INT 25h or INT 21h/AX=7305h.
If I run it under Windows ME, the reads fail with error 0x701F,
whether it's operating on a FAT32 drive or a FAT16 drive. I can't find
any mention of this error in documentation; it turns up once or twice on
Usenet, always in the context of calling INT 25h or INT 21h/AX=7305h
from a DOS extender. That suggests I've made an error setting up the
__dpmi_regs when making the call, but if so I can't see what it is. Does
anyone have any suggestions?
(this is an old djgpp, based on gcc 2.7.2, but for such a simple
operation I wouldn't have thought that would make much of a difference).
#include <stdio.h>
#include <ctype.h>
#include <go32.h>
#include <dpmi.h>
#include <sys/farptr.h>
/* Since INT 25h leaves a word on the stack, we have a small 16-bit
* wrapper around it */
static unsigned char code16[] =
{
0x90,
0x55, /* push bp */
0x8B, 0xEC, /* mov bp,sp */
0xcd, 0x25, /* int 25 */
0x8B, 0xE5, /* mov sp,bp */
0x5D, /* pop bp */
0xCB /* retf */
};
void try_int25(int drive, long sector, int count, int buffer);
void try_int21(int drive, long sector, int count, int buffer);
int main(int argc, char **argv)
{
long sector = 0;
int count = 1;
int buffer = __tb + 32;
int drive = 'C';
if (argc > 1)
{
drive = toupper(argv[1][0]);
}
try_int25(drive, sector, count, buffer);
try_int21(drive, sector, count, buffer);
}
void try_int25(int drive, long sector, int count, int buffer)
{
__dpmi_regs regs;
/* Create the read packet at __tb */
_farpokew(_dos_ds, __tb, sector);
_farpokew(_dos_ds, __tb+2, sector >> 16);
_farpokew(_dos_ds, __tb+4, count);
_farpokew(_dos_ds, __tb+6, buffer & 0x0F);
_farpokew(_dos_ds, __tb+8, buffer >> 4);
/* Create the 16-bit wrapper at __tb + 16 */
dosmemput(code16, sizeof(code16), __tb + 16);
/* Set up the registers */
memset(®s, 0, sizeof(regs));
regs.x.ax = drive - 'A'; /* Unit */
regs.x.cx = 0xFFFF; /* Packet read */
regs.x.bx = __tb & 0x0F; /* Packet address */
regs.x.ds = __tb >> 4;
regs.x.ip = __tb & 0x0F; /* 16-bit stub */
regs.x.cs = (__tb >> 4) + 1;
_go32_dpmi_simulate_fcall(®s);
if (regs.x.flags & 1)
{
fprintf(stderr, "INT 25 returned error: %04x\n",
regs.x.ax);
}
else
{
fprintf(stderr, "INT 25 succeeded\n");
}
}
void try_int21(int drive, long sector, int count, int buffer)
{
__dpmi_regs regs;
/* Create the read packet at __tb */
_farpokew(_dos_ds, __tb, sector);
_farpokew(_dos_ds, __tb+2, sector >> 16);
_farpokew(_dos_ds, __tb+4, count);
_farpokew(_dos_ds, __tb+6, buffer & 0x0F);
_farpokew(_dos_ds, __tb+8, buffer >> 4);
/* Set up the registers */
memset(®s, 0, sizeof(regs));
regs.x.ax = 0x7305; /* Function */
regs.x.cx = 0xFFFF; /* Packet read */
regs.x.dx = drive - '@'; /* Unit */
regs.x.bx = __tb & 0x0F; /* Packet address */
regs.x.ds = __tb >> 4;
regs.x.si = 0; /* Read */
__dpmi_int(0x21, ®s);
if (regs.x.flags & 1)
{
fprintf(stderr, "INT 21/7305 returned error: %04x\n",
regs.x.ax);
}
else
{
fprintf(stderr, "INT 21/7305 succeeded\n");
}
}
- Raw text -