CreateDesktop () con vista y UAC en (C, ventanas)

Le pregunté esto enCreateDesktop () con Vista UAC (C Windows) Establecí una recompensa, pero al intentar rechazar la única respuesta, la "aceptación" se presionó por error (he estado despierto por más de 48 hs). Así que lo estoy preguntando de nuevo.

Estoy usando CreateDesktop () para crear un escritorio temporal en el que se ejecutará una aplicación, realizar una acción de limpieza (mientras permanezca fuera del camino) y finalizar. Estoy cerrando ese escritorio una vez que la aplicación se haya ido. Todo está bien cuando se usa Windows XP e incluso Vista. El problema surge cuando habilitas el UAC (molesto).

Todo está bien cuando creas un escritorio, pero cuando llamas a CreateProcess () para abrir un programa en ese escritorio, la aplicación abierta se bloquea con una excepción en User32.dll.

He estado leyendo mucho sobre los diferentes escritorios y capas en Windows y las restricciones de memoria. Sin embargo, la mayoría de los programas que abro (como escenarios de prueba) están bien, pero algunos (como IE, Notepad, Calc y mi propia aplicación) causan el bloqueo.

¿Alguien tiene alguna idea de por qué sucede esto en Vista con UAC, o más específicamente para esos programas específicos? ¿Y cómo solucionar esto?

¿Alguien tiene un buen ejemplo sólido sobre cómo crear un escritorio y abrir una aplicación allí sin cambiarlo en Vista con UAC?

El código es apreciado.

Gracias

El código utilizado es

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, &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;

Respuestas a la pregunta(2)

Su respuesta a la pregunta