From: the_doc AT primenet DOT com (David Boynton) Newsgroups: comp.os.msdos.djgpp Subject: I'm sure this is a FAQ, but I couldn't find the answer. Date: Sat, 11 Apr 1998 19:52:55 GMT Organization: http://extra.newsguy.com Lines: 83 Message-ID: <352fc5a5.399357@enews.newsguy.com> NNTP-Posting-Host: p-313.newsdawg.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Precedence: bulk Can anyone tell me why the following code doesn't work? The breaking point is when I try to assign the segment returned by __dpmi_allocate_dos_memory() to the buffer in the disk read packet. I'm obviously not converting it correctly as this thing always either locks up my machine or throws a windows protection error. :( Thanks in advance, and sorry if this gets asked a lot. --------------------------------------------------------- #include #include #include #include #include #include typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long DWORD; int main (void) { WORD nsects=1; // These used to be parameters of a fxn, DWORD lsect=0; // this little program is just to test BYTE drive=1; // the code. BYTE pbuffer[512]; memset(pbuffer, 0, 512); // For debug purposes int iNoParas=0, iDosMemSelector=0; WORD wSegment=0, wNoBytes=0; struct { DWORD lsect; // Starting sector WORD nsects; // # of sectors to read DWORD buffer; // Where to put the stuff... } drp; wNoBytes=nsects*512; iNoParas=(wNoBytes+15) >> 4; wSegment=__dpmi_allocate_dos_memory(iNoParas, &iDosMemSelector); assert(iDosMemSelector > 0); drp.buffer=wSegment << 16; // I've tried wSegment * 16 also // with similar results. drp.lsect=lsect; drp.nsects=nsects; dosmemput(&drp, sizeof(drp), __tb); // Copy our struct into DOS mem. __dpmi_regs in; memset (&in, 0, sizeof(__dpmi_regs)); in.x.ax=0x7305; // Extended Absolute Disk Read/Write in.h.dl=drive+1; // Make it work like the old Borland fxn, so // the default drive isn't availible. in.x.si=0x0000; // Read unknown data in.x.cx=0xffff; in.x.bx=(__tb & 0x0f); in.x.ds=((__tb >> 4) & 0xffff); __dpmi_int(0x21, &in); dosmemget(drp.buffer, wNoBytes, pbuffer); FILE *output=fopen ("pbuffer.bin", "wb"); assert(output!=NULL); fwrite(pbuffer, 512, 1, output); fclose(output); // After this pbuffer contains nothing but garbage (actually, it's // part of DJGPP.ENV). If I do the dosmemget on __tb, I can see the // disk read packet, so that's getting transferred to conventional // memory fine. __dpmi_free_dos_memory(iDosMemSelector); return 0; } ----------------------------------------------------------------------------- David Boynton | "It wasn't always like this, I had a Finger for PGP Key (3072/DA2C347A) | life... once." - Ash, Army of Darkness