summaryrefslogtreecommitdiff
path: root/win32/win32.c
diff options
context:
space:
mode:
authorJan Dubois <jand@activestate.com>2003-07-29 12:14:10 -0700
committerJarkko Hietaniemi <jhi@iki.fi>2003-07-30 06:13:55 +0000
commit3e5269857e8d8838cbf4c53cbb042865abeedd0e (patch)
tree5410a90bd2c1b9aa1577c76a8a11f1c39ec68d3b /win32/win32.c
parent369b44b45b100ebccc1e9e9ec79851683e716faa (diff)
downloadperl-3e5269857e8d8838cbf4c53cbb042865abeedd0e.tar.gz
Extend Win32::GetOSVersion() to return additional information
Message-ID: <i06eivs0h9khken8rloevj68iqu6n45hnq@4ax.com> p4raw-id: //depot/perl@20331
Diffstat (limited to 'win32/win32.c')
-rw-r--r--win32/win32.c72
1 files changed, 60 insertions, 12 deletions
diff --git a/win32/win32.c b/win32/win32.c
index c41c36d7ed..beabef6b02 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -4502,26 +4502,68 @@ static
XS(w32_GetOSVersion)
{
dXSARGS;
- OSVERSIONINFOA osver;
+ /* Use explicit struct definition because wSuiteMask and
+ * wProductType are not defined in the VC++ 6.0 headers.
+ * WORD type has been replaced by unsigned short because
+ * WORD is already used by Perl itself.
+ */
+ struct {
+ DWORD dwOSVersionInfoSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ DWORD dwBuildNumber;
+ DWORD dwPlatformId;
+ CHAR szCSDVersion[128];
+ unsigned short wServicePackMajor;
+ unsigned short wServicePackMinor;
+ unsigned short wSuiteMask;
+ BYTE wProductType;
+ BYTE wReserved;
+ } osver;
+ BOOL bEx = TRUE;
if (USING_WIDE()) {
- OSVERSIONINFOW osverw;
+ struct {
+ DWORD dwOSVersionInfoSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ DWORD dwBuildNumber;
+ DWORD dwPlatformId;
+ WCHAR szCSDVersion[128];
+ unsigned short wServicePackMajor;
+ unsigned short wServicePackMinor;
+ unsigned short wSuiteMask;
+ BYTE wProductType;
+ BYTE wReserved;
+ } osverw;
char szCSDVersion[sizeof(osverw.szCSDVersion)];
- osverw.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
- if (!GetVersionExW(&osverw)) {
- XSRETURN_EMPTY;
+ osverw.dwOSVersionInfoSize = sizeof(osverw);
+ if (!GetVersionExW((OSVERSIONINFOW*)&osverw)) {
+ bEx = FALSE;
+ osverw.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
+ if (!GetVersionExW((OSVERSIONINFOW*)&osverw)) {
+ XSRETURN_EMPTY;
+ }
}
W2AHELPER(osverw.szCSDVersion, szCSDVersion, sizeof(szCSDVersion));
XPUSHs(newSVpvn(szCSDVersion, strlen(szCSDVersion)));
- osver.dwMajorVersion = osverw.dwMajorVersion;
- osver.dwMinorVersion = osverw.dwMinorVersion;
- osver.dwBuildNumber = osverw.dwBuildNumber;
- osver.dwPlatformId = osverw.dwPlatformId;
+ osver.dwMajorVersion = osverw.dwMajorVersion;
+ osver.dwMinorVersion = osverw.dwMinorVersion;
+ osver.dwBuildNumber = osverw.dwBuildNumber;
+ osver.dwPlatformId = osverw.dwPlatformId;
+ osver.wServicePackMajor = osverw.wServicePackMajor;
+ osver.wServicePackMinor = osverw.wServicePackMinor;
+ osver.wSuiteMask = osverw.wSuiteMask;
+ osver.wProductType = osverw.wProductType;
}
else {
- osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
- if (!GetVersionExA(&osver)) {
- XSRETURN_EMPTY;
+ osver.dwOSVersionInfoSize = sizeof(osver);
+ if (!GetVersionExA((OSVERSIONINFOA*)&osver)) {
+ bEx = FALSE;
+ osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
+ if (!GetVersionExA((OSVERSIONINFOA*)&osver)) {
+ XSRETURN_EMPTY;
+ }
}
XPUSHs(newSVpvn(osver.szCSDVersion, strlen(osver.szCSDVersion)));
}
@@ -4529,6 +4571,12 @@ XS(w32_GetOSVersion)
XPUSHs(newSViv(osver.dwMinorVersion));
XPUSHs(newSViv(osver.dwBuildNumber));
XPUSHs(newSViv(osver.dwPlatformId));
+ if (bEx) {
+ XPUSHs(newSViv(osver.wServicePackMajor));
+ XPUSHs(newSViv(osver.wServicePackMinor));
+ XPUSHs(newSViv(osver.wSuiteMask));
+ XPUSHs(newSViv(osver.wProductType));
+ }
PUTBACK;
}