* wincap.h (wincaps::detect_win16_exe): Declare.
(wincapc::detect_win16_exe): Implement. * wincap.cc: Populate detect_win16_exe where appropriate. * spawn.cc (spawn_guts): Only go out of the way to detect 16-bit apps on systems which are flummoxed by them.
This commit is contained in:
parent
2bc6be1eda
commit
91717fb806
|
@ -1,3 +1,11 @@
|
|||
2005-06-17 Christopher Faylor <cgf@timesys.com>
|
||||
|
||||
* wincap.h (wincaps::detect_win16_exe): Declare.
|
||||
(wincapc::detect_win16_exe): Implement.
|
||||
* wincap.cc: Populate detect_win16_exe where appropriate.
|
||||
* spawn.cc (spawn_guts): Only go out of the way to detect 16-bit apps
|
||||
on systems which are flummoxed by them.
|
||||
|
||||
2005-06-17 Christopher Faylor <cgf@timesys.com>
|
||||
|
||||
* spawn.cc (spawn_guts): Detect when executing a 16-bit application and
|
||||
|
|
|
@ -402,7 +402,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
|
|||
|
||||
av newargv (ac, argv);
|
||||
|
||||
bool msdos_exe = false;
|
||||
bool win16_exe = false;
|
||||
int null_app_name = 0;
|
||||
if (ac == 3 && argv[1][0] == '/' && argv[1][1] == 'c' &&
|
||||
(iscmd (argv[0], "command.com") || iscmd (argv[0], "cmd.exe")))
|
||||
|
@ -434,7 +434,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
|
|||
|
||||
/* If the file name ends in either .exe, .com, .bat, or .cmd we assume
|
||||
that it is NOT a script file */
|
||||
while (*ext == '\0' || strcasematch (ext, ".exe"))
|
||||
while (*ext == '\0' || (wincap.detect_win16_exe () && strcasematch (ext, ".exe")))
|
||||
{
|
||||
HANDLE hnd = CreateFile (real_path, GENERIC_READ,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
|
@ -462,7 +462,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
|
|||
if (buf[0] == 'M' && buf[1] == 'Z')
|
||||
{
|
||||
unsigned off = (unsigned char) buf[0x18] | (((unsigned char) buf[0x19]) << 8);
|
||||
msdos_exe = off < sizeof (IMAGE_DOS_HEADER);
|
||||
win16_exe = off < sizeof (IMAGE_DOS_HEADER);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -812,7 +812,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
|
|||
on this fact when we exit. dup_proc_pipe will close our end of the pipe.
|
||||
Note that wr_proc_pipe may also be == INVALID_HANDLE_VALUE. That will make
|
||||
dup_proc_pipe essentially a no-op. */
|
||||
if (!msdos_exe && myself->wr_proc_pipe)
|
||||
if (!win16_exe && myself->wr_proc_pipe)
|
||||
{
|
||||
myself->sync_proc_pipe (); /* Make sure that we own wr_proc_pipe
|
||||
just in case we've been previously
|
||||
|
|
|
@ -57,7 +57,8 @@ static NO_COPY wincaps wincap_unknown = {
|
|||
has_ioctl_storage_get_media_types_ex:false,
|
||||
start_proc_suspended:true,
|
||||
has_extended_priority_class:false,
|
||||
has_guid_volumes:false
|
||||
has_guid_volumes:false,
|
||||
detect_win16_exe:true
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_95 = {
|
||||
|
@ -106,7 +107,8 @@ static NO_COPY wincaps wincap_95 = {
|
|||
has_ioctl_storage_get_media_types_ex:false,
|
||||
start_proc_suspended:true,
|
||||
has_extended_priority_class:false,
|
||||
has_guid_volumes:false
|
||||
has_guid_volumes:false,
|
||||
detect_win16_exe:true
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_95osr2 = {
|
||||
|
@ -155,7 +157,8 @@ static NO_COPY wincaps wincap_95osr2 = {
|
|||
has_ioctl_storage_get_media_types_ex:false,
|
||||
start_proc_suspended:true,
|
||||
has_extended_priority_class:false,
|
||||
has_guid_volumes:false
|
||||
has_guid_volumes:false,
|
||||
detect_win16_exe:true
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_98 = {
|
||||
|
@ -204,7 +207,8 @@ static NO_COPY wincaps wincap_98 = {
|
|||
has_ioctl_storage_get_media_types_ex:false,
|
||||
start_proc_suspended:true,
|
||||
has_extended_priority_class:false,
|
||||
has_guid_volumes:false
|
||||
has_guid_volumes:false,
|
||||
detect_win16_exe:true
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_98se = {
|
||||
|
@ -253,7 +257,8 @@ static NO_COPY wincaps wincap_98se = {
|
|||
has_ioctl_storage_get_media_types_ex:false,
|
||||
start_proc_suspended:true,
|
||||
has_extended_priority_class:false,
|
||||
has_guid_volumes:false
|
||||
has_guid_volumes:false,
|
||||
detect_win16_exe:true
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_me = {
|
||||
|
@ -302,7 +307,8 @@ static NO_COPY wincaps wincap_me = {
|
|||
has_ioctl_storage_get_media_types_ex:false,
|
||||
start_proc_suspended:true,
|
||||
has_extended_priority_class:false,
|
||||
has_guid_volumes:false
|
||||
has_guid_volumes:false,
|
||||
detect_win16_exe:true
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_nt3 = {
|
||||
|
@ -351,7 +357,8 @@ static NO_COPY wincaps wincap_nt3 = {
|
|||
has_ioctl_storage_get_media_types_ex:false,
|
||||
start_proc_suspended:false,
|
||||
has_extended_priority_class:false,
|
||||
has_guid_volumes:false
|
||||
has_guid_volumes:false,
|
||||
detect_win16_exe:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_nt4 = {
|
||||
|
@ -400,7 +407,8 @@ static NO_COPY wincaps wincap_nt4 = {
|
|||
has_ioctl_storage_get_media_types_ex:false,
|
||||
start_proc_suspended:false,
|
||||
has_extended_priority_class:false,
|
||||
has_guid_volumes:false
|
||||
has_guid_volumes:false,
|
||||
detect_win16_exe:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_nt4sp4 = {
|
||||
|
@ -449,7 +457,8 @@ static NO_COPY wincaps wincap_nt4sp4 = {
|
|||
has_ioctl_storage_get_media_types_ex:false,
|
||||
start_proc_suspended:false,
|
||||
has_extended_priority_class:false,
|
||||
has_guid_volumes:false
|
||||
has_guid_volumes:false,
|
||||
detect_win16_exe:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_2000 = {
|
||||
|
@ -498,7 +507,8 @@ static NO_COPY wincaps wincap_2000 = {
|
|||
has_ioctl_storage_get_media_types_ex:false,
|
||||
start_proc_suspended:false,
|
||||
has_extended_priority_class:true,
|
||||
has_guid_volumes:true
|
||||
has_guid_volumes:true,
|
||||
detect_win16_exe:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_xp = {
|
||||
|
@ -547,7 +557,8 @@ static NO_COPY wincaps wincap_xp = {
|
|||
has_ioctl_storage_get_media_types_ex:true,
|
||||
start_proc_suspended:false,
|
||||
has_extended_priority_class:true,
|
||||
has_guid_volumes:true
|
||||
has_guid_volumes:true,
|
||||
detect_win16_exe:false
|
||||
};
|
||||
|
||||
static NO_COPY wincaps wincap_2003 = {
|
||||
|
@ -596,7 +607,8 @@ static NO_COPY wincaps wincap_2003 = {
|
|||
has_ioctl_storage_get_media_types_ex:true,
|
||||
start_proc_suspended:false,
|
||||
has_extended_priority_class:true,
|
||||
has_guid_volumes:true
|
||||
has_guid_volumes:true,
|
||||
detect_win16_exe:false
|
||||
};
|
||||
|
||||
wincapc wincap;
|
||||
|
|
|
@ -59,6 +59,7 @@ struct wincaps
|
|||
unsigned start_proc_suspended : 1;
|
||||
unsigned has_extended_priority_class : 1;
|
||||
unsigned has_guid_volumes : 1;
|
||||
unsigned detect_win16_exe : 1;
|
||||
};
|
||||
|
||||
class wincapc
|
||||
|
@ -122,6 +123,7 @@ public:
|
|||
bool IMPLEMENT (start_proc_suspended)
|
||||
bool IMPLEMENT (has_extended_priority_class)
|
||||
bool IMPLEMENT (has_guid_volumes)
|
||||
bool IMPLEMENT (detect_win16_exe)
|
||||
|
||||
#undef IMPLEMENT
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue