{"id":4483,"date":"2009-05-21T11:40:00","date_gmt":"2009-05-21T11:40:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vcblog\/2009\/05\/21\/dynamicbase-and-nxcompat\/"},"modified":"2019-02-18T18:45:55","modified_gmt":"2019-02-18T18:45:55","slug":"dynamicbase-and-nxcompat","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/cppblog\/dynamicbase-and-nxcompat\/","title":{"rendered":"\/DYNAMICBASE and \/NXCOMPAT"},"content":{"rendered":"<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">Hello, my name is Xiang Fan and I am a developer on the C++ Shanghai team.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">Today I\u2019d like to talk about two linker options related to security: \/DYNAMICBASE and \/NXCOMPAT.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">These two options are introduced in VS2005, and target to improve the overall security of native applications.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">You can set these two options explicitly in VS IDE:<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\"><\/font><\/font>&nbsp;<\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/Dynamicbase%20and%20Nxcompat.png\"><\/font><\/font><\/p>\n<p class=\"MsoNormal\">&nbsp;<\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">These two options have three available values in the IDE: On, Off and Default.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">They are set to \u201cOn\u201d if you create native C++ application using VS2008 wizard. <\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">When VS2008 upgrades projects created by older version of VC which doesn\u2019t support these options, it will set them to \u201cOff\u201d after upgrade.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">If you set them to \u201cDefault\u201d, linker will treat it as \u201cOff\u201d.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">After several years adoption, we plan to change the behavior of \u201cDefault\u201d to \u201cOn\u201d in VS2010 to reinforce the security. And we\u2019d like to get your feedback.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">Here are the detailed information about these two options:<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoListParagraph\"><span><font face=\"Calibri\">1.<\/font><\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/bb384887.aspx\" target=\"_blank\"><font face=\"Calibri\" color=\"#0000ff\">DYNAMICBASE<\/font><\/a><\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">\/DYNAMICBASE modifies the header of an executable to indicate whether the application should be randomly rebased at load time by the OS. The random rebase is well known as ASLR (Address space layout randomization).<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">This option also implies \u201c\/FIXED:NO\u201d, which will generate a relocation section in the executable. See <span><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/w368ysh2.aspx\" target=\"_blank\"><font color=\"#0000ff\">\/FIXED<\/font><\/a><\/span> for more information.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">In VS2008, this option is on by default if a component requires Windows Vista (<span><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/fcc1zstk.aspx\" target=\"_blank\"><font color=\"#0000ff\">\/SUBSYSTEM<\/font><\/a><\/span> 6.0 and greater)<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">\/DYNAMICBASE:NO can be used to explicitly disable the random rebase.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">This article talks about ASLR: <\/font><a href=\"http:\/\/technet.microsoft.com\/en-us\/magazine\/cc162458.aspx\" target=\"_blank\"><font face=\"Calibri\" color=\"#0000ff\" size=\"3\">http:\/\/technet.microsoft.com\/en-us\/magazine\/cc162458.aspx<\/font><\/a><font size=\"3\"><font face=\"Calibri\"><span> <\/span><\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">ASLR is supported only on Windows Vista and later operating systems. It will be ignored on older OS.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">ASLR is transparent to the application. With ASLR, the only difference is OS will rebase the executable unconditionally instead of doing it only when an image base conflict exists.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoListParagraph\"><span><font face=\"Calibri\">2.<\/font><\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms235442.aspx\" target=\"_blank\"><font face=\"Calibri\" color=\"#0000ff\">NXCOMPAT<\/font><\/a><\/span><\/p>\n<p class=\"MsoListParagraph\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">\/NXCOMPAT is used to specify an executable as compatible with DEP<span> <\/span>(Data Execution Prevention)<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">Notice that, this option applies for x86 executable only. Non-x86 architecture versions of desktop Windows (e.g. x64 and IA64) always enforce DEP if the executable is not running in WOW64 mode.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">Here is a comprehensive description of DEP:<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><a href=\"http:\/\/support.microsoft.com\/kb\/875352\" target=\"_blank\"><font face=\"Calibri\" color=\"#0000ff\" size=\"3\">http:\/\/support.microsoft.com\/kb\/875352<\/font><\/a><\/p>\n<p class=\"MsoListParagraph\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">This option is on by default if a component requires Windows Vista (<span><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/fcc1zstk.aspx\" target=\"_blank\"><font color=\"#0000ff\">\/SUBSYSTEM<\/font><\/a><\/span> 6.0 and greater).<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">\/NXCOMPAT:NO can be used to explicitly specify an executable as not compatible with DEP.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">However, the administrator can still enable the DEP even if the executable is not specified as compatible with DEP. So you should always test your application with DEP on.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Windows Vista SP1, Windows XP SP3 and Windows Server 2008 add a new API <\/font><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/bb736299.aspx\"><font face=\"Calibri\" color=\"#0000ff\" size=\"3\">SetProcessDEPPolicy<\/font><\/a><font size=\"3\"><font face=\"Calibri\"> to allow the developer to set DEP on their process at runtime rather than using linker options. See the following link for more details:<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span><a href=\"http:\/\/blogs.msdn.com\/michael_howard\/archive\/2008\/01\/29\/new-nx-apis-added-to-windows-vista-sp1-windows-xp-sp3-and-windows-server-2008.aspx\"><font face=\"Calibri\" color=\"#0000ff\" size=\"3\">http:\/\/blogs.msdn.com\/michael_howard\/archive\/2008\/01\/29\/new-nx-apis-added-to-windows-vista-sp1-windows-xp-sp3-and-windows-server-2008.aspx<\/font><\/a><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">There are several common (and incomplete) patterns which are not compatible with DEP (See <\/font><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/aa366553.aspx\" target=\"_blank\"><font face=\"Calibri\" color=\"#0000ff\" size=\"3\">http:\/\/msdn.microsoft.com\/en-us\/library\/aa366553.aspx<\/font><\/a><font size=\"3\"><font face=\"Calibri\"> for more information.)<\/font><\/font><\/p>\n<p class=\"MsoListParagraph\"><font face=\"Calibri\" size=\"3\">a.<\/font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font size=\"3\"><font face=\"Calibri\">Dynamic code generated in heap or stack<\/font><\/font><\/p>\n<p class=\"MsoListParagraph\"><font face=\"Calibri\" size=\"3\">If your application must run code from a memory page, it must allocate and set the proper virtual <\/font><a id=\"ctl00_rs1_mainContentContainer_ctl01\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/aa366785(VS.85).aspx\" target=\"_blank\"><span><font face=\"Calibri\" size=\"3\">memory protection<\/font><\/span><\/a><font size=\"3\"><font face=\"Calibri\"> attributes.<\/font><\/font><\/p>\n<p class=\"MsoListParagraph\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoListParagraph\"><font size=\"3\"><font face=\"Calibri\">The allocated memory must be marked PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, or PAGE_EXECUTE_WRITECOPY when allocating memory. Heap allocations made by calling the <b>new<\/b>,<span> <\/span><b>malloc<\/b> and<span> <\/span><\/font><\/font><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/aa366597(VS.85).aspx\" target=\"_blank\"><b><span><font face=\"Calibri\" size=\"3\">HeapAlloc<\/font><\/span><\/b><\/a><font face=\"Calibri\" size=\"3\"> functions are non-executable. An application can use the <\/font><a id=\"ctl00_rs1_mainContentContainer_ctl05\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/aa366887(VS.85).aspx\" target=\"_blank\"><b><span><font face=\"Calibri\" size=\"3\">VirtualAlloc<\/font><\/span><\/b><\/a><font size=\"3\"><font face=\"Calibri\"> function to allocate executable memory with the appropriate memory protection options.<\/font><\/font><\/p>\n<p class=\"MsoListParagraph\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoListParagraph\"><font size=\"3\"><font face=\"Calibri\">Another option is to pass HEAP_CREATE_ENABLE_EXECUTE when create the heap via &nbsp;HeapCreate. Then the memory allocated by the subsequent HeapAlloc will be executable.<\/font><\/font><\/p>\n<p class=\"MsoListParagraph\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoListParagraph\"><font face=\"Calibri\" size=\"3\">b.<\/font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><font size=\"3\"><font face=\"Calibri\">Executable code in data section<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">They should be migrated to a code section<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">Security vulnerabilities are more exploitable than they would be if DEP were enabled. So you should always make your application DEP compatible and turn DEP on.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">The following sample<span> <\/span>demonstrates the code which is not compatible with DEP.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">It also shows two DEP compatible ways to run the code on heap.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">Running code in data section or on stack almost always implies security holes. You have to put the code in code section or heap instead.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>#include<\/span><span> <span>&#8220;windows.h&#8221;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>#include<\/span><span> <span>&lt;cstdio&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>typedef<\/span><span> <span>void<\/span> (*funType)();<\/span><\/p>\n<p class=\"MsoNormal\"><span>unsigned<\/span><span> <span>char<\/span> gCode[] = {0xC3}; <span>\/\/ \u201dret\u201d instruction on x86<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>const<\/span><span> size_t gCodeSize = <span>sizeof<\/span>(gCode);<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>\/\/ these are not DEP compatible<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>void<\/span><span> RunCodeOnHeap()<\/span><\/p>\n<p class=\"MsoNormal\"><span>{<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>unsigned<\/span> <span>char<\/span> *code = <span>new<\/span> <span>unsigned<\/span> <span>char<\/span>[gCodeSize];<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; memcpy(code, gCode, gCodeSize);<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; funType fun = <span>reinterpret_cast<\/span>&lt;funType&gt;(code);<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; fun();<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>delete<\/span> []code;<\/span><\/p>\n<p class=\"MsoNormal\"><span>}<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>\/\/ these are DEP compatible<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>void<\/span><span> RunCodeOnHeapCompatible1()<\/span><\/p>\n<p class=\"MsoNormal\"><span>{<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>unsigned<\/span> <span>char<\/span> *code = (<span>unsigned<\/span> <span>char<\/span> *)::VirtualAlloc(NULL, gCodeSize, MEM_COMMIT, PAGE_READWRITE);<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; memcpy(code, gCode, gCodeSize);<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; DWORD flOldProtect;<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; ::VirtualProtect(code, gCodeSize, PAGE_EXECUTE_READ, &amp;flOldProtect);<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; funType fun = <span>reinterpret_cast<\/span>&lt;funType&gt;(code);<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; fun();<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; ::VirtualFree(code, 0, MEM_RELEASE);<\/span><\/p>\n<p class=\"MsoNormal\"><span>}<\/span><\/p>\n<p class=\"MsoNormal\"><span>void<\/span><span> RunCodeOnHeapCompatible2()<\/span><\/p>\n<p class=\"MsoNormal\"><span>{<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; HANDLE hheap = ::HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, 0, 0);<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>unsigned<\/span> <span>char<\/span> *code = (<span>unsigned<\/span> <span>char<\/span> *)::HeapAlloc(hheap, 0, gCodeSize);<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; memcpy(code, gCode, gCodeSize);<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; funType fun = <span>reinterpret_cast<\/span>&lt;funType&gt;(code);<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; fun();<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; ::HeapFree(hheap, 0, code);<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; ::HeapDestroy(hheap);<\/span><\/p>\n<p class=\"MsoNormal\"><span>}<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>INT DEPExceptionFilter(LPEXCEPTION_POINTERS lpInfo)<\/span><\/p>\n<p class=\"MsoNormal\"><span>{<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>\/\/ please check <a href=\"http:\/\/technet.microsoft.com\/en-us\/library\/bb457155.aspx\" target=\"_blank\"><font color=\"#0000ff\">http:\/\/technet.microsoft.com\/en-us\/library\/bb457155.aspx<\/font><\/a> <\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>\/\/ for more information<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>if<\/span> (lpInfo-&gt;ExceptionRecord-&gt;ExceptionCode == STATUS_ACCESS_VIOLATION &amp;&amp;<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpInfo-&gt;ExceptionRecord-&gt;ExceptionInformation[0] == 8) {<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>return<\/span> EXCEPTION_EXECUTE_HANDLER;<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; }<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>return<\/span> EXCEPTION_CONTINUE_SEARCH;<\/span><\/p>\n<p class=\"MsoNormal\"><span>}<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><span>int<\/span><span> main()<\/span><\/p>\n<p class=\"MsoNormal\"><span>{<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>__try<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; {<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RunCodeOnHeap();<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(<span>&#8220;RunCodeOnHeap: OK\\n&#8221;<\/span>);<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; }<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>__except<\/span> (DEPExceptionFilter(GetExceptionInformation()))<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; {<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(<span>&#8220;RunCodeOnHeap: Fail due to DEP\\n&#8221;<\/span>);<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; }<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>__try<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; {<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RunCodeOnHeapCompatible1();<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(<span>&#8220;RunCodeOnHeapCompatible1: OK\\n&#8221;<\/span>);<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; }<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>__except<\/span> (DEPExceptionFilter(GetExceptionInformation()))<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; {<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(<span>&#8220;RunCodeOnHeapCompatible1: Fail due to DEP\\n&#8221;<\/span>);<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; }<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>__try<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; {<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RunCodeOnHeapCompatible2();<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(<span>&#8220;RunCodeOnHeapCompatible2: OK\\n&#8221;<\/span>);<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; }<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; <span>__except<\/span> (DEPExceptionFilter(GetExceptionInformation()))<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; {<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(<span>&#8220;RunCodeOnHeapCompatible2: Fail due to DEP\\n&#8221;<\/span>);<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; }<\/span><\/p>\n<p class=\"MsoNormal\"><span>}<\/span><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">Output:<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">cl test.cpp \/link \/nxcompat:no<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">RunCodeOnHeap: OK<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">RunCodeOnHeapCompatible1: OK<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">RunCodeOnHeapCompatible2: OK<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">cl test.cpp \/link \/nxcompat<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">RunCodeOnHeap: Fail due to DEP<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">RunCodeOnHeapCompatible1: OK<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">RunCodeOnHeapCompatible2: OK<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">In summary, \u201ccl test.cpp\u201d is equivalent to \u201ccl test.cpp \/link \/nxcompat:no \/dynamicbase:no\u201d before VS2010. We plan to change it to \u201ccl test.cpp \/link \/nxcompat \/dynamicbase\u201d in VS2010.<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">If you have any concerns about the default behavior change of these two options, don\u2019t hesitate to give your feedback. Thanks!<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Calibri\">&nbsp;<\/font><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\"><span>Regards,<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">&nbsp;&nbsp;&nbsp; Xiang<\/font><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello, my name is Xiang Fan and I am a developer on the C++ Shanghai team. Today I\u2019d like to talk about two linker options related to security: \/DYNAMICBASE and \/NXCOMPAT. &nbsp; These two options are introduced in VS2005, and target to improve the overall security of native applications. &nbsp; You can set these two [&hellip;]<\/p>\n","protected":false},"author":289,"featured_media":35994,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4483","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cplusplus"],"acf":[],"blog_post_summary":"<p>Hello, my name is Xiang Fan and I am a developer on the C++ Shanghai team. Today I\u2019d like to talk about two linker options related to security: \/DYNAMICBASE and \/NXCOMPAT. &nbsp; These two options are introduced in VS2005, and target to improve the overall security of native applications. &nbsp; You can set these two [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/4483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/users\/289"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/comments?post=4483"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/4483\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media\/35994"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media?parent=4483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/categories?post=4483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/tags?post=4483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}