http://jesusnjim.com/code/windows-dos/df.html

in looking at working code and wondering why mine wasing working for over a 
month now, I came to realize 2 things:
1. I had swapped DS:DX and ES:DI (ouch). this was causing the error flag to be 
set.
2. I was getting garbage back from the function call because you have to use 
dosmemput and dosmemget very close to _dpmi_int(0x21, &regs) calls in djgpp, or 
that memory will get written over by something else in your program quickly 
without your knowledge!  it can get scrambled.




________________________________
From: Walt Nagel <wr...@yahoo.com>
To: Jim Michaels <jmich...@yahoo.com>
Sent: Fri, March 18, 2011 11:52:17 AM
Subject: Re: [Freedos-devel] problem with 7303h?


Hi Jim,

"Translating" from assembly to C is not quite as straightforward as one might 
expect (or desire). A good place to start is section 18 of DJ's FAQs. I believe 
the missing part of the puzzle is that buffers used by/for interrupts must be 
located in low memory.

I translated my earlier program to C (see attached). It appears to compile 
under 
DJGPP V2 and work without using 7300h.

Regards,
Walt


--- On Tue, 3/15/11, Jim Michaels <jmich...@yahoo.com> wrote:


>From: Jim Michaels <jmich...@yahoo.com>
>Subject: Re: [Freedos-devel] problem with 7303h?
>To: "Jim Michaels" <jmich...@yahoo.com>, freedos-devel@lists.sourceforge.net
>Date: Tuesday, March 15, 2011, 4:09 PM
>
>
>here's my code fragment.
>I'm sure I'm doing something wrong.  why else would the free32 program work 
>and 
>mine not?
>
>I am using the same 7300h and 7303h function calls.  but no dice.  only diff I 
>think is that I am doing this in C rather than assembler.  I didn't read the 
>entire program because I figured those were the core 2 functions anyway.  the 
>dirty buffers check on a specific drive and then the disk free space check on 
>that drive, both fat32 calls. 7303h doesn't work without 7300h being called 
>first.
>
>I know it's not your obligation to help me, but I am at my wits end with this 
>program.  nothing I try works in freedos except that assembler program free32. 
> 
>I know I can't do this on my own.  I need  help.
>
>
>#define  STR_OFS 0x30
>#define STRUCT_OFS 0x0
>
>#if defined(__DJGPP__)
>//#define HANDLE_PRAGMA_PACK_PUSH_POP 1
>//#pragma pack(push,1)
>
>typedef struct extFAT32FreeSpaceStructure {
>/* 00h    WORD*/uint16_t    ret_size_of_returned_structure;
>/* 02h    WORD*/uint16_t    
>call_structure_version_ret_actual_structure_version;// (0000h)
>/* 04h    DWORD*/uint32_t    
>number_of_sectors_per_cluster_with_adjustment_for_compression;
>/* 08h    DWORD*/uint32_t    number_of_bytes_per_sector;
>/* 0Ch    DWORD*/uint32_t    number_of_available_clusters;
>/* 10h    DWORD*/uint32_t    total_number_of_clusters_on_the_drive;
>/* 14h    DWORD*/uint32_t    
>number_of_physical_sectors_available_on_the_drive_without_adjustment_for_compression;
>
>/* 18h     DWORD*/uint32_t    
>total_number_of_physical_sectors_on_the_drive_without_adjustment_for_compression;
>
>/* 1Ch    DWORD*/uint32_t    
>number_of_available_allocation_units_without_adjustment_for_compression;
>/* 20h    DWORD*/uint32_t    
>total_allocation_units_without_adjustment_for_compression;
>/* 24h  8 BYTEs*/uint64_t    reserved;
>uint32_t wastedspace;
>} __attribute__((packed)) extFAT32FreeSpaceStructure;
>//typedef struct extFAT32FreeSpaceStructure extFAT32FreeSpaceStructure;
>
>//#pragma pack(pop)
>
>#endif
>
>char * dirpath[26] = {
>    "A:\\",  "B:\\",  "C:\\",  "D:\\",  "E:\\",
>    "F:\\",  "G:\\",  "H:\\",  "I:\\",  "J:\\",
>    "K:\\",  "L:\\",  "M:\\",  "N:\\",  "O:\\",
>    "P:\\",   "Q:\\",  "R:\\",  "S:\\",  "T:\\",
>    "U:\\",  "V:\\",  "W:\\",  "X:\\",  "Y:\\",
>    "Z:\\"
>};
>
>
>    int64_t iDAvail, iTotal;
>    struct diskfree_t df;
>    extFAT32FreeSpaceStructure *pds = (extFAT32FreeSpaceStructure 
>*)calloc(sizeof(extFAT32FreeSpaceStructure), 1);
>/*BUG:    int21h 7303h returns a maximum of 2GB free space even on an FAT32
>      partition larger than 2GB under some versions of Win95 and Win98,
>      apparently by limiting the number of reported free clusters to no
>      more than 64K -- but only in a DOS window if a TSR has hooked INT 21h
>  */
>            __dpmi_regs r;
>             r.h.dl=drive;//curent drive
>            r.h.cl=0x01;//dirty buffers flag
>            r.x.ax=0x7300;
>            pds->ret_size_of_returned_structure=0x30;
>            __dpmi_int(0x21, &r);
>            if (0x7300!=r.x.ax) {
>                //supports fat32. 7303h doesn't work without this.
>
>                pds->call_structure_version_ret_actual_structure_version=0;
>                dosmemput(pds,  sizeof(extFAT32FreeSpaceStructure), __tb + 
>STRUCT_OFS);
>                dosmemput(dirpath[drive-a_drive], 
>strlen(dirpath[drive-a_drive])+1, __tb + STR_OFS);
>                r.x.ax=0x7303;
>                r.x.cx=sizeof(extFAT32FreeSpaceStructure);//0x30 whereas 
> before 
>it was 0x2c
>                r.x.ds=(__tb+STRUCT_OFS)>>4;
>                r.x.dx=(__tb+STRUCT_OFS)& 0x0f;
>                 r.x.es=(__tb+STR_OFS)>>4;
>                r.x.di=(__tb+STR_OFS)&0x0f;
>                r.x.flags = 1; //set carry bit to show error in case there is 
> no 
>change
>                r.x.ss=0;
>                r.x.sp=0;
>                __dpmi_int(0x21, &r);
>                if (1==r.x.flags & 1 //carry flag
>                || (1==r.x.flags & 1 &&  0==r.h.al)
>                ) {
>                    //error, so try fallback method of using old dos int21h 
>function 36h _dos_getdiskfree()
>                    //long long iTotal, iDAvail;
>
>                    //for this function, drive starting with 1 is correct.
>                    if (0==_dos_getdiskfree(drive, &df)) { // 0=default, 1=a, 
>2=b...
>                         iDAvail =df.avail_clusters;         iTotal 
>=df.total_clusters;
>                        iDAvail*=df.bytes_per_sector;       
>iTotal*=df.bytes_per_sector;
>                        iDAvail*=df.sectors_per_cluster;    
>iTotal*=df.sectors_per_cluster;
>                    } else {
>                        printf("ERROR:_dos_getdiskfree() failed, int21h 7303h  
>failed.");
>                        return false;
>                    }
>                } else {
>                    printf("AX=0x%04x,FLAGS=0x%04x\n", r.x.ax, 
>r.x.flags);//DEBUG
>                    //success on int 21h 7303h, so extract results.
>                    unsigned long  adr=r.x.es;
>                    adr<<=4;
>                    adr += r.x.di;
>                    dosmemget(/*__tb+STRUCT_OFS+*/adr, 
>sizeof(extFAT32FreeSpaceStructure), pds);
>
>                    if (pds->ret_size_of_returned_structure < 0x24
>                    || pds->ret_size_of_returned_structure > 
>sizeof(extFAT32FreeSpaceStructure))  {
>                        printf("ERROR:structure size returned=0x%04x on drive 
>%d\n",pds->ret_size_of_returned_structure, drive);
>
>                        if (0==_dos_getdiskfree(drive, &df)) { // 0=default, 
>1=a, 2=b...
>                            printf("_dos_getdiskfree() SUCCESS, int21h 7303h 
>failed. sizeof struct was 
>%hd,flags=0x%04x,AX=0x%04x\n",pds->ret_size_of_returned_structure,r.x.flags,r.x.ax);
>
>                             iDAvail =df.avail_clusters;         iTotal 
>=df.total_clusters;
>                            iDAvail*=df.bytes_per_sector;       
>iTotal*=df.bytes_per_sector;
>                            iDAvail*=df.sectors_per_cluster;    
>iTotal*=df.sectors_per_cluster;
>                        } else {
>                            printf("ERROR:_dos_getdiskfree()  failed on drive 
>%d, int21h 7303h failed.\n", drive);
>                            return false;
>                        }
>                    } else {
>                        printf("SUCCESS on int21h 7303h\n");//DEBUG
>                        iDAvail =  
>pds->number_of_sectors_per_cluster_with_adjustment_for_compression;
>                        iDAvail *= pds->number_of_bytes_per_sector;
>                        iDAvail *= pds->number_of_available_clusters;
>
>                        iTotal = 
>pds->number_of_sectors_per_cluster_with_adjustment_for_compression;
>                        iTotal *=  pds->number_of_bytes_per_sector;
>                        iTotal *= pds->total_number_of_clusters_on_the_drive;
>                    }
>                }
>            }
>    free(pds);
>
>
>
>
>
>
>
________________________________
From: Jim Michaels <jmich...@yahoo.com>
>To: freedos development  <freedos-devel@lists.sourceforge.net>
>Sent: Tue, March 15, 2011 11:33:25 AM
>Subject: [Freedos-devel] problem with 7303h?
>
>
>I am calling 7303H, but I am getting failure under freedos.
>upon return,
>int21h 7303h failed. sizeof struct was 14917=0x3a45,flags=0x3003,AX=0x000f
>
>function 36h succeeded.
>I am using djgpp, and while I haven't gotten the best of help on how to 
>implement that return of ES:DI buffer pointer, I should think I would have 
>gotten it by now with all the things I have tried.
>
> -------------
>Jim Michaels
>jmich...@yahoo.com
>j...@jimscomputerrepairandwebdesign.com
>http://JimsComputerRepairandWebDesign.com
>http://JesusnJim.com (my personal site, has software)
>http://DoLifeComputers.JesusnJim.com (group which I lead)
>---
>Computer memory/disk size measurements:
>[KB KiB] [MB MiB] [GB GiB] [TB TiB]
>[10^3B=1,000B=1KB][2^10B=1,024B=1KiB]
>[10^6B=1,000,000B=1MB][2^20B=1,048,576B=1MiB]
>[10^9B=1,000,000,000B=1GB][2^30B=1,073,741,824B=1GiB]
>[10^12B=1,000,000,000,000B=1TB][2^40B=1,099,511,627,776B=1TiB]
>Note: disk size is measured in MB, GB, or TB, not in MiB, GiB, or TiB.  
>computer 
>memory (RAM) is measured in MiB and GiB.
>
>
>
>
>
>
>-----Inline Attachment Follows-----
>
>
>------------------------------------------------------------------------------
>Colocation vs. Managed Hosting
>A question and answer guide to determining the best fit
>for your organization - today and in the future.
>http://p.sf.net/sfu/internap-sfd2d
>-----Inline Attachment Follows-----
>
>
>_______________________________________________
>Freedos-devel mailing list
>Freedos-devel@lists.sourceforge.net
>https://lists.sourceforge.net/lists/listinfo/freedos-devel
> 



      
------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
Freedos-devel mailing list
Freedos-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freedos-devel

Reply via email to