mirror of
https://github.com/reactos/reactos.git
synced 2024-10-06 01:13:38 +00:00
Anich Gregor: Basic implementation of GetUserObjectInformation() (needed by the nvidia opengl ICD)
svn path=/trunk/; revision=9410
This commit is contained in:
parent
bdd1e9e8c6
commit
43783f95c5
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: object.c,v 1.6 2004/01/23 23:38:26 ekohl Exp $
|
/* $Id: object.c,v 1.7 2004/05/15 22:50:04 weiden Exp $
|
||||||
*
|
*
|
||||||
* PROJECT: ReactOS user32.dll
|
* PROJECT: ReactOS user32.dll
|
||||||
* FILE: lib/user32/misc/dde.c
|
* FILE: lib/user32/misc/dde.c
|
||||||
|
@ -82,7 +82,7 @@ UserHandleGrantAccess(
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
BOOL
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
|
@ -93,13 +93,46 @@ GetUserObjectInformationA(
|
||||||
DWORD nLength,
|
DWORD nLength,
|
||||||
LPDWORD lpnLengthNeeded)
|
LPDWORD lpnLengthNeeded)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
LPWSTR buffer;
|
||||||
|
BOOL ret = TRUE;
|
||||||
|
|
||||||
|
DPRINT("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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get unicode string */
|
||||||
|
if (!GetUserObjectInformationW(hObj, nIndex, buffer, nLength*2, lpnLengthNeeded))
|
||||||
|
ret = FALSE;
|
||||||
|
*lpnLengthNeeded /= 2;
|
||||||
|
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
/* convert string */
|
||||||
|
if (WideCharToMultiByte(CP_THREAD_ACP, 0, buffer, -1,
|
||||||
|
pvInfo, nLength, NULL, NULL) == 0)
|
||||||
|
{
|
||||||
|
ret = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* free resources */
|
||||||
|
HeapFree(GetProcessHeap(), 0, buffer);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
BOOL
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
|
@ -110,6 +143,8 @@ GetUserObjectInformationW(
|
||||||
DWORD nLength,
|
DWORD nLength,
|
||||||
LPDWORD lpnLengthNeeded)
|
LPDWORD lpnLengthNeeded)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
DPRINT("GetUserObjectInformationW(%x %d %x %d %x)\n", hObj, nIndex,
|
||||||
return FALSE;
|
pvInfo, nLength, lpnLengthNeeded);
|
||||||
|
return NtUserGetObjectInformation(hObj, nIndex, pvInfo, nLength, lpnLengthNeeded);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*
|
*
|
||||||
* $Id: winsta.c,v 1.60 2004/05/14 23:57:32 weiden Exp $
|
* $Id: winsta.c,v 1.61 2004/05/15 22:50:04 weiden Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -611,10 +611,119 @@ NtUserGetObjectInformation(
|
||||||
DWORD nLength,
|
DWORD nLength,
|
||||||
PDWORD nLengthNeeded)
|
PDWORD nLengthNeeded)
|
||||||
{
|
{
|
||||||
SetLastNtError(STATUS_UNSUCCESSFUL);
|
PWINSTATION_OBJECT WinStaObject = NULL;
|
||||||
|
PDESKTOP_OBJECT DesktopObject = NULL;
|
||||||
|
NTSTATUS Status;
|
||||||
|
PVOID pvData = NULL;
|
||||||
|
DWORD nDataSize = 0;
|
||||||
|
|
||||||
|
/* try windowstation */
|
||||||
|
DPRINT("Trying to open window station 0x%x\n", hObject);
|
||||||
|
Status = IntValidateWindowStationHandle(
|
||||||
|
hObject,
|
||||||
|
UserMode,/*ExGetPreviousMode(),*/
|
||||||
|
GENERIC_READ, /* FIXME: is this ok? */
|
||||||
|
&WinStaObject);
|
||||||
|
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_TYPE_MISMATCH)
|
||||||
|
{
|
||||||
|
DPRINT("Failed: 0x%x\n", Status);
|
||||||
|
SetLastNtError(Status);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Status == STATUS_OBJECT_TYPE_MISMATCH)
|
||||||
|
{
|
||||||
|
/* try desktop */
|
||||||
|
DPRINT("Trying to open desktop 0x%x\n", hObject);
|
||||||
|
Status = IntValidateDesktopHandle(
|
||||||
|
hObject,
|
||||||
|
UserMode,/*ExGetPreviousMode(),*/
|
||||||
|
GENERIC_READ, /* FIXME: is this ok? */
|
||||||
|
&DesktopObject);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT("Failed: 0x%x\n", Status);
|
||||||
|
SetLastNtError(Status);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DPRINT("WinSta or Desktop opened!!\n");
|
||||||
|
|
||||||
|
/* get data */
|
||||||
|
switch (nIndex)
|
||||||
|
{
|
||||||
|
case UOI_FLAGS:
|
||||||
|
Status = STATUS_NOT_IMPLEMENTED;
|
||||||
|
DPRINT1("UOI_FLAGS unimplemented!\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case UOI_NAME:
|
||||||
|
if (WinStaObject != NULL)
|
||||||
|
{
|
||||||
|
pvData = WinStaObject->Name.Buffer;
|
||||||
|
nDataSize = WinStaObject->Name.Length+2;
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
else if (DesktopObject != NULL)
|
||||||
|
{
|
||||||
|
pvData = DesktopObject->Name.Buffer;
|
||||||
|
nDataSize = DesktopObject->Name.Length+2;
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Status = STATUS_INVALID_PARAMETER;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case UOI_TYPE:
|
||||||
|
if (WinStaObject != NULL)
|
||||||
|
{
|
||||||
|
pvData = L"WindowStation";
|
||||||
|
nDataSize = (wcslen(pvData) + 1) * sizeof(WCHAR);
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
else if (DesktopObject != NULL)
|
||||||
|
{
|
||||||
|
pvData = L"Desktop";
|
||||||
|
nDataSize = (wcslen(pvData) + 1) * sizeof(WCHAR);
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Status = STATUS_INVALID_PARAMETER;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case UOI_USER_SID:
|
||||||
|
Status = STATUS_NOT_IMPLEMENTED;
|
||||||
|
DPRINT1("UOI_USER_SID unimplemented!\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Status = STATUS_INVALID_PARAMETER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* try to copy data to caller */
|
||||||
|
if (Status == STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
DPRINT("Trying to copy data to caller (len = %d, len needed = %d)\n", nLength, nDataSize);
|
||||||
|
*nLengthNeeded = nDataSize;
|
||||||
|
if (nLength >= nDataSize)
|
||||||
|
Status = MmCopyToCaller(pvInformation, pvData, nDataSize);
|
||||||
|
else
|
||||||
|
Status = STATUS_BUFFER_TOO_SMALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* release objects */
|
||||||
|
if (WinStaObject != NULL)
|
||||||
|
ObDereferenceObject(WinStaObject);
|
||||||
|
if (DesktopObject != NULL)
|
||||||
|
ObDereferenceObject(DesktopObject);
|
||||||
|
|
||||||
|
SetLastNtError(Status);
|
||||||
|
return NTSUCCESS(Status);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NtUserSetObjectInformation
|
* NtUserSetObjectInformation
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue