514 lines
10 KiB
C++
514 lines
10 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1996.
|
|
//
|
|
// clsid.hxx
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#ifndef __CLSID_HXX__
|
|
#define __CLSID_HXX__
|
|
|
|
// For LookupClsidData, CClsidData::Load Option parameter.
|
|
// Note that LOAD_APPID skips the check in CClsidData::Load() to screen
|
|
// against COM+ library aps. In the legacy case, VB sometimes loads a library
|
|
// app with CoRegisterClassObject() for debugging, so, we have to let that
|
|
// work.
|
|
#define LOAD_NORMAL 0
|
|
#define LOAD_APPID 1
|
|
|
|
// _ServerTypes values
|
|
#define SERVERTYPE_NONE 0
|
|
#define SERVERTYPE_EXE32 1
|
|
#define SERVERTYPE_SERVICE 2
|
|
#define SERVERTYPE_SURROGATE 3
|
|
#define SERVERTYPE_EXE16 4
|
|
#define SERVERTYPE_INPROC32 5
|
|
// NOTE: Both of following are dllhost.exe but complus
|
|
// is more specific
|
|
#define SERVERTYPE_COMPLUS 6
|
|
#define SERVERTYPE_DLLHOST 7
|
|
// A COM+ app configured to be an NT service
|
|
#define SERVERTYPE_COMPLUS_SVC 8
|
|
|
|
class CClsidData;
|
|
class CAppidData;
|
|
|
|
HRESULT
|
|
LookupClsidData(
|
|
IN GUID & Clsid,
|
|
IN IComClassInfo* pComClassInfo,
|
|
IN CToken * pToken,
|
|
IN DWORD Option,
|
|
IN OUT CClsidData **ppClsidData
|
|
);
|
|
|
|
HRESULT
|
|
LookupAppidData(
|
|
IN GUID & AppidGuid,
|
|
IN CToken * pToken,
|
|
OUT CAppidData ** ppAppidData
|
|
);
|
|
|
|
class CAppidData
|
|
{
|
|
public:
|
|
CAppidData(
|
|
IN WCHAR * pwszAppid,
|
|
IN CToken * pToken
|
|
);
|
|
~CAppidData();
|
|
|
|
HRESULT
|
|
Load(
|
|
IN IComProcessInfo *pICPI
|
|
);
|
|
|
|
void
|
|
Purge();
|
|
|
|
inline WCHAR *
|
|
AppidString()
|
|
{
|
|
return _wszAppid;
|
|
}
|
|
|
|
inline GUID *
|
|
AppidGuid()
|
|
{
|
|
return &_GuidAppid;
|
|
}
|
|
|
|
inline BOOL
|
|
ActivateAtStorage()
|
|
{
|
|
return _bActivateAtStorage;
|
|
}
|
|
|
|
inline BOOL
|
|
ComPlusProcess()
|
|
{
|
|
// NOTE!!!!:: This is true for normal dllhost.exe regardless of
|
|
// whether they are really complus or not. We won't
|
|
// distinguish this in here in AppidData but in
|
|
// ClsidData
|
|
|
|
return _bComPlusProcess;
|
|
}
|
|
|
|
inline WCHAR *
|
|
RemoteServerNames()
|
|
{
|
|
return _pwszRemoteServerNames;
|
|
}
|
|
|
|
inline WCHAR *
|
|
RunAsUser()
|
|
{
|
|
return _pwszRunAsUser;
|
|
}
|
|
|
|
inline BOOL
|
|
IsInteractiveUser()
|
|
{
|
|
RunAsType type;
|
|
|
|
if (FAILED(_pICPI->GetRunAsType(&type)))
|
|
return FALSE;
|
|
|
|
return (type == RunAsInteractiveUser);
|
|
}
|
|
|
|
inline RunAsType
|
|
GetRunAsType()
|
|
{
|
|
RunAsType type;
|
|
if (FAILED(_pICPI->GetRunAsType(&type)))
|
|
type = RunAsLaunchingUser;
|
|
|
|
return type;
|
|
}
|
|
|
|
inline ProcessType
|
|
GetProcessType()
|
|
{
|
|
ProcessType type;
|
|
if (FAILED(_pICPI->GetProcessType(&type)))
|
|
type = ProcessTypeNormal;
|
|
|
|
return type;
|
|
}
|
|
|
|
inline WCHAR *
|
|
RunAsDomain()
|
|
{
|
|
return _pwszRunAsDomain;
|
|
}
|
|
|
|
inline WCHAR *
|
|
Service()
|
|
{
|
|
return _pwszService;
|
|
}
|
|
|
|
inline WCHAR *
|
|
ServiceArgs()
|
|
{
|
|
return _pwszServiceParameters;
|
|
}
|
|
|
|
inline SECURITY_DESCRIPTOR *
|
|
LaunchPermission()
|
|
{
|
|
return _pLaunchPermission;
|
|
}
|
|
|
|
inline BOOL
|
|
GetSaferLevel(DWORD *pdwSaferLevel)
|
|
{
|
|
if (_fSaferLevelValid)
|
|
*pdwSaferLevel = _dwSaferLevel;
|
|
|
|
return _fSaferLevelValid;
|
|
}
|
|
|
|
BOOL
|
|
CertifyServer(
|
|
IN CProcess * pProcess
|
|
);
|
|
|
|
CNamedObject*
|
|
ServerRegisterEvent();
|
|
|
|
CNamedObject*
|
|
ServerInitializedEvent();
|
|
|
|
|
|
private:
|
|
|
|
CToken * _pToken;
|
|
WCHAR * _pwszService;
|
|
WCHAR * _pwszServiceParameters;
|
|
WCHAR * _pwszRunAsUser;
|
|
WCHAR * _pwszRunAsDomain;
|
|
SECURITY_DESCRIPTOR * _pLaunchPermission;
|
|
DWORD _dwSaferLevel;
|
|
BOOL _fSaferLevelValid;
|
|
|
|
BOOL _bActivateAtStorage;
|
|
|
|
WCHAR * _pwszRemoteServerNames;
|
|
BOOL _bComPlusProcess;
|
|
|
|
WCHAR _wszAppid[GUIDSTR_MAX];
|
|
GUID _GuidAppid;
|
|
|
|
IComProcessInfo* _pICPI;
|
|
};
|
|
|
|
class CClsidData
|
|
{
|
|
friend class CServerTableEntry;
|
|
|
|
public:
|
|
CClsidData( IN GUID & Clsid, IN CToken * pToken, IN IComClassInfo* );
|
|
~CClsidData();
|
|
|
|
HRESULT
|
|
Load(
|
|
IN DWORD Option
|
|
);
|
|
|
|
void
|
|
Purge();
|
|
|
|
inline CToken *
|
|
Token()
|
|
{
|
|
return _pToken;
|
|
}
|
|
|
|
inline GUID *
|
|
ClsidGuid()
|
|
{
|
|
return &_Clsid;
|
|
}
|
|
|
|
inline WCHAR *
|
|
AppidString()
|
|
{
|
|
return _pAppid ? _pAppid->AppidString() : NULL;
|
|
}
|
|
|
|
inline GUID *
|
|
AppidGuid()
|
|
{
|
|
return _pAppid ? _pAppid->AppidGuid() : NULL;
|
|
}
|
|
|
|
inline DWORD
|
|
ServerType()
|
|
{
|
|
return _ServerType;
|
|
}
|
|
|
|
inline BOOL
|
|
IsInprocClass()
|
|
{
|
|
return _bIsInprocClass;
|
|
}
|
|
|
|
inline DWORD
|
|
DllThreadModel()
|
|
{
|
|
return _DllThreadModel;
|
|
}
|
|
|
|
inline WCHAR *
|
|
Server()
|
|
{
|
|
if ((_ServerType == SERVERTYPE_SERVICE) ||
|
|
(_ServerType == SERVERTYPE_COMPLUS_SVC))
|
|
return _pAppid->Service();
|
|
else
|
|
return _pwszServer;
|
|
}
|
|
|
|
inline BOOL
|
|
ActivateAtStorage()
|
|
{
|
|
return _pAppid ? _pAppid->ActivateAtStorage() : FALSE;
|
|
}
|
|
|
|
inline BOOL
|
|
ComPlusProcess()
|
|
{
|
|
return (_ServerType == SERVERTYPE_COMPLUS);
|
|
}
|
|
|
|
inline BOOL
|
|
DllHostOrComPlusProcess()
|
|
{
|
|
return (ComPlusProcess() ||
|
|
(_ServerType == SERVERTYPE_COMPLUS_SVC) ||
|
|
(_ServerType == SERVERTYPE_DLLHOST));
|
|
}
|
|
|
|
inline WCHAR *
|
|
DllSurrogate()
|
|
{
|
|
return _pwszDllSurrogate;
|
|
}
|
|
|
|
inline WCHAR *
|
|
ServerExecutable()
|
|
{
|
|
return _pwszServerExecutable;
|
|
}
|
|
|
|
inline WCHAR *
|
|
RemoteServerNames()
|
|
{
|
|
return _pAppid ? _pAppid->RemoteServerNames() : 0;
|
|
}
|
|
|
|
inline WCHAR *
|
|
RunAsUser()
|
|
{
|
|
return _pAppid ? _pAppid->RunAsUser() : NULL;
|
|
}
|
|
|
|
inline BOOL
|
|
IsInteractiveUser()
|
|
{
|
|
return _pAppid ? _pAppid->IsInteractiveUser() : FALSE;
|
|
}
|
|
|
|
inline BOOL
|
|
HasRunAs()
|
|
{
|
|
return ((RunAsUser() != 0) || IsInteractiveUser());
|
|
}
|
|
|
|
inline WCHAR *
|
|
RunAsDomain()
|
|
{
|
|
return _pAppid ? _pAppid->RunAsDomain() : 0;
|
|
}
|
|
|
|
inline WCHAR *
|
|
ServiceArgs()
|
|
{
|
|
return _pAppid ? _pAppid->ServiceArgs() : 0;
|
|
}
|
|
|
|
inline SECURITY_DESCRIPTOR *
|
|
LaunchPermission()
|
|
{
|
|
return _pAppid ? _pAppid->LaunchPermission() : 0;
|
|
}
|
|
|
|
inline SAFER_LEVEL_HANDLE
|
|
SaferLevel()
|
|
{
|
|
return _hSaferLevel;
|
|
}
|
|
|
|
inline BOOL
|
|
CertifyServer( IN CProcess * pProcess )
|
|
{
|
|
return _pAppid ? _pAppid->CertifyServer( pProcess ) : TRUE;
|
|
}
|
|
|
|
CNamedObject*
|
|
ServerLaunchMutex();
|
|
|
|
CNamedObject*
|
|
ServerRegisterEvent();
|
|
|
|
CNamedObject*
|
|
ServerInitializedEvent();
|
|
|
|
inline DWORD
|
|
GetAcceptableContext()
|
|
{
|
|
return _dwAcceptableCtx;
|
|
}
|
|
|
|
HRESULT
|
|
IsEnabledRemote()
|
|
{
|
|
IComClassInfo2 *pCCI2 = NULL;
|
|
HRESULT hr = _pIComCI->QueryInterface(IID_IComClassInfo2, (void **)&pCCI2);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
BOOL fEnabled;
|
|
hr = pCCI2->IsEnabledRemote(&fEnabled);
|
|
pCCI2->Release();
|
|
|
|
if (SUCCEEDED(hr) && !fEnabled)
|
|
hr = CO_E_CLASS_DISABLED;
|
|
}
|
|
else
|
|
{
|
|
// IComClassInfo2 not supported, it's enabled.
|
|
hr = S_OK;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
private:
|
|
|
|
HRESULT
|
|
LaunchActivatorServer(
|
|
IN CToken * pClientToken,
|
|
IN WCHAR * pEnvBlock,
|
|
IN DWORD EnvBlockLength,
|
|
IN BOOL fRemoteActivation,
|
|
IN BOOL fClientImpersonating,
|
|
IN WCHAR* pwszWinstaDesktop,
|
|
IN DWORD clsctx,
|
|
OUT HANDLE * phProcess,
|
|
OUT DWORD * pdwProcessId
|
|
);
|
|
|
|
HRESULT
|
|
LaunchRunAsServer(
|
|
IN CToken * pClientToken,
|
|
IN BOOL fRemoteActivation,
|
|
IN ActivationPropertiesIn *pActIn,
|
|
IN DWORD clsctx,
|
|
OUT HANDLE * phProcess,
|
|
OUT DWORD * pdwProcessId,
|
|
OUT void ** ppvRunAsHandle
|
|
);
|
|
|
|
HRESULT
|
|
LaunchService(
|
|
IN CToken * pClientToken,
|
|
IN DWORD clsctx,
|
|
OUT SC_HANDLE * phService
|
|
);
|
|
|
|
BOOL
|
|
LaunchAllowed(
|
|
IN CToken * pClientToken,
|
|
IN DWORD clsctx
|
|
);
|
|
|
|
#if(_WIN32_WINNT >= 0x0500)
|
|
HRESULT
|
|
LaunchRestrictedServer(
|
|
IN CToken * pClientToken,
|
|
IN WCHAR * pEnvBlock,
|
|
IN DWORD EnvBlockLength,
|
|
IN DWORD clsctx,
|
|
OUT HANDLE * phProcess,
|
|
OUT DWORD * pdwProcessId
|
|
);
|
|
|
|
HRESULT
|
|
CreateHKEYRestrictedSite(
|
|
IN CToken * pToken);
|
|
#endif //(_WIN32_WINNT >= 0x0500)
|
|
|
|
HRESULT
|
|
GetLaunchCommandLine(
|
|
OUT WCHAR ** ppwszCommandLine
|
|
);
|
|
|
|
HRESULT
|
|
AddAppPathsToEnv(
|
|
IN WCHAR * pEnvBlock,
|
|
IN DWORD EnvBlockLength,
|
|
OUT WCHAR ** ppFinalEnvBlock
|
|
);
|
|
|
|
HRESULT
|
|
CalculateSaferLevel();
|
|
|
|
BOOL
|
|
AutoSaferEnabled();
|
|
|
|
|
|
HRESULT
|
|
DefaultSaferLevel(
|
|
DWORD *pdwSafer
|
|
);
|
|
|
|
HRESULT
|
|
GetAAASaferToken(
|
|
CToken *pClientTone,
|
|
HANDLE *pTokenOut
|
|
);
|
|
|
|
GUID _Clsid;
|
|
CAppidData * _pAppid;
|
|
|
|
CToken * _pToken;
|
|
|
|
BOOL _bIsInprocClass;
|
|
|
|
UCHAR _ServerType;
|
|
UCHAR _DllThreadModel;
|
|
|
|
WCHAR * _pwszServer;
|
|
WCHAR * _pwszDarwinId;
|
|
WCHAR * _pwszDllSurrogate;
|
|
WCHAR * _pwszServerExecutable;
|
|
|
|
SAFER_LEVEL_HANDLE _hSaferLevel;
|
|
|
|
IComClassInfo* _pIComCI;
|
|
IClassClassicInfo* _pIClassCI;
|
|
IComProcessInfo* _pICPI;
|
|
DWORD _dwAcceptableCtx;
|
|
WCHAR _wszClsid[GUIDSTR_MAX];
|
|
};
|
|
|
|
#endif // __CLSID_HXX__
|
|
|
|
|