void do_InitialDesktop_child(int i) { HDESK hdesktop; HWINSTA hwinsta; WCHAR buffer[100]; DWORD size; BOOL ret; if(TestResults[i].ExpectedWinsta == NULL) { trace("Process should have failed to initialize\n"); return; } IsGUIThread(TRUE); hdesktop = GetThreadDesktop(GetCurrentThreadId()); hwinsta = GetProcessWindowStation(); ret = GetUserObjectInformationW( hwinsta, UOI_NAME, buffer, sizeof(buffer), &size ); ok(ret == TRUE, "ret = %d\n", ret); ok(wcscmp(buffer, TestResults[i].ExpectedWinsta) == 0, "Wrong winsta %S insted of %S\n", buffer, TestResults[i].ExpectedWinsta); ret = GetUserObjectInformationW( hdesktop, UOI_NAME, buffer, sizeof(buffer), &size ); ok(ret == TRUE, "ret = %d\n", ret); ok(wcscmp(buffer, TestResults[i].ExpectedDesktp) == 0, "Wrong desktop %S insted of %S\n", buffer, TestResults[i].ExpectedDesktp); }
/*********************************************************************** * GetUserObjectInformationA (USER32.@) */ BOOL WINAPI GetUserObjectInformationA( HANDLE handle, INT index, LPVOID info, DWORD len, LPDWORD needed ) { /* check for information types returning strings */ if (index == UOI_TYPE || index == UOI_NAME) { WCHAR buffer[MAX_PATH]; DWORD lenA, lenW; if (!GetUserObjectInformationW( handle, index, buffer, sizeof(buffer), &lenW )) return FALSE; lenA = WideCharToMultiByte( CP_ACP, 0, buffer, -1, NULL, 0, NULL, NULL ); if (needed) *needed = lenA; if (lenA > len) { /* If the buffer length supplied by the caller is insufficient, Windows returns a 'needed' length based upon the Unicode byte length, so we should do similarly. */ if (needed) *needed = lenW; SetLastError( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } if (info) WideCharToMultiByte( CP_ACP, 0, buffer, -1, info, len, NULL, NULL ); return TRUE; } return GetUserObjectInformationW( handle, index, info, len, needed ); }
/* get_user_obj_name() Get the name of a user object. 'object' is a handle to the user object you want the name of. returns nonzero on success. if success then '*name' has received a pointer to the user object's name. free() when done. if fail then '*name' has received NULL. if fail call GetLastError() for GetUserObjectInformationW() last error */ int get_user_obj_name( WCHAR **const name, // out deref HANDLE const object // in ) { DWORD bytes_needed = 0; FAIL_IF( !name ); FAIL_IF( !object ); SetLastError( 0 ); // error code may be evaluated on success GetUserObjectInformationW( object, UOI_NAME, NULL, 0, &bytes_needed ); if( ( GetLastError() != ERROR_INSUFFICIENT_BUFFER ) || ( bytes_needed < sizeof( WCHAR ) ) ) { *name = NULL; return FALSE; } *name = must_calloc( bytes_needed, 1 ); SetLastError( 0 ); // error code may be evaluated on success if( !GetUserObjectInformationW( object, UOI_NAME, *name, bytes_needed, NULL ) ) { free( *name ); *name = NULL; return FALSE; } (*name)[ ( bytes_needed / sizeof( WCHAR ) ) - 1 ] = L'\0'; return TRUE; }
int OPENSSL_isservice(void) { HWINSTA h; DWORD len; WCHAR *name; static union { void *p; int (*f)(void); } _OPENSSL_isservice = { NULL }; if (_OPENSSL_isservice.p == NULL) { HANDLE h = GetModuleHandle(NULL); if (h != NULL) _OPENSSL_isservice.p = GetProcAddress(h,"_OPENSSL_isservice"); if (_OPENSSL_isservice.p == NULL) _OPENSSL_isservice.p = (void *)-1; } if (_OPENSSL_isservice.p != (void *)-1) return (*_OPENSSL_isservice.f)(); (void)GetDesktopWindow(); /* return value is ignored */ h = GetProcessWindowStation(); if (h==NULL) return -1; if (GetUserObjectInformationW (h,UOI_NAME,NULL,0,&len) || GetLastError() != ERROR_INSUFFICIENT_BUFFER) return -1; if (len>512) return -1; /* paranoia */ len++,len&=~1; /* paranoia */ name=(WCHAR *)alloca(len+sizeof(WCHAR)); if (!GetUserObjectInformationW (h,UOI_NAME,name,len,&len)) return -1; len++,len&=~1; /* paranoia */ name[len/sizeof(WCHAR)]=L'\0'; /* paranoia */ #if 1 /* This doesn't cover "interactive" services [working with real * WinSta0's] nor programs started non-interactively by Task * Scheduler [those are working with SAWinSta]. */ if (wcsstr(name,L"Service-0x")) return 1; #else /* This covers all non-interactive programs such as services. */ if (!wcsstr(name,L"WinSta0")) return 1; #endif else return 0; }
/* retrieve the desktop name to use if not specified on the command line */ static const WCHAR *get_default_desktop_name(void) { static const WCHAR desktopW[] = {'D','e','s','k','t','o','p',0}; static const WCHAR defaultW[] = {'D','e','f','a','u','l','t',0}; static const WCHAR explorer_keyW[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\', 'E','x','p','l','o','r','e','r',0}; static WCHAR buffer[MAX_PATH]; DWORD size = sizeof(buffer); HDESK desk = GetThreadDesktop( GetCurrentThreadId() ); WCHAR *ret = NULL; HKEY hkey; if (desk && GetUserObjectInformationW( desk, UOI_NAME, buffer, sizeof(buffer)/sizeof(WCHAR), NULL )) { if (strcmpiW( buffer, defaultW )) return buffer; } /* @@ Wine registry key: HKCU\Software\Wine\Explorer */ if (!RegOpenKeyW( HKEY_CURRENT_USER, explorer_keyW, &hkey )) { if (!RegQueryValueExW( hkey, desktopW, 0, NULL, (LPBYTE)buffer, &size )) ret = buffer; RegCloseKey( hkey ); } return ret; }
/* * @implemented */ BOOL WINAPI GetUserObjectInformationA( HANDLE hObj, int nIndex, PVOID pvInfo, DWORD nLength, LPDWORD lpnLengthNeeded) { LPWSTR buffer; BOOL ret = FALSE; DWORD LengthNeeded; TRACE("GetUserObjectInformationA(%x %d %x %d %x)\n", hObj, nIndex, pvInfo, nLength, lpnLengthNeeded); if (nIndex != UOI_NAME && nIndex != UOI_TYPE) return GetUserObjectInformationW(hObj, nIndex, pvInfo, nLength, lpnLengthNeeded); /* allocate unicode buffer */ buffer = HeapAlloc(GetProcessHeap(), 0, nLength*2); if (buffer == NULL) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } /* get unicode string */ if (GetUserObjectInformationW(hObj, nIndex, buffer, nLength*2, lpnLengthNeeded)) { /* convert string */ LengthNeeded = WideCharToMultiByte(CP_THREAD_ACP, 0, buffer, -1, pvInfo, nLength, NULL, NULL); if (LengthNeeded != 0) { if (lpnLengthNeeded) *lpnLengthNeeded = LengthNeeded; ret = TRUE; } } /* free resources */ HeapFree(GetProcessHeap(), 0, buffer); return ret; }
/*********************************************************************** * GetUserObjectInformationA (USER32.@) */ BOOL WINAPI GetUserObjectInformationA( HANDLE handle, INT index, LPVOID info, DWORD len, LPDWORD needed ) { /* check for information types returning strings */ if (index == UOI_TYPE || index == UOI_NAME) { WCHAR buffer[MAX_PATH]; DWORD lenA; if (!GetUserObjectInformationW( handle, index, buffer, sizeof(buffer), NULL )) return FALSE; lenA = WideCharToMultiByte( CP_ACP, 0, buffer, -1, NULL, 0, NULL, NULL ); if (needed) *needed = lenA; if (lenA > len) { SetLastError( ERROR_MORE_DATA ); return FALSE; } if (info) WideCharToMultiByte( CP_ACP, 0, buffer, -1, info, len, NULL, NULL ); return TRUE; } return GetUserObjectInformationW( handle, index, info, len, needed ); }
int OPENSSL_isservice(void) { HWINSTA h; DWORD len; WCHAR *name; (void)GetDesktopWindow(); /* return value is ignored */ h = GetProcessWindowStation(); if (h==NULL) return -1; if (GetUserObjectInformationW (h,UOI_NAME,NULL,0,&len) || GetLastError() != ERROR_INSUFFICIENT_BUFFER) return -1; if (len>512) return -1; /* paranoia */ len++,len&=~1; /* paranoia */ #ifdef _MSC_VER name=(WCHAR *)_alloca(len+sizeof(WCHAR)); #else name=(WCHAR *)alloca(len+sizeof(WCHAR)); #endif if (!GetUserObjectInformationW (h,UOI_NAME,name,len,&len)) return -1; len++,len&=~1; /* paranoia */ name[len/sizeof(WCHAR)]=L'\0'; /* paranoia */ #if 1 /* This doesn't cover "interactive" services [working with real * WinSta0's] nor programs started non-interactively by Task * Scheduler [those are working with SAWinSta]. */ if (wcsstr(name,L"Service-0x")) return 1; #else /* This covers all non-interactive programs such as services. */ if (!wcsstr(name,L"WinSta0")) return 1; #endif else return 0; }
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"); }