|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: rotif.cxx
//
// Contents: Initialization for SCM ROT and RPC interface
//
// Functions: InitScmRot
// IrotRegister
// IrotRevoke
// IrotIsRunning
// IrotGetObject
// IrotNoteChangeTime
// IrotGetTimeOfLastChange
// IrotEnumRunning
// GetObjectFromRot
//
// History: 24-Jan-95 Ricksa Created
//
//--------------------------------------------------------------------------
#include "act.hxx"
CScmRot *gpscmrot = NULL;
//+-------------------------------------------------------------------------
//
// Function: InitScmRot
//
// Synopsis: Initialize ROT Directory for the SCM
// NOTE: if InitRotDir is ever called by any process other than the
// SCM then the RpcServerRegisterIf may fail with RPC_S_TYPE_ALREADY_REGISTERED
// in some unusal cases. Change the error checking code to ignore that error.
//
// Returns: S_OK - Created ROT directory successfully
//
// History: 17-Nov-93 Ricksa Created
// 26-Jul-94 AndyH Added warning above while bug hunting.
// 25-Jan-95 Ricksa New rot
//
// Notes: This routine is only in non-chicago builds
//
//--------------------------------------------------------------------------
HRESULT InitScmRot() { CairoleDebugOut((DEB_ROT, "%p _IN InitScmRot \n", NULL));
HRESULT hr = E_OUTOFMEMORY;
gpscmrot = new CScmRot(hr, ROTHINT_NAME);
if (SUCCEEDED(hr)) { RPC_STATUS status; status = RpcServerRegisterIfEx(IROT_ServerIfHandle, NULL, NULL, 0, RPC_C_LISTEN_MAX_CALLS_DEFAULT, LocalInterfaceOnlySecCallback); ASSERT((status == RPC_S_OK) && "RpcServerRegisterIf for IROT failed!"); if (status == RPC_S_OK) { hr = S_OK; } else { hr = HRESULT_FROM_WIN32(status); delete gpscmrot; gpscmrot = NULL; } }
CairoleDebugOut((DEB_ROT, "%p OUT InitScmRot ( %lx )\n", NULL, hr));
return hr; }
//+-------------------------------------------------------------------------
//
// Function: IrotRegister
//
// Synopsis: Main entry point for registering an item in the ROT
//
// Arguments: [hRpc] - rpc handle to SCM
// [phProcess] - context handle (CProcess)
// [pmkeqbuf] - moniker equality buffer
// [pifdObject] - marshaled object
// [pifdObjectName] - marshaled moniker
// [pfiletime] - time of last change
// [dwProcessID] - process ID for object
// [psrkRegister] - SCM registration ID
// [prpcstat] - RPC communication status
//
// Returns: NOERROR
//
// History: 30-Jan-95 Ricksa Created
//
// Notes: The purpose of this routine is really just to make the
// code more readable.
//
//--------------------------------------------------------------------------
extern "C" HRESULT IrotRegister( handle_t hRpc, PHPROCESS phProcess, WCHAR *pwszWinstaDesktop, MNKEQBUF *pmkeqbuf, InterfaceData *pifdObject, InterfaceData *pifdObjectName, FILETIME *pfiletime, DWORD dwProcessID, WCHAR *pwszServerExe, SCMREGKEY *psrkRegister, error_status_t *prpcstat) { CProcess* pProcess = CheckLocalSecurity(hRpc, phProcess); if (!pProcess) return E_ACCESSDENIED;
// Ole32 always sends us a desktop. Since NULL is a reserved value
// internally, don't let anybody send us such a value from outside.
if (!pwszWinstaDesktop) return E_ACCESSDENIED;
VDATEHEAP(); if (!prpcstat) return E_ACCESSDENIED; *prpcstat = RPC_S_OK;
#if DBG == 1
CairoleDebugOut((DEB_SCM, "%p _IN IrotRegister\n", NULL)); DbgPrintMnkEqBuf("_IN Moinker Compare Buffer:", pmkeqbuf); DbgPrintIFD("_IN Object Interface Data:", pifdObject); DbgPrintIFD("_IN Moniker Interface Data:", pifdObject); DbgPrintFileTime("_IN FileTime: ", pfiletime); CairoleDebugOut((DEB_SCM, "_IN Process ID: %lX\n", dwProcessID));
#endif // DBG == 1
HRESULT hr = E_OUTOFMEMORY;
if (gpscmrot != NULL) { hr = gpscmrot->Register(pProcess, pwszWinstaDesktop, pmkeqbuf, pifdObject, pifdObjectName, pfiletime, dwProcessID, pwszServerExe, psrkRegister); }
#if DBG == 1
CairoleDebugOut((DEB_SCM, "%p OUT IrotRegister\n", NULL)); CairoleDebugOut((DEB_SCM, "OUT Hresult %lX\n", hr));
if (SUCCEEDED(hr)) { DbgPrintScmRegKey("OUT Register Key: ", psrkRegister); }
#endif // DBG == 1
VDATEHEAP(); return hr; }
//+-------------------------------------------------------------------------
//
// Function: IrotRevoke
//
// Synopsis: Main entry point for revoking an item from the ROT
//
// Arguments: [hRpc] - rpc handle to SCM
// [phProcess] - context handle (CProcess)
// [psrkRegister] - SCM registration ID
// [ppifdObject] - returned marshaled object
// [ppifdObjectName] - returned marshaled moniker
// [prpcstat] - RPC communication status
//
// Returns: NOERROR
//
// History: 30-Jan-95 Ricksa Created
//
// Notes: The purpose of this routine is really just to make the
// code more readable.
//
//--------------------------------------------------------------------------
extern "C" HRESULT IrotRevoke( handle_t hRpc, PHPROCESS phProcess, SCMREGKEY *psrkRegister, InterfaceData **ppifdObject, InterfaceData **ppifdName, error_status_t *prpcstat) { CProcess* pProcess = CheckLocalSecurity(hRpc, phProcess); if (!pProcess) return E_ACCESSDENIED;
VDATEHEAP();
if (!prpcstat) return E_ACCESSDENIED;
*prpcstat = RPC_S_OK;
#if DBG == 1
CairoleDebugOut((DEB_SCM, "%p _IN IrotRevoke\n", NULL)); DbgPrintScmRegKey("_IN Revoke Key: ", psrkRegister); CairoleDebugOut((DEB_SCM, "_IN Object Interface Data Ptr: %lx\n", ppifdObject)); CairoleDebugOut((DEB_SCM, "_IN Moniker Interface Data Ptr: %lx\n", ppifdName)); #endif // DBG == 1
HRESULT hr = E_OUTOFMEMORY; if (gpscmrot != NULL) { hr = gpscmrot->Revoke(pProcess, psrkRegister, ppifdObject, ppifdName); }
#if DBG == 1
CairoleDebugOut((DEB_SCM, "%p OUT IrotRevoke\n", NULL)); CairoleDebugOut((DEB_SCM, "OUT Hresult : %lx\n", hr));
if (*ppifdObject != NULL) { DbgPrintIFD("OUT Object Interface Data:", *ppifdObject); }
if (*ppifdName != NULL) { DbgPrintIFD("OUT Moniker Interface Data:", *ppifdName); }
#endif // DBG == 1
VDATEHEAP(); return hr; }
//+-------------------------------------------------------------------------
//
// Function: IrotIsRunning
//
// Synopsis: Main entry point for determining if an entry is in the ROT
//
// Arguments: [hRpc] - rpc handle to SCM
// [pmkeqbuf] - moniker equality buffer
// [prpcstat] - RPC communication status
//
// Returns: NOERROR
//
// History: 30-Jan-95 Ricksa Created
//
// Notes: The purpose of this routine is really just to make the
// code more readable.
//
//--------------------------------------------------------------------------
extern "C" HRESULT IrotIsRunning( handle_t hRpc, PHPROCESS phProcess, WCHAR *pwszWinstaDesktop, MNKEQBUF *pmkeqbuf, error_status_t *prpcstat) { CProcess* pProcess = CheckLocalSecurity(hRpc, phProcess); if (!pProcess) return E_ACCESSDENIED;
VDATEHEAP();
if (!prpcstat) return E_ACCESSDENIED;
*prpcstat = RPC_S_OK;
#if DBG == 1
CairoleDebugOut((DEB_SCM, "%p _IN IrotIsRunning\n", NULL)); DbgPrintMnkEqBuf("_IN Moniker Compare Buffer:", pmkeqbuf);
#endif // DBG == 1
HRESULT hr = E_OUTOFMEMORY;
if (gpscmrot != NULL) { hr = gpscmrot->IsRunning( pProcess->GetToken(), pwszWinstaDesktop, pmkeqbuf); }
#if DBG == 1
CairoleDebugOut((DEB_SCM, "%p OUT IrotIsRunning\n", NULL)); CairoleDebugOut((DEB_SCM, "OUT Hresult : %lx\n", hr));
#endif // DBG == 1
VDATEHEAP(); return hr; }
//+-------------------------------------------------------------------------
//
// Function: IrotGetObject
//
// Synopsis: Main entry point for getting an object from the ROT
//
// Arguments: [hRpc] - rpc handle to SCM
// [dwProcessID] - process id for object
// [pmkeqbuf] - moniker equality buffer
// [psrkRegister] - Registration ID of returned Object
// [ppifdObject] - returned marshaled object
// [prpcstat] - RPC communication status
//
// Returns: NOERROR
//
// History: 30-Jan-95 Ricksa Created
//
// Notes:
//
//--------------------------------------------------------------------------
extern "C" HRESULT IrotGetObject( handle_t hRpc, PHPROCESS phProcess, WCHAR *pwszWinstaDesktop, DWORD dwProcessID, MNKEQBUF *pmkeqbuf, SCMREGKEY *psrkRegister, InterfaceData **ppifdObject, error_status_t *prpcstat) { CProcess* pProcess = CheckLocalSecurity(hRpc, phProcess); if (!pProcess) return E_ACCESSDENIED;
VDATEHEAP();
if (!prpcstat) return E_ACCESSDENIED;
*prpcstat = RPC_S_OK;
#if DBG == 1
CairoleDebugOut((DEB_SCM, "%p _IN IrotGetObject\n", NULL)); CairoleDebugOut((DEB_SCM, "_IN Process ID: %lX\n", dwProcessID)); DbgPrintMnkEqBuf("_IN Moniker Compare Buffer:", pmkeqbuf);
#endif // DBG == 1
HRESULT hr = E_OUTOFMEMORY;
if (gpscmrot != NULL) { hr = gpscmrot->GetObject( pProcess->GetToken(), pwszWinstaDesktop, dwProcessID, pmkeqbuf, psrkRegister, ppifdObject); }
#if DBG == 1
CairoleDebugOut((DEB_SCM, "%p OUT IrotGetObject\n", NULL)); CairoleDebugOut((DEB_SCM, "OUT Hresult : %lx\n", hr));
if (SUCCEEDED(hr)) { DbgPrintScmRegKey("OUT Register Key: ", psrkRegister); DbgPrintIFD("OUT Object Interface Data:", *ppifdObject); }
#endif // DBG == 1
VDATEHEAP(); return hr; }
//+-------------------------------------------------------------------------
//
// Function: IrotNoteChangeTime
//
// Synopsis: Main entry point for setting the change time of an object
// int the ROT.
//
// Arguments: [hRpc] - rpc handle to SCM
// [psrkRegister] - Registration ID of Object to update
// [pfiletime] - new change time for the object
// [prpcstat] - RPC communication status
//
// Returns: NOERROR
//
// History: 30-Jan-95 Ricksa Created
//
// Notes:
//
//--------------------------------------------------------------------------
extern "C" HRESULT IrotNoteChangeTime( handle_t hRpc, PHPROCESS phProcess, SCMREGKEY *psrkRegister, FILETIME *pfiletime, error_status_t *prpcstat) { CProcess* pProcess = CheckLocalSecurity(hRpc, phProcess); if (!pProcess) return E_ACCESSDENIED;
VDATEHEAP();
if (!prpcstat) return E_ACCESSDENIED;
*prpcstat = RPC_S_OK;
#if DBG == 1
CairoleDebugOut((DEB_SCM, "%p _IN IrotNoteChangeTime\n", NULL)); DbgPrintScmRegKey("_IN Revoke Key: ", psrkRegister); DbgPrintFileTime("_IN FileTime: ", pfiletime);
#endif // DBG == 1
HRESULT hr = E_OUTOFMEMORY;
if (gpscmrot != NULL) { hr = gpscmrot->NoteChangeTime(psrkRegister, pfiletime); }
#if DBG == 1
CairoleDebugOut((DEB_SCM, "%p OUT IrotRevoke\n", NULL)); CairoleDebugOut((DEB_SCM, "OUT Hresult : %lx\n", hr));
#endif // DBG == 1
VDATEHEAP(); return hr; }
//+-------------------------------------------------------------------------
//
// Function: IrotGetTimeOfLastChange
//
// Synopsis: Main entry point for getting the change time of an object
// int the ROT.
//
// Arguments: [hRpc] - rpc handle to SCM
// [pmkeqbuf] - Moniker for object
// [pfiletime] - new change time for the object
// [prpcstat] - RPC communication status
//
// Returns: NOERROR
//
// History: 30-Jan-95 Ricksa Created
//
// Notes:
//
//--------------------------------------------------------------------------
extern "C" HRESULT IrotGetTimeOfLastChange( handle_t hRpc, PHPROCESS phProcess, WCHAR *pwszWinstaDesktop, MNKEQBUF *pmkeqbuf, FILETIME *pfiletime, error_status_t *prpcstat) { CProcess* pProcess = CheckLocalSecurity(hRpc, phProcess); if (!pProcess) return E_ACCESSDENIED;
VDATEHEAP();
if (!prpcstat) return E_ACCESSDENIED;
*prpcstat = RPC_S_OK;
#if DBG == 1
CairoleDebugOut((DEB_SCM, "%p _IN IrotGetTimeOfLastChange\n", NULL)); DbgPrintMnkEqBuf("_IN Moniker Compare Buffer:", pmkeqbuf);
#endif // DBG == 1
HRESULT hr = E_OUTOFMEMORY;
if (gpscmrot != NULL) { hr = gpscmrot->GetTimeOfLastChange( pProcess->GetToken(), pwszWinstaDesktop, pmkeqbuf, pfiletime); }
#if DBG == 1
CairoleDebugOut((DEB_SCM, "%p OUT IrotGetTimeOfLastChange\n", NULL)); CairoleDebugOut((DEB_SCM, "OUT Hresult : %lx\n", hr)); DbgPrintFileTime("OUT FileTime: ", pfiletime);
#endif // DBG == 1
VDATEHEAP(); return hr; }
//+-------------------------------------------------------------------------
//
// Function: IrotEnumRunning
//
// Synopsis: Main entry point for getting all monikers to running objects
// int the ROT.
//
// Arguments: [hRpc] - rpc handle to SCM
// [ppMKIFList] - list of marshaled monikers to running objects
// [prpcstat] - RPC communication status
//
// Returns: NOERROR
//
// History: 30-Jan-95 Ricksa Created
//
// Notes:
//
//--------------------------------------------------------------------------
extern "C" HRESULT IrotEnumRunning( handle_t hRpc, PHPROCESS phProcess, WCHAR *pwszWinstaDesktop, MkInterfaceList **ppMkIFList, error_status_t *prpcstat) { CProcess* pProcess = CheckLocalSecurity(hRpc, phProcess); if (!pProcess) return E_ACCESSDENIED;
VDATEHEAP();
if (!prpcstat) return E_ACCESSDENIED;
*prpcstat = RPC_S_OK;
CairoleDebugOut((DEB_SCM, "%p _IN IrotEnumRunning\n", NULL));
HRESULT hr = E_OUTOFMEMORY;
if (gpscmrot != NULL) { hr = gpscmrot->EnumRunning( pProcess->GetToken(), pwszWinstaDesktop, ppMkIFList); }
#if DBG == 1
CairoleDebugOut((DEB_SCM, "%p OUT IrotEnumRunning\n", NULL)); CairoleDebugOut((DEB_SCM, "OUT Hresult : %lx\n", hr));
if (SUCCEEDED(hr)) { DbgPrintMkIfList("OUT Moniker IF List: ", ppMkIFList); }
#endif // DBG == 1
VDATEHEAP(); return hr; }
//+-------------------------------------------------------------------------
//
// Function: GetObjectFromRot
//
// Synopsis: Helper for binding to locate an object in the ROT
//
// Arguments: [pwszPath] - path for bind
// [ppifdObject] - marshaled output buffer
//
// Returns: NOERROR
//
// Algorithm: Get the ROT. Create a moniker comparison buffer for searching
// the ROT. Then try to get the object out of the ROT.
//
// History: 30-Jan-95 Ricksa Created
//
// Notes:
//
//--------------------------------------------------------------------------
HRESULT GetObjectFromRot( CToken *pToken, WCHAR *pwszWinstaDesktop, WCHAR *pwszPath, InterfaceData **ppifdObject) { VDATEHEAP();
CairoleDebugOut((DEB_ROT, "%p _IN GetObjectFromRot " "( %p , %p )\n", NULL, pwszPath, ppifdObject));
HRESULT hr = E_OUTOFMEMORY;
if (gpscmrot != NULL) { // Create a moniker equality buffer from path
CTmpMkEqBuf tmeb;
hr = CreateFileMonikerComparisonBuffer(pwszPath, tmeb.GetBuf(), tmeb.GetSize(), tmeb.GetSizeAddr());
if (hr == NOERROR) { // SCMREGKEY which we won't really use
SCMREGKEY srkRegister;
hr = gpscmrot->GetObject( pToken, pwszWinstaDesktop, 0, tmeb.GetMkEqBuf(), &srkRegister, ppifdObject ); } }
CairoleDebugOut((DEB_ROT, "%p OUT GetObjectFromRot ( %lx ) [ %p ]\n", NULL, hr, *ppifdObject));
return hr; }
|