CreateDesktop() with Vista UAC (C Windows)

倖福魔咒の 提交于 2019-12-07 12:32:17

问题


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.

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.

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.

Anyone has any idea why this happen on Vista with UAC, or more specifically for those specific programs? and how to fix this?

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?

Code is appreciated.

Thanks

EDIT: Here's the code I am using.

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

EDIT for Bounty 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.

I pressed the "accept" by mistake. I asked the question again in CreateDesktop() with vista and UAC on (C, windows)


回答1:


Interesting problem... I wouldn't expect a difference bewteen the UAC/non-UAC scenario unless the launched program required administrator privilege (and I doubt that either notepad or calc does). Anyway, have you tried setting the thread's desktop before calling CreateProcess()?

HDESK hOld = GetThreadDesktop( GetCurrentThreadId() );
HDESK hNew = OpenDesktop( "name", 0, FALSE, GENERIC_ALL );
SetThreadDesktop( hNew );
CreateProcess( ... );
SetThreadDesktop( hOld );
CloseDesktop( hNew );


来源:https://stackoverflow.com/questions/1188396/createdesktop-with-vista-uac-c-windows

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!