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.

578 lines
19 KiB

  1. //
  2. // mproxy.h
  3. //
  4. #ifndef MPROXY_H
  5. #define MPROXY_H
  6. #include "private.h"
  7. #include "marshal.h"
  8. #include "mstub.h"
  9. #include "ptrary.h"
  10. #include "strary.h"
  11. #include "transmit.h"
  12. IUnknown *ProxyCreator(SYSTHREAD *psfn, REFIID riid, ULONG ulStubId, DWORD dwStubTime, DWORD dwThreadId, DWORD dwCurThreadId, DWORD dwCurProcessId);
  13. typedef struct tag_MARSHALINTERFACEPARAM
  14. {
  15. ULONG ulStubId;
  16. ULONG dwStubTime;
  17. BOOL fNULLPointer;
  18. BOOL fNULLStack;
  19. } MARSHALINTERFACEPARAM;
  20. #define MSGMAPSIZE 0x100
  21. //////////////////////////////////////////////////////////////////////////////
  22. //
  23. // CMarshalParamCreator
  24. //
  25. //////////////////////////////////////////////////////////////////////////////
  26. class CMarshalParamCreator
  27. {
  28. public:
  29. CMarshalParamCreator()
  30. {
  31. _ulCur = 0;
  32. _ulParamNum = 0;
  33. _pMsg = NULL;
  34. _fMsgCreated = FALSE;
  35. }
  36. ~CMarshalParamCreator()
  37. {
  38. if (_fMsgCreated)
  39. cicMemFree(_pMsg);
  40. }
  41. void Clear()
  42. {
  43. if (_fMsgCreated)
  44. cicMemFree(_pMsg);
  45. _ulCur = 0;
  46. _ulParamNum = 0;
  47. _pMsg = NULL;
  48. _fMsgCreated = FALSE;
  49. }
  50. BOOL Set(MARSHALMSG *pMsg, ULONG cbSize)
  51. {
  52. _pMsg = pMsg;
  53. _pMsg->cbBufSize = cbSize;
  54. return TRUE;
  55. }
  56. BOOL Init(DWORD dwSrcThreadId, DWORD dwSrcProcessId, REFIID riid, ULONG ulMethodId, ULONG ulParamNum, ULONG ulStubId, DWORD dwStubTime, BOOL fUseulRet = FALSE)
  57. {
  58. _ulParamNum = ulParamNum;
  59. ULONG cbSize = sizeof(MARSHALMSG) + ulParamNum * sizeof(MARSHALPARAM *);
  60. if (!_pMsg)
  61. {
  62. _pMsg = (MARSHALMSG *)cicMemAllocClear(MSGMAPSIZE);
  63. if (!_pMsg)
  64. return FALSE;
  65. _fMsgCreated = TRUE;
  66. _pMsg->cbBufSize = MSGMAPSIZE;
  67. }
  68. LENGTH_ALIGN(cbSize, CIC_ALIGNMENT);
  69. _pMsg->cbSize = cbSize;
  70. _pMsg->iid = riid;
  71. _pMsg->ulMethodId = ulMethodId;
  72. _pMsg->ulParamNum = 0;
  73. _pMsg->dwSrcThreadId = dwSrcThreadId;
  74. _pMsg->dwSrcProcessId = dwSrcProcessId;
  75. _pMsg->ulStubId = ulStubId;
  76. _pMsg->dwStubTime = dwStubTime;
  77. if (!fUseulRet)
  78. _pMsg->hrRet = E_FAIL;
  79. return TRUE;
  80. }
  81. HRESULT Add(ULONG cbBufSize, DWORD dwFlags, const void *pv)
  82. {
  83. ULONG cbOrgBufSize = cbBufSize;
  84. LENGTH_ALIGN(cbBufSize, CIC_ALIGNMENT);
  85. ULONG cbMsgSize = _pMsg->cbSize + cbBufSize + sizeof(MARSHALPARAM);
  86. LENGTH_ALIGN(cbMsgSize, CIC_ALIGNMENT);
  87. MARSHALPARAM *pParam;
  88. if (_pMsg->cbBufSize < cbMsgSize)
  89. {
  90. Assert(0);
  91. return E_OUTOFMEMORY;
  92. }
  93. pParam = (MARSHALPARAM *)((BYTE *)_pMsg + _pMsg->cbSize);
  94. _pMsg->ulParamOffset[_ulCur] = _pMsg->cbSize;
  95. pParam->cbBufSize = cbBufSize;
  96. pParam->dwFlags = dwFlags;
  97. if (cbBufSize)
  98. {
  99. if (pv)
  100. {
  101. BYTE *pb = (BYTE *)ParamToBufferPointer(pParam);
  102. memcpy(pb, pv, cbOrgBufSize);
  103. if (cbBufSize - cbOrgBufSize)
  104. memset(pb + cbOrgBufSize, 0, cbBufSize - cbOrgBufSize);
  105. }
  106. else
  107. {
  108. memset(ParamToBufferPointer(pParam), 0, cbBufSize);
  109. }
  110. }
  111. _pMsg->cbSize = cbMsgSize;
  112. _pMsg->ulParamNum++;
  113. _ulCur++;
  114. return S_OK;
  115. }
  116. MARSHALMSG *Get() {return _pMsg;}
  117. HRESULT GetHresult() {return _pMsg->hrRet;}
  118. MARSHALPARAM *GetMarshalParam(ULONG ulParam)
  119. {
  120. return (MARSHALPARAM *)(((BYTE *)_pMsg) + _pMsg->ulParamOffset[ulParam]);
  121. }
  122. HRESULT _RealSendReceive(CProxy *pProxy, ULONG ulBlockId)
  123. {
  124. HRESULT hr = pProxy->SendReceive(_pMsg, ulBlockId);
  125. return hr;
  126. }
  127. HRESULT SendReceive(CProxy *pProxy, ULONG ulBlockId)
  128. {
  129. HRESULT hr = _RealSendReceive(pProxy, ulBlockId);
  130. if (FAILED(hr))
  131. return hr;
  132. return _pMsg->hrRet;
  133. }
  134. #ifdef UNKNOWN_MARSHAL
  135. HRESULT SendReceiveULONG(CProxy *pProxy, ULONG ulBlockId)
  136. {
  137. HRESULT hr = _RealSendReceive(pProxy, ulBlockId);
  138. if (FAILED(hr))
  139. return hr;
  140. return S_OK;
  141. }
  142. #endif
  143. private:
  144. MARSHALMSG *_pMsg;
  145. ULONG _ulParamNum;
  146. ULONG _ulCur;
  147. BOOL _fMsgCreated;
  148. };
  149. //////////////////////////////////////////////////////////////////////////////
  150. //
  151. // CProxyIUnknown
  152. //
  153. //////////////////////////////////////////////////////////////////////////////
  154. class CProxyIUnknown : public IUnknown,
  155. public CProxy
  156. {
  157. public:
  158. CProxyIUnknown(SYSTHREAD *psfn);
  159. virtual ~CProxyIUnknown()
  160. {
  161. Assert(!_cRef);
  162. }
  163. //
  164. // IUnknown methods
  165. //
  166. STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
  167. STDMETHODIMP_(ULONG) AddRef(void);
  168. STDMETHODIMP_(ULONG) Release(void);
  169. HRESULT _QueryInterface(REFIID riid, void **ppvObj);
  170. private:
  171. DBG_ID_DECLARE;
  172. };
  173. extern const IID IID_CPROXYPRIV;
  174. inline CProxyIUnknown *GetCProxyIUnknown(IUnknown *punk)
  175. {
  176. CProxyIUnknown *pv;
  177. punk->QueryInterface(IID_CPROXYPRIV, (void **)&pv);
  178. return pv;
  179. }
  180. #define CPROXYIUNKOWNIMPL() \
  181. STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj) \
  182. { \
  183. return CProxyIUnknown::QueryInterface(riid, ppvObj); \
  184. } \
  185. STDMETHODIMP_(ULONG) AddRef(void) \
  186. { \
  187. return CProxyIUnknown::AddRef(); \
  188. } \
  189. STDMETHODIMP_(ULONG) Release(void) \
  190. { \
  191. return CProxyIUnknown::Release(); \
  192. }
  193. //////////////////////////////////////////////////////////////////////////////
  194. //
  195. // CProxyITfLangBarMgr
  196. //
  197. //////////////////////////////////////////////////////////////////////////////
  198. class CProxyITfLangBarMgr : public CProxyIUnknown,
  199. public ITfLangBarMgr
  200. {
  201. public:
  202. CProxyITfLangBarMgr(SYSTHREAD *psfn);
  203. CPROXYIUNKOWNIMPL()
  204. //
  205. // ITfLangBarMgr methods
  206. //
  207. STDMETHODIMP AdviseEventSink(ITfLangBarEventSink *pSink,
  208. HWND hwnd,
  209. DWORD dwFlags,
  210. DWORD *pdwCookie);
  211. STDMETHODIMP UnadviseEventSink(DWORD dwCookie);
  212. STDMETHODIMP GetThreadMarshalInterface(DWORD dwThreadId,
  213. DWORD dwType,
  214. REFIID riid,
  215. IUnknown **ppunk);
  216. STDMETHODIMP GetThreadLangBarItemMgr(DWORD dwThreadId,
  217. ITfLangBarItemMgr **pplbi,
  218. DWORD *pdwThreadId) ;
  219. STDMETHODIMP GetInputProcessorProfiles(DWORD dwThreadId,
  220. ITfInputProcessorProfiles **ppaip,
  221. DWORD *pdwThreadId) ;
  222. STDMETHODIMP RestoreLastFocus(DWORD *pdwThreadId, BOOL fPrev);
  223. STDMETHODIMP SetModalInput(ITfLangBarEventSink *pSink,
  224. DWORD dwThreadId,
  225. DWORD dwFlags);
  226. STDMETHODIMP ShowFloating(DWORD dwFlags);
  227. STDMETHODIMP GetShowFloatingStatus(DWORD *pdwFlags);
  228. DBG_ID_DECLARE;
  229. };
  230. //////////////////////////////////////////////////////////////////////////////
  231. //
  232. // CProxyITfLangBarItemMgr
  233. //
  234. //////////////////////////////////////////////////////////////////////////////
  235. class CProxyITfLangBarItemMgr : public ITfLangBarItemMgr,
  236. public CProxyIUnknown
  237. {
  238. public:
  239. CProxyITfLangBarItemMgr(SYSTHREAD *psfn);
  240. CPROXYIUNKOWNIMPL()
  241. STDMETHODIMP EnumItems(IEnumTfLangBarItems **ppEnum);
  242. STDMETHODIMP GetItem(REFGUID rguid,
  243. ITfLangBarItem **ppItem);
  244. STDMETHODIMP AddItem(ITfLangBarItem *punk);
  245. STDMETHODIMP RemoveItem(ITfLangBarItem *punk);
  246. STDMETHODIMP AdviseItemSink(ITfLangBarItemSink *punk,
  247. DWORD *pdwCookie,
  248. REFGUID rguidItem);
  249. STDMETHODIMP UnadviseItemSink(DWORD dwCookie);
  250. STDMETHODIMP GetItemFloatingRect(DWORD dwThreadId, REFGUID rguid, RECT *prc);
  251. STDMETHODIMP GetItemsStatus(ULONG ulCount, const GUID *prgguid, DWORD *pdwStatus);
  252. STDMETHODIMP GetItemNum(ULONG *pulCount);
  253. STDMETHODIMP GetItems(ULONG ulCount, ITfLangBarItem **ppItem, TF_LANGBARITEMINFO *pInfo, DWORD *pdwStatus, ULONG *pcFetched);
  254. STDMETHODIMP AdviseItemsSink(ULONG ulCount, ITfLangBarItemSink **ppunk, const GUID *pguidItem, DWORD *pdwCookie);
  255. STDMETHODIMP UnadviseItemsSink(ULONG ulCount, DWORD *pdwCookie);
  256. DBG_ID_DECLARE;
  257. };
  258. //////////////////////////////////////////////////////////////////////////////
  259. //
  260. // CProxyITfLangBarItemSink
  261. //
  262. //////////////////////////////////////////////////////////////////////////////
  263. class CProxyITfLangBarItemSink : public ITfLangBarItemSink,
  264. public CProxyIUnknown
  265. {
  266. public:
  267. CProxyITfLangBarItemSink(SYSTHREAD *psfn);
  268. CPROXYIUNKOWNIMPL()
  269. STDMETHODIMP OnUpdate(DWORD dwFlags);
  270. DBG_ID_DECLARE;
  271. };
  272. //////////////////////////////////////////////////////////////////////////////
  273. //
  274. // CProxyIEnumEnumTfLangBarItems
  275. //
  276. //////////////////////////////////////////////////////////////////////////////
  277. class CProxyIEnumTfLangBarItems : public IEnumTfLangBarItems,
  278. public CProxyIUnknown
  279. {
  280. public:
  281. CProxyIEnumTfLangBarItems(SYSTHREAD *psfn);
  282. CPROXYIUNKOWNIMPL()
  283. STDMETHODIMP Clone(IEnumTfLangBarItems **ppEnum);
  284. STDMETHODIMP Next(ULONG ulCount,
  285. ITfLangBarItem **ppItem,
  286. ULONG *pcFetched);
  287. STDMETHODIMP Reset();
  288. STDMETHODIMP Skip(ULONG ulCount);
  289. DBG_ID_DECLARE;
  290. };
  291. //////////////////////////////////////////////////////////////////////////////
  292. //
  293. // CProxyITfLangBarItem
  294. //
  295. //////////////////////////////////////////////////////////////////////////////
  296. class CProxyITfLangBarItem : public ITfLangBarItem,
  297. public CProxyIUnknown
  298. {
  299. public:
  300. CProxyITfLangBarItem(SYSTHREAD *psfn);
  301. CPROXYIUNKOWNIMPL()
  302. STDMETHODIMP GetInfo(TF_LANGBARITEMINFO *pInfo);
  303. STDMETHODIMP GetStatus(DWORD *pdwStatus);
  304. STDMETHODIMP Show(BOOL fShow);
  305. STDMETHODIMP GetTooltipString(BSTR *pbstrToolTip);
  306. DBG_ID_DECLARE;
  307. };
  308. #define CPROXYLANGBARITEMIMPL() \
  309. STDMETHODIMP GetInfo(TF_LANGBARITEMINFO *pInfo) \
  310. {return CProxyITfLangBarItem::GetInfo(pInfo);} \
  311. STDMETHODIMP GetStatus(DWORD *pdwStatus) \
  312. {return CProxyITfLangBarItem::GetStatus(pdwStatus);} \
  313. STDMETHODIMP Show(BOOL fShow) \
  314. {return CProxyITfLangBarItem::Show(fShow);} \
  315. STDMETHODIMP GetTooltipString(BSTR *pbstr) \
  316. {return CProxyITfLangBarItem::GetTooltipString(pbstr);}
  317. //////////////////////////////////////////////////////////////////////////////
  318. //
  319. // CProxyITfLangBarItemButton
  320. //
  321. //////////////////////////////////////////////////////////////////////////////
  322. class CProxyITfLangBarItemButton : public ITfLangBarItemButton,
  323. public CProxyITfLangBarItem
  324. {
  325. public:
  326. CProxyITfLangBarItemButton(SYSTHREAD *psfn);
  327. CPROXYIUNKOWNIMPL()
  328. CPROXYLANGBARITEMIMPL()
  329. STDMETHODIMP OnClick(TfLBIClick click, POINT pt, const RECT *prcArea);
  330. STDMETHODIMP InitMenu(ITfMenu *pMenu);
  331. STDMETHODIMP OnMenuSelect(UINT wID);
  332. STDMETHODIMP GetIcon(HICON *phIcon);
  333. STDMETHODIMP GetText(BSTR *pbstrText);
  334. DBG_ID_DECLARE;
  335. };
  336. //////////////////////////////////////////////////////////////////////////////
  337. //
  338. // CProxyITfLangBarItemBitmapButton
  339. //
  340. //////////////////////////////////////////////////////////////////////////////
  341. class CProxyITfLangBarItemBitmapButton : public ITfLangBarItemBitmapButton,
  342. public CProxyITfLangBarItem
  343. {
  344. public:
  345. CProxyITfLangBarItemBitmapButton(SYSTHREAD *psfn);
  346. CPROXYIUNKOWNIMPL()
  347. CPROXYLANGBARITEMIMPL()
  348. STDMETHODIMP OnClick(TfLBIClick click, POINT pt, const RECT *prcArea);
  349. STDMETHODIMP InitMenu(ITfMenu *pMenu);
  350. STDMETHODIMP OnMenuSelect(UINT wID);
  351. STDMETHODIMP GetPreferredSize(const SIZE *pszDefault,SIZE *psz);
  352. STDMETHODIMP DrawBitmap(LONG bmWidth, LONG bmHeight, DWORD dwFlags, HBITMAP *phbmp, HBITMAP *phbmpMask);
  353. STDMETHODIMP GetText(BSTR *pbstrText);
  354. DBG_ID_DECLARE;
  355. };
  356. //////////////////////////////////////////////////////////////////////////////
  357. //
  358. // CProxyITfLangBarItemBitmap
  359. //
  360. //////////////////////////////////////////////////////////////////////////////
  361. class CProxyITfLangBarItemBitmap : public ITfLangBarItemBitmap,
  362. public CProxyITfLangBarItem
  363. {
  364. public:
  365. CProxyITfLangBarItemBitmap(SYSTHREAD *psfn);
  366. CPROXYIUNKOWNIMPL()
  367. CPROXYLANGBARITEMIMPL()
  368. STDMETHODIMP OnClick(TfLBIClick click, POINT pt, const RECT *prcArea);
  369. STDMETHODIMP GetPreferredSize(const SIZE *pszDefault,SIZE *psz);
  370. STDMETHODIMP DrawBitmap(LONG bmWidth, LONG bmHeight, DWORD dwFlags, HBITMAP *phbmp, HBITMAP *phbmpMask);
  371. DBG_ID_DECLARE;
  372. };
  373. //////////////////////////////////////////////////////////////////////////////
  374. //
  375. // CProxyITfLangBarItemBalloon
  376. //
  377. //////////////////////////////////////////////////////////////////////////////
  378. class CProxyITfLangBarItemBalloon : public ITfLangBarItemBalloon,
  379. public CProxyITfLangBarItem
  380. {
  381. public:
  382. CProxyITfLangBarItemBalloon(SYSTHREAD *psfn);
  383. CPROXYIUNKOWNIMPL()
  384. CPROXYLANGBARITEMIMPL()
  385. STDMETHODIMP OnClick(TfLBIClick click, POINT pt, const RECT *prcArea);
  386. STDMETHODIMP GetPreferredSize(const SIZE *pszDefault,SIZE *psz);
  387. STDMETHODIMP GetBalloonInfo(TF_LBBALLOONINFO *pInfo);
  388. DBG_ID_DECLARE;
  389. };
  390. //////////////////////////////////////////////////////////////////////////////
  391. //
  392. // CProxyITfMenu
  393. //
  394. //////////////////////////////////////////////////////////////////////////////
  395. class CProxyITfMenu : public ITfMenu,
  396. public CProxyIUnknown
  397. {
  398. public:
  399. CProxyITfMenu(SYSTHREAD *psfn);
  400. CPROXYIUNKOWNIMPL()
  401. STDMETHODIMP AddMenuItem(UINT uId,
  402. DWORD dwFlags,
  403. HBITMAP hbmp,
  404. HBITMAP hbmpMask,
  405. const WCHAR *pch,
  406. ULONG cch,
  407. ITfMenu **ppMenu);
  408. DBG_ID_DECLARE;
  409. };
  410. //////////////////////////////////////////////////////////////////////////////
  411. //
  412. // CProxyITfMenu
  413. //
  414. //////////////////////////////////////////////////////////////////////////////
  415. class CProxyITfInputProcessorProfiles : public ITfInputProcessorProfiles,
  416. public CProxyIUnknown
  417. {
  418. public:
  419. CProxyITfInputProcessorProfiles(SYSTHREAD *psfn);
  420. CPROXYIUNKOWNIMPL()
  421. STDMETHODIMP Register(REFCLSID rclsid);
  422. STDMETHODIMP Unregister(REFCLSID rclsid);
  423. STDMETHODIMP AddLanguageProfile(REFCLSID rclsid,
  424. LANGID langid,
  425. REFGUID guidProfile,
  426. const WCHAR *pchDesc,
  427. ULONG cchDesc,
  428. const WCHAR *pchIconFile,
  429. ULONG cchFile,
  430. ULONG uIconIndex);
  431. STDMETHODIMP RemoveLanguageProfile(REFCLSID rclsid,
  432. LANGID langid,
  433. REFGUID guidProfile);
  434. STDMETHODIMP EnumInputProcessorInfo(IEnumGUID **ppEnum);
  435. STDMETHODIMP GetDefaultLanguageProfile(LANGID langid,
  436. REFGUID catid,
  437. CLSID *pclsid,
  438. GUID *pguidProfile);
  439. STDMETHODIMP SetDefaultLanguageProfile(LANGID langid,
  440. REFCLSID rclsid,
  441. REFGUID guidProfiles);
  442. STDMETHODIMP ActivateLanguageProfile(REFCLSID rclsid,
  443. LANGID langid,
  444. REFGUID guidProfiles);
  445. STDMETHODIMP GetActiveLanguageProfile(REFCLSID rclsid,
  446. LANGID *plangid,
  447. GUID *pguidProfile);
  448. STDMETHODIMP GetLanguageProfileDescription(REFCLSID rclsid,
  449. LANGID langid,
  450. REFGUID guidProfile,
  451. BSTR *pbstrProfile);
  452. STDMETHODIMP GetCurrentLanguage(LANGID *plangid);
  453. STDMETHODIMP ChangeCurrentLanguage(LANGID langid);
  454. STDMETHODIMP GetLanguageList(LANGID **ppLangId,
  455. ULONG *pulCount);
  456. STDMETHODIMP EnumLanguageProfiles(LANGID langid,
  457. IEnumTfLanguageProfiles **ppEnum);
  458. STDMETHODIMP EnableLanguageProfile(REFCLSID rclsid,
  459. LANGID langid,
  460. REFGUID guidProfile,
  461. BOOL fEnable);
  462. STDMETHODIMP IsEnabledLanguageProfile(REFCLSID rclsid,
  463. LANGID langid,
  464. REFGUID guidProfile,
  465. BOOL *pfEnable);
  466. STDMETHODIMP EnableLanguageProfileByDefault(REFCLSID rclsid,
  467. LANGID langid,
  468. REFGUID guidProfile,
  469. BOOL fEnable);
  470. STDMETHODIMP SubstituteKeyboardLayout(REFCLSID rclsid,
  471. LANGID langid,
  472. REFGUID guidProfile,
  473. HKL hKL);
  474. DBG_ID_DECLARE;
  475. };
  476. #endif // MPROXY_H