2005-01-06 13:58:04 +00:00
|
|
|
/* $Id$
|
2001-06-12 17:51:51 +00:00
|
|
|
*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS user32.dll
|
|
|
|
* FILE: lib/user32/misc/winsta.c
|
|
|
|
* PURPOSE: Window stations
|
|
|
|
* PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
|
|
|
* UPDATE HISTORY:
|
|
|
|
* 04-06-2001 CSH Created
|
|
|
|
*/
|
2004-08-15 21:36:30 +00:00
|
|
|
|
2005-06-19 18:06:53 +00:00
|
|
|
#include <user32.h>
|
2001-06-12 17:51:51 +00:00
|
|
|
|
2006-06-26 13:16:43 +00:00
|
|
|
#include <wine/debug.h>
|
|
|
|
|
2003-07-10 21:04:32 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2008-11-30 11:42:05 +00:00
|
|
|
HWINSTA WINAPI
|
2010-03-28 15:32:23 +00:00
|
|
|
CreateWindowStationA(LPCSTR lpwinsta,
|
2002-06-11 22:09:03 +00:00
|
|
|
DWORD dwReserved,
|
|
|
|
ACCESS_MASK dwDesiredAccess,
|
|
|
|
LPSECURITY_ATTRIBUTES lpsa)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2008-06-26 11:49:47 +00:00
|
|
|
UNICODE_STRING WindowStationNameU;
|
|
|
|
HWINSTA hWinSta;
|
2005-05-09 01:42:07 +00:00
|
|
|
|
2008-06-26 11:49:47 +00:00
|
|
|
if (lpwinsta)
|
2002-06-11 22:09:03 +00:00
|
|
|
{
|
2008-06-26 11:49:47 +00:00
|
|
|
/* After conversion, the buffer is zero-terminated */
|
|
|
|
RtlCreateUnicodeStringFromAsciiz(&WindowStationNameU, lpwinsta);
|
2005-05-09 01:42:07 +00:00
|
|
|
}
|
2008-06-26 11:49:47 +00:00
|
|
|
else
|
2002-06-11 22:09:03 +00:00
|
|
|
{
|
2008-06-26 11:49:47 +00:00
|
|
|
RtlInitUnicodeString(&WindowStationNameU, NULL);
|
2002-06-11 22:09:03 +00:00
|
|
|
}
|
|
|
|
|
2008-06-26 11:49:47 +00:00
|
|
|
hWinSta = CreateWindowStationW(WindowStationNameU.Buffer,
|
|
|
|
dwReserved,
|
|
|
|
dwDesiredAccess,
|
|
|
|
lpsa);
|
2002-06-11 22:09:03 +00:00
|
|
|
|
2008-06-26 11:49:47 +00:00
|
|
|
/* Free the string, if it was allocated */
|
|
|
|
if (lpwinsta) RtlFreeUnicodeString(&WindowStationNameU);
|
2005-05-09 01:42:07 +00:00
|
|
|
|
2008-06-26 11:49:47 +00:00
|
|
|
return hWinSta;
|
2001-06-12 17:51:51 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 21:04:32 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2008-11-30 11:42:05 +00:00
|
|
|
HWINSTA WINAPI
|
2010-03-28 15:32:23 +00:00
|
|
|
CreateWindowStationW(LPCWSTR lpwinsta,
|
2002-06-11 22:09:03 +00:00
|
|
|
DWORD dwReserved,
|
|
|
|
ACCESS_MASK dwDesiredAccess,
|
|
|
|
LPSECURITY_ATTRIBUTES lpsa)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
|
|
|
UNICODE_STRING WindowStationName;
|
2005-05-09 01:42:07 +00:00
|
|
|
|
2001-06-29 19:34:35 +00:00
|
|
|
RtlInitUnicodeString(&WindowStationName, lpwinsta);
|
2005-05-09 01:42:07 +00:00
|
|
|
|
2003-08-21 20:29:44 +00:00
|
|
|
return NtUserCreateWindowStation(&WindowStationName,
|
2002-06-11 22:09:03 +00:00
|
|
|
dwDesiredAccess,
|
2007-09-28 01:49:06 +00:00
|
|
|
lpsa, 0, 0, 0, 0);
|
2001-06-12 17:51:51 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 21:04:32 +00:00
|
|
|
/*
|
2004-08-21 19:50:39 +00:00
|
|
|
* Common code for EnumDesktopsA/W and EnumWindowStationsA/W
|
2003-07-10 21:04:32 +00:00
|
|
|
*/
|
2004-08-21 19:50:39 +00:00
|
|
|
BOOL FASTCALL
|
|
|
|
EnumNamesW(HWINSTA WindowStation,
|
|
|
|
NAMEENUMPROCW EnumFunc,
|
|
|
|
LPARAM Context,
|
|
|
|
BOOL Desktops)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2004-08-21 19:50:39 +00:00
|
|
|
char Buffer[256];
|
|
|
|
PVOID NameList;
|
|
|
|
PWCHAR Name;
|
|
|
|
NTSTATUS Status;
|
|
|
|
ULONG RequiredSize;
|
|
|
|
ULONG CurrentEntry, EntryCount;
|
|
|
|
BOOL Ret;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Check parameters
|
|
|
|
*/
|
|
|
|
if (NULL == WindowStation && Desktops)
|
|
|
|
{
|
2009-09-17 15:25:36 +00:00
|
|
|
WindowStation = GetProcessWindowStation();
|
2004-08-21 19:50:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Try with fixed-size buffer
|
|
|
|
*/
|
|
|
|
Status = NtUserBuildNameList(WindowStation, sizeof(Buffer), Buffer, &RequiredSize);
|
|
|
|
if (NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
/* Fixed-size buffer is large enough */
|
|
|
|
NameList = (PWCHAR) Buffer;
|
|
|
|
}
|
|
|
|
else if (Status == STATUS_BUFFER_TOO_SMALL)
|
|
|
|
{
|
|
|
|
/* Allocate a larger buffer */
|
|
|
|
NameList = HeapAlloc(GetProcessHeap(), 0, RequiredSize);
|
|
|
|
if (NULL == NameList)
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
/* Try again */
|
|
|
|
Status = NtUserBuildNameList(WindowStation, RequiredSize, NameList, NULL);
|
|
|
|
if (! NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
HeapFree(GetProcessHeap(), 0, NameList);
|
|
|
|
SetLastError(RtlNtStatusToDosError(Status));
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Some unrecognized error occured */
|
|
|
|
SetLastError(RtlNtStatusToDosError(Status));
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Enum the names one by one
|
|
|
|
*/
|
|
|
|
EntryCount = *((DWORD *) NameList);
|
|
|
|
Name = (PWCHAR) ((PCHAR) NameList + sizeof(DWORD));
|
|
|
|
Ret = TRUE;
|
|
|
|
for (CurrentEntry = 0; CurrentEntry < EntryCount && Ret; ++CurrentEntry)
|
|
|
|
{
|
|
|
|
Ret = (*EnumFunc)(Name, Context);
|
|
|
|
Name += wcslen(Name) + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Cleanup
|
|
|
|
*/
|
|
|
|
if (NameList != Buffer)
|
|
|
|
{
|
|
|
|
HeapFree(GetProcessHeap(), 0, NameList);
|
|
|
|
}
|
|
|
|
|
|
|
|
return Ret;
|
2001-06-12 17:51:51 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 21:04:32 +00:00
|
|
|
|
2004-08-21 19:50:39 +00:00
|
|
|
/* For W->A conversion */
|
|
|
|
typedef struct tagENUMNAMESASCIICONTEXT
|
|
|
|
{
|
|
|
|
NAMEENUMPROCA UserEnumFunc;
|
|
|
|
LPARAM UserContext;
|
|
|
|
} ENUMNAMESASCIICONTEXT, *PENUMNAMESASCIICONTEXT;
|
|
|
|
|
2003-07-10 21:04:32 +00:00
|
|
|
/*
|
2004-08-21 19:50:39 +00:00
|
|
|
* Callback used by Ascii versions. Converts the Unicode name to
|
|
|
|
* Ascii and then calls the user callback
|
2003-07-10 21:04:32 +00:00
|
|
|
*/
|
2004-08-21 19:50:39 +00:00
|
|
|
BOOL CALLBACK
|
|
|
|
EnumNamesCallback(LPWSTR Name, LPARAM Param)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2004-08-21 19:50:39 +00:00
|
|
|
PENUMNAMESASCIICONTEXT Context = (PENUMNAMESASCIICONTEXT) Param;
|
|
|
|
char FixedNameA[32];
|
|
|
|
LPSTR NameA;
|
|
|
|
int Len;
|
|
|
|
BOOL Ret;
|
2003-12-13 11:34:53 +00:00
|
|
|
|
2004-08-21 19:50:39 +00:00
|
|
|
/*
|
|
|
|
* Determine required size of Ascii string and see if we can use
|
|
|
|
* fixed buffer
|
|
|
|
*/
|
|
|
|
Len = WideCharToMultiByte(CP_ACP, 0, Name, -1, NULL, 0, NULL, NULL);
|
|
|
|
if (Len <= 0)
|
2003-12-13 11:34:53 +00:00
|
|
|
{
|
2004-08-21 19:50:39 +00:00
|
|
|
/* Some strange error occured */
|
2003-12-13 11:34:53 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2004-08-21 19:50:39 +00:00
|
|
|
else if (Len <= sizeof(FixedNameA))
|
|
|
|
{
|
|
|
|
/* Fixed-size buffer is large enough */
|
|
|
|
NameA = FixedNameA;
|
|
|
|
}
|
|
|
|
else
|
2003-12-13 11:34:53 +00:00
|
|
|
{
|
2004-08-21 19:50:39 +00:00
|
|
|
/* Allocate a larger buffer */
|
|
|
|
NameA = HeapAlloc(GetProcessHeap(), 0, Len);
|
|
|
|
if (NULL == NameA)
|
2003-12-13 11:34:53 +00:00
|
|
|
{
|
2004-08-21 19:50:39 +00:00
|
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
2003-12-13 11:34:53 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
2004-08-21 19:50:39 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Do the Unicode ->Ascii conversion
|
|
|
|
*/
|
|
|
|
if (0 == WideCharToMultiByte(CP_ACP, 0, Name, -1, NameA, Len, NULL, NULL))
|
2003-12-13 11:34:53 +00:00
|
|
|
{
|
2004-08-21 19:50:39 +00:00
|
|
|
/* Something went wrong, clean up */
|
|
|
|
if (NameA != FixedNameA)
|
|
|
|
{
|
|
|
|
HeapFree(GetProcessHeap(), 0, NameA);
|
|
|
|
}
|
2003-12-13 11:34:53 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2004-08-21 19:50:39 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Call user callback
|
|
|
|
*/
|
|
|
|
Ret = Context->UserEnumFunc(NameA, Context->UserContext);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clean up
|
|
|
|
*/
|
|
|
|
if (NameA != FixedNameA)
|
2003-12-13 11:34:53 +00:00
|
|
|
{
|
2004-08-21 19:50:39 +00:00
|
|
|
HeapFree(GetProcessHeap(), 0, NameA);
|
2003-12-13 11:34:53 +00:00
|
|
|
}
|
2004-08-21 19:50:39 +00:00
|
|
|
|
|
|
|
return Ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Common code for EnumDesktopsA and EnumWindowStationsA
|
|
|
|
*/
|
|
|
|
BOOL FASTCALL
|
|
|
|
EnumNamesA(HWINSTA WindowStation,
|
|
|
|
NAMEENUMPROCA EnumFunc,
|
|
|
|
LPARAM Context,
|
|
|
|
BOOL Desktops)
|
|
|
|
{
|
|
|
|
ENUMNAMESASCIICONTEXT PrivateContext;
|
|
|
|
|
|
|
|
PrivateContext.UserEnumFunc = EnumFunc;
|
|
|
|
PrivateContext.UserContext = Context;
|
|
|
|
|
|
|
|
return EnumNamesW(WindowStation, EnumNamesCallback, (LPARAM) &PrivateContext, Desktops);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2008-11-30 11:42:05 +00:00
|
|
|
BOOL WINAPI
|
2004-08-21 19:50:39 +00:00
|
|
|
EnumWindowStationsA(WINSTAENUMPROCA EnumFunc,
|
|
|
|
LPARAM Context)
|
|
|
|
{
|
|
|
|
return EnumNamesA(NULL, EnumFunc, Context, FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2008-11-30 11:42:05 +00:00
|
|
|
BOOL WINAPI
|
2004-08-21 19:50:39 +00:00
|
|
|
EnumWindowStationsW(WINSTAENUMPROCW EnumFunc,
|
|
|
|
LPARAM Context)
|
|
|
|
{
|
|
|
|
return EnumNamesW(NULL, EnumFunc, Context, FALSE);
|
2001-06-12 17:51:51 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 21:04:32 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2008-11-30 11:42:05 +00:00
|
|
|
HWINSTA WINAPI
|
2010-03-28 15:32:23 +00:00
|
|
|
OpenWindowStationA(LPCSTR lpszWinSta,
|
2004-01-23 23:38:26 +00:00
|
|
|
BOOL fInherit,
|
2002-06-11 22:09:03 +00:00
|
|
|
ACCESS_MASK dwDesiredAccess)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
2008-06-26 11:49:47 +00:00
|
|
|
UNICODE_STRING WindowStationNameU;
|
|
|
|
HWINSTA hWinSta;
|
2005-05-09 01:42:07 +00:00
|
|
|
|
2008-06-26 11:49:47 +00:00
|
|
|
if (lpszWinSta)
|
2002-06-11 22:09:03 +00:00
|
|
|
{
|
2008-06-26 11:49:47 +00:00
|
|
|
/* After conversion, the buffer is zero-terminated */
|
|
|
|
RtlCreateUnicodeStringFromAsciiz(&WindowStationNameU, lpszWinSta);
|
2005-05-09 01:42:07 +00:00
|
|
|
}
|
2008-06-26 11:49:47 +00:00
|
|
|
else
|
2002-06-11 22:09:03 +00:00
|
|
|
{
|
2008-06-26 11:49:47 +00:00
|
|
|
RtlInitUnicodeString(&WindowStationNameU, NULL);
|
2002-06-11 22:09:03 +00:00
|
|
|
}
|
2005-05-09 01:42:07 +00:00
|
|
|
|
2008-06-26 11:49:47 +00:00
|
|
|
hWinSta = OpenWindowStationW(WindowStationNameU.Buffer,
|
|
|
|
fInherit,
|
|
|
|
dwDesiredAccess);
|
2005-05-09 01:42:07 +00:00
|
|
|
|
2008-06-26 11:49:47 +00:00
|
|
|
/* Free the string, if it was allocated */
|
|
|
|
if (lpszWinSta) RtlFreeUnicodeString(&WindowStationNameU);
|
2003-05-12 19:30:00 +00:00
|
|
|
|
2008-06-26 11:49:47 +00:00
|
|
|
return hWinSta;
|
2001-06-12 17:51:51 +00:00
|
|
|
}
|
|
|
|
|
2003-07-10 21:04:32 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2008-11-30 11:42:05 +00:00
|
|
|
HWINSTA WINAPI
|
2010-03-28 15:32:23 +00:00
|
|
|
OpenWindowStationW(LPCWSTR lpszWinSta,
|
2004-01-23 23:38:26 +00:00
|
|
|
BOOL fInherit,
|
2002-06-11 22:09:03 +00:00
|
|
|
ACCESS_MASK dwDesiredAccess)
|
2001-06-12 17:51:51 +00:00
|
|
|
{
|
|
|
|
UNICODE_STRING WindowStationName;
|
|
|
|
|
2001-06-29 19:34:35 +00:00
|
|
|
RtlInitUnicodeString(&WindowStationName, lpszWinSta);
|
2001-06-12 17:51:51 +00:00
|
|
|
|
|
|
|
return NtUserOpenWindowStation(&WindowStationName, dwDesiredAccess);
|
|
|
|
}
|
|
|
|
|
2003-07-10 21:04:32 +00:00
|
|
|
|
- Moved GetFocus, DrawCaptionTemp[AW], DrawMenuBarTemp, SetTaskmanWindow, SetProgmanWindow, GetProgmanWindow, GetTaskmanWindow, MenuWindowProc[AW], SetWindowsHook[AW], RegisterShellHookWindow, DeregisterShellHookWindow,
ChangeMenu[AW], UnhookWindowsHook, NotifyWinEvent, SetWinEventHook, UnhookWinEvent, IsWinEventHookInstalled, SetWindowStationUser, LockWindowStation, UnlockWindowStation, SetWindowStationUser, SetWindowsHookEx[AW] from stubs.c to appropriate files.
- Changed EditWndProc in user32.edf to point to EditWndProcA.
svn path=/trunk/; revision=6592
2003-11-09 13:50:04 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
|
|
|
DWORD
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
- Moved GetFocus, DrawCaptionTemp[AW], DrawMenuBarTemp, SetTaskmanWindow, SetProgmanWindow, GetProgmanWindow, GetTaskmanWindow, MenuWindowProc[AW], SetWindowsHook[AW], RegisterShellHookWindow, DeregisterShellHookWindow,
ChangeMenu[AW], UnhookWindowsHook, NotifyWinEvent, SetWinEventHook, UnhookWinEvent, IsWinEventHookInstalled, SetWindowStationUser, LockWindowStation, UnlockWindowStation, SetWindowStationUser, SetWindowsHookEx[AW] from stubs.c to appropriate files.
- Changed EditWndProc in user32.edf to point to EditWndProcA.
svn path=/trunk/; revision=6592
2003-11-09 13:50:04 +00:00
|
|
|
SetWindowStationUser(
|
|
|
|
DWORD Unknown1,
|
|
|
|
DWORD Unknown2,
|
|
|
|
DWORD Unknown3,
|
|
|
|
DWORD Unknown4
|
|
|
|
)
|
|
|
|
{
|
|
|
|
return NtUserSetWindowStationUser(Unknown1, Unknown2, Unknown3, Unknown4);
|
|
|
|
}
|
|
|
|
|
2001-06-12 17:51:51 +00:00
|
|
|
/* EOF */
|
2002-08-27 06:40:15 +00:00
|
|
|
|