Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*===================================================================
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)); }
|