|
From: Jim M. <jmi...@ya...> - 2011-03-20 06:37:34
|
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, ®s) 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...@ya...> To: Jim Michaels <jmi...@ya...> 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 <jmi...@ya...> wrote: >From: Jim Michaels <jmi...@ya...> >Subject: Re: [Freedos-devel] problem with 7303h? >To: "Jim Michaels" <jmi...@ya...>, fre...@li... >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 <jmi...@ya...> >To: freedos development <fre...@li...> >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 >jmi...@ya... >Ji...@Ji... >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 >Fre...@li... >https://lists.sourceforge.net/lists/listinfo/freedos-devel > |