71955773a7f477f9a159a491f765ba97e1f00e1avboxsync/* $Id$ */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync/** @file
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * IPRT - Init Ring-3, Windows Specific Code.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync/*
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * Copyright (C) 2006-2013 Oracle Corporation
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync *
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * available from http://www.virtualbox.org. This file is free software;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * you can redistribute it and/or modify it under the terms of the GNU
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * General Public License (GPL) as published by the Free Software
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync *
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * The contents of this file may alternatively be used under the terms
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * of the Common Development and Distribution License Version 1.0
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * VirtualBox OSE distribution, in which case the provisions of the
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * CDDL are applicable instead of those of the GPL.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync *
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * You may elect to license modified versions of this file under the
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * terms and conditions of either the GPL or the CDDL or both.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync/*******************************************************************************
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync* Header Files *
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync*******************************************************************************/
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#define LOG_GROUP RTLOGGROUP_DEFAULT
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#include <Windows.h>
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#ifndef LOAD_LIBRARY_SEARCH_APPLICATION_DIR
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync# define LOAD_LIBRARY_SEARCH_APPLICATION_DIR 0x200
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync# define LOAD_LIBRARY_SEARCH_SYSTEM32 0x800
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#endif
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync#include "internal-r3-win.h"
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#include <iprt/initterm.h>
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync#include <iprt/assert.h>
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#include <iprt/err.h>
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync#include <iprt/string.h>
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#include "../init.h"
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync/*******************************************************************************
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync* Global Variables *
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync*******************************************************************************/
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync/** Windows DLL loader protection level. */
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsyncDECLHIDDEN(RTR3WINLDRPROT) g_enmWinLdrProt = RTR3WINLDRPROT_NONE;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync/** Our simplified windows version. */
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsyncDECLHIDDEN(RTWINOSTYPE) g_enmWinVer = kRTWinOSType_UNKNOWN;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync/** Extended windows version information. */
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsyncDECLHIDDEN(OSVERSIONINFOEXW) g_WinOsInfoEx;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync/** The native kernel32.dll handle. */
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsyncDECLHIDDEN(HMODULE) g_hModKernel32 = NULL;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync/** The native ntdll.dll handle. */
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsyncDECLHIDDEN(HMODULE) g_hModNtDll = NULL;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync/**
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * Translates OSVERSIONINOFEX into a Windows OS type.
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync *
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * @returns The Windows OS type.
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * @param pOSInfoEx The OS info returned by Windows.
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync *
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * @remarks This table has been assembled from Usenet postings, personal
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * observations, and reading other people's code. Please feel
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * free to add to it or correct it.
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * <pre>
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync dwPlatFormID dwMajorVersion dwMinorVersion dwBuildNumber
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync95 1 4 0 950
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync95 SP1 1 4 0 >950 && <=1080
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync95 OSR2 1 4 <10 >1080
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync98 1 4 10 1998
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync98 SP1 1 4 10 >1998 && <2183
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync98 SE 1 4 10 >=2183
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncME 1 4 90 3000
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncNT 3.51 2 3 51 1057
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncNT 4 2 4 0 1381
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync2000 2 5 0 2195
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncXP 2 5 1 2600
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync2003 2 5 2 3790
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncVista 2 6 0
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncCE 1.0 3 1 0
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncCE 2.0 3 2 0
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncCE 2.1 3 2 1
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsyncCE 3.0 3 3 0
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync</pre>
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync */
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsyncstatic RTWINOSTYPE rtR3InitWinSimplifiedVersion(OSVERSIONINFOEXW const *pOSInfoEx)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync{
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync RTWINOSTYPE enmVer = kRTWinOSType_UNKNOWN;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync BYTE const bProductType = pOSInfoEx->wProductType;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync DWORD const dwPlatformId = pOSInfoEx->dwPlatformId;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync DWORD const dwMinorVersion = pOSInfoEx->dwMinorVersion;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync DWORD const dwMajorVersion = pOSInfoEx->dwMajorVersion;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync DWORD const dwBuildNumber = pOSInfoEx->dwBuildNumber & 0xFFFF; /* Win 9x needs this. */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync if ( dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwMajorVersion == 4)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync {
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync if ( dwMinorVersion < 10
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwBuildNumber == 950)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_95;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if ( dwMinorVersion < 10
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwBuildNumber > 950
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwBuildNumber <= 1080)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_95SP1;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if ( dwMinorVersion < 10
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwBuildNumber > 1080)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_95OSR2;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if ( dwMinorVersion == 10
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwBuildNumber == 1998)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_98;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if ( dwMinorVersion == 10
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwBuildNumber > 1998
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwBuildNumber < 2183)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_98SP1;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if ( dwMinorVersion == 10
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwBuildNumber >= 2183)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_98SE;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if (dwMinorVersion == 90)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_ME;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync }
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if (dwPlatformId == VER_PLATFORM_WIN32_NT)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync {
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync if ( dwMajorVersion == 3
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwMinorVersion == 51)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_NT351;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if ( dwMajorVersion == 4
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwMinorVersion == 0)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_NT4;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if ( dwMajorVersion == 5
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwMinorVersion == 0)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_2K;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if ( dwMajorVersion == 5
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwMinorVersion == 1)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_XP;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if ( dwMajorVersion == 5
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwMinorVersion == 2)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_2003;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if ( dwMajorVersion == 6
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwMinorVersion == 0)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync {
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync if (bProductType != VER_NT_WORKSTATION)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_2008;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_VISTA;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync }
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if ( dwMajorVersion == 6
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwMinorVersion == 1)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_7;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if ( dwMajorVersion == 6
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwMinorVersion == 2)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_8;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if ( dwMajorVersion == 6
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync && dwMinorVersion == 3)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_81;
ee01650486823de6a197501459e4781ad4e4a54dvboxsync else if ( dwMajorVersion == 6
ee01650486823de6a197501459e4781ad4e4a54dvboxsync && dwMinorVersion == 4)
ee01650486823de6a197501459e4781ad4e4a54dvboxsync enmVer = kRTWinOSType_10;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync enmVer = kRTWinOSType_NT_UNKNOWN;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync }
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync return enmVer;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync}
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync/**
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync * Initializes the global variables related to windows version.
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync */
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsyncstatic void rtR3InitWindowsVersion(void)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync{
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync Assert(g_hModNtDll != NULL);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync /*
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync * ASSUMES OSVERSIONINFOEX starts with the exact same layout as OSVERSIONINFO (safe).
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync AssertCompileMembersSameSizeAndOffset(OSVERSIONINFOEX, szCSDVersion, OSVERSIONINFO, szCSDVersion);
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync AssertCompileMemberOffset(OSVERSIONINFOEX, wServicePackMajor, sizeof(OSVERSIONINFO));
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync /*
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync * Use the NT version of GetVersionExW so we don't get fooled by
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync * compatability shims.
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync RT_ZERO(g_WinOsInfoEx);
507150dbeee290c9769dc80de3579a1dcabc8bd0vboxsync g_WinOsInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync LONG (__stdcall *pfnRtlGetVersion)(OSVERSIONINFOEXW *);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync *(FARPROC *)&pfnRtlGetVersion = GetProcAddress(g_hModNtDll, "RtlGetVersion");
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync LONG rcNt = -1;
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync if (pfnRtlGetVersion)
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync rcNt = pfnRtlGetVersion(&g_WinOsInfoEx);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync if (rcNt != 0)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync {
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync /*
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync * Couldn't find it or it failed, try the windows version of the API.
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync RT_ZERO(g_WinOsInfoEx);
507150dbeee290c9769dc80de3579a1dcabc8bd0vboxsync g_WinOsInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync if (!GetVersionExW((POSVERSIONINFOW)&g_WinOsInfoEx))
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync {
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync /*
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync * If that didn't work either, just get the basic version bits.
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync */
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync RT_ZERO(g_WinOsInfoEx);
507150dbeee290c9769dc80de3579a1dcabc8bd0vboxsync g_WinOsInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
507150dbeee290c9769dc80de3579a1dcabc8bd0vboxsync if (GetVersionExW((POSVERSIONINFOW)&g_WinOsInfoEx))
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync Assert(g_WinOsInfoEx.dwPlatformId != VER_PLATFORM_WIN32_NT || g_WinOsInfoEx.dwMajorVersion < 5);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync else
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync {
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync AssertBreakpoint();
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync RT_ZERO(g_WinOsInfoEx);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync }
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync }
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync }
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync if (g_WinOsInfoEx.dwOSVersionInfoSize)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync g_enmWinVer = rtR3InitWinSimplifiedVersion(&g_WinOsInfoEx);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync}
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsyncstatic int rtR3InitNativeObtrusiveWorker(void)
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync{
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync /*
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync * Disable error popups.
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync */
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync UINT fOldErrMode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX | fOldErrMode);
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync /*
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * Restrict DLL searching for the process on windows versions which allow
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * us to do so.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * - The first trick works on XP SP1+ and disables the searching of the
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * current directory.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * - The second trick is W7 w/ KB2533623 and W8+, it restrict the DLL
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * searching to the application directory and the System32 directory.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync int rc = VINF_SUCCESS;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync typedef BOOL (WINAPI *PFNSETDLLDIRECTORY)(LPCWSTR);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync PFNSETDLLDIRECTORY pfnSetDllDir = (PFNSETDLLDIRECTORY)GetProcAddress(g_hModKernel32, "SetDllDirectoryW");
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync if (pfnSetDllDir)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync {
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync if (pfnSetDllDir(L""))
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync g_enmWinLdrProt = RTR3WINLDRPROT_NO_CWD;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync else
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync rc = VERR_INTERNAL_ERROR_3;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync }
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
bf11cc8a816102c7f343cb5cc113e7a08fa129a0vboxsync /** @bugref 6861: Observed GUI issues on Vista (32-bit and 64-bit). */
bf11cc8a816102c7f343cb5cc113e7a08fa129a0vboxsync if (g_enmWinVer > kRTWinOSType_VISTA)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync {
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync typedef BOOL(WINAPI *PFNSETDEFAULTDLLDIRECTORIES)(DWORD);
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync PFNSETDEFAULTDLLDIRECTORIES pfnSetDefDllDirs;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync pfnSetDefDllDirs = (PFNSETDEFAULTDLLDIRECTORIES)GetProcAddress(g_hModKernel32, "SetDefaultDllDirectories");
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync if (pfnSetDefDllDirs)
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync {
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync if (pfnSetDefDllDirs(LOAD_LIBRARY_SEARCH_APPLICATION_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32))
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync g_enmWinLdrProt = RTR3WINLDRPROT_SAFE;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync else if (RT_SUCCESS(rc))
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync rc = VERR_INTERNAL_ERROR_4;
2ebdf3d2131d683bde27a65eeef2450d8834fec9vboxsync }
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync }
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync return rc;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync}
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsyncDECLHIDDEN(int) rtR3InitNativeFirst(uint32_t fFlags)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync{
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync /*
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * Make sure we've got the handles of the two main Windows NT dlls.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync g_hModKernel32 = GetModuleHandleW(L"kernel32.dll");
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync if (g_hModKernel32 == NULL)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync return VERR_INTERNAL_ERROR_2;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync g_hModNtDll = GetModuleHandleW(L"ntdll.dll");
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync if (g_hModNtDll == NULL)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync return VERR_INTERNAL_ERROR_2;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync rtR3InitWindowsVersion();
62184c10d4a848c16595c203aad10dcf3cb8cdaavboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync int rc = VINF_SUCCESS;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync if (!(fFlags & RTR3INIT_FLAGS_UNOBTRUSIVE))
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync rc = rtR3InitNativeObtrusiveWorker();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync return rc;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync}
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsyncDECLHIDDEN(void) rtR3InitNativeObtrusive(void)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync{
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync rtR3InitNativeObtrusiveWorker();
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync}
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsyncDECLHIDDEN(int) rtR3InitNativeFinal(uint32_t fFlags)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync{
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync /* Nothing to do here. */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync return VINF_SUCCESS;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync}
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync