title: CreateDesktop() with Vista UAC (C Windows)
body: <p>I'm using CreateDesktop() to create a temporary desktop where an application will run, perform a cleanup action (while remaining out of the way) and terminate. I'm closing that desktop once the application is gone.
  Everything is fine when using Windows XP and even Vista. The problem arises when you enable the (annoying) UAC.</p>
  
  <p>Everything is OK when you create a desktop, but when you call CreateProcess() to open a program on that desktop it causes the opened application to crash with an exception on User32.dll.</p>
  
  <p>I've been reading a lot about the different desktops and layers on Windows and the restrictions of memory. However, most of the programs I open (as test scenarios) are OK, but a few (like IE, Notepad, Calc and my own application) cause the crash.</p>
  
  <p>Anyone has any idea why this happen on Vista with UAC, or more specifically for those specific programs? and how to fix this?</p>
  
  <p>Anyone has a good solid example on how to create a desktop and open an application there without switching to it under Vista with UAC on?</p>
  
  <p>Code is appreciated.</p>
  
  <p>Thanks</p>
  
  <p>EDIT:
  Here's the code I am using.</p>
  
  <pre><code>//Security
  SECURITY_ATTRIBUTES sa;
  
  HDESK dOld;
  HDESK dNew;
  
  BOOL switchdesk, switchdesk2, closedesk;
  int AppPid;
  
  sa.bInheritHandle = TRUE;
  sa.lpSecurityDescriptor = NULL;
  sa.nLength = sizeof(SECURITY_ATTRIBUTES);
  
  //Get handle to current desktop
  dOld = OpenDesktopA("default", 0, TRUE, DESKTOP_SWITCHDESKTOP| 
                          DESKTOP_WRITEOBJECTS|
                          DESKTOP_READOBJECTS|
                          DESKTOP_ENUMERATE|
                          DESKTOP_CREATEWINDOW|
                          DESKTOP_CREATEMENU);
  if(!dOld)
  {
      printf("Failed to get current desktop handle !!\n\n");
      return 0;
  }
  
  //Make a new desktop
  dNew = CreateDesktopA("kaka", 0, 0, 0, DESKTOP_SWITCHDESKTOP|
                            DESKTOP_WRITEOBJECTS|
                            DESKTOP_READOBJECTS|
                            DESKTOP_ENUMERATE|
                            DESKTOP_CREATEWINDOW|
                            DESKTOP_CREATEMENU, &amp;sa);
  
  if(!dNew)
  {
      printf("Failed to create new desktop !!\n\n");
      return 0;
  }
  
  AppPid = PerformOpenApp(SomeAppPath);
  if(AppPid == 0)
  {
      printf("failed to open app, err = %d\n", GetLastError());
  }
  else
  {
      printf("App pid = %d\n", AppPid);
  }
  
  
  closedesk = CloseDesktop(dNew);
  
  if(!closedesk)
  {
      printf("Failed to close new desktop !!\n\n");
      return 0;
  }
  
  
  return 0;
  </code></pre>
  
  <p><strong>EDIT for Bounty</strong>
  The current answer propesed DOES NOT COUNT as an answer, please do not set this as the answer to the bounty if the time for the bounty expires.</p>
  
  <p>I pressed the "accept" by mistake. I asked the question again in <a href="https://stackoverflow.com/questions/1395351/createdesktop-with-vista-and-uac-on-c-windows">CreateDesktop() with vista and UAC on (C, windows)</a></p>