168 lines
3.7 KiB
C++
168 lines
3.7 KiB
C++
|
/*===================================================================
|
||
|
Microsoft Denali
|
||
|
|
||
|
Microsoft Confidential.
|
||
|
Copyright 1996 Microsoft Corporation. All Rights Reserved.
|
||
|
|
||
|
Component: NT/OLE Security
|
||
|
|
||
|
File: NTSec.cpp
|
||
|
|
||
|
Owner: AndrewS
|
||
|
|
||
|
This file contains code related to NT security on Desktops
|
||
|
|
||
|
BUG 87164: This whole code path is unused. I'm leaving this around
|
||
|
in case we ever need it.
|
||
|
===================================================================*/
|
||
|
#include "denpre.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "ntsec.h"
|
||
|
|
||
|
// Globals
|
||
|
HDESK ghDesktop = NULL;
|
||
|
HDESK ghdeskPrev = NULL;
|
||
|
|
||
|
// Local Defines
|
||
|
// Note: This name is deliberately obscure so no one will guess it
|
||
|
#define SZ_DEN_DESKTOP "__A8D9S1_42_D"
|
||
|
|
||
|
#define DESKTOP_ALL (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | \
|
||
|
DESKTOP_CREATEMENU | DESKTOP_HOOKCONTROL | \
|
||
|
DESKTOP_JOURNALRECORD | DESKTOP_JOURNALPLAYBACK | \
|
||
|
DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | \
|
||
|
DESKTOP_SWITCHDESKTOP | STANDARD_RIGHTS_REQUIRED)
|
||
|
|
||
|
/*===================================================================
|
||
|
InitDesktop
|
||
|
|
||
|
Create a desktop for ASP threads to use & tells Viper to call
|
||
|
us back on every thread create so we can set the desktop
|
||
|
|
||
|
Parameters:
|
||
|
|
||
|
Returns:
|
||
|
HRESULT S_OK on success
|
||
|
|
||
|
Side effects
|
||
|
Sets global variables
|
||
|
===================================================================*/
|
||
|
HRESULT InitDesktop()
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
DWORD err;
|
||
|
HDESK hDesktop = NULL;
|
||
|
|
||
|
// Only applies to NT
|
||
|
if (!Glob(fWinNT))
|
||
|
return(S_OK);
|
||
|
|
||
|
// Save the old desktop because we might need it later for an obscure error condition
|
||
|
if ((ghdeskPrev = GetThreadDesktop(GetCurrentThreadId())) == NULL)
|
||
|
goto LErr;
|
||
|
|
||
|
// Create a desktop for denali to use
|
||
|
if ((hDesktop = CreateDesktop(SZ_DEN_DESKTOP, NULL, NULL, 0, DESKTOP_ALL, NULL)) == NULL)
|
||
|
goto LErr;
|
||
|
|
||
|
// store this handle in the global
|
||
|
ghDesktop = hDesktop;
|
||
|
|
||
|
#ifdef UNUSED
|
||
|
hr = SetViperThreadEvents();
|
||
|
Assert(SUCCEEDED(hr));
|
||
|
#endif
|
||
|
|
||
|
return(hr);
|
||
|
|
||
|
LErr:
|
||
|
Assert(FALSE);
|
||
|
|
||
|
if (hDesktop != NULL)
|
||
|
CloseDesktop(hDesktop);
|
||
|
|
||
|
err = GetLastError();
|
||
|
hr = HRESULT_FROM_WIN32(err);
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
/*===================================================================
|
||
|
UnInitDesktop
|
||
|
|
||
|
Destroy the ASP desktop
|
||
|
|
||
|
Parameters:
|
||
|
None
|
||
|
|
||
|
Returns:
|
||
|
Nothing
|
||
|
|
||
|
Side effects
|
||
|
Sets global variables
|
||
|
===================================================================*/
|
||
|
VOID UnInitDesktop()
|
||
|
{
|
||
|
BOOL fClosed;
|
||
|
|
||
|
if (ghDesktop != NULL)
|
||
|
{
|
||
|
BOOL fRetried = FALSE;
|
||
|
LRetry:
|
||
|
Assert(ghDesktop != NULL);
|
||
|
fClosed = CloseDesktop(ghDesktop);
|
||
|
// If this fails, it probably means that we are in the obscure case where
|
||
|
// IIS's CacheExtensions registry setting is 0. In this case, we are shutting
|
||
|
// down in a worker thread. This worker thread is using the desktop, so
|
||
|
// it cant be closed. In this case, attempt to set the desktop back to the
|
||
|
// original IIS desktop, and then retry closing the desktop. Only retry once.
|
||
|
if (!fClosed && !fRetried)
|
||
|
{
|
||
|
fRetried = TRUE;
|
||
|
if (!SetThreadDesktop(ghdeskPrev))
|
||
|
Assert(FALSE);
|
||
|
goto LRetry;
|
||
|
}
|
||
|
// BUG 86775: Begning assert
|
||
|
// Assert(fClosed);
|
||
|
|
||
|
ghDesktop = NULL;
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/*===================================================================
|
||
|
SetDesktop
|
||
|
|
||
|
Set the desktop for the calling thread
|
||
|
|
||
|
Parameters:
|
||
|
None
|
||
|
|
||
|
Returns:
|
||
|
S_OK on success
|
||
|
|
||
|
Side effects:
|
||
|
Sets desktop
|
||
|
===================================================================*/
|
||
|
HRESULT SetDesktop()
|
||
|
{
|
||
|
DWORD err;
|
||
|
|
||
|
if (Glob(fWinNT) && ghDesktop != NULL)
|
||
|
{
|
||
|
if (!SetThreadDesktop(ghDesktop))
|
||
|
goto LErr;
|
||
|
}
|
||
|
|
||
|
return(S_OK);
|
||
|
|
||
|
LErr:
|
||
|
Assert(FALSE);
|
||
|
|
||
|
err = GetLastError();
|
||
|
return(HRESULT_FROM_WIN32(err));
|
||
|
}
|
||
|
|