180 lines
3.5 KiB
C
180 lines
3.5 KiB
C
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// File: desktops.c
|
||
|
//
|
||
|
// Contents:
|
||
|
//
|
||
|
// Classes:
|
||
|
//
|
||
|
// Functions:
|
||
|
//
|
||
|
// History: 6-02-96 RichardW Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
#include "testgina.h"
|
||
|
|
||
|
BOOL
|
||
|
AddDesktop(
|
||
|
DWORD Index,
|
||
|
PWSTR Name)
|
||
|
{
|
||
|
PWLX_DESKTOP pDesk;
|
||
|
|
||
|
pDesk = LocalAlloc( LMEM_FIXED | LMEM_ZEROINIT,
|
||
|
sizeof( WLX_DESKTOP ) +
|
||
|
( wcslen(Name) + 1 ) * sizeof(WCHAR) );
|
||
|
|
||
|
if ( pDesk )
|
||
|
{
|
||
|
pDesk->Size = sizeof( WLX_DESKTOP );
|
||
|
pDesk->Flags = WLX_DESKTOP_NAME;
|
||
|
pDesk->pszDesktopName = (PWSTR) ( pDesk + 1 );
|
||
|
wcscpy( pDesk->pszDesktopName, Name );
|
||
|
|
||
|
Desktops[ Index ] = pDesk;
|
||
|
|
||
|
return( TRUE );
|
||
|
}
|
||
|
|
||
|
return( FALSE );
|
||
|
}
|
||
|
|
||
|
PWLX_DESKTOP
|
||
|
CopyDesktop(
|
||
|
PWLX_DESKTOP pOrig)
|
||
|
{
|
||
|
PWLX_DESKTOP pDesk;
|
||
|
|
||
|
if ( pOrig->pszDesktopName )
|
||
|
{
|
||
|
pDesk = LocalAlloc( LMEM_FIXED | LMEM_ZEROINIT,
|
||
|
sizeof( WLX_DESKTOP ) +
|
||
|
( wcslen( pOrig->pszDesktopName ) + 1 ) * 2 );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pDesk = LocalAlloc( LMEM_FIXED | LMEM_ZEROINIT,
|
||
|
sizeof( WLX_DESKTOP ) );
|
||
|
|
||
|
}
|
||
|
|
||
|
if ( pDesk )
|
||
|
{
|
||
|
*pDesk = *pOrig;
|
||
|
if ( pOrig->pszDesktopName )
|
||
|
{
|
||
|
pDesk->pszDesktopName = (PWSTR) (pDesk + 1);
|
||
|
wcscpy( pDesk->pszDesktopName, pOrig->pszDesktopName );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return( pDesk );
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
InitializeDesktops( VOID )
|
||
|
{
|
||
|
ZeroMemory( Desktops, sizeof( PWLX_DESKTOP ) * MAX_DESKTOPS );
|
||
|
|
||
|
AddDesktop( WINLOGON_DESKTOP, TEXT("Winlogon") );
|
||
|
AddDesktop( DEFAULT_DESKTOP, TEXT("Default") );
|
||
|
AddDesktop( SCREENSAVER_DESKTOP, TEXT("Screen-Saver") );
|
||
|
|
||
|
CurrentDesktop = WINLOGON_DESKTOP;
|
||
|
OtherDesktop = WINLOGON_DESKTOP;
|
||
|
DesktopCount = 3;
|
||
|
|
||
|
return( TRUE );
|
||
|
}
|
||
|
|
||
|
|
||
|
int
|
||
|
WINAPI
|
||
|
WlxGetSourceDesktop(
|
||
|
HANDLE hWlx,
|
||
|
PWLX_DESKTOP * ppDesktop)
|
||
|
{
|
||
|
if ( !VerifyHandle( hWlx ) )
|
||
|
{
|
||
|
TestGinaError( GINAERR_INVALID_HANDLE, TEXT("WlxGetSourceDesktop"));
|
||
|
}
|
||
|
|
||
|
*ppDesktop = CopyDesktop( Desktops[ OtherDesktop ] );
|
||
|
|
||
|
return( 0 );
|
||
|
}
|
||
|
|
||
|
int
|
||
|
WINAPI
|
||
|
WlxSetReturnDesktop(
|
||
|
HANDLE hWlx,
|
||
|
PWLX_DESKTOP pDesktop)
|
||
|
{
|
||
|
DWORD i;
|
||
|
|
||
|
if ( !VerifyHandle( hWlx ) )
|
||
|
{
|
||
|
TestGinaError( GINAERR_INVALID_HANDLE, TEXT("WlxSetReturnDesktop"));
|
||
|
}
|
||
|
|
||
|
for ( i = 0 ; i < DesktopCount ; i++ )
|
||
|
{
|
||
|
if ( _wcsicmp( pDesktop->pszDesktopName, Desktops[ i ]->pszDesktopName ) == 0 )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( i == WINLOGON_DESKTOP )
|
||
|
{
|
||
|
TestGinaError( GINAERR_INVALID_HANDLE, TEXT("WlxSetReturnDesktop"));
|
||
|
}
|
||
|
|
||
|
if ( i == DesktopCount )
|
||
|
{
|
||
|
AddDesktop( DesktopCount, pDesktop->pszDesktopName );
|
||
|
DesktopCount ++ ;
|
||
|
}
|
||
|
|
||
|
OtherDesktop = i;
|
||
|
|
||
|
return( 0 );
|
||
|
}
|
||
|
|
||
|
int
|
||
|
WINAPI
|
||
|
WlxCreateUserDesktop(
|
||
|
HANDLE hWlx,
|
||
|
HANDLE hToken,
|
||
|
DWORD Flags,
|
||
|
PWSTR pszDesktopName,
|
||
|
PWLX_DESKTOP * ppDesktop )
|
||
|
{
|
||
|
if ( !VerifyHandle( hWlx ) )
|
||
|
{
|
||
|
TestGinaError( GINAERR_INVALID_HANDLE, TEXT("WlxCreateUserDesktop"));
|
||
|
}
|
||
|
|
||
|
AddDesktop( DesktopCount, pszDesktopName );
|
||
|
|
||
|
*ppDesktop = CopyDesktop( Desktops[ DesktopCount ] );
|
||
|
|
||
|
DesktopCount++;
|
||
|
|
||
|
return( 0 );
|
||
|
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
WINAPI
|
||
|
WlxCloseUserDesktop(
|
||
|
HANDLE hWlx,
|
||
|
PWLX_DESKTOP Desktop,
|
||
|
HANDLE Token
|
||
|
)
|
||
|
{
|
||
|
return TRUE ;
|
||
|
}
|