Case of the .NET 4.5.2 Setup Can’t Run In Compatibility Mode

When downloading http://www.microsoft.com/en-us/download/confirmation.aspx?id=42643 on Windows 8.1, the installer failed

image

Well the most obvious thing, is the installer for some reason is set into compatibility mode. Clicking EXE and looking at properties shows this is not the case:

image

First I tried ProcMon (http://live.sysinternals.com/ProcMon.exe)

Using the Target icon in ProcMon I drag it over the error message, and we find setup.exe is showing the error

image

In the properties we get the path

image

Well no compatibility mode on that EXE either.

From ProcMon we do see an HTML file is written (This is what clicking the link “More Information about blocked .NET Framework 4.5.2 installations” will open)

image

Opening it we see in log:

image

Well that’s helpful.

While setup.exe was still open I copied the entire extracted install contents into a temporary folder, so I would still have them after the folder was deleted.

So I used a file search utility to search the extracted install folder (I used http://www.nirsoft.net/utils/search_my_files.html ) for

cannot run in compatibility mode

and found file 1033\LocalizedData.xml

<Text ID=”#(loc.Blocker_in_OS_Compatibility_Mode)” LocalizedText=”The setup cannot run in compatibility mode.” />

In then searched for files with content Blocker_in_OS_Compatibility_Mode

This found ParameterInfo.xml which found

<BlockIf DisplayText=”#(loc.Blocker_in_OS_Compatibility_Mode)” ID=”AppCompatMode”>
      <Exists>
        <IsInOSCompatibilityMode />
      </Exists>
    </BlockIf>

Now possibly we could just remove this from the XML file to get rid of the check. But let’s investigate further

Searching files for content with IsInOSCompatibilityMode found SetupEngine.dll

Opening DLL in IDA we see functions with IsInOSCompatibilityMode in the name

image

Examining function  we this this – we click the jmp link to follow it to function :

Mode::IsOSCompatibilityMode(IronMan::IsInOSCompatibilityMode *__hidden this)
?IsOSCompatibilityMode@IsInOSCompatibilityMode@IronMan@@EAE_NXZ proc near
jmp   
?IsInOSCompatibilityMode@CSystemUtil@IronMan@@SG_NXZ ; IronMan::CSystemUtil::IsInOSCompatibilityMode(void)
?IsOSCompatibilityMode@IsInOSCompatibilityMode@IronMan@@EAE_NXZ endp

We can see this function

1) retreives OS version via GetVersionEx (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724451(v=vs.85).aspx) then calls

2) sets mask with VerSetConditionMask (http://msdn.microsoft.com/en-us/library/windows/desktop/ms725493(v=vs.85).aspx)

3) Calls VerifyVersionInfoW (http://msdn.microsoft.com/en-us/library/windows/desktop/ms725492(v=vs.85).aspx)

text:10028537 ; bool __stdcall IronMan::CSystemUtil::IsInOSCompatibilityMode() .text:10028537 ?IsInOSCompatibilityMode@CSystemUtil@IronMan@@SG_NXZ proc near .text:10028537 ; CODE XREF: IronMan::IsInOSCompatibilityMode::IsOSCompatibilityMode(void)j .text:10028537 ; IronMan::UxT<IronMan::Sqm>::GetOSComplete(_OSVERSIONINFOEXW &,_SYSTEM_INFO &)+4Ap .text:10028537 .text:10028537 var_129 = byte ptr -129h .text:10028537 VersionInformation= _OSVERSIONINFOW ptr -128h .text:10028537 var_4 = dword ptr -4 .text:10028537 .text:10028537 push ebp .text:10028538 mov ebp, esp .text:1002853A and esp, 0FFFFFFF8h .text:1002853D sub esp, 130h .text:10028543 mov eax, ___security_cookie .text:10028548 xor eax, esp .text:1002854A mov [esp+130h+var_4], eax .text:10028551 push ebx .text:10028552 push esi .text:10028553 xor ebx, ebx .text:10028555 push 118h ; Size .text:1002855A lea eax, [esp+13Ch+VersionInformation.dwMajorVersion] .text:1002855E push ebx ; Val .text:1002855F push eax ; Dst .text:10028560 mov [esp+144h+var_129], bl .text:10028564 call _memset .text:10028569 add esp, 0Ch .text:1002856C lea eax, [esp+138h+VersionInformation] .text:10028570 push eax ; lpVersionInformation .text:10028571 mov [esp+13Ch+VersionInformation.dwOSVersionInfoSize], 11Ch .text:10028579 call ds:__imp__GetVersionExW@4 ; GetVersionExW(x) .text:1002857F test eax, eax .text:10028581 jz short loc_100285BF .text:10028583 mov esi, ds:__imp__VerSetConditionMask@16 ; VerSetConditionMask(x,x,x,x) .text:10028589 push 1 ; Condition .text:1002858B push 2 ; TypeMask .text:1002858D push ebx .text:1002858E push ebx ; ConditionMask .text:1002858F call esi ; VerSetConditionMask(x,x,x,x) ; VerSetConditionMask(x,x,x,x) .text:10028591 push 1 ; Condition .text:10028593 push 1 ; TypeMask .text:10028595 push edx .text:10028596 push eax ; ConditionMask .text:10028597 call esi ; VerSetConditionMask(x,x,x,x) ; VerSetConditionMask(x,x,x,x) .text:10028599 push 1 ; Condition .text:1002859B push 20h ; TypeMask .text:1002859D push edx .text:1002859E push eax ; ConditionMask .text:1002859F call esi ; VerSetConditionMask(x,x,x,x) ; VerSetConditionMask(x,x,x,x) .text:100285A1 push 1 ; Condition .text:100285A3 push 10h ; TypeMask .text:100285A5 push edx .text:100285A6 push eax ; ConditionMask .text:100285A7 call esi ; VerSetConditionMask(x,x,x,x) ; VerSetConditionMask(x,x,x,x) .text:100285A9 push edx .text:100285AA push eax ; dwlConditionMask .text:100285AB push 33h ; dwTypeMask .text:100285AD lea eax, [esp+144h+VersionInformation] .text:100285B1 push eax ; lpVersionInformation .text:100285B2 call ds:__imp__VerifyVersionInfoW@16 ; VerifyVersionInfoW(x,x,x,x) .text:100285B8 test eax, eax .text:100285BA setnz [esp+138h+var_129] .text:100285BF .text:100285BF loc_100285BF: ; CODE XREF: IronMan::CSystemUtil::IsInOSCompatibilityMode(void)+4Aj .text:100285BF mov ecx, [esp+138h+var_4] .text:100285C6 xor eax, eax .text:100285C8 cmp [esp+138h+var_129], bl .text:100285CC pop esi .text:100285CD setz al .text:100285D0 pop ebx .text:100285D1 xor ecx, esp .text:100285D3 call @__security_check_cookie@4 ; __security_check_cookie(x) .text:100285D8 mov esp, ebp .text:100285DA pop ebp .text:100285DB retn .text:100285DB ?IsInOSCompatibilityMode@CSystemUtil@IronMan@@SG_NXZ endp

We search these two APIs in Rohitab API Monitor (http://www.rohitab.com/apimonitor) and make sure they are monitored:

image

Then we monitor it with API monitor:

image

The GetVersionExW that comes just before VerifyVersionInfoW succeeds

image

The call to VerifyVersionInfoW

image

Breakpoint after the call we can see error:

image

In the “After” break point, if we change the return value to TRUE the installer starts

image

 

image

The “before” our fix API trace looked like:

#    Time of Day    Thread    Module    API    Return Value    Error    Duration
84887    7:31:13.077 PM    1    SetupEngine.dll    GetVersionExW ( 0x00a3ee60 )    TRUE        0.0000070
84888    7:31:13.077 PM    1    vfcompat.dll    LoadStringA ( 0x5e260000, 1003, 0x00a3ed08, 64 )    4        0.0000008
84889    7:31:13.077 PM    1    vrfcore.dll    _vsnwprintf ( 0x6abaf438, 2047, “Returned %lu.%lu build number: %lu, service pack: %lu.%lu, suite mask: 0x%08X, product type: %hs.”, 0x00a3ece0 )    97        0.0000025
84890    7:31:13.077 PM    1    vrfcore.dll    _wcsicmp ( “Returned 7.0 build number: 8000, service pack: 0.0, suite mask: 0x00000000, product type: (null).”, “Returned 7.0 build number: 8000, service pack: 0.0, suite mask: 0x00000000, product type: (null).” )    0        0.0000004
84891    7:31:13.077 PM    1    SetupEngine.dll    VerSetConditionMask ( 0, VER_MAJORVERSION, VER_EQUAL )    9223372036854775816        0.0000000
84892    7:31:13.077 PM    1    SetupEngine.dll    VerSetConditionMask ( 9223372036854775816, VER_MINORVERSION, VER_EQUAL )    9223372036854775817        0.0000000
84893    7:31:13.077 PM    1    SetupEngine.dll    VerSetConditionMask ( 9223372036854775817, VER_SERVICEPACKMAJOR, VER_EQUAL )    9223372036854808585        0.0000004
84894    7:31:13.077 PM    1    SetupEngine.dll    VerSetConditionMask ( 9223372036854808585, VER_SERVICEPACKMINOR, VER_EQUAL )    9223372036854812681        0.0000000
84895    7:31:13.077 PM    1    SetupEngine.dll    VerifyVersionInfoW ( 0x00a3ee60, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, 9223372036854812681 )    FALSE    1150 = The specified program requires a newer version of Windows.     0.0000086

After we “modified” the value the result looked like:

#    Time of Day    Thread    Module    API    Return Value    Error    Duration
85790    7:25:08.561 PM    1    SetupEngine.dll    VerifyVersionInfoW ( 0x00a3ef00, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, 9223372036854812681 )    TRUE        0.0000094

The cause of this issue is documented in http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx

GetVersion(Ex) lies to you unless you explicitly embed a manifest to indicate your app is compatible with Windows 8.1.

Or is it the cause? Resource Hacker, shows the EXE has explicitly declared Windows 8.1 support:

image

We can reproduce the issue with simple code, from a new Win32 Console C++ template in Visual Studio 2013. By default you can no longer call GetVersionEx, you will get error C4996: ‘GetVersionExW’: was declared deprecated, so we must disable this warning before the code will compile. For a more overcomplicated solution check http://www.codeproject.com/Articles/678606/Part-Overcoming-Windows-s-deprecation-of-GetVe

#include "stdafx.h"
#include <Windows.h>

#pragma warning(disable : 4996)  // to disable deprecated error on GetVersionEx

int _tmain(int argc, _TCHAR* argv[])
{
    OSVERSIONINFOEX osvi;

    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

    GetVersionEx((LPOSVERSIONINFO)&osvi);    
    ULONGLONG mask= VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL);
    mask = VerSetConditionMask(mask, VER_MINORVERSION, VER_EQUAL);
    mask = VerSetConditionMask(mask, VER_SERVICEPACKMAJOR, VER_EQUAL);
    mask = VerSetConditionMask(mask, VER_SERVICEPACKMINOR, VER_EQUAL);
    bool result = VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, mask);
    if (result)
    {
        printf("OS Version OK!");
    }
    else
    {
        DWORD errorCode = GetLastError();
        printf("Bad os version Error: %d", errorCode);
    }

    return 0;
}


Which get same error as our install:

image

We can see the version is wrong:

image

So this is expected behavior.

Applications not manifested for Windows 8.1 will return the Windows 8 OS version value (6.2). Once an application is manifested for a given operating system version, GetVersionEx will always return the version that the application is manifested for in future releases. To manifest your applications for Windows 8.1 please refer to Targeting your application for Windows 8.1.

As soon as I added the manifest into my EXE the code worked OK.

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
        <application> 
            <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!-- Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
            <!-- Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
        </application> 
    </compatibility>
</assembly>

image

Monitoring our own exe comes back with correct value:

image

Compared to the setup.exe which is returning Major Version 7 and Minor Version 0 (Windows 9?)

image 

So I launched with WinDbg, and set broke into application after the error. By viewing the import address table, we can see that the Version Lie SHIM has been applied:

0:001> lmv m setup
start    end        module name
00400000 00415000   Setup      (deferred)            
    Image path: Setup.exe
    Image name: Setup.exe
    Timestamp:        Sat Apr 12 12:40:15 2014 (5348A78F)
    CheckSum:         0001C78F
    ImageSize:        00015000
    File version:     12.0.51209.34209
    Product version:  12.0.51209.34209
    File flags:       0 (Mask 3F)
    File OS:          4 Unknown Win32
    File type:        1.0 App
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® .NET Framework
    InternalName:     Setup.exe
    OriginalFilename: SetupUI.exe
    ProductVersion:   12.0.51209.34209
    FileVersion:      12.0.51209.34209 built by: FX452RTMGDR
    FileDescription:  Setup Installer
    LegalCopyright:   © Microsoft Corporation. All rights reserved.
0:001> !dh 00400000

File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
     14C machine (i386)
       5 number of sections
5348A78F time date stamp Sat Apr 12 12:40:15 2014

       0 file pointer to symbol table
       0 number of symbols
      E0 size of optional header
     122 characteristics
            Executable
            App can handle >2gb addresses
            32 bit word machine

OPTIONAL HEADER VALUES
     10B magic #
   10.00 linker version
    5E00 size of code
    C400 size of initialized data
       0 size of uninitialized data
    2A82 address of entry point
    1000 base of code
         —– new —–
00400000 image base
    1000 section alignment
     200 file alignment
       2 subsystem (Windows GUI)
    5.01 operating system version
   10.00 image version
    5.01 subsystem version
   15000 size of image
     400 size of headers
   1C78F checksum
00100000 size of stack reserve
00002000 size of stack commit
00100000 size of heap reserve
00001000 size of heap commit
    8140  DLL characteristics
            Dynamic base
            NX compatible
            Terminal server aware
    6CE0 [      78] address [size] of Export Directory
    9000 [      3C] address [size] of Import Directory
    A000 [    9BB8] address [size] of Resource Directory
       0 [       0] address [size] of Exception Directory
   11800 [    3E90] address [size] of Security Directory
   14000 [     5C8] address [size] of Base Relocation Directory
    1040 [      1C] address [size] of Debug Directory
       0 [       0] address [size] of Description Directory
       0 [       0] address [size] of Special Directory
       0 [       0] address [size] of Thread Storage Directory
    27A0 [      40] address [size] of Load Configuration Directory
       0 [       0] address [size] of Bound Import Directory
    911C [      E0] address [size] of Import Address Table Directory
       0 [       0] address [size] of Delay Import Directory
       0 [       0] address [size] of COR20 Header Directory
       0 [       0] address [size] of Reserved Directory

SECTION HEADER #1
   .text name
    5D58 virtual size
    1000 virtual address
    5E00 size of raw data
     400 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60000020 flags
         Code
         (no align specified)
         Execute Read

Debug Directories(1)
    Type       Size     Address  Pointer
    cv           22        27e8     1be8    Format: RSDS, guid, 3, Setup.pdb

SECTION HEADER #2
   .data name
    19E0 virtual size
    7000 virtual address
     C00 size of raw data
    6200 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0000040 flags
         Initialized Data
         (no align specified)
         Read Write

SECTION HEADER #3
  .idata name
     5FC virtual size
    9000 virtual address
     600 size of raw data
    6E00 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         (no align specified)
         Read Only

SECTION HEADER #4
   .rsrc name
    9BB8 virtual size
    A000 virtual address
    9C00 size of raw data
    7400 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         (no align specified)
         Read Only

SECTION HEADER #5
  .reloc name
     7D8 virtual size
   14000 virtual address
     800 size of raw data
   11000 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
42000040 flags
         Initialized Data
         Discardable
         (no align specified)
         Read Only
0:001>
dps 00400000+911C 00400000+911C+E0
0040911c  7688cdad KERNEL32!HeapSetInformationStub
00409120  7688be1f KERNEL32!LoadLibraryW
00409124  7688980c KERNEL32!GetProcAddressStub
00409128  7688a7c6 KERNEL32!GetModuleHandleWStub
0040912c  5e262bfa
vfcompat!NS_HighVersionLie::VfHookGetVersion <- This causes GetVersionEx to return a version HIGHER than actual OS
00409130  76884eb0 KERNEL32!MultiByteToWideCharStub
00409134  7688986f KERNEL32!LCMapStringWStub
00409138  7688cfae KERNEL32!GetCommandLineWStub
0040913c  7688c460 KERNEL32!GetStartupInfoWStub
00409140  7688cf38 KERNEL32!SetUnhandledExceptionFilterStub
00409144  76897f64 KERNEL32!ExitProcessImplementation
00409148  768975fc KERNEL32!WriteFile
0040914c  7688c433 KERNEL32!GetStdHandleStub
00409150  7688ad26 KERNEL32!GetModuleFileNameWStub
00409154  7688ca7d KERNEL32!FreeEnvironmentStringsWStub
00409158  7688cda2 KERNEL32!GetEnvironmentStringsWStub
0040915c  7688cf87 KERNEL32!SetHandleCount
00409160  76897230 KERNEL32!InitializeCriticalSectionAndSpinCount
00409164  768974a0 KERNEL32!GetFileType
00409168  771f2974 ntdll!RtlDeleteCriticalSection
0040916c  7688be7e KERNEL32!TlsAllocStub
00409170  76881940 KERNEL32!TlsGetValueStub
00409174  76883560 KERNEL32!TlsSetValueStub
00409178  7688bdf2 KERNEL32!TlsFreeStub
0040917c  76888f69 KERNEL32!InterlockedIncrementStub
00409180  76883360 KERNEL32!SetLastErrorStub
00409184  76881960 KERNEL32!GetCurrentThreadId
00409188  768836c0 KERNEL32!GetLastErrorStub
0040918c  76889067 KERNEL32!InterlockedDecrementStub
00409190  7688bf1b KERNEL32!HeapCreateStub
00409194  76883760 KERNEL32!QueryPerformanceCounterStub
00409198  7689607c KERNEL32!GetTickCountStub
0040919c  76883580 KERNEL32!GetCurrentProcessId
004091a0  76884cf0 KERNEL32!GetSystemTimeAsFileTimeStub
004091a4  7688d17a KERNEL32!TerminateProcessStub
004091a8  76884ed0 KERNEL32!GetCurrentProcess
004091ac  768b3e7f KERNEL32!UnhandledExceptionFilterStub
004091b0  7688d16f KERNEL32!IsDebuggerPresentStub
004091b4  771cfd40 ntdll!RtlLeaveCriticalSection
004091b8  771cfd00 ntdll!RtlEnterCriticalSection
004091bc  76881990 KERNEL32!HeapFreeStub
004091c0  768898c0 KERNEL32!SleepStub
004091c4  7688be5c KERNEL32!GetCPInfoStub
004091c8  76889864 KERNEL32!GetACPStub
004091cc  76894c37 KERNEL32!GetOEMCPStub
004091d0  7688bc6d KERNEL32!IsValidCodePageStub
004091d4  7688c83c KERNEL32!RtlUnwindStub
004091d8  76887cf2 KERNEL32!WideCharToMultiByteStub
004091dc  771dafa9 ntdll!RtlSizeHeap
004091e0  5b88a77c vrfcore!VfCoreRtlAllocateHeap
004091e4  5b88a7c0 vrfcore!VfCoreRtlReAllocateHeap
004091e8  7688bc04 KERNEL32!IsProcessorFeaturePresentStub
004091ec  7688c2f6 KERNEL32!GetStringTypeWStub
004091f0  00000000
004091f4  0facd941 SetupEngine!Run
004091f8  00000000
004091fc  65480355

Looking at the DLL

0:001> lmv m vfcompat
start    end        module name
5e260000 5e275000   vfcompat   (pdb symbols)          c:\symbols\vfcompat.pdb\F265D805746240A68F5E3D2C2225463B1\vfcompat.pdb
    Loaded symbol image file: C:\WINDOWS\SYSTEM32\vfcompat.dll
    Image path: C:\WINDOWS\SysWOW64\vfcompat.dll
    Image name: vfcompat.dll
    Timestamp:        Thu Aug 22 14:05:29 2013 (52158E09)
    CheckSum:         000185B6
    ImageSize:        00015000
    File version:     6.3.9600.16384
    Product version:  6.3.9600.16384
    File flags:       0 (Mask 3F)
    File OS:          40004 NT Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® Windows® Operating System
    InternalName:     vfcompat.dll
    OriginalFilename: vfcompat.dll
    ProductVersion:   6.3.9600.16384
    FileVersion:      6.3.9600.16384 (winblue_rtm.130821-1623)
    FileDescription:  Application Verifier Provider – OS compatibility issues detection.
    LegalCopyright:   © Microsoft Corporation. All rights reserved.

Opening Application Verifier we can see the application verifier SHIM applied:

image

How did this getting get there? I didn’t put that there!!!

The Windows 8.1 App Certification Kit put it there, to check that an application would install on next version of Windows (or version 7.0 to be exact)

About chentiangemalc

specializes in end-user computing technologies. disclaimer 1) use at your own risk. test any solution in your environment. if you do not understand the impact/consequences of what you're doing please stop, and ask advice from somebody who does. 2) views are my own at the time of posting and do not necessarily represent my current view or the view of my employer and family members/relatives. 3) over the years Microsoft/Citrix/VMWare have given me a few free shirts, pens, paper notebooks/etc. despite these gifts i will try to remain unbiased.
This entry was posted in .NET, API Monitor, Application Compatibility, Debugging, Reverse Engineering, Windows 8.1 and tagged . Bookmark the permalink.

4 Responses to Case of the .NET 4.5.2 Setup Can’t Run In Compatibility Mode

  1. Hello,
    I was lucky to find this when I clicked your .Net link:
    Can’t Run In Compatibility Mode
    I do not know how to do this to the exe file:
    “unless you explicitly embed a manifest to indicate your app is compatible with Windows”
    Would you please point me in the right direction?
    Very grateful for any helpful comment!

    Jim Harmon
    Palm Springs, California
    facebook.com/psjimm
    jimmharmon@aol.com

    P.S.
    I understand the impact/consequences of what I am doing having had fifty years of “stopping and asking”

  2. Mike says:

    Thank you chentiangemalc. This post helped me a lot.

  3. Anonymous says:

    I had the same issue with the .NET 4.6.2 installer. I ended up uninstalling the Windows SDK, and it worked after that.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s