Leaked source code of windows server 2003
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.

1337 lines
38 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1993.
  5. //
  6. // File: propifs.hxx
  7. //
  8. // Contents: Common definitions for object activation.
  9. //
  10. // Classes: InstantiationInfo
  11. // ServerLocationInfo
  12. //
  13. // History: 03-Feb-98 Vinaykr Created
  14. //
  15. //--------------------------------------------------------------------------
  16. #ifndef __PROPIFS_HXX__
  17. #define __PROPIFS_HXX__
  18. #include <Serializ.h>
  19. #include <immact.h>
  20. #include <activate.h>
  21. #include <privact.h>
  22. #include <custmact.h>
  23. #include <serial.hxx>
  24. #include <actprops.hxx>
  25. #ifndef OLESCM
  26. #include <context.hxx>
  27. #endif
  28. #define ActMemAlloc(cb) MIDL_user_allocate(cb)
  29. #define ActMemFree(pv) MIDL_user_free(pv)
  30. #define MAX_ACTARRAY_SIZE 10
  31. extern HRESULT ReleaseIFD(
  32. MInterfacePointer *pIRD);
  33. static inline WCHAR *makeWStringCopy(WCHAR *pwszStr)
  34. {
  35. DWORD l = lstrlenW(pwszStr);
  36. WCHAR * newstr = (WCHAR*) ActMemAlloc((l+1)*sizeof(WCHAR));
  37. if (newstr != NULL)
  38. lstrcpyW(newstr,pwszStr);
  39. return newstr;
  40. }
  41. //----------------------------------------------------------------------
  42. // Prototypes for the CoMarshal family of functions
  43. //----------------------------------------------------------------------
  44. // These are function pointers to avoid using them inside of rpcss.dll.
  45. // (rpcss.dll may not link with ole32.dll)
  46. typedef HRESULT (__stdcall *PFN_COMARSHALINTERFACE)(IN LPSTREAM pStm,
  47. IN REFIID riid,
  48. IN LPUNKNOWN pUnk,
  49. IN DWORD dwDestContext,
  50. IN LPVOID pvDestContext,
  51. IN DWORD mshlflags);
  52. extern PFN_COMARSHALINTERFACE pfnCoMarshalInterface;
  53. typedef HRESULT (__stdcall *PFN_COGETMARSHALSIZEMAX)(IN LPDWORD pSz,
  54. IN REFIID riid,
  55. IN LPUNKNOWN pUnk,
  56. IN DWORD dwDestContext,
  57. IN LPVOID pvDestContext,
  58. IN DWORD mshlflags);
  59. extern PFN_COGETMARSHALSIZEMAX pfnCoGetMarshalSizeMax;
  60. typedef HRESULT (__stdcall *PFN_COUNMARSHALINTERFACE)(IN LPSTREAM pStm,
  61. IN REFIID riid,
  62. OUT LPVOID FAR* ppv);
  63. extern PFN_COUNMARSHALINTERFACE pfnCoUnmarshalInterface;
  64. typedef HRESULT (__stdcall *PFN_CORELEASEMARSHALDATA)(IN LPSTREAM pStm);
  65. extern PFN_CORELEASEMARSHALDATA pfnCoReleaseMarshalData;
  66. // Call this to initialize the function pointers.
  67. void InitMarshalling(void);
  68. class SerializableProperty: public ISerializable
  69. {
  70. public:
  71. SerializableProperty():_parent(0),_unSerialized(FALSE),_added(FALSE)
  72. {}
  73. //Serialization Methods
  74. STDMETHOD (SetParent) ( ISerializableParent *pParent)
  75. {
  76. _parent = pParent;
  77. return S_OK;
  78. }
  79. inline BOOL IsAdded()
  80. {
  81. return _added;
  82. }
  83. inline void Added()
  84. {
  85. _added = TRUE;
  86. }
  87. inline BOOL IsInproc(Serializer *pSer,
  88. OUT DWORD *pdwMaxDestCtx,
  89. OUT DWORD *pdwCurrDestCtx)
  90. {
  91. pSer->GetCurrDestCtx(pdwCurrDestCtx);
  92. pSer->GetMaxDestCtx(pdwMaxDestCtx);
  93. return ((*pdwCurrDestCtx == MSHCTX_CROSSCTX)||
  94. (*pdwCurrDestCtx == MSHCTX_INPROC));
  95. }
  96. inline BOOL IsInproc(Serializer *pSer)
  97. {
  98. DWORD dwCurrDestCtx;
  99. pSer->GetCurrDestCtx(&dwCurrDestCtx);
  100. return ((dwCurrDestCtx == MSHCTX_CROSSCTX)||
  101. (dwCurrDestCtx == MSHCTX_INPROC));
  102. }
  103. protected:
  104. ISerializableParent *_parent;
  105. BOOL _unSerialized;
  106. BOOL _added;
  107. };
  108. class InstantiationInfo : public IInstantiationInfo,
  109. public SerializableProperty
  110. {
  111. public:
  112. InstantiationInfo()
  113. {
  114. ZeroMemory(&_instantiationInfoData, sizeof(InstantiationInfoData));
  115. _instantiationInfoData.clientCOMVersion.MajorVersion
  116. = COM_MAJOR_VERSION;
  117. _instantiationInfoData.clientCOMVersion.MinorVersion
  118. = COM_MINOR_VERSION;
  119. }
  120. virtual ~InstantiationInfo()
  121. {
  122. if (_instantiationInfoData.pIID != _pIIDs)
  123. ActMemFree(_instantiationInfoData.pIID);
  124. }
  125. // Methods from IUnknown
  126. STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj);
  127. STDMETHOD_(ULONG,AddRef) ( void );
  128. STDMETHOD_(ULONG,Release) ( void );
  129. inline HRESULT SetClientCOMVersion(COMVERSION version)
  130. {
  131. _instantiationInfoData.clientCOMVersion = version;
  132. return S_OK;
  133. }
  134. inline HRESULT GetClientCOMVersion(COMVERSION **ppVersion)
  135. {
  136. *ppVersion = &_instantiationInfoData.clientCOMVersion;
  137. return S_OK;
  138. }
  139. inline HRESULT SetClsid(IN REFGUID clsid)
  140. {
  141. _instantiationInfoData.classId = clsid;
  142. return S_OK;
  143. }
  144. inline HRESULT GetClsid(OUT GUID *pClsid)
  145. {
  146. *pClsid = _instantiationInfoData.classId;
  147. return S_OK;
  148. }
  149. inline HRESULT SetClsctx(IN DWORD dwClsctx)
  150. {
  151. _instantiationInfoData.classCtx = dwClsctx;
  152. return S_OK;
  153. }
  154. inline HRESULT GetClsctx(OUT DWORD *pdwClsctx)
  155. {
  156. *pdwClsctx = _instantiationInfoData.classCtx;
  157. return S_OK;
  158. }
  159. inline HRESULT SetActivationFlags(IN DWORD dwActvFlags)
  160. {
  161. _instantiationInfoData.actvflags = dwActvFlags;
  162. return S_OK;
  163. }
  164. inline HRESULT GetActivationFlags(OUT DWORD *pdwActvFlags)
  165. {
  166. *pdwActvFlags = _instantiationInfoData.actvflags;
  167. return S_OK;
  168. }
  169. inline HRESULT SetInstFlag(IN DWORD flag)
  170. {
  171. _instantiationInfoData.instFlag = flag;
  172. return S_OK;
  173. }
  174. inline HRESULT GetInstFlag(OUT DWORD *pFlag)
  175. {
  176. *pFlag = _instantiationInfoData.instFlag;
  177. return S_OK;
  178. }
  179. inline HRESULT SetIsSurrogate()
  180. {
  181. _instantiationInfoData.fIsSurrogate = TRUE;
  182. return S_OK;
  183. }
  184. inline HRESULT GetIsSurrogate(BOOL *pIsSurrogate)
  185. {
  186. *pIsSurrogate = _instantiationInfoData.fIsSurrogate;
  187. return S_OK;
  188. }
  189. inline HRESULT GetRequestedIIDs(
  190. OUT DWORD *pcIfs,
  191. OUT IID **ppIID)
  192. {
  193. *pcIfs = _instantiationInfoData.cIID;
  194. *ppIID = _instantiationInfoData.pIID;
  195. return S_OK;
  196. }
  197. inline HRESULT AddRequestedIIDs(
  198. IN DWORD cIfs,
  199. IN IID *pIID)
  200. {
  201. IID *newiids;
  202. //--------------------------------------------------------------------
  203. // Check if we need to allocate
  204. //--------------------------------------------------------------------
  205. if ((_unSerialized) || (cIfs + _instantiationInfoData.cIID) > MAX_ACTARRAY_SIZE)
  206. {
  207. newiids = (IID*) ActMemAlloc(sizeof(IID) *
  208. (cIfs + _instantiationInfoData.cIID));
  209. if (newiids == NULL)
  210. return E_OUTOFMEMORY;
  211. //----------------------------------------------------------------
  212. // Copy old into new
  213. //----------------------------------------------------------------
  214. if (_instantiationInfoData.cIID)
  215. {
  216. memcpy(newiids,
  217. _instantiationInfoData.pIID,
  218. sizeof(IID)*_instantiationInfoData.cIID);
  219. if (_instantiationInfoData.pIID != _pIIDs)
  220. ActMemFree(_instantiationInfoData.pIID);
  221. }
  222. }
  223. else
  224. newiids = _pIIDs;
  225. //--------------------------------------------------------------------
  226. // Copy new into array
  227. //--------------------------------------------------------------------
  228. memcpy(&newiids[_instantiationInfoData.cIID],
  229. pIID, sizeof(IID)*cIfs);
  230. _instantiationInfoData.pIID = newiids;
  231. _instantiationInfoData.cIID += cIfs;
  232. return S_OK;
  233. }
  234. //Serialization Methods
  235. STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
  236. STDMETHOD(Serialize)(IN void *pSer);
  237. STDMETHOD(UnSerialize)(IN void *pSer);
  238. STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize);
  239. STDMETHOD(GetCLSID)(OUT CLSID *pclsid);
  240. private:
  241. InstantiationInfoData _instantiationInfoData;
  242. IID _pIIDs[MAX_ACTARRAY_SIZE];
  243. };
  244. class ServerLocationInfo: public IServerLocationInfo, public SerializableProperty
  245. {
  246. public:
  247. // ctor/dtor
  248. ServerLocationInfo();
  249. virtual ~ServerLocationInfo();
  250. // Methods from IUnknown
  251. STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj);
  252. STDMETHOD_(ULONG,AddRef) ( void );
  253. STDMETHOD_(ULONG,Release) ( void );
  254. STDMETHOD (SetRemoteServerName) (IN WCHAR *pwszMachineName);
  255. STDMETHOD(GetRemoteServerName) (OUT WCHAR **ppwszMachineName)
  256. {
  257. *ppwszMachineName = _locationInfoData.machineName;
  258. return S_OK;
  259. }
  260. STDMETHOD (SetProcess) (IN DWORD processId, DWORD dwPRT);
  261. STDMETHOD (GetProcess) (OUT DWORD* pProcessId, DWORD* pdwPRT);
  262. STDMETHOD (SetApartment) (IN APTID apartmentId)
  263. {
  264. _locationInfoData.apartmentId = apartmentId;
  265. return S_OK;
  266. }
  267. STDMETHOD (GetApartment) (OUT APTID *pApartmentId)
  268. {
  269. *pApartmentId = _locationInfoData.apartmentId;
  270. return S_OK;
  271. }
  272. STDMETHOD (SetContext) (IN IObjContext *pObjectContext)
  273. {
  274. HRESULT hr = pObjectContext->QueryInterface(IID_IStdObjectContext, (void**)&_pObjectContext);
  275. Win4Assert(SUCCEEDED(hr) && "Not COM internal context!");
  276. if (SUCCEEDED(hr))
  277. {
  278. // Get an internal ref and release the user ref.
  279. _pObjectContext->InternalAddRef();
  280. _pObjectContext->Release();
  281. }
  282. return hr;
  283. }
  284. STDMETHOD (GetContext) (OUT IObjContext **ppObjectContext)
  285. {
  286. CObjectContext *pCtx;
  287. GetInternalContext(&pCtx);
  288. if (pCtx)
  289. {
  290. // Return a user counted reference to the context.
  291. pCtx->AddRef();
  292. pCtx->InternalRelease();
  293. *ppObjectContext = (IObjContext*)pCtx;
  294. }
  295. return S_OK;
  296. }
  297. STDMETHOD(Serialize)(IN void *pSer);
  298. STDMETHOD(UnSerialize)(IN void *pSer);
  299. STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize);
  300. STDMETHOD(GetCLSID)(OUT CLSID *pclsid);
  301. STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0)
  302. { return E_NOTIMPL;}
  303. STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
  304. HRESULT GetInternalContext(CObjectContext **ppObjectContext)
  305. {
  306. if (_pObjectContext)
  307. _pObjectContext->InternalAddRef();
  308. *ppObjectContext = _pObjectContext;
  309. return S_OK;
  310. }
  311. // Gives us a non-refcounted ISpecialSystemProperties* interface ptr; we
  312. // need this so we can store/retrieve certain activation state from it.s
  313. void SetSpecialPropsInterface(ISpecialSystemProperties* pISSP)
  314. {
  315. Win4Assert(!_pISSP && "_pISSP should not be set twice");
  316. _pISSP = pISSP; // no refcount -- we do not release this
  317. };
  318. private:
  319. LocationInfoData _locationInfoData;
  320. CObjectContext *_pObjectContext;
  321. ISpecialSystemProperties* _pISSP;
  322. };
  323. class SecurityInfo:public IActivationSecurityInfo, public ILegacyInfo, public SerializableProperty
  324. {
  325. private:
  326. inline static void SecureStringFree(LPWSTR psz, DWORD dwLen)
  327. {
  328. if (psz)
  329. {
  330. SecureZeroMemory(psz, dwLen);
  331. ActMemFree(psz);
  332. }
  333. }
  334. public:
  335. SecurityInfo()
  336. {
  337. ZeroMemory(&_securityInfoData, sizeof(SecurityInfoData));
  338. }
  339. inline static void freeCOAUTHIDENTITY(COAUTHIDENTITY *id)
  340. {
  341. if (id)
  342. {
  343. BOOL bUnicode = id->Flags & SEC_WINNT_AUTH_IDENTITY_UNICODE;
  344. SecurityInfo::SecureStringFree(id->User, bUnicode? id->UserLength*sizeof(WCHAR): id->UserLength*sizeof(char));
  345. SecurityInfo::SecureStringFree(id->Domain, bUnicode? id->DomainLength*sizeof(WCHAR): id->DomainLength*sizeof(char));
  346. SecurityInfo::SecureStringFree(id->Password, bUnicode? id->PasswordLength*sizeof(WCHAR): id->PasswordLength*sizeof(char));
  347. ActMemFree(id);
  348. }
  349. }
  350. inline static void freeCOAUTHINFO(COAUTHINFO *info)
  351. {
  352. if (info)
  353. {
  354. SecurityInfo::SecureStringFree(info->pwszServerPrincName, lstrlen(info->pwszServerPrincName) * sizeof(WCHAR));
  355. freeCOAUTHIDENTITY(info->pAuthIdentityData);
  356. ActMemFree(info);
  357. }
  358. }
  359. inline static void freeCOSERVERINFO(COSERVERINFO *info)
  360. {
  361. if (info)
  362. {
  363. ActMemFree(info->pwszName);
  364. freeCOAUTHINFO(info->pAuthInfo);
  365. ActMemFree(info);
  366. }
  367. }
  368. virtual ~SecurityInfo()
  369. {
  370. // Free only if unmarshaled (in which case the
  371. // memory has been allocated by the marshaler)
  372. // We don't do deep copy, client frees these
  373. // blobs after activation.
  374. if (_unSerialized)
  375. {
  376. freeCOSERVERINFO(_securityInfoData.pServerInfo);
  377. freeCOAUTHIDENTITY(_securityInfoData.pAuthIdentityInfo);
  378. }
  379. }
  380. // Methods from IUnknown
  381. STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj);
  382. STDMETHOD_(ULONG,AddRef) ( void );
  383. STDMETHOD_(ULONG,Release) ( void );
  384. // IActivationSecurityInfo Methods
  385. STDMETHOD(SetAuthnFlags)(IN DWORD dwAuthnFlags)
  386. {
  387. _securityInfoData.dwAuthnFlags = dwAuthnFlags;
  388. return S_OK;
  389. }
  390. STDMETHOD(GetAuthnFlags)(OUT DWORD *pdwAuthnFlags)
  391. {
  392. *pdwAuthnFlags = _securityInfoData.dwAuthnFlags;
  393. return S_OK;
  394. }
  395. STDMETHOD(SetAuthnSvc)(IN DWORD dwAuthnSvc)
  396. {
  397. return E_NOTIMPL;
  398. }
  399. STDMETHOD(GetAuthnSvc)(OUT DWORD *pdwAuthnSvc)
  400. {
  401. *pdwAuthnSvc =
  402. _securityInfoData.pServerInfo->pAuthInfo->dwAuthnSvc;
  403. return S_OK;
  404. }
  405. STDMETHOD(SetAuthzSvc)(IN DWORD dwAuthzSvc)
  406. {
  407. return E_NOTIMPL;
  408. }
  409. STDMETHOD(GetAuthzSvc)(OUT DWORD *pdwAuthzSvc)
  410. {
  411. *pdwAuthzSvc =
  412. _securityInfoData.pServerInfo->pAuthInfo->dwAuthzSvc;
  413. return S_OK;
  414. }
  415. STDMETHOD(SetAuthnLevel)(IN DWORD dwAuthnLevel)
  416. {
  417. return E_NOTIMPL;
  418. }
  419. STDMETHOD(GetAuthnLevel)(OUT DWORD *pdwAuthnLevel)
  420. {
  421. *pdwAuthnLevel =
  422. _securityInfoData.pServerInfo->pAuthInfo->dwAuthnLevel;
  423. return S_OK;
  424. }
  425. STDMETHOD(SetImpLevel)(IN DWORD dwImpLevel)
  426. {
  427. return E_NOTIMPL;
  428. }
  429. STDMETHOD(GetImpLevel)(OUT DWORD *pdwImpLevel)
  430. {
  431. *pdwImpLevel =
  432. _securityInfoData.pServerInfo->pAuthInfo->dwImpersonationLevel;
  433. return S_OK;
  434. }
  435. STDMETHOD(SetCapabilities)(IN DWORD dwCapabilities)
  436. {
  437. return E_NOTIMPL;
  438. }
  439. STDMETHOD(GetCapabilities)(OUT DWORD *pdwCapabilities)
  440. {
  441. *pdwCapabilities =
  442. _securityInfoData.pServerInfo->pAuthInfo->dwCapabilities;
  443. return S_OK;
  444. }
  445. // The pAuthIdentityInfo field of the _securityInfoData struct has
  446. // never been used. We have to keep it (wire compat) but code
  447. // should check that is always zero.
  448. STDMETHOD(SetAuthIdentity)(COAUTHIDENTITY *pAuthIdentityData)
  449. {
  450. Win4Assert(!"Don't call this ever");
  451. return E_NOTIMPL;
  452. }
  453. // Retain this method for allowing code to check that field is NULL
  454. STDMETHOD(GetAuthIdentity)(OUT COAUTHIDENTITY **ppAuthIdentityData)
  455. {
  456. *ppAuthIdentityData = _securityInfoData.pAuthIdentityInfo;
  457. return S_OK;
  458. }
  459. STDMETHOD(SetServerPrincipalName)(LPWSTR pwszServerPrincName)
  460. {
  461. Win4Assert(!"No one should be using this");
  462. return E_NOTIMPL;
  463. }
  464. STDMETHOD(GetServerPrincipalName)(OUT LPWSTR *ppwszServerPrincName)
  465. {
  466. Win4Assert(!"No one should be using this");
  467. return E_NOTIMPL;
  468. }
  469. //ILegacyInfo Methods
  470. STDMETHOD(SetCOSERVERINFO)(IN COSERVERINFO *pServerInfo)
  471. {
  472. _securityInfoData.pServerInfo = pServerInfo;
  473. if ((pServerInfo) && (pServerInfo->pwszName))
  474. {
  475. IServerLocationInfo *iloc;
  476. QueryInterface(IID_IServerLocationInfo, (void**) &iloc);
  477. iloc->SetRemoteServerName(pServerInfo->pwszName);
  478. iloc->Release();
  479. }
  480. return S_OK;
  481. }
  482. STDMETHOD(GetCOSERVERINFO)(OUT COSERVERINFO **ppServerInfo)
  483. {
  484. *ppServerInfo = _securityInfoData.pServerInfo;
  485. return S_OK;
  486. }
  487. STDMETHOD(SetCOAUTHINFO)(IN COAUTHINFO *pAuthInfo)
  488. {
  489. _securityInfoData.pServerInfo->pAuthInfo = pAuthInfo;
  490. return S_OK;
  491. }
  492. //Methods from IActivationPropertySet
  493. STDMETHOD(Reset)()
  494. {
  495. if (_unSerialized)
  496. {
  497. freeCOSERVERINFO(_securityInfoData.pServerInfo);
  498. freeCOAUTHIDENTITY(_securityInfoData.pAuthIdentityInfo);
  499. _securityInfoData.pServerInfo = 0;
  500. _securityInfoData.pAuthIdentityInfo = 0;
  501. }
  502. _unSerialized = FALSE;
  503. return S_OK;
  504. }
  505. // ISerializable Methods
  506. STDMETHOD(Serialize)(IN void *pSer);
  507. STDMETHOD(UnSerialize)(IN void *pSer);
  508. STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize);
  509. STDMETHOD(GetCLSID)(OUT CLSID *pclsid);
  510. STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0)
  511. { return E_NOTIMPL;}
  512. STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
  513. private:
  514. SecurityInfoData _securityInfoData;
  515. };
  516. class ScmRequestInfo : public IScmRequestInfo, public SerializableProperty
  517. {
  518. public:
  519. ScmRequestInfo()
  520. {
  521. ZeroMemory(&_scmRequestInfoData, sizeof(ScmRequestInfoData));
  522. }
  523. inline void freeScmInfo(PRIV_SCM_INFO *pScmInfo)
  524. {
  525. if (_unSerialized && pScmInfo)
  526. {
  527. ActMemFree(pScmInfo->pwszWinstaDesktop);
  528. ActMemFree(pScmInfo->pEnvBlock);
  529. ActMemFree(pScmInfo);
  530. }
  531. }
  532. inline void freeRemoteRequest(REMOTE_REQUEST_SCM_INFO *remoteRequest)
  533. {
  534. if (remoteRequest)
  535. {
  536. ActMemFree(remoteRequest->pRequestedProtseqs);
  537. ActMemFree(remoteRequest);
  538. }
  539. }
  540. virtual ~ScmRequestInfo()
  541. {
  542. freeScmInfo((PRIV_SCM_INFO *)_scmRequestInfoData.pScmInfo);
  543. freeRemoteRequest((REMOTE_REQUEST_SCM_INFO *)_scmRequestInfoData.remoteRequest);
  544. }
  545. // Methods from IUnknown
  546. STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj);
  547. STDMETHOD_(ULONG,AddRef) ( void );
  548. STDMETHOD_(ULONG,Release) ( void );
  549. // Methods from IScmRequestInfo
  550. STDMETHOD(SetScmInfo)(IN PRIV_SCM_INFO *pScmInfo)
  551. {
  552. freeScmInfo((PRIV_SCM_INFO *)_scmRequestInfoData.pScmInfo);
  553. _scmRequestInfoData.pScmInfo = (CustomPrivScmInfo*)pScmInfo;
  554. freeRemoteRequest((REMOTE_REQUEST_SCM_INFO *)_scmRequestInfoData.remoteRequest);
  555. _scmRequestInfoData.remoteRequest = NULL;
  556. return S_OK;
  557. }
  558. STDMETHOD(GetScmInfo)(OUT PRIV_SCM_INFO **ppScmInfo)
  559. {
  560. *ppScmInfo = (PRIV_SCM_INFO*)_scmRequestInfoData.pScmInfo;
  561. return S_OK;
  562. }
  563. STDMETHOD(SetRemoteRequestInfo)(IN REMOTE_REQUEST_SCM_INFO *pRemoteReq)
  564. {
  565. freeRemoteRequest((REMOTE_REQUEST_SCM_INFO *)_scmRequestInfoData.remoteRequest);
  566. _scmRequestInfoData.remoteRequest =
  567. (customREMOTE_REQUEST_SCM_INFO*) pRemoteReq;
  568. freeScmInfo((PRIV_SCM_INFO *)_scmRequestInfoData.pScmInfo);
  569. _scmRequestInfoData.pScmInfo = NULL;
  570. return S_OK;
  571. }
  572. STDMETHOD(GetRemoteRequestInfo)(OUT REMOTE_REQUEST_SCM_INFO **ppRemoteReq)
  573. {
  574. *ppRemoteReq = (REMOTE_REQUEST_SCM_INFO*)
  575. _scmRequestInfoData.remoteRequest;
  576. return S_OK;
  577. }
  578. STDMETHOD(Reset)()
  579. {
  580. _scmRequestInfoData.pScmInfo = 0;
  581. _scmRequestInfoData.remoteRequest = 0;
  582. _unSerialized = FALSE;
  583. return S_OK;
  584. }
  585. // ISerializable Methods
  586. STDMETHOD(Serialize)(IN void *pSer);
  587. STDMETHOD(UnSerialize)(IN void *pSer);
  588. STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize);
  589. STDMETHOD(GetCLSID)(OUT CLSID *pclsid);
  590. STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0)
  591. { return E_NOTIMPL;}
  592. STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
  593. private:
  594. ScmRequestInfoData _scmRequestInfoData;
  595. };
  596. class ContextInfo :
  597. public IPrivActivationContextInfo,
  598. public SerializableProperty,
  599. public IOverrideTargetContext
  600. {
  601. public:
  602. ContextInfo()
  603. {
  604. _pClientCtx = 0;
  605. _pPrototypeCtx = 0;
  606. ZeroMemory(&_contextInfoData, sizeof(ActivationContextInfoData));
  607. _contextInfoData.clientOK = TRUE;
  608. _toReleaseIFD = TRUE;
  609. _ctxOverride = GUID_NULL;
  610. }
  611. virtual ~ContextInfo()
  612. {
  613. if (_pClientCtx)
  614. _pClientCtx->InternalRelease();
  615. if (_pPrototypeCtx)
  616. _pPrototypeCtx->InternalRelease();
  617. if (_contextInfoData.pIFDClientCtx)
  618. {
  619. if (_toReleaseIFD)
  620. {
  621. InitMarshalling();
  622. if (pfnCoReleaseMarshalData)
  623. {
  624. ActivationStream stream((InterfaceData*)_contextInfoData.pIFDClientCtx);
  625. pfnCoReleaseMarshalData(&stream);
  626. }
  627. }
  628. ActMemFree(_contextInfoData.pIFDClientCtx);
  629. }
  630. if (_contextInfoData.pIFDPrototypeCtx)
  631. {
  632. if (_toReleaseIFD)
  633. {
  634. InitMarshalling();
  635. if (pfnCoReleaseMarshalData)
  636. {
  637. ActivationStream stream((InterfaceData*)_contextInfoData.pIFDPrototypeCtx);
  638. pfnCoReleaseMarshalData(&stream);
  639. }
  640. }
  641. ActMemFree(_contextInfoData.pIFDPrototypeCtx);
  642. }
  643. }
  644. // Methods from IUnknown
  645. STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj);
  646. STDMETHOD_(ULONG,AddRef) ( void );
  647. STDMETHOD_(ULONG,Release) ( void );
  648. // Methods from IActivationContextInfo
  649. STDMETHOD(SetClientContext)(IN IContext *pctx)
  650. {
  651. if (_unSerialized) //Can only set on IInitActPropsIn
  652. return E_NOTIMPL;
  653. // We always want to set the internal context.
  654. _pClientCtx = NULL;
  655. if (pctx)
  656. {
  657. // We want an internal reference to the supplied context, not a
  658. // user reference. Hence, we QI for the StdObjectContext and
  659. // take an internal reference.
  660. HRESULT hr = pctx->QueryInterface(IID_IStdObjectContext, (void**)&_pClientCtx);
  661. Win4Assert(SUCCEEDED(hr));
  662. if (SUCCEEDED(hr))
  663. {
  664. _pClientCtx->InternalAddRef();
  665. _pClientCtx->Release();
  666. }
  667. return hr;
  668. }
  669. return S_OK;
  670. }
  671. STDMETHOD(GetClientContext)(OUT IContext **ppCtx);
  672. HRESULT GetInternalClientContext(OUT CObjectContext **ppCtx);
  673. STDMETHOD(SetPrototypeContext)(IN IContext *pctx)
  674. {
  675. if (_unSerialized) //Can only set on IInitActPropsIn
  676. return E_NOTIMPL;
  677. // We always want to set the internal context.
  678. _pPrototypeCtx = NULL;
  679. if (pctx)
  680. {
  681. // We want an internal reference to the supplied context, not a
  682. // user reference. Hence, we QI for the StdObjectContext and
  683. // take an internal reference.
  684. HRESULT hr = pctx->QueryInterface(IID_IStdObjectContext, (void**)&_pPrototypeCtx);
  685. Win4Assert(SUCCEEDED(hr));
  686. if (SUCCEEDED(hr))
  687. {
  688. _pPrototypeCtx->InternalAddRef();
  689. _pPrototypeCtx->Release();
  690. }
  691. return hr;
  692. }
  693. return S_OK;
  694. }
  695. STDMETHOD(GetPrototypeContext)(OUT IContext **ppCtx);
  696. HRESULT GetInternalPrototypeContext(OUT CObjectContext **ppCtx);
  697. STDMETHOD(PrototypeExists)(BOOL *pBExists)
  698. {
  699. if ((_pPrototypeCtx!=NULL) ||
  700. ((_unSerialized) &&
  701. (_contextInfoData.pIFDPrototypeCtx != NULL)))
  702. *pBExists = TRUE;
  703. else
  704. *pBExists = FALSE;
  705. return S_OK;
  706. }
  707. STDMETHOD(IsClientContextOK)(OUT BOOL *pBOk)
  708. {
  709. *pBOk = _contextInfoData.clientOK;
  710. return S_OK;
  711. }
  712. STDMETHOD(SetClientContextNotOK)()
  713. {
  714. _contextInfoData.clientOK = FALSE;
  715. return S_OK;
  716. }
  717. // IOverrideTargetContext Methods
  718. STDMETHOD(OverrideTargetContext)(REFGUID guidTargetCtxtId)
  719. {
  720. _ctxOverride = guidTargetCtxtId;
  721. return S_OK;
  722. }
  723. // ISerializable Methods
  724. STDMETHOD(Serialize)(IN void *pSer);
  725. STDMETHOD(UnSerialize)(IN void *pSer);
  726. STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize);
  727. STDMETHOD(GetCLSID)(OUT CLSID *pclsid);
  728. STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0)
  729. { return E_NOTIMPL;}
  730. STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
  731. public:
  732. ActivationContextInfoData _contextInfoData;
  733. GUID _ctxOverride;
  734. private:
  735. CObjectContext *_pClientCtx;
  736. CObjectContext *_pPrototypeCtx;
  737. BOOL _toReleaseIFD;
  738. };
  739. class ScmReplyInfo : public IScmReplyInfo, public SerializableProperty
  740. {
  741. public:
  742. ScmReplyInfo()
  743. {
  744. ZeroMemory(&_scmReplyInfoData, sizeof(_scmReplyInfoData));
  745. }
  746. inline void freeResolverInfo()
  747. {
  748. if (_scmReplyInfoData.pResolverInfo)
  749. {
  750. ActMemFree(_scmReplyInfoData.pResolverInfo->pwszDllServer);
  751. ActMemFree(_scmReplyInfoData.pResolverInfo->pServerORBindings);
  752. ActMemFree(_scmReplyInfoData.pResolverInfo->OxidInfo.psa);
  753. ActMemFree(_scmReplyInfoData.pResolverInfo);
  754. }
  755. }
  756. inline void freeRemoteReplyInfo()
  757. {
  758. if (_scmReplyInfoData.remoteReply)
  759. {
  760. ActMemFree(_scmReplyInfoData.remoteReply->pdsaOxidBindings);
  761. ActMemFree(_scmReplyInfoData.remoteReply);
  762. }
  763. }
  764. virtual ~ScmReplyInfo()
  765. {
  766. freeResolverInfo();
  767. freeRemoteReplyInfo();
  768. }
  769. // Methods from IUnknown
  770. STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj);
  771. STDMETHOD_(ULONG,AddRef) ( void );
  772. STDMETHOD_(ULONG,Release) ( void );
  773. // Methods from IScmReplyInfo
  774. STDMETHOD(SetRemoteReplyInfo)(IN REMOTE_REPLY_SCM_INFO *pRemoteReq)
  775. {
  776. _scmReplyInfoData.remoteReply =
  777. (customREMOTE_REPLY_SCM_INFO*) pRemoteReq;
  778. freeResolverInfo();
  779. _scmReplyInfoData.pResolverInfo = NULL;
  780. return S_OK;
  781. }
  782. STDMETHOD(GetRemoteReplyInfo)(OUT REMOTE_REPLY_SCM_INFO **ppRemoteReq)
  783. {
  784. *ppRemoteReq = (REMOTE_REPLY_SCM_INFO*)
  785. _scmReplyInfoData.remoteReply;
  786. return S_OK;
  787. }
  788. STDMETHOD(SetResolverInfo)(IN PRIV_RESOLVER_INFO *pResolverInfo)
  789. {
  790. _scmReplyInfoData.pResolverInfo = (CustomPrivResolverInfo*)pResolverInfo;
  791. freeRemoteReplyInfo();
  792. _scmReplyInfoData.remoteReply = NULL;
  793. return S_OK;
  794. }
  795. STDMETHOD(GetResolverInfo)(OUT PRIV_RESOLVER_INFO **ppResolverInfo)
  796. {
  797. *ppResolverInfo = (PRIV_RESOLVER_INFO*)_scmReplyInfoData.pResolverInfo;
  798. return S_OK;
  799. }
  800. //Methods from IActivationPropertySet
  801. STDMETHOD(Reset)()
  802. {
  803. _scmReplyInfoData.remoteReply = 0;
  804. _scmReplyInfoData.pResolverInfo = 0;
  805. _unSerialized = FALSE;
  806. return S_OK;
  807. }
  808. // ISerializable Methods
  809. STDMETHOD(Serialize)(IN void *pSer);
  810. STDMETHOD(UnSerialize)(IN void *pSer);
  811. STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize);
  812. STDMETHOD(GetCLSID)(OUT CLSID *pclsid);
  813. STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0)
  814. { return E_NOTIMPL;}
  815. STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
  816. private:
  817. ScmReplyInfoData _scmReplyInfoData;
  818. };
  819. class InstanceInfo : public IInstanceInfo, public SerializableProperty
  820. {
  821. public:
  822. InstanceInfo()
  823. {
  824. ZeroMemory(&_instanceInfoData, sizeof(InstanceInfoData));
  825. _pstg = 0;
  826. }
  827. virtual ~InstanceInfo()
  828. {
  829. if (_pstg)
  830. _pstg->Release();
  831. if (_instanceInfoData.fileName)
  832. ActMemFree(_instanceInfoData.fileName);
  833. //NOTE: need to copy in SCM to always free here
  834. if (_instanceInfoData.ifdROT)
  835. ActMemFree(_instanceInfoData.ifdROT);
  836. if (_instanceInfoData.ifdStg)
  837. ActMemFree(_instanceInfoData.ifdStg);
  838. }
  839. // Methods from IUnknown
  840. STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj);
  841. STDMETHOD_(ULONG,AddRef) ( void );
  842. STDMETHOD_(ULONG,Release) ( void );
  843. // Methods from IInstanceInfo
  844. STDMETHOD(SetStorage)(IN IStorage *pstg);
  845. STDMETHOD(GetStorage)(OUT IStorage **ppstg);
  846. STDMETHOD(GetStorageIFD)(MInterfacePointer **pStgIfd)
  847. {
  848. if (!_unSerialized)
  849. return E_FAIL;
  850. *pStgIfd = _instanceInfoData.ifdStg;
  851. return S_OK;
  852. }
  853. STDMETHOD(SetStorageIFD)(MInterfacePointer *pStgIfd)
  854. {
  855. Win4Assert(_instanceInfoData.ifdStg == NULL);
  856. _instanceInfoData.ifdStg = pStgIfd;
  857. return S_OK;
  858. }
  859. STDMETHOD(SetIfdROT) (IN MInterfacePointer *pIFD)
  860. {
  861. _instanceInfoData.ifdROT = pIFD;
  862. return S_OK;
  863. }
  864. STDMETHOD(GetIfdROT) (OUT MInterfacePointer **ppIFD)
  865. {
  866. *ppIFD = _instanceInfoData.ifdROT;
  867. return S_OK;
  868. }
  869. STDMETHOD(SetFile)(IN WCHAR *pfile, DWORD mode)
  870. {
  871. ActMemFree(_instanceInfoData.fileName);
  872. _instanceInfoData.fileName = makeWStringCopy(pfile);
  873. if (_instanceInfoData.fileName==NULL)
  874. return E_OUTOFMEMORY;
  875. _instanceInfoData.mode = mode;
  876. return S_OK;
  877. }
  878. STDMETHOD(GetFile)(OUT WCHAR **ppfile, DWORD *pmode)
  879. {
  880. *ppfile = _instanceInfoData.fileName;
  881. *pmode = _instanceInfoData.mode;
  882. return S_OK;
  883. }
  884. // ISerializable Methods
  885. STDMETHOD(Serialize)(IN void *pSer);
  886. STDMETHOD(UnSerialize)(IN void *pSer);
  887. STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize);
  888. STDMETHOD(GetCLSID)(OUT CLSID *pclsid);
  889. STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0)
  890. { return E_NOTIMPL;}
  891. STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
  892. inline void CleanupLocalState(void)
  893. {
  894. if (_pstg)
  895. {
  896. _pstg->Release();
  897. _pstg = NULL;
  898. }
  899. }
  900. private:
  901. InstanceInfoData _instanceInfoData;
  902. IStorage *_pstg;
  903. };
  904. class OpaqueDataInfo : public IOpaqueDataInfo, public SerializableProperty
  905. {
  906. public:
  907. inline HRESULT CopyOpaqueData(OpaqueData *pDst,
  908. OpaqueData *pSrc,
  909. DWORD dwLen,
  910. BOOL bDeep)
  911. {
  912. HRESULT hr = S_OK;
  913. for (DWORD i=0; i<dwLen; i++)
  914. {
  915. pDst->guid = pSrc->guid;
  916. pDst->dataLength = pSrc->dataLength;
  917. pDst->reserved1 = pSrc->reserved1;
  918. pDst->reserved2 = pSrc->reserved2;
  919. if (bDeep)
  920. {
  921. pDst->data = (BYTE*)
  922. ActMemAlloc((pSrc->dataLength+7)&~7);
  923. if (pDst->data == NULL)
  924. return E_OUTOFMEMORY;
  925. memcpy(pDst->data,
  926. pSrc->data,
  927. pSrc->dataLength);
  928. }
  929. else
  930. pDst->data = pSrc->data;
  931. pDst++;
  932. pSrc++;
  933. }
  934. return hr;
  935. }
  936. OpaqueDataInfo()
  937. {
  938. _cOpaqueData = 0;
  939. _dwCollSize = 0;
  940. _pOpaqueData = NULL;
  941. }
  942. ~OpaqueDataInfo()
  943. {
  944. for (DWORD i=0; i<_cOpaqueData;i++)
  945. ActMemFree(_pOpaqueData[i].data);
  946. ActMemFree(_pOpaqueData);
  947. }
  948. // Methods from IUnknown
  949. STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj);
  950. STDMETHOD_(ULONG,AddRef) ( void );
  951. STDMETHOD_(ULONG,Release) ( void );
  952. // Methods from IOpaqueDataInfo
  953. STDMETHOD (AddOpaqueData) (OpaqueData *pData);
  954. STDMETHOD (GetOpaqueData) (REFGUID guid,
  955. OpaqueData **pData);
  956. STDMETHOD (DeleteOpaqueData) (REFGUID guid);
  957. STDMETHOD (GetOpaqueDataCount) (ULONG *pulCount);
  958. STDMETHOD (GetAllOpaqueData) (OpaqueData **prgData);
  959. // ISerializable Methods
  960. STDMETHOD(Serialize)(IN void *pSer);
  961. STDMETHOD(UnSerialize)(IN void *pSer);
  962. STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize);
  963. STDMETHOD(GetCLSID)(OUT CLSID *pclsid);
  964. STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0)
  965. { return E_NOTIMPL;}
  966. STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
  967. STDMETHOD (SetParent) ( ISerializableParent *pParent);
  968. private:
  969. DWORD _cOpaqueData;
  970. DWORD _dwCollSize;
  971. OpaqueData *_pOpaqueData;
  972. void *_pAct;
  973. };
  974. class SpecialProperties : public ISpecialSystemProperties,
  975. public SerializableProperty
  976. {
  977. public:
  978. SpecialProperties()
  979. {
  980. ZeroMemory(&_data, sizeof(SpecialPropertiesData));
  981. }
  982. ~SpecialProperties()
  983. {
  984. }
  985. SpecialProperties & operator =(SpecialProperties &sp)
  986. {
  987. if(this == &sp) return *this;
  988. _data = sp._data;
  989. return *this;
  990. }
  991. // Methods from ISpecialSystemProperties
  992. STDMETHOD (SetSessionId) (ULONG dwSessionId, BOOL bUseConsole, BOOL fRemoteThisSessionId)
  993. {
  994. if (bUseConsole)
  995. {
  996. _data.dwFlags |= SPD_FLAG_USE_CONSOLE_SESSION;
  997. _data.dwSessionId = 0;
  998. }
  999. else
  1000. {
  1001. _data.dwFlags &= ~SPD_FLAG_USE_CONSOLE_SESSION;
  1002. _data.dwSessionId = dwSessionId;
  1003. }
  1004. _data.fRemoteThisSessionId = fRemoteThisSessionId;
  1005. return S_OK;
  1006. }
  1007. STDMETHOD (GetSessionId) (ULONG *pdwSessionId, BOOL* pbUseConsole)
  1008. {
  1009. if (_data.dwFlags & SPD_FLAG_USE_CONSOLE_SESSION)
  1010. {
  1011. *pbUseConsole = TRUE;
  1012. *pdwSessionId = 0;
  1013. }
  1014. else
  1015. {
  1016. *pbUseConsole = FALSE;
  1017. *pdwSessionId = _data.dwSessionId;
  1018. }
  1019. return S_OK;
  1020. }
  1021. STDMETHOD (GetSessionId2) (ULONG *pdwSessionId, BOOL* pbUseConsole, BOOL* pfRemoteThisSessionId)
  1022. {
  1023. HRESULT hr = GetSessionId(pdwSessionId, pbUseConsole);
  1024. if (SUCCEEDED(hr))
  1025. {
  1026. *pfRemoteThisSessionId = _data.fRemoteThisSessionId;
  1027. }
  1028. return hr;
  1029. }
  1030. STDMETHOD (SetClientImpersonating) (BOOL fClientImpersonating)
  1031. {
  1032. _data.fClientImpersonating = fClientImpersonating;
  1033. return S_OK;
  1034. }
  1035. STDMETHOD (GetClientImpersonating) (BOOL* pfClientImpersonating)
  1036. {
  1037. *pfClientImpersonating = _data.fClientImpersonating;
  1038. return S_OK;
  1039. }
  1040. STDMETHOD (SetPartitionId) (REFGUID guidPartition)
  1041. {
  1042. _data.fPartitionIDPresent = TRUE;
  1043. memcpy (&_data.guidPartition,&guidPartition, sizeof(GUID));
  1044. return S_OK;
  1045. }
  1046. STDMETHOD (GetPartitionId) (GUID* pguidPartition)
  1047. {
  1048. Win4Assert(pguidPartition != NULL);
  1049. if (_data.fPartitionIDPresent)
  1050. {
  1051. memcpy (pguidPartition,&_data.guidPartition,sizeof(GUID));
  1052. return S_OK;
  1053. }
  1054. return E_FAIL;
  1055. }
  1056. STDMETHOD (SetProcessRequestType) (DWORD dwPRT)
  1057. {
  1058. _data.dwPRTFlags = dwPRT;
  1059. return S_OK;
  1060. }
  1061. STDMETHOD (GetProcessRequestType) (DWORD* pdwPRT)
  1062. {
  1063. *pdwPRT = _data.dwPRTFlags;
  1064. return S_OK;
  1065. }
  1066. STDMETHOD (SetOrigClsctx) (DWORD dwClsCtx)
  1067. {
  1068. _data.dwOrigClsctx = dwClsCtx;
  1069. return S_OK;
  1070. }
  1071. STDMETHOD (GetOrigClsctx) (DWORD *pdwClsCtx)
  1072. {
  1073. if(!pdwClsCtx) return E_POINTER;
  1074. *pdwClsCtx = _data.dwOrigClsctx;
  1075. return S_OK;
  1076. }
  1077. STDMETHOD (GetDefaultAuthenticationLevel) (DWORD *pdwAuthnLevel)
  1078. {
  1079. if (!pdwAuthnLevel) return E_POINTER;
  1080. if (_data.dwFlags & SPD_FLAG_USE_DEFAULT_AUTHN_LVL)
  1081. {
  1082. *pdwAuthnLevel = _data.dwDefaultAuthnLvl;
  1083. }
  1084. else
  1085. {
  1086. // Not specified in the ActProps, just return the
  1087. // old default. (RPC_C_AUTHN_LEVEL_CONNECT)
  1088. *pdwAuthnLevel = RPC_C_AUTHN_LEVEL_CONNECT;
  1089. }
  1090. return S_OK;
  1091. }
  1092. STDMETHOD (SetDefaultAuthenticationLevel) (DWORD dwAuthnLevel)
  1093. {
  1094. _data.dwFlags |= SPD_FLAG_USE_DEFAULT_AUTHN_LVL;
  1095. _data.dwDefaultAuthnLvl = dwAuthnLevel;
  1096. return S_OK;
  1097. }
  1098. // Methods from IUnknown
  1099. STDMETHOD (QueryInterface) ( REFIID riid, LPVOID* ppvObj);
  1100. STDMETHOD_(ULONG,AddRef) ( void );
  1101. STDMETHOD_(ULONG,Release) ( void );
  1102. // ISerializable Methods
  1103. STDMETHOD(Serialize)(IN void *pSer);
  1104. STDMETHOD(UnSerialize)(IN void *pSer);
  1105. STDMETHOD(GetSize)(IN void *pSer, OUT DWORD *pdwSize);
  1106. STDMETHOD(GetCLSID)(OUT CLSID *pclsid);
  1107. STDMETHOD(UnSerializeCallBack)(REFCLSID clsid, ISerializable **ppSer=0)
  1108. { return E_NOTIMPL;}
  1109. STDMETHOD (SerializableQueryInterface) ( REFIID riid, LPVOID* ppvObj);
  1110. private:
  1111. SpecialPropertiesData _data;
  1112. };
  1113. #endif // __PROPIFS_HXX__