static void print_object( HANDLE obj ) { char buffer[100]; DWORD size; strcpy( buffer, "foobar" ); if (!GetUserObjectInformationA( obj, UOI_NAME, buffer, sizeof(buffer), &size )) trace( "could not get info for %p\n", obj ); else trace( "obj %p name '%s'\n", obj, buffer ); strcpy( buffer, "foobar" ); if (!GetUserObjectInformationA( obj, UOI_TYPE, buffer, sizeof(buffer), &size )) trace( "could not get type for %p\n", obj ); else trace( "obj %p type '%s'\n", obj, buffer ); }
static void test_getuserobjectinformation(void) { HDESK desk; WCHAR bufferW[20]; char buffer[20]; WCHAR foobarTestW[] = {'f','o','o','b','a','r','T','e','s','t',0}; WCHAR DesktopW[] = {'D','e','s','k','t','o','p',0}; DWORD size; BOOL ret; desk = CreateDesktop("foobarTest", NULL, NULL, 0, DESKTOP_ALL_ACCESS, NULL); ok(desk != 0, "open foobarTest desktop failed\n"); strcpy(buffer, "blahblah"); /** Tests for UOI_NAME **/ /* Get size, test size and return value/error code */ SetLastError(0xdeadbeef); size = 0xdeadbeef; ret = GetUserObjectInformationA(desk, UOI_NAME, NULL, 0, &size); ok(!ret, "GetUserObjectInformationA returned %x\n", ret); ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "LastError is set to %08x\n", GetLastError()); ok(size == 22, "size is set to %d\n", size); /* Windows returns Unicode length (11*2) */ /* Get string */ SetLastError(0xdeadbeef); size = 0xdeadbeef; ret = GetUserObjectInformationA(desk, UOI_NAME, buffer, sizeof(buffer), &size); ok(ret, "GetUserObjectInformationA returned %x\n", ret); ok(GetLastError() == 0xdeadbeef, "LastError is set to %08x\n", GetLastError()); ok(strcmp(buffer, "foobarTest") == 0, "Buffer is set to '%s'\n", buffer); ok(size == 11, "size is set to %d\n", size); /* 11 bytes in 'foobarTest\0' */ /* Get size, test size and return value/error code (Unicode) */ SetLastError(0xdeadbeef); size = 0xdeadbeef; ret = GetUserObjectInformationW(desk, UOI_NAME, NULL, 0, &size); ok(!ret, "GetUserObjectInformationW returned %x\n", ret); ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "LastError is set to %08x\n", GetLastError()); ok(size == 22, "size is set to %d\n", size); /* 22 bytes in 'foobarTest\0' in Unicode */ /* Get string (Unicode) */ SetLastError(0xdeadbeef); size = 0xdeadbeef; ret = GetUserObjectInformationW(desk, UOI_NAME, bufferW, sizeof(bufferW), &size); ok(ret, "GetUserObjectInformationW returned %x\n", ret); ok(GetLastError() == 0xdeadbeef, "LastError is set to %08x\n", GetLastError()); ok(lstrcmpW(bufferW, foobarTestW) == 0, "Buffer is not set to 'foobarTest'\n"); ok(size == 22, "size is set to %d\n", size); /* 22 bytes in 'foobarTest\0' in Unicode */ /** Tests for UOI_TYPE **/ /* Get size, test size and return value/error code */ SetLastError(0xdeadbeef); size = 0xdeadbeef; ret = GetUserObjectInformationA(desk, UOI_TYPE, NULL, 0, &size); ok(!ret, "GetUserObjectInformationA returned %x\n", ret); ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "LastError is set to %08x\n", GetLastError()); ok(size == 16, "size is set to %d\n", size); /* Windows returns Unicode length (8*2) */ /* Get string */ SetLastError(0xdeadbeef); size = 0xdeadbeef; ret = GetUserObjectInformationA(desk, UOI_TYPE, buffer, sizeof(buffer), &size); ok(ret, "GetUserObjectInformationA returned %x\n", ret); ok(GetLastError() == 0xdeadbeef, "LastError is set to %08x\n", GetLastError()); ok(strcmp(buffer, "Desktop") == 0, "Buffer is set to '%s'\n", buffer); ok(size == 8, "size is set to %d\n", size); /* 8 bytes in 'Desktop\0' */ /* Get size, test size and return value/error code (Unicode) */ size = 0xdeadbeef; SetLastError(0xdeadbeef); ret = GetUserObjectInformationW(desk, UOI_TYPE, NULL, 0, &size); ok(!ret, "GetUserObjectInformationW returned %x\n", ret); ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "LastError is set to %08x\n", GetLastError()); ok(size == 16, "size is set to %d\n", size); /* 16 bytes in 'Desktop\0' in Unicode */ /* Get string (Unicode) */ SetLastError(0xdeadbeef); size = 0xdeadbeef; ret = GetUserObjectInformationW(desk, UOI_TYPE, bufferW, sizeof(bufferW), &size); ok(ret, "GetUserObjectInformationW returned %x\n", ret); ok(GetLastError() == 0xdeadbeef, "LastError is set to %08x\n", GetLastError()); ok(lstrcmpW(bufferW, DesktopW) == 0, "Buffer is not set to 'Desktop'\n"); ok(size == 16, "size is set to %d\n", size); /* 16 bytes in 'Desktop\0' in Unicode */ ok(CloseDesktop(desk), "CloseDesktop failed\n"); }
static void test_inputdesktop(void) { HDESK input_desk, old_input_desk, thread_desk, old_thread_desk, new_desk; DWORD ret; CHAR name[1024]; INPUT inputs[1]; inputs[0].type = INPUT_KEYBOARD; U(inputs[0]).ki.wVk = 0; U(inputs[0]).ki.wScan = 0x3c0; U(inputs[0]).ki.dwFlags = KEYEVENTF_UNICODE; /* OpenInputDesktop creates new handles for each calls */ old_input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS); ok(old_input_desk != NULL, "OpenInputDesktop failed!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(old_input_desk, UOI_NAME, name, 1024, NULL); ok(ret, "GetUserObjectInformation failed!\n"); ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name); input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS); ok(input_desk != NULL, "OpenInputDesktop failed!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(input_desk, UOI_NAME, name, 1024, NULL); ok(ret, "GetUserObjectInformation failed!\n"); ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name); ok(old_input_desk != input_desk, "returned the same handle!\n"); ret = CloseDesktop(input_desk); ok(ret, "CloseDesktop failed!\n"); /* by default, GetThreadDesktop is the input desktop, SendInput should succeed. */ old_thread_desk = GetThreadDesktop(GetCurrentThreadId()); ok(old_thread_desk != NULL, "GetThreadDesktop faile!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(old_thread_desk, UOI_NAME, name, 1024, NULL); ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name); SetLastError(0xdeadbeef); ret = SendInput(1, inputs, sizeof(INPUT)); ok(GetLastError() == 0xdeadbeef, "unexpected last error %08x\n", GetLastError()); ok(ret == 1, "unexpected return count %d\n", ret); /* Set thread desktop to the new desktop, SendInput should fail. */ new_desk = CreateDesktopA("new_desk", NULL, NULL, 0, DESKTOP_ALL_ACCESS, NULL); ok(new_desk != NULL, "CreateDesktop failed!\n"); ret = SetThreadDesktop(new_desk); ok(ret, "SetThreadDesktop failed!\n"); thread_desk = GetThreadDesktop(GetCurrentThreadId()); ok(thread_desk == new_desk, "thread desktop doesn't match!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(thread_desk, UOI_NAME, name, 1024, NULL); ok(!strcmp(name, "new_desk"), "unexpected desktop %s\n", name); SetLastError(0xdeadbeef); ret = SendInput(1, inputs, sizeof(INPUT)); if(broken(GetLastError() == 0xdeadbeef)) { SetThreadDesktop(old_thread_desk); CloseDesktop(old_input_desk); CloseDesktop(input_desk); CloseDesktop(new_desk); win_skip("Skip tests on NT4\n"); return; } todo_wine ok(GetLastError() == ERROR_ACCESS_DENIED, "unexpected last error %08x\n", GetLastError()); ok(ret == 1 || broken(ret == 0) /* Win64 */, "unexpected return count %d\n", ret); /* Set thread desktop back to the old thread desktop, SendInput should success. */ ret = SetThreadDesktop(old_thread_desk); ok(ret, "SetThreadDesktop failed!\n"); thread_desk = GetThreadDesktop(GetCurrentThreadId()); ok(thread_desk == old_thread_desk, "thread desktop doesn't match!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(thread_desk, UOI_NAME, name, 1024, NULL); ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name); SetLastError(0xdeadbeef); ret = SendInput(1, inputs, sizeof(INPUT)); ok(GetLastError() == 0xdeadbeef, "unexpected last error %08x\n", GetLastError()); ok(ret == 1, "unexpected return count %d\n", ret); /* Set thread desktop to the input desktop, SendInput should success. */ ret = SetThreadDesktop(old_input_desk); ok(ret, "SetThreadDesktop failed!\n"); thread_desk = GetThreadDesktop(GetCurrentThreadId()); ok(thread_desk == old_input_desk, "thread desktop doesn't match!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(thread_desk, UOI_NAME, name, 1024, NULL); ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name); SetLastError(0xdeadbeef); ret = SendInput(1, inputs, sizeof(INPUT)); ok(GetLastError() == 0xdeadbeef, "unexpected last error %08x\n", GetLastError()); ok(ret == 1, "unexpected return count %d\n", ret); /* Switch input desktop to the new desktop, SendInput should fail. */ ret = SwitchDesktop(new_desk); ok(ret, "SwitchDesktop failed!\n"); input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS); ok(input_desk != NULL, "OpenInputDesktop failed!\n"); ok(input_desk != new_desk, "returned the same handle!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(input_desk, UOI_NAME, name, 1024, NULL); ok(ret, "GetUserObjectInformation failed!\n"); todo_wine ok(!strcmp(name, "new_desk"), "unexpected desktop %s\n", name); ret = CloseDesktop(input_desk); ok(ret, "CloseDesktop failed!\n"); SetLastError(0xdeadbeef); ret = SendInput(1, inputs, sizeof(INPUT)); todo_wine ok(GetLastError() == ERROR_ACCESS_DENIED, "unexpected last error %08x\n", GetLastError()); ok(ret == 1 || broken(ret == 0) /* Win64 */, "unexpected return count %d\n", ret); /* Set thread desktop to the new desktop, SendInput should success. */ ret = SetThreadDesktop(new_desk); ok(ret, "SetThreadDesktop failed!\n"); thread_desk = GetThreadDesktop(GetCurrentThreadId()); ok(thread_desk == new_desk, "thread desktop doesn't match!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(thread_desk, UOI_NAME, name, 1024, NULL); ok(!strcmp(name, "new_desk"), "unexpected desktop %s\n", name); SetLastError(0xdeadbeef); ret = SendInput(1, inputs, sizeof(INPUT)); ok(GetLastError() == 0xdeadbeef, "unexpected last error %08x\n", GetLastError()); ok(ret == 1, "unexpected return count %d\n", ret); /* Switch input desktop to the old input desktop, set thread desktop to the old * thread desktop, clean side effects. SendInput should success. */ ret = SwitchDesktop(old_input_desk); input_desk = OpenInputDesktop(0, FALSE, DESKTOP_ALL_ACCESS); ok(input_desk != NULL, "OpenInputDesktop failed!\n"); ok(input_desk != old_input_desk, "returned the same handle!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(input_desk, UOI_NAME, name, 1024, NULL); ok(ret, "GetUserObjectInformation failed!\n"); ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name); ret = SetThreadDesktop(old_thread_desk); ok(ret, "SetThreadDesktop failed!\n"); thread_desk = GetThreadDesktop(GetCurrentThreadId()); ok(thread_desk == old_thread_desk, "thread desktop doesn't match!\n"); memset(name, 0, sizeof(name)); ret = GetUserObjectInformationA(thread_desk, UOI_NAME, name, 1024, NULL); ok(!strcmp(name, "Default"), "unexpected desktop %s\n", name); SetLastError(0xdeadbeef); ret = SendInput(1, inputs, sizeof(INPUT)); ok(GetLastError() == 0xdeadbeef, "unexpected last error %08x\n", GetLastError()); ok(ret == 1, "unexpected return count %d\n", ret); /* free resources */ ret = CloseDesktop(input_desk); ok(ret, "CloseDesktop failed!\n"); ret = CloseDesktop(old_input_desk); ok(ret, "CloseDesktop failed!\n"); ret = CloseDesktop(new_desk); ok(ret, "CloseDesktop failed!\n"); }
HVNC VNCCreateServer(HVNC_INITIALIZE *lpVNCInit) { if (!bHVNCInit) return -1; HVNC hVNC=1; EnterCriticalSection(&csHVNC); { HVNC_HANDLE *lpHandle=NULL; DWORD dwHash=chksum_crc32((byte*)lpVNCInit->szDeskName,lstrlenA(lpVNCInit->szDeskName)); if (!lpHandles) lpHandle=lpHandles=(HVNC_HANDLE*)MemAlloc(sizeof(HVNC_HANDLE)); else { lpHandle=lpHandles; HVNC_HANDLE *lpPrev; while (lpHandle) { if (lpHandle->lpServer->Names.dwHash == dwHash) { LeaveCriticalSection(&csHVNC); return -1; } lpPrev=lpHandle; lpHandle=lpHandle->lpNext; } lpHandle=lpPrev->lpNext=(HVNC_HANDLE*)MemAlloc(sizeof(HVNC_HANDLE)); lpHandle->lpPrev=lpPrev; hVNC=lpPrev->hHandle+1; } PHVNC lpServer=lpHandle->lpServer=(PHVNC)VirtualAlloc(NULL,sizeof(HVNCS),MEM_COMMIT,PAGE_READWRITE); lpHandle->hHandle=hVNC; InitializeCriticalSection(&lpServer->ThreadsInfo.csThreads); InitializeCriticalSection(&lpServer->WndWatcherInfo.csWndsList); lpServer->EventsInfo.dwSleep=50; lstrcpyA(lpServer->DeskInfo.szDeskName,lpVNCInit->szDeskName); lpServer->DeskInfo.dwFlags=lpVNCInit->dwFlags; #ifdef _HVNC_WEBCAM if (!memcmp(lpVNCInit->szDeskName,"#webcam",sizeof("#webcam")-1)) { lpServer->DeskInfo.bWebCam=true; lpServer->DeskInfo.dwFlags|=HVNC_WEB_CAM; if (!InitWebCam(lpServer)) { LeaveCriticalSection(&csHVNC); VNCCloseHandle(lpHandle->hHandle); return -1; } } else #endif { HDESK hInputDesktop=OpenInputDesktop(0,FALSE,DESKTOP_READOBJECTS); if (hInputDesktop) { char szInputDesktopName[100]; GetUserObjectInformationA(hInputDesktop,UOI_NAME,szInputDesktopName,sizeof(szInputDesktopName),NULL); if (!lstrcmpiA(szInputDesktopName,lpVNCInit->szDeskName)) { lpServer->DeskInfo.bInputDesktop=true; lpServer->DeskInfo.dwFlags|=HVNC_INPUT_DESKTOP; } CloseDesktop(hInputDesktop); } if (lpServer->DeskInfo.dwFlags & HVNC_SCREEN_SIZE_DETERMINED) { if ((!lpVNCInit->bBitsPerPixel) || (!lpVNCInit->dwHeight) || (!lpVNCInit->dwWidth)) { LeaveCriticalSection(&csHVNC); VNCCloseHandle(lpHandle->hHandle); return -1; } SetScreenSize(lpServer,lpVNCInit->dwHeight,lpVNCInit->dwWidth,lpVNCInit->bBitsPerPixel); } } lpServer->Names.dwHash=dwHash; InitGlobalDataNames(lpServer); if (!InitGlobalData(lpServer)) { LeaveCriticalSection(&csHVNC); VNCCloseHandle(lpHandle->hHandle); return -1; } lpServer->lpClientGoneHook=lpVNCInit->lpClientGoneHook; lpServer->lpNewClientHook=lpVNCInit->lpNewClientHook; if (!(lpServer->DeskInfo.dwFlags & HVNC_NO_INJECTS)) { lstrcpyA(lpServer->lpGlobalVNCData->szDeskName,lpServer->DeskInfo.szDeskName); lpServer->lpGlobalVNCData->dwDeskFlags=lpVNCInit->dwFlags; WaitForSingleObject(hHandlesMutex,INFINITE); for (int i=0; i < HVNC_MAX_HANDLES; i++) { if (!lpHandlesMapping[i]) { lpHandlesMapping[i]=lpServer->Names.dwHash; break; } } ReleaseMutex(hHandlesMutex); } } LeaveCriticalSection(&csHVNC); return hVNC; }