delorie.com/archives/browse.cgi | search |
X-Authentication-Warning: | delorie.com: mail set sender to djgpp-bounces using -f |
From: | James <countingtoten AT gmail DOT com> |
Newsgroups: | comp.os.msdos.djgpp |
Subject: | Segfault reading memory address > 0xFFFFF000 |
Date: | Tue, 25 Mar 2008 13:30:19 -0700 (PDT) |
Organization: | http://groups.google.com |
Lines: | 95 |
Message-ID: | <c76e39a6-8268-4d92-9ed7-f4a8eaf568f6@m36g2000hse.googlegroups.com> |
NNTP-Posting-Host: | 15.235.153.106 |
Mime-Version: | 1.0 |
X-Trace: | posting.google.com 1206477020 27886 127.0.0.1 (25 Mar 2008 20:30:20 GMT) |
X-Complaints-To: | groups-abuse AT google DOT com |
NNTP-Posting-Date: | Tue, 25 Mar 2008 20:30:20 +0000 (UTC) |
Complaints-To: | groups-abuse AT google DOT com |
Injection-Info: | m36g2000hse.googlegroups.com; posting-host=15.235.153.106; |
posting-account=0eZ2FQoAAAAH9Eu6ZsBYvAdTdeH7YxPs | |
User-Agent: | G2/1.0 |
X-HTTP-UserAgent: | Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) |
Gecko/20080201 Firefox/2.0.0.12,gzip(gfe),gzip(gfe) | |
X-Original-Bytes: | 3420 |
To: | djgpp AT delorie DOT com |
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp |
Reply-To: | djgpp AT delorie DOT com |
When I try to read a memory address higher than 0xFFFFF000 directly using DJGPP in DOS the program seg faults, but if I step up to that address by reading the addresses before it, the program works fine. Why does stepping up to the address work but not reading the address directly and is there a fix to just read the address directly? Here is the affected code: #define TRUE 1 #define FALSE 0 typedef int BOOL; typedef unsigned char* PCHAR; typedef unsigned char* PBYTE; typedef unsigned char BYTE; typedef unsigned short int WORD; typedef unsigned long int DWORD; BOOL ReadMemory(DWORD address, DWORD size, PBYTE buffer) { DWORD offset; __dpmi_meminfo mi; if(address > 0xFFFFF000) { int temp, x = 0xFFFFF000; while( x < address) { mi.address = x; mi.size = 0x1000; if(__dpmi_physical_address_mapping(&mi) == -1) { printf("ERROR: __dpmi_physical_address_mapping\n"); } selector = __dpmi_allocate_ldt_descriptors(1); if(__dpmi_set_segment_base_address(selector, mi.address) == -1) { printf("ERROR: __dpmi_set_segment_base_address\n"); } if(__dpmi_set_segment_limit(selector, mi.size - 1)) { printf("ERROR: __dpmi_set_segment_limit\n"); } temp = _farpeekb(selector, 0); __dpmi_free_ldt_descriptor(selector); __dpmi_free_physical_address_mapping(&mi); x += 0x10; } } for(offset=0; offset<size; offset++) { if((address + offset) < 0x100000) { buffer[offset] = _farpeekb(_dos_ds, address + offset); } else { mi.address = address + offset; mi.size = 0x1000; if(__dpmi_physical_address_mapping(&mi) == -1) { printf("ERROR: __dpmi_physical_address_mapping\n"); return FALSE; } selector = __dpmi_allocate_ldt_descriptors(1); if(__dpmi_set_segment_base_address(selector, mi.address) == -1) { printf("ERROR: __dpmi_set_segment_base_address\n"); return FALSE; } if(__dpmi_set_segment_limit(selector, mi.size - 1)) { printf("ERROR: __dpmi_set_segment_limit\n"); return FALSE; } buffer[offset] = _farpeekb(selector, 0); __dpmi_free_ldt_descriptor(selector); __dpmi_free_physical_address_mapping(&mi); } } return (TRUE); } Thanks for your help, James
webmaster | delorie software privacy |
Copyright © 2019 by DJ Delorie | Updated Jul 2019 |