From: yorka AT dlc DOT fi (aYk) Newsgroups: comp.os.msdos.djgpp Subject: Problems with vbe2 linear framebuffer deinitialization Date: Sat, 27 Jun 1998 11:43:13 GMT Organization: Majik Lines: 78 Message-ID: <3594d67a.231650@news.dlc.fi> NNTP-Posting-Host: cccxcv.kdyn.saunalahti.fi 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 I am having trouble with the code below. It is almost entirely ripped from the DJGPP User's Guide vesa-programming sections (thanks Shawn :)) with slight modifications. Read the comments for more info. #include // this is my own lib's include file #include #include #include #include __dpmi_meminfo mapping; int selector; /* This function initializes a linear framebuffer for the current vesa mode by setting a selector to the globally defined variable */ void InitLFB() { VBEModeInfo mode_info; VBEInfo vesa_info; GetVBEModeInfo(QueryCurrentMode(),&mode_info); GetVBEInfo(&vesa_info); /* map into linear memory */ mapping.address = mode_info.PhysBasePtr; mapping.size = vesa_info.TotalMemory << 16; if (__dpmi_physical_address_mapping(&mapping) != 0) return; /* allocate an LDT descriptor to access the linear region */ selector = __dpmi_allocate_ldt_descriptors(1); if (selector < 0) { __dpmi_free_physical_address_mapping(&mapping); return; } /* set the descriptor location and size */ __dpmi_set_segment_base_address(selector, mapping.address); __dpmi_set_segment_limit(selector, mapping.size-1); } /* This function should free the dpmi meminfo struct and the ldt descriptor. It works just fine in plain DOS but crashes under Windows 95 DOS box (the __dpmi_free_physical_address_mapping causes the crash). Why is that? */ void DeinitLFB() { __dpmi_free_physical_address_mapping(&mapping); __dpmi_free_ldt_descriptor(selector); } /* Here's just the main function which shows how I make the function calls. Everything works except for the DeinitLFB() -function under Windows 95. */ int main() { SetVBEMode(320,200,15); InitLFB(); getch(); _farpokew(selector,0,0xFFFF); // this is here just to test the LFB getch(); DeinitLFB(); GraphicsMode(0x03); return 1; } Thanks in advance for all help. - aYk - | Atte "Yorkaturr" Koivula - aYk - | | -------------------------------------- | | God of Evil | yorka AT dlc DOT fi | | Programmer | yorka AT newbies DOT net | | Graphician | yorkaturr AT majik DOT netti DOT fi | | -------------------------------------- | | Majik MURPE - http://majik.netti.fi |