[Vm-dev] Raise minimum supported Windows API from XP to Vista (was: Identify console executable and standard one)
Vincent.Blondeau at lamresearch.com
Vincent.Blondeau at lamresearch.com
Tue Apr 24 00:39:19 UTC 2018
From: Vm-dev [mailto:vm-dev-bounces at lists.squeakfoundation.org] On Behalf Of Eliot Miranda
Sent: Monday, April 23, 2018 16:24
To: Open Smalltalk Virtual Machine Development Discussion <vm-dev at lists.squeakfoundation.org>
Subject: Re: [Vm-dev] Raise minimum supported Windows API from XP to Vista (was: Identify console executable and standard one)
Hi Vincent,
On Mon, Apr 23, 2018 at 4:11 PM, <Vincent.Blondeau at lamresearch.com> wrote:
>
>
> Hi Eliot,
>
>
>
> *From:* Vm-dev [mailto:vm-dev-bounces at lists.squeakfoundation.org] *On
> Behalf Of *Eliot Miranda
> *Sent:* Monday, April 23, 2018 13:33
> *To:* Open Smalltalk Virtual Machine Development Discussion <vm-dev at lists.
> squeakfoundation.org>
> *Subject:* Re: [Vm-dev] Raise minimum supported Windows API from XP to
> Vista (was: Identify console executable and standard one)
>
>
>
> Hi Alistair,
>
>
>
> On Mon, Apr 23, 2018 at 1:06 PM, Alistair Grant <akgrant0710 at gmail.com>
>
> wrote:
>
>
>
> >
>
> > Hi Eliot & Vincent,
>
> >
>
> > On Mon, Apr 23, 2018 at 10:00:12AM -0700, Eliot Miranda wrote:
>
> > >
>
> > > Hi Alistair,
>
> > >
>
> > >
>
> > > > On Apr 23, 2018, at 2:46 AM, Alistair Grant <akgrant0710 at gmail.com>
>
> > wrote:
>
> > > >
>
> > > >
>
> > > > Hi Everyone,
>
> > > >
>
> > > >
>
> > > > I have some test code that correctly identifies whether stdin on
>
> > Windows
>
> > > > is a console or redirected, in both windows command terminals
> (cmd.exe)
>
> > > > and cygwin mintty (the current code only works for cmd.exe, not for
>
> > > > cygwin terminals).
>
> > > >
>
> > > > However it relies on the Windows Vista API, i.e. _WIN32_WINNT >=
>
> > > > 0x0600, and at the moment we set the minimum supported version to
>
> > > > Windows XP (0x0501).
>
> > > >
>
> > > > Since Windows XP is no longer supported, I can't see any problem with
>
> > > > raising the minimum version to Windows Vista (which also isn't
>
> > > > supported, but should give us maximum compatibility), but wanted to
>
> > > > check first.
>
> > > >
>
> > > > Are there any objections to raising the minimum API level to Windows
>
> > > > Vista?
>
> > >
>
> > > Not from me. But it would be nice if the resulting executable still
>
> > > ran in Windows NT. Is that still possible? What does the code look
>
> > > like?
>
> >
>
> > If we make this change I think the chances of it working on NT are next
>
> > to zero.
>
> >
>
> > Actually, I'd be surprised if the current VM ran on NT since it is
>
> > explicitly asking for the XP API, but I haven't tested it.
>
> >
>
> > The code is available at:
>
> >
>
> > https://urldefense.proofpoint.com/v2/url?u=https-3A__
> fossies.org_linux_misc_vim-2D8.0.tar.bz2_vim80_src_iscygpty.c&d=DwIBaQ&c=
> RWI7EqL8K9lqtga8KxgfzvOYoob76EZWE0yAO85PVMQ&r=
> kIZIYXBAA3fhM7P5HOuTC5w6mnEApTfXPTq3lR34ZiY&m=oPgRLf_
> qAaa4HRKiutXLr1xXOa8SzpEcef72bohSLbU&s=mkWFs166cLTuhJuXteRsf0YR1UetLX
> CU4lbr9L-ztdY&e=
>
> > https://urldefense.proofpoint.com/v2/url?u=https-3A__
> fossies.org_linux_misc_vim-2D8.0.tar.bz2_vim80_src_iscygpty.h&d=DwIBaQ&c=
> RWI7EqL8K9lqtga8KxgfzvOYoob76EZWE0yAO85PVMQ&r=
> kIZIYXBAA3fhM7P5HOuTC5w6mnEApTfXPTq3lR34ZiY&m=oPgRLf_
> qAaa4HRKiutXLr1xXOa8SzpEcef72bohSLbU&s=C9f7RvD0S_OxvWZFF8Md_
> 6nmuANHrD3WPtoUghrAahE&e=
>
>
>
>
>
> So if you look at lines 60 through 101 you'll see the standard technique
>
> for getting around the version issue:
>
>
>
> 60 //#define USE_DYNFILEID
>
> 61 #ifdef USE_DYNFILEID
>
> 62 typedef BOOL (WINAPI *pfnGetFileInformationByHandleEx)(
>
> 63 HANDLE hFile,
>
> 64 FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
>
> 65 LPVOID lpFileInformation,
>
> 66 DWORD dwBufferSize
>
> 67 );
>
> 68 static pfnGetFileInformationByHandleEx pGetFileInformationByHandleEx
>
> = NULL;
>
> 69
>
> 70 # ifndef USE_FILEEXTD
>
> 71 static BOOL WINAPI stub_GetFileInformationByHandleEx(
>
> 72 HANDLE hFile,
>
> 73 FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
>
> 74 LPVOID lpFileInformation,
>
> 75 DWORD dwBufferSize
>
> 76 )
>
> 77 {
>
> 78 return FALSE;
>
> 79 }
>
> 80 # endif
>
> 81
>
> 82 static void setup_fileid_api(void)
>
> 83 {
>
> 84 if (pGetFileInformationByHandleEx != NULL) {
>
> 85 return;
>
> 86 }
>
> 87 pGetFileInformationByHandleEx = (pfnGetFileInformationByHandleE
> x)
>
> 88 GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
>
> 89 "GetFileInformationByHandleEx");
>
> 90 if (pGetFileInformationByHandleEx == NULL) {
>
> 91 # ifdef USE_FILEEXTD
>
> 92 pGetFileInformationByHandleEx = GetFileInformationByHandleEx;
>
> 93 # else
>
> 94 pGetFileInformationByHandleEx =
>
> stub_GetFileInformationByHandleEx;
>
> 95 # endif
>
> 96 }
>
> 97 }
>
> 98 #else
>
> 99 # define pGetFileInformationByHandleEx GetFileInformationByHandleEx
>
> 100 # define setup_fileid_api()
>
> 101 #endif
>
>
>
>
>
> If USE_DYNFILEID is defined then the code searches kernel32.dll and uses
>
> the function if found. So the safe way to write this is to follow the
>
> approach given by USE_DYNFILEID (no need to implement setup_fileid_api; all
>
> thats needed is the statements therefore prepended to the use of
>
> pGetFileInformationByHandleEx). If GetFileInformationByHandleEx exists in
>
> kernel32.dll use it, otherwise fall back on our existing code. That way we
>
> should be able to keep the Windows XP build level. People still use it a
>
> lot (especially students in poor countries) and I'd rather wait until we
>
> can jump forward beyond Vista to make the change ;-) ;-) ;-)
>
>
>
>
>
> Does that make sense? You'll see some of this code in the win32 subsystem
>
> already; gre p GetProcAddress platforms/win32/vm/*
>
> platforms/win32/plugins/*/*
>
>
>
> It does make sense. But, it is not possible anymore to compile with Cygwin
> in this case: some structures like FILE_BASIC_INFO,
> FILE_INFO_BY_HANDLE_CLASS are not defined if the Windows version is before
> 0x0600 (see winbase.h:2641).
>
No problem; one simply steals the Microsoft define from the Vista header
and includes it verbatim, e.g. see NOTIFYICONDATA
in platforms/win32/vm/sqWin32.h.
> And in the Windows 10 version of Cygwin, fileExt.h, which should contains
> the definitions for the XP version, is just an empty stub.
>
>
>
> Then, should we change:
>
> WINVER:=-D_WIN32_WINNT=0x0501 -DWINVER=0x0501
>
> to:
>
> WINVER:=-D_WIN32_WINNT=0x0600 -DWINVER=0x0600
>
> In Makefile.tools, knowing that the dependencies are still compatible?
>
>
>
> Or should be add the fileExt.h XP version in the dependencies?
>
No. We simply define the necessary types verbatim. Look at sqWin32.h for
the pattern:
/****************************************************************************/
/* few addtional definitions for those having older include files
*/
/****************************************************************************/
#if (WINVER < 0x0400) && !defined(_GNU_H_WINDOWS_H)
...
defines
#endif
In this case we should just use #if WINVER < 0x0600, right?
Indeed!
Waiting for review now: https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/254
It is working fine on Windows 10 with the debug version, with Powershell, Cygwin, and standard Launching for the explorer
Vincent
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20180424/b032c99f/attachment-0001.html>
More information about the Vm-dev
mailing list