From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D217BC04A68 for ; Wed, 27 Jul 2022 13:22:22 +0000 (UTC) Received: from localhost ([::1]:35628 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oGgzV-0006ZK-Mb for qemu-devel@archiver.kernel.org; Wed, 27 Jul 2022 09:22:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:60668) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oGgvk-0004ZC-2J for qemu-devel@nongnu.org; Wed, 27 Jul 2022 09:18:28 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:51496) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oGgvf-0000Kx-D1 for qemu-devel@nongnu.org; Wed, 27 Jul 2022 09:18:26 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1658927902; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=Hn6Ns6YMQVXNJ1pgGxIrawhHlM2ZMm18ENzBEGQMsy8=; b=CxpbbQlJOgl9qg3kVrtnBc04a12+V96ZBdsL8D5LxLGLjiP9IbEFVFwW01wWA7AnpfqP9W tui++Thd+ekU8mzUHsz9B3/VL//E8FF7kLAMdXjzILLvUjTUj5e07JCRKzrg9wN4Vo5ISJ ujRbDek4Sb66IItrTwhDE+Us6dizthw= Received: from mail-yw1-f199.google.com (mail-yw1-f199.google.com [209.85.128.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-85-mBo4gBd1O8erQPh5XnfdpA-1; Wed, 27 Jul 2022 09:18:20 -0400 X-MC-Unique: mBo4gBd1O8erQPh5XnfdpA-1 Received: by mail-yw1-f199.google.com with SMTP id 00721157ae682-31ea3f0e357so108679787b3.16 for ; Wed, 27 Jul 2022 06:18:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=Hn6Ns6YMQVXNJ1pgGxIrawhHlM2ZMm18ENzBEGQMsy8=; b=GRBqq0R3MjuxoSy6Uam98Dd+VJqrHAF66cxUKy1xEu0HRBjaTVHffZUWsou7hnGRds FHKGtZSMkmfLExOY2Nvo2Nee6qwIgC/rXNfUAb/Ob+TxUiJ/0JLJuB77QBTJhRAGxIEu r7pdi/uiVUOyOFup2pfz2OT0IovySZSUxaCDMTPh7zYb8fmdecXR8BF7vAHPp2KuEW5J +46LqaoQFC0vKqVQnuvMVaWUMT0J/HDj9vPqnaWOMwtFk0fV7zYqHQUwh8ZXaDouha50 C62h9EyvCEq712HzuBwRSMjLbNV4WH4LT0tJN1bswpFvL3dcV3p9R7GwlEcUUOvUDBkA Dt2A== X-Gm-Message-State: AJIora/7prfELt6k/gyE/8b6ZeZZrdhxGTK1arPzWg09v/E4EzGuialP nl0hSO4uFqYqEsxvlhkuIQDHsZiF7Tmt1hKn9A8qZwdGpxMNxMMMzCEQZ8KP73WAhqqdGY5gQJx FvNV4dmCsTb327YpYeFtnBuEZ8yPWvOA= X-Received: by 2002:a0d:d655:0:b0:31f:417c:2187 with SMTP id y82-20020a0dd655000000b0031f417c2187mr9391820ywd.385.1658927900250; Wed, 27 Jul 2022 06:18:20 -0700 (PDT) X-Google-Smtp-Source: AGRyM1uwZKAm5sbdchpOVqSXB/pZL6eC2//106ECC8hXDKrIBP0xxjTD5CyUkobrduDYymdAsKIs7pJCaYQiGEkVCg0= X-Received: by 2002:a0d:d655:0:b0:31f:417c:2187 with SMTP id y82-20020a0dd655000000b0031f417c2187mr9391796ywd.385.1658927899979; Wed, 27 Jul 2022 06:18:19 -0700 (PDT) MIME-Version: 1.0 References: <20220727073542.811420-1-bmeng.cn@gmail.com> <20220727073542.811420-3-bmeng.cn@gmail.com> In-Reply-To: From: Konstantin Kostiuk Date: Wed, 27 Jul 2022 16:18:07 +0300 Message-ID: Subject: Re: [PATCH 2/5] util/oslib-win32: Add a helper to get the Windows version To: Bin Meng Cc: =?UTF-8?Q?Daniel_P=2E_Berrang=C3=A9?= , Yan Vugenfirer , QEMU Developers , Bin Meng , Xuzhou Cheng , Stefan Weil Content-Type: multipart/alternative; boundary="0000000000002fcc3605e4c940f7" Received-SPF: pass client-ip=170.10.129.124; envelope-from=kkostiuk@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" --0000000000002fcc3605e4c940f7 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Jul 27, 2022 at 2:58 PM Bin Meng wrote: > On Wed, Jul 27, 2022 at 6:00 PM Daniel P. Berrang=C3=A9 > wrote: > > > > On Wed, Jul 27, 2022 at 05:38:27PM +0800, Bin Meng wrote: > > > On Wed, Jul 27, 2022 at 4:50 PM Yan Vugenfirer > wrote: > > > > > > > > On Wed, Jul 27, 2022 at 10:43 AM Bin Meng > wrote: > > > > > > > > > > From: Bin Meng > > > > > > > > > > This adds a helper to get the Windows version via the RtlGetVersi= on > > > > > call, for QEMU codes to determine the Windows version at run-time= . > > > > > > > > > > Signed-off-by: Xuzhou Cheng > > > > > Signed-off-by: Bin Meng > > > > > --- > > > > > > > > > > include/sysemu/os-win32.h | 2 ++ > > > > > util/oslib-win32.c | 15 +++++++++++++++ > > > > > 2 files changed, 17 insertions(+) > > > > > > > > > > diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.= h > > > > > index edc3b38a57..1e324026a4 100644 > > > > > --- a/include/sysemu/os-win32.h > > > > > +++ b/include/sysemu/os-win32.h > > > > > @@ -204,6 +204,8 @@ ssize_t qemu_recv_wrap(int sockfd, void *buf, > size_t len, int flags); > > > > > ssize_t qemu_recvfrom_wrap(int sockfd, void *buf, size_t len, in= t > flags, > > > > > struct sockaddr *addr, socklen_t > *addrlen); > > > > > > > > > > +void os_get_win_version(RTL_OSVERSIONINFOEXW *info); > > > > > + > > > > > #ifdef __cplusplus > > > > > } > > > > > #endif > > > > > diff --git a/util/oslib-win32.c b/util/oslib-win32.c > > > > > index 5723d3eb4c..6d2387b9ff 100644 > > > > > --- a/util/oslib-win32.c > > > > > +++ b/util/oslib-win32.c > > > > > @@ -547,3 +547,18 @@ int qemu_msync(void *addr, size_t length, in= t > fd) > > > > > */ > > > > > return qemu_fdatasync(fd); > > > > > } > > > > > + > > > > > +void os_get_win_version(RTL_OSVERSIONINFOEXW *info) > > > > > +{ > > > > > + typedef LONG (WINAPI > *rtl_get_version_t)(PRTL_OSVERSIONINFOEXW); > > > > > + > > > > > + /* RtlGetVersion is available starting with Windows 2000 */ > > > > > + HMODULE module =3D GetModuleHandle("ntdll"); > > > > > + PVOID fun =3D GetProcAddress(module, "RtlGetVersion"); > > > > > + rtl_get_version_t rtl_get_version =3D (rtl_get_version_t)fun= ; > > > > > + > > > > > + info->dwOSVersionInfoSize =3D sizeof(RTL_OSVERSIONINFOEXW); > > > > > + rtl_get_version(info); > > > > The original function, when it was present in qemu-ga, tested that > > > > getting the function address succeeded. > > > > I think this test should be kept. > > > > See below: > > > > - PVOID fun =3D GetProcAddress(module, "RtlGetVersion"); > > > > - if (fun =3D=3D NULL) { > > > > - error_setg(errp, QERR_QGA_COMMAND_FAILED, > > > > - "Failed to get address of RtlGetVersion"); > > > > - return; > > > > - } > > > > > > > > > > Please see the comment: > > > > > > /* RtlGetVersion is available starting with Windows 2000 */ > > > > > > I don't think we need that check. > > > > In include/qemu/osdep.h we have > > > > /* as defined in sdkddkver.h */ > > #ifndef _WIN32_WINNT > > #define _WIN32_WINNT 0x0601 /* Windows 7 API (should be in sync with > glib) */ > > #endif > > > > so do we even need to have the GetProcAddress calls at all ? > > > > Surely we can just '#include ' and call > > RtlGetVersion directly at compile time ? > > > > I believe #include is used in the kernel mode driver > programming environment. > In the user space we will have to use the ntdll exported symbol. > > I cannot locate a Microsoft doc that tells us to call RtlGetVersion > directly in the user space. > >From MS docs: RtlGetVersion is the kernel-mode equivalent of the user-mode GetVersionEx function in the Windows SDK. So you can use GetVersionEx instread. > > Regards, > Bin > > --0000000000002fcc3605e4c940f7 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


=
On Wed, Jul 27, 2022 at 2:58 PM Bin M= eng <bmeng.cn@gmail.com> wr= ote:
On Wed, Jul= 27, 2022 at 6:00 PM Daniel P. Berrang=C3=A9 <berrange@redhat.com> wrote:
>
> On Wed, Jul 27, 2022 at 05:38:27PM +0800, Bin Meng wrote:
> > On Wed, Jul 27, 2022 at 4:50 PM Yan Vugenfirer <yvugenfi@redhat.com> wrot= e:
> > >
> > > On Wed, Jul 27, 2022 at 10:43 AM Bin Meng <bmeng.cn@gmail.com> wrote:=
> > > >
> > > > From: Bin Meng <bin.meng@windriver.com>
> > > >
> > > > This adds a helper to get the Windows version via the R= tlGetVersion
> > > > call, for QEMU codes to determine the Windows version a= t run-time.
> > > >
> > > > Signed-off-by: Xuzhou Cheng <xuzhou.cheng@windriver.com>=
> > > > Signed-off-by: Bin Meng <bin.meng@windriver.com>
> > > > ---
> > > >
> > > >=C2=A0 include/sysemu/os-win32.h |=C2=A0 2 ++
> > > >=C2=A0 util/oslib-win32.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 | 1= 5 +++++++++++++++
> > > >=C2=A0 2 files changed, 17 insertions(+)
> > > >
> > > > diff --git a/include/sysemu/os-win32.h b/include/sysemu= /os-win32.h
> > > > index edc3b38a57..1e324026a4 100644
> > > > --- a/include/sysemu/os-win32.h
> > > > +++ b/include/sysemu/os-win32.h
> > > > @@ -204,6 +204,8 @@ ssize_t qemu_recv_wrap(int sockfd, = void *buf, size_t len, int flags);
> > > >=C2=A0 ssize_t qemu_recvfrom_wrap(int sockfd, void *buf,= size_t len, int flags,
> > > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0struct sockaddr *addr, sock= len_t *addrlen);
> > > >
> > > > +void os_get_win_version(RTL_OSVERSIONINFOEXW *info); > > > > +
> > > >=C2=A0 #ifdef __cplusplus
> > > >=C2=A0 }
> > > >=C2=A0 #endif
> > > > diff --git a/util/oslib-win32.c b/util/oslib-win32.c > > > > index 5723d3eb4c..6d2387b9ff 100644
> > > > --- a/util/oslib-win32.c
> > > > +++ b/util/oslib-win32.c
> > > > @@ -547,3 +547,18 @@ int qemu_msync(void *addr, size_t = length, int fd)
> > > >=C2=A0 =C2=A0 =C2=A0 =C2=A0*/
> > > >=C2=A0 =C2=A0 =C2=A0 return qemu_fdatasync(fd);
> > > >=C2=A0 }
> > > > +
> > > > +void os_get_win_version(RTL_OSVERSIONINFOEXW *info) > > > > +{
> > > > +=C2=A0 =C2=A0 typedef LONG (WINAPI *rtl_get_version_t)= (PRTL_OSVERSIONINFOEXW);
> > > > +
> > > > +=C2=A0 =C2=A0 /* RtlGetVersion is available starting w= ith Windows 2000 */
> > > > +=C2=A0 =C2=A0 HMODULE module =3D GetModuleHandle("= ;ntdll");
> > > > +=C2=A0 =C2=A0 PVOID fun =3D GetProcAddress(module, &qu= ot;RtlGetVersion");
> > > > +=C2=A0 =C2=A0 rtl_get_version_t rtl_get_version =3D (r= tl_get_version_t)fun;
> > > > +
> > > > +=C2=A0 =C2=A0 info->dwOSVersionInfoSize =3D sizeof(= RTL_OSVERSIONINFOEXW);
> > > > +=C2=A0 =C2=A0 rtl_get_version(info);
> > > The original function, when it was present in qemu-ga, teste= d that
> > > getting the function address succeeded.
> > > I think this test should be kept.
> > > See below:
> > > -=C2=A0 =C2=A0 PVOID fun =3D GetProcAddress(module, "Rt= lGetVersion");
> > > -=C2=A0 =C2=A0 if (fun =3D=3D NULL) {
> > > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 error_setg(errp, QERR_QGA_COMMA= ND_FAILED,
> > > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "Failed to g= et address of RtlGetVersion");
> > > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 return;
> > > -=C2=A0 =C2=A0 }
> > >
> >
> > Please see the comment:
> >
> > /* RtlGetVersion is available starting with Windows 2000 */
> >
> > I don't think we need that check.
>
> In include/qemu/osdep.h we have
>
> /* as defined in sdkddkver.h */
> #ifndef _WIN32_WINNT
> #define _WIN32_WINNT 0x0601 /* Windows 7 API (should be in sync with g= lib) */
> #endif
>
> so do we even need to have the GetProcAddress calls at all ?
>
> Surely we can just=C2=A0 '#include <ddk/ntddk.h>' and ca= ll
> RtlGetVersion directly at compile time ?
>

I believe #include <ddk/ntddk.h> is used in the kernel mode driver programming environment.
In the user space we will have to use the ntdll exported symbol.

I cannot locate a Microsoft doc that tells us to call RtlGetVersion
directly in the user space.

From MS doc= s: RtlGetVersion is the kernel-mode equivalent of the user-mode GetVersionE= x function in the Windows SDK.
So you can use GetVersionEx i= nstread.
=C2=A0

Regards,
Bin

--0000000000002fcc3605e4c940f7--