delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2003/07/21/12:25:06

From: "Keonwoo Kim" <sosaria AT freechal DOT com>
Newsgroups: comp.os.msdos.djgpp
Subject: Please Help! Logical Disk Access
Date: Mon, 21 Jul 2003 23:34:30 +0900
Organization: Hanaro Telecom
Lines: 128
Message-ID: <bfgvp4$r05$1@news.hananet.net>
NNTP-Posting-Host: 218.39.244.178
X-Trace: news.hananet.net 1058800228 27653 218.39.244.178 (21 Jul 2003 15:10:28 GMT)
X-Complaints-To: newsadmin AT hanaro DOT com
NNTP-Posting-Date: Mon, 21 Jul 2003 15:10:28 +0000 (UTC)
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1106
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

I want to read logical sector.
so I used DOS interrupt services, int 25, int 25/cx=FFFFh, int
21/ax=7305h,cx=FFFFh
It works well under MSDOS-CWSDPMI.
but It die under Windows 98.
what is problem? I just call __dpmi_int( 0x21, &regs ). but I don't know why
it die.
if this is bug of windows, how can I read logical sector?
please help.


#include <dpmi.h>
#include <go32.h>
#include <sys/farptr.h>
#include <stdio.h>


#define SECTOR_SIZE     0x200

#pragma pack(1)
struct  SectorPacket {
    int sector;
    short num;
    short offset;
    short seg;
};
#pragma pack()

static int CallInt25( __dpmi_regs *regs )
{
    /* pushw %bp; int $0x25; popw %bp; popw %bp; retf */
    static char buff[] = { 0x55, 0xCD, 0x25, 0x5D, 0x5D, 0xCB };
    int nSeg, nSel;

    nSeg = __dpmi_allocate_dos_memory( 1, &nSel );  /* 16 bytes */
    if ( nSeg == 0 )
    {
        regs->x.flags |= 1;
        return 0;
    }
    dosmemput(buff, sizeof(buff), nSeg*16 );
    regs->x.ss = __dpmi_int_ss;
    regs->x.sp = __dpmi_int_sp;
    regs->x.cs = nSeg;
    regs->x.ip = 0;
    if ( __dpmi_simulate_real_mode_procedure_retf( regs ) != 0 )
        regs->x.flags |= 1;

    __dpmi_free_dos_memory( nSel );
    return !(regs->x.flags & 1);
}

int main( int argc, char** argv )
{
    int sector = 1;     // first logical sector
    int drive = 2;      // drive c:
    int i;
    __dpmi_regs regs;
    struct SectorPacket packet;
    char buff[SECTOR_SIZE];

    packet.sector = sector;
    packet.num = 1;
    packet.seg = __tb >> 4;
    packet.offset = __tb & 0x0F;

    printf ("read logical sector 1 in drive C:\n");

    if ( sector < 0x10000 )
    {
        printf("try int 25...");
        regs.x.ax = drive;
        regs.x.cx = 1;
        regs.x.dx = sector;
        regs.x.ds = __tb >> 4;
        regs.x.bx = __tb & 0x0F;
        CallInt25( &regs );         // it can access when disk size < 32M
    }
    if ( regs.x.flags & 1)
    {
        printf("fail\n");
        printf("try int 25/cx=ffff...");
        // copy disk read packet to transfer buffer
        dosmemput( &packet, sizeof(packet), __tb + SECTOR_SIZE );
        regs.x.ax = drive;
        regs.x.cx = 0xFFFF;
        regs.x.ds = __tb >> 4;
        regs.x.bx = ( __tb & 0x0F ) + SECTOR_SIZE;    // 'struct sector'ÀÇ
»çº»
        regs.x.dx = 0;
        CallInt25( &regs );         // it can access when disk size >= 32M
and < 2048M ( fat16 )

        if ( regs.x.flags & 1 )
        {
            printf("fail\n");
            printf("try int21/ax=7305/cx=ffff...");
            // copy disk read packet to transfer buffer
            dosmemput( &packet, sizeof(packet), __tb + SECTOR_SIZE );
            regs.x.ax = 0x7305;
            regs.x.cx = 0xFFFF;
            regs.x.dx = drive + 1;
            regs.x.si = 0;          // read mode
            regs.x.ds = __tb >> 4;
            regs.x.bx = ( __tb & 0x0F ) + SECTOR_SIZE;  // 'struct sector'ÀÇ
»çº»
            __dpmi_int( 0x21, &regs );              // it can access fat32
<-- damn, dead in win 98
            if ( regs.x.ax == 0x7300 )
                regs.x.flags |= 1;
        }
    }
    if ( regs.x.flags & 1)
    {
        printf("fail\n");
    }
    else
    {
        dosmemget( __tb, SECTOR_SIZE, buff );
        printf("success\n");
        for( i = 0; i < 16; i++ )
            printf("%02x ", buff[i] );
        printf("\n");
    }
    return 0;
}


- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019