title: Why does WriteFile crash when writing to the standard output?
body: <p>Here's a "Hello world" program that uses WinAPI's WriteFile (compiled in Microsoft Visual C++ 2008 Express):</p>
  
  <pre><code>int _tmain(int argc, _TCHAR* argv[])
  {
      wchar_t str[] = L"Hello world";
  
      HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
      if(out &amp;&amp; out!=INVALID_HANDLE_VALUE)
      {
          WriteFile(out, str, sizeof(str), NULL, NULL);
          CloseHandle(out);
      }   
  
      return 0;
  }
  </code></pre>
  
  <p>If executed in a console window, it happily greets the world. If you try to redirect its standard output, however, as in</p>
  
  <pre><code>hello.exe &gt; output.txt
  </code></pre>
  
  <p>the program crashes in WriteFile (NULL pointer exception). Nonetheless, output.txt exists and contains the correct output in its entirety.</p>
  
  <p>The call stack on crash:</p>
  
  <pre><code>KernelBase.dll!_WriteFile@20()  + 0x75 bytes    
  kernel32.dll!_WriteFileImplementation@20()  + 0x4e bytes    
  srgprc2.exe!wmain(int argc=1, wchar_t * * argv=0x00483d88)  Line 15 + 0x16 bytes    C++
  </code></pre>
  
  <p>The message: "Unhandled exception at 0x75ce85ea (KernelBase.dll) in srgprc2.exe: 0xC0000005: Access violation writing location 0x00000000."</p>
  
  <p>What's going on here? Thanks!</p>