* shared.cc (open_shared): Revert to "old" method for shared memory location if

!wincap.needs_memory_protection.
* wincap.cc: Implement needs_memory_protection throughout.
* wincap.h: Ditto.
This commit is contained in:
Christopher Faylor 2002-10-15 17:04:20 +00:00
parent fdb28b5e5f
commit 6c6c3b90e9
4 changed files with 42 additions and 11 deletions

View File

@ -1,3 +1,10 @@
2002-10-15 Christopher Faylor <cgf@redhat.com>
* shared.cc (open_shared): Revert to "old" method for shared memory
location if !wincap.needs_memory_protection.
* wincap.cc: Implement needs_memory_protection throughout.
* wincap.h: Ditto.
2002-10-15 Christopher Faylor <cgf@redhat.com>
* child_info.h (CURR_CHILD_INFO_MAGIC): Reset.

View File

@ -70,20 +70,15 @@ open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locat
+ pround (sizeof (_pinfo))
};
if (m == SH_CYGWIN_SHARED)
void *addr;
if (!wincap.needs_memory_protection ())
addr = NULL;
else
{
for (int i = SH_CYGWIN_SHARED; i < SH_TOTAL_SIZE; i++)
if (!VirtualAlloc (offsets[i], offsets[i + 1] - offsets[i],
MEM_RESERVE, PAGE_NOACCESS))
continue; /* oh well */
if (!child_proc_info)
for (DWORD s = 0x950000; s <= 0xa40000; s += 0x1000)
VirtualAlloc ((void *) s, 4, MEM_RESERVE, PAGE_NOACCESS);
addr = offsets[m];
(void) VirtualFree (addr, 0, MEM_RELEASE);
}
void *addr = offsets[m];
(void) VirtualFree (addr, 0, MEM_RELEASE);
if (!size)
return addr;
@ -118,6 +113,22 @@ open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, shared_locat
if (!shared)
api_fatal ("MapViewOfFileEx '%s'(%p), %E. Terminating.", name, shared_h);
if (m == SH_CYGWIN_SHARED)
{
for (int i = SH_CYGWIN_SHARED + 1; i < SH_TOTAL_SIZE; i++)
{
offsets[i] += (char *) shared - offsets[0];
if (!VirtualAlloc (offsets[i], offsets[i + 1] - offsets[i],
MEM_RESERVE, PAGE_NOACCESS))
continue; /* oh well */
offsets[0] = (char *) shared;
}
if (!child_proc_info && wincap.needs_memory_protection ())
for (DWORD s = 0x950000; s <= 0xa40000; s += 0x1000)
VirtualAlloc ((void *) s, 4, MEM_RESERVE, PAGE_NOACCESS);
}
debug_printf ("name %s, shared %p (wanted %p), h %p", name, shared, addr, shared_h);
/* FIXME: I couldn't find anywhere in the documentation a note about

View File

@ -47,6 +47,7 @@ static NO_COPY wincaps wincap_unknown = {
has_64bit_file_access:false,
has_process_io_counters:false,
supports_reading_modem_output_lines:false,
needs_memory_protection:false
};
static NO_COPY wincaps wincap_95 = {
@ -85,6 +86,7 @@ static NO_COPY wincaps wincap_95 = {
has_64bit_file_access:false,
has_process_io_counters:false,
supports_reading_modem_output_lines:false,
needs_memory_protection:false
};
static NO_COPY wincaps wincap_95osr2 = {
@ -123,6 +125,7 @@ static NO_COPY wincaps wincap_95osr2 = {
has_64bit_file_access:false,
has_process_io_counters:false,
supports_reading_modem_output_lines:false,
needs_memory_protection:false
};
static NO_COPY wincaps wincap_98 = {
@ -161,6 +164,7 @@ static NO_COPY wincaps wincap_98 = {
has_64bit_file_access:false,
has_process_io_counters:false,
supports_reading_modem_output_lines:false,
needs_memory_protection:false
};
static NO_COPY wincaps wincap_98se = {
@ -199,6 +203,7 @@ static NO_COPY wincaps wincap_98se = {
has_64bit_file_access:false,
has_process_io_counters:false,
supports_reading_modem_output_lines:false,
needs_memory_protection:false
};
static NO_COPY wincaps wincap_me = {
@ -237,6 +242,7 @@ static NO_COPY wincaps wincap_me = {
has_64bit_file_access:false,
has_process_io_counters:false,
supports_reading_modem_output_lines:false,
needs_memory_protection:false
};
static NO_COPY wincaps wincap_nt3 = {
@ -275,6 +281,7 @@ static NO_COPY wincaps wincap_nt3 = {
has_64bit_file_access:true,
has_process_io_counters:false,
supports_reading_modem_output_lines:true,
needs_memory_protection:true
};
static NO_COPY wincaps wincap_nt4 = {
@ -313,6 +320,7 @@ static NO_COPY wincaps wincap_nt4 = {
has_64bit_file_access:true,
has_process_io_counters:false,
supports_reading_modem_output_lines:true,
needs_memory_protection:true
};
static NO_COPY wincaps wincap_nt4sp4 = {
@ -351,6 +359,7 @@ static NO_COPY wincaps wincap_nt4sp4 = {
has_64bit_file_access:true,
has_process_io_counters:false,
supports_reading_modem_output_lines:true,
needs_memory_protection:true
};
static NO_COPY wincaps wincap_2000 = {
@ -389,6 +398,7 @@ static NO_COPY wincaps wincap_2000 = {
has_64bit_file_access:true,
has_process_io_counters:true,
supports_reading_modem_output_lines:true,
needs_memory_protection:true
};
static NO_COPY wincaps wincap_xp = {
@ -427,6 +437,7 @@ static NO_COPY wincaps wincap_xp = {
has_64bit_file_access:true,
has_process_io_counters:true,
supports_reading_modem_output_lines:true,
needs_memory_protection:true
};
wincapc wincap;

View File

@ -48,6 +48,7 @@ struct wincaps
unsigned has_64bit_file_access : 1;
unsigned has_process_io_counters : 1;
unsigned supports_reading_modem_output_lines : 1;
unsigned needs_memory_protection : 1;
};
class wincapc
@ -100,6 +101,7 @@ public:
bool IMPLEMENT (has_64bit_file_access)
bool IMPLEMENT (has_process_io_counters)
bool IMPLEMENT (supports_reading_modem_output_lines)
bool IMPLEMENT (needs_memory_protection)
#undef IMPLEMENT
};