- UserSetProcessWindowStation: Use PsGetProcessWin32WindowStation and PsSetProcessWindowStation. Close the prevoious window station handle only when the window station was not set by UserSetProcessWindowStation (should be the case for console apps)

svn path=/trunk/; revision=51496
This commit is contained in:
Giannis Adamopoulos 2011-04-29 17:50:30 +00:00
parent 3ff2ee5566
commit 1396412b7c
2 changed files with 29 additions and 12 deletions

View file

@ -78,6 +78,21 @@ PsGetThreadWin32Thread(
PETHREAD Thread
);
NTKERNELAPI
PVOID
NTAPI
PsGetProcessWin32WindowStation(
PEPROCESS Process
);
NTKERNELAPI
VOID
NTAPI
PsSetProcessWindowStation(
PEPROCESS Process,
PVOID WindowStation
);
NTKERNELAPI
PTEB
NTAPI

View file

@ -940,6 +940,7 @@ UserSetProcessWindowStation(HWINSTA hWindowStation)
ppi = PsGetCurrentProcessWin32Process();
/* Reference the new window station */
if(hWindowStation !=NULL)
{
Status = IntValidateWindowStationHandle( hWindowStation,
@ -956,28 +957,29 @@ UserSetProcessWindowStation(HWINSTA hWindowStation)
}
OldWinSta = ppi->prpwinsta;
hwinstaOld = ppi->hwinsta;
/*
* FIXME - don't allow changing the window station if there are threads that are attached to desktops and own gui objects
*/
InterlockedExchangePointer(&PsGetCurrentProcess()->Win32WindowStation, hWindowStation);
ppi->prpwinsta = NewWinSta;
ppi->hwinsta = hWindowStation;
hwinstaOld = PsGetProcessWin32WindowStation(ppi->peProcess);
/* Dereference the previous window station */
if(OldWinSta != NULL)
{
ObDereferenceObject(OldWinSta);
}
if(hwinstaOld != NULL)
/* Check if we have a stale handle (it should happen for console apps) */
if(hwinstaOld != ppi->hwinsta)
{
ObCloseHandle(hwinstaOld, UserMode);
}
/*
* FIXME - don't allow changing the window station if there are threads that are attached to desktops and own gui objects
*/
PsSetProcessWindowStation(ppi->peProcess, hWindowStation);
ppi->prpwinsta = NewWinSta;
ppi->hwinsta = hWindowStation;
return TRUE;
}