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.

745 lines
18 KiB

  1. //
  2. // Hosting (local or remote)
  3. //
  4. #ifndef _H_HET
  5. #define _H_HET
  6. //
  7. // DC-Share includes
  8. //
  9. #include <osi.h>
  10. //
  11. // Names of special classes
  12. //
  13. #define HET_MENU_CLASS "#32768" // Moved around
  14. #define HET_TOOLTIPS98_CLASS "ToolTips" // Win98 moved around
  15. #define HET_TOOLTIPSNT5_CLASS "#32774" // NT5 moved around
  16. #define HET_DIALOG_CLASS "#32770"
  17. #define HET_SCREEN_SAVER_CLASS "WindowsScreenSaverClass"
  18. #define HET_OLEDRAGDROP_CLASS "CLIPBRDWNDCLASS"
  19. //
  20. // Policy windows
  21. //
  22. #define HET_CMD95_CLASS "tty"
  23. #define HET_CMDNT_CLASS "ConsoleWindowClass"
  24. #define HET_EXPLORER_CLASS "ExploreWClass"
  25. #define HET_CABINET_CLASS "CabinetWClass"
  26. //
  27. // Maximum size of a class name queried. This should be at least as large
  28. // as the size of HET_MENU_CLASS, HET_PROPERTY_CLASS and
  29. // HET_SCREEN_SAVER_CLASS.
  30. //
  31. #define HET_CLASS_NAME_SIZE 32
  32. #if defined(DLL_CORE)
  33. //
  34. // Refresh timer
  35. //
  36. #define IDT_REFRESH 51
  37. #define PERIOD_REFRESH 10000
  38. typedef struct tagHOSTENUM
  39. {
  40. BASEDLIST list;
  41. UINT count;
  42. UINT countShared;
  43. }
  44. HOSTENUM, * PHOSTENUM;
  45. BOOL HET_GetAppsList(IAS_HWND_ARRAY **ppHwnds);
  46. void HET_FreeAppsList(IAS_HWND_ARRAY * pArray);
  47. BOOL HET_IsWindowShareable(HWND hwnd);
  48. BOOL HET_IsWindowShared(HWND hwnd);
  49. BOOL CALLBACK HostEnumProc(HWND, LPARAM);
  50. BOOL HET_Init(void);
  51. void HET_Term(void);
  52. INT_PTR CALLBACK HostDlgProc(HWND, UINT, WPARAM, LPARAM);
  53. void HOST_InitDialog(HWND);
  54. void HOST_OnCall(HWND, BOOL);
  55. void HOST_OnSharing(HWND, BOOL);
  56. void HOST_OnControllable(HWND, BOOL);
  57. void HOST_UpdateTitle(HWND, UINT);
  58. BOOL HOST_MeasureItem(HWND, LPMEASUREITEMSTRUCT);
  59. BOOL HOST_DeleteItem(HWND, LPDELETEITEMSTRUCT);
  60. BOOL HOST_DrawItem(HWND, LPDRAWITEMSTRUCT);
  61. void HOST_EnableCtrl(HWND, UINT, BOOL);
  62. enum
  63. {
  64. CHANGE_UNSHARED = 0,
  65. CHANGE_SHARED,
  66. CHANGE_TOGGLE,
  67. CHANGE_ALLUNSHARED
  68. };
  69. void HOST_ChangeShareState(HWND hwnd, UINT change);
  70. void HOST_FillList(HWND hwnd);
  71. void HOST_OnSelChange(HWND hwnd);
  72. //
  73. // Private messages to host dialog
  74. //
  75. enum
  76. {
  77. HOST_MSG_OPEN = WM_APP,
  78. HOST_MSG_CLOSE,
  79. HOST_MSG_CALL,
  80. HOST_MSG_UPDATELIST,
  81. HOST_MSG_HOSTSTART,
  82. HOST_MSG_HOSTEND,
  83. HOST_MSG_ALLOWCONTROL,
  84. HOST_MSG_CONTROLLED
  85. };
  86. //
  87. // Host dialog list item
  88. //
  89. typedef struct HOSTITEM
  90. {
  91. HWND hwnd;
  92. HICON hIcon;
  93. BOOL fShared:1;
  94. BOOL fAvailable:1;
  95. }
  96. HOSTITEM, * PHOSTITEM;
  97. #endif // DLL_CORE
  98. //
  99. // Hosting Property name
  100. //
  101. #define HET_ATOM_NAME "MNMHosted"
  102. //
  103. // Property values, flags
  104. //
  105. //
  106. // Here's the general idea with the following cases:
  107. //
  108. // An explictly shared process/thread
  109. // We enumerate all its top level windows, and mark the showing ones
  110. // with the VISIBLE option, which contributes to the hosted count,
  111. // and mark the hidden ones with the INVISIBLE option. Those become
  112. // hosted VISIBLE the second they are shown. They will always
  113. // be shared as long as they exist or the process/thread is shared.
  114. //
  115. // From then on, we watch for CREATEs of new top level windows in the
  116. // same process, and mark them the same way.
  117. //
  118. // On SHOWs, we change the state to visible, and update the visible
  119. // top level count. On HIDEs, we change the state to invisible, and
  120. // update the visible top level count. We wipe any properties off
  121. // real children to make sure that SetParent() of a top level window
  122. // (like OLE insitu) to a child doesn't keep garbage around. We do
  123. // the opposite for children that have become top level, like tear off
  124. // toolbars. On a SHOW, if there are other non-TEMPORARY hosted windows
  125. // in the same thread/process, we mark this dude as shared also.
  126. //
  127. // Unshared process/thread
  128. // On CREATE, if this is the first window in this thread/process, and
  129. // its parent process is shared (has at least one shared window of any
  130. // kind, temporary or invisible even, we mark this guy. From then on,
  131. // it behaves like an explicitly shared process.
  132. //
  133. // On SHOW, if this is a top level window, we look for any other window
  134. // visible on this thread which is shared. If so, we show this one
  135. // TEMPORARILY also. We also look at the owner of this window. If
  136. // it is shared in any way, we also share this one TEMPORARILY. When
  137. // TEMP shared, we enum all other windows in this thread and mark
  138. // the visible ones as TEMP shared also. This takes care of the cached
  139. // global popup menu window case.
  140. //
  141. // On HIDE, if this is TEMP shared, we unshare it. This is only for
  142. // the BYWINDOW case.
  143. //
  144. // WINHLP32.EXE
  145. // Creation the first time works normally via task tracking. But
  146. // if you have Help up in one app then go to another app, not shared,
  147. // and choose Help, it will come up shared there also. WINHLP32 doesn't
  148. // go away, it keeps a couple invisible MS_ class windows around. The
  149. // dialogs are destroyed.
  150. //
  151. //
  152. // Classes to skip
  153. //
  154. // Flags:
  155. #define HET_HOSTED_BYPROCESS 0x0010
  156. #define HET_HOSTED_BYTHREAD 0x0020
  157. #define HET_HOSTED_BYWINDOW 0x0040 // CURRENTLY ONLY FOR TEMPORARY
  158. // Hosted types:
  159. #define HET_HOSTED_PERMANENT 0x0001
  160. #define HET_HOSTED_TEMPORARY 0x0002
  161. #define HET_HOSTED_MASK 0x000F
  162. // App types
  163. #define HET_WOWVDM_APP 0x0001
  164. #define HET_WINHELP_APP 0x0002 // Not used, but maybe someday
  165. //
  166. // NOTE that all HET_ property values are non-zero. That way all possible
  167. // permutations of known properties are non-zero. Only windows with no
  168. // property at all will get zero back from HET_GetHosting().
  169. //
  170. #if (defined(DLL_CORE) || defined(DLL_HOOK))
  171. UINT_PTR __inline HET_GetHosting(HWND hwnd)
  172. {
  173. extern ATOM g_asHostProp;
  174. return((UINT_PTR)GetProp(hwnd, MAKEINTATOM(g_asHostProp)));
  175. }
  176. BOOL __inline HET_SetHosting(HWND hwnd, UINT_PTR hostType)
  177. {
  178. extern ATOM g_asHostProp;
  179. return(SetProp(hwnd, MAKEINTATOM(g_asHostProp), (HANDLE)hostType));
  180. }
  181. UINT_PTR __inline HET_ClearHosting(HWND hwnd)
  182. {
  183. extern ATOM g_asHostProp;
  184. return((UINT_PTR)RemoveProp(hwnd, MAKEINTATOM(g_asHostProp)));
  185. }
  186. typedef struct tagGUIEFFECTS
  187. {
  188. UINT_PTR hetAdvanced;
  189. UINT_PTR hetCursorShadow;
  190. ANIMATIONINFO hetAnimation;
  191. }
  192. GUIEFFECTS;
  193. void HET_SetGUIEffects(BOOL fOn, GUIEFFECTS * pEffects);
  194. #endif // DLL_CORE or DLL_HOOK
  195. //
  196. // Define escape codes
  197. //
  198. // These are normal
  199. enum
  200. {
  201. // These are normal
  202. HET_ESC_SHARE_DESKTOP = OSI_HET_ESC_FIRST,
  203. HET_ESC_UNSHARE_DESKTOP,
  204. HET_ESC_VIEWER
  205. };
  206. // These are WNDOBJ_SETUP
  207. enum
  208. {
  209. HET_ESC_SHARE_WINDOW = OSI_HET_WO_ESC_FIRST,
  210. HET_ESC_UNSHARE_WINDOW,
  211. HET_ESC_UNSHARE_ALL
  212. };
  213. //
  214. // Structure passed with a HET_ESC_SHARE_WINDOW request
  215. //
  216. typedef struct tagHET_SHARE_WINDOW
  217. {
  218. OSI_ESCAPE_HEADER header;
  219. DWORD_PTR winID; // window to share
  220. DWORD result; // Return code from HET_DDShareWindow
  221. }
  222. HET_SHARE_WINDOW;
  223. typedef HET_SHARE_WINDOW FAR * LPHET_SHARE_WINDOW;
  224. //
  225. // Structure passed with a HET_ESC_UNSHARE_WINDOW request
  226. //
  227. typedef struct tagHET_UNSHARE_WINDOW
  228. {
  229. OSI_ESCAPE_HEADER header;
  230. DWORD_PTR winID; // window to unshare
  231. }
  232. HET_UNSHARE_WINDOW;
  233. typedef HET_UNSHARE_WINDOW FAR * LPHET_UNSHARE_WINDOW;
  234. //
  235. // Structure passed with a HET_ESC_UNSHARE_ALL request
  236. //
  237. typedef struct tagHET_UNSHARE_ALL
  238. {
  239. OSI_ESCAPE_HEADER header;
  240. }
  241. HET_UNSHARE_ALL;
  242. typedef HET_UNSHARE_ALL FAR * LPHET_UNSHARE_ALL;
  243. //
  244. // Structure passed with HET_ESC_SHARE_DESKTOP
  245. //
  246. typedef struct tagHET_SHARE_DESKTOP
  247. {
  248. OSI_ESCAPE_HEADER header;
  249. }
  250. HET_SHARE_DESKTOP;
  251. typedef HET_SHARE_DESKTOP FAR * LPHET_SHARE_DESKTOP;
  252. //
  253. // Structure passed with HET_ESC_UNSHARE_DESKTOP
  254. //
  255. typedef struct tagHET_UNSHARE_DESKTOP
  256. {
  257. OSI_ESCAPE_HEADER header;
  258. }
  259. HET_UNSHARE_DESKTOP;
  260. typedef HET_UNSHARE_DESKTOP FAR * LPHET_UNSHARE_DESKTOP;
  261. //
  262. // Structure passed with HET_ESC_VIEWER
  263. //
  264. typedef struct tagHET_VIEWER
  265. {
  266. OSI_ESCAPE_HEADER header;
  267. LONG viewersPresent;
  268. }
  269. HET_VIEWER;
  270. typedef HET_VIEWER FAR * LPHET_VIEWER;
  271. #ifdef DLL_DISP
  272. #ifndef IS_16
  273. //
  274. // Number of rectangles allocated per window structure. If a visible
  275. // region exceeds that number, we will merge rects together and end up
  276. // trapping a bit more output than necessary.
  277. //
  278. #define HET_WINDOW_RECTS 10
  279. //
  280. // HET's version of ENUMRECTS. This is the same as Windows', except that
  281. // it has HET_WINDOW_RECTS rectangles, not 1
  282. //
  283. typedef struct tagHET_ENUM_RECTS
  284. {
  285. ULONG c; // count of rectangles in use
  286. RECTL arcl[HET_WINDOW_RECTS]; // rectangles
  287. } HET_ENUM_RECTS;
  288. typedef HET_ENUM_RECTS FAR * LPHET_ENUM_RECTS;
  289. //
  290. // The Window Structure kept for each tracked window
  291. //
  292. typedef struct tagHET_WINDOW_STRUCT
  293. {
  294. BASEDLIST chain; // list chaining info
  295. HWND hwnd; // hwnd of this window
  296. WNDOBJ * wndobj; // WNDOBJ for this window
  297. HET_ENUM_RECTS rects; // rectangles
  298. } HET_WINDOW_STRUCT;
  299. typedef HET_WINDOW_STRUCT FAR * LPHET_WINDOW_STRUCT;
  300. //
  301. // Initial number of windows for which space is allocated
  302. // We alloc about 1 page for each block of windows. Need to account for
  303. // the BASEDLIST at the front of HET_WINDOW_MEMORY.
  304. //
  305. #define HET_WINDOW_COUNT ((0x1000 - sizeof(BASEDLIST)) / sizeof(HET_WINDOW_STRUCT))
  306. //
  307. // Layout of memory ued to hold window structures
  308. //
  309. typedef struct tagHET_WINDOW_MEMORY
  310. {
  311. BASEDLIST chain;
  312. HET_WINDOW_STRUCT wnd[HET_WINDOW_COUNT];
  313. } HET_WINDOW_MEMORY;
  314. typedef HET_WINDOW_MEMORY FAR * LPHET_WINDOW_MEMORY;
  315. #endif // !IS_16
  316. #ifdef IS_16
  317. void HETDDViewing(BOOL fViewers);
  318. #else
  319. void HETDDViewing(SURFOBJ *pso, BOOL fViewers);
  320. BOOL HETDDShareWindow(SURFOBJ *pso, LPHET_SHARE_WINDOW pReq);
  321. void HETDDUnshareWindow(LPHET_UNSHARE_WINDOW pReq);
  322. void HETDDUnshareAll(void);
  323. BOOL HETDDAllocWndMem(void);
  324. void HETDDDeleteAndFreeWnd(LPHET_WINDOW_STRUCT pWnd);
  325. VOID CALLBACK HETDDVisRgnCallback(WNDOBJ *pwo, FLONG fl);
  326. #endif
  327. #endif // DLL_DISP
  328. //
  329. // HET_IsShellThread()
  330. // HET_IsShellWindow()
  331. // Returns TRUE if this window is in the thread of the tray or the desktop
  332. // and therefore should be ignored.
  333. //
  334. BOOL HET_IsShellThread(DWORD dwThreadID);
  335. BOOL HET_IsShellWindow(HWND hwnd);
  336. #ifdef DLL_DISP
  337. //
  338. // INIT, TERM. TERM is used to free the window list blocks when NetMeeting
  339. // shuts down. Otherwise that memory will stay allocated in the display
  340. // driver forever.
  341. //
  342. void HET_DDTerm(void);
  343. //
  344. //
  345. // Name: HET_DDProcessRequest
  346. //
  347. // Description: Handle a DrvEscape request for HET
  348. //
  349. // Params: pso - pointer to a SURFOBJ
  350. // cjIn - size of input buffer
  351. // pvIn - input buffer
  352. // cjOut - size of output buffer
  353. // pvOut - output buffer
  354. //
  355. //
  356. #ifdef IS_16
  357. BOOL HET_DDProcessRequest(UINT fnEscape, LPOSI_ESCAPE_HEADER pResult,
  358. DWORD cbResult);
  359. #else
  360. ULONG HET_DDProcessRequest(SURFOBJ *pso,
  361. UINT cjIn,
  362. void * pvIn,
  363. UINT cjOut,
  364. void * pvOut);
  365. #endif // IS_16
  366. //
  367. //
  368. // Name: HET_DDOutputIsHosted
  369. //
  370. // Description: determines whether a point is inside a hosted area
  371. //
  372. // Params: pt - point to query
  373. //
  374. // Returns: TRUE - output is hosted
  375. // FALSE - output is not hosted
  376. //
  377. // Operation:
  378. //
  379. //
  380. BOOL HET_DDOutputIsHosted(POINT pt);
  381. //
  382. //
  383. // Name: HET_DDOutputRectIsHosted
  384. //
  385. // Description: determines whether a rect intersects a hosted area
  386. //
  387. // Params: pRect - rect to query
  388. //
  389. // Returns: TRUE - output is hosted
  390. // FALSE - output is not hosted
  391. //
  392. // Operation:
  393. //
  394. //
  395. BOOL HET_DDOutputRectIsHosted(LPRECT pRect);
  396. #endif // DLL_DISP
  397. //
  398. // Functions for window, task tracking (hook dll for NT, hook/dd for Win95)
  399. //
  400. void WINAPI HOOK_Init(HWND dcsCore, ATOM atom); // NT only
  401. void HOOK_Load(HINSTANCE hInst); // NT only
  402. void HOOK_NewThread(void); // NT only
  403. typedef struct tagHET_SHARE_INFO
  404. {
  405. int cWnds;
  406. UINT uType;
  407. DWORD dwID;
  408. } HET_SHARE_INFO, FAR* LPHET_SHARE_INFO;
  409. void HET_Clear(void);
  410. BOOL CALLBACK HETShareCallback(HWND hwnd, LPARAM lParam);
  411. BOOL CALLBACK HETUnshareCallback(HWND hwnd, LPARAM lParam);
  412. #if defined(DLL_CORE) || defined(DLL_HOOK)
  413. //
  414. // HET_GetShellTray
  415. //
  416. __inline HWND HET_GetShellTray(void)
  417. {
  418. #define HET_SHELL_TRAY_CLASS "Shell_TrayWnd"
  419. return(FindWindow(HET_SHELL_TRAY_CLASS, NULL));
  420. }
  421. //
  422. // HET_GetShellDesktop
  423. //
  424. __inline HWND HET_GetShellDesktop(void)
  425. {
  426. return(GetShellWindow());
  427. }
  428. #endif // DLL_CORE || DLL_HOOK
  429. //
  430. // Functions in the Core Process DLL
  431. //
  432. BOOL CALLBACK HETUnshareAllWindows(HWND hwnd, LPARAM lParam);
  433. BOOL CALLBACK HETRepaintWindow(HWND hwnd, LPARAM lParam);
  434. //
  435. // Internal Hook functions
  436. //
  437. #ifdef DLL_HOOK
  438. BOOL HET_WindowIsHosted(HWND hwnd);
  439. #ifdef IS_16
  440. LRESULT CALLBACK HETEventProc(int, WPARAM, LPARAM);
  441. LRESULT CALLBACK HETTrackProc(int, WPARAM, LPARAM);
  442. #else
  443. //
  444. // The following definitions are taken from <ntddk.h> and <ntdef.h>. They
  445. // are required to make use of the <NtQueryInformationProcess> function
  446. // in NTDLL.DLL.
  447. //
  448. typedef struct _PEB *PPEB;
  449. typedef ULONG_PTR KAFFINITY;
  450. typedef KAFFINITY *PKAFFINITY;
  451. typedef LONG KPRIORITY;
  452. typedef LONG NTSTATUS;
  453. //
  454. // Types of Win Event hook/unhook functions
  455. //
  456. typedef HWINEVENTHOOK (WINAPI * SETWINEVENTHOOK)(
  457. DWORD eventMin,
  458. DWORD eventMax,
  459. HMODULE hmodWinEventProc,
  460. WINEVENTPROC lpfnWinEventProc,
  461. DWORD idProcess,
  462. DWORD idThread,
  463. DWORD dwFlags);
  464. typedef BOOL (WINAPI * UNHOOKWINEVENT)(HWINEVENTHOOK hEventId);
  465. //
  466. // Process Information Classes
  467. //
  468. typedef enum _PROCESSINFOCLASS {
  469. ProcessBasicInformation,
  470. ProcessQuotaLimits,
  471. ProcessIoCounters,
  472. ProcessVmCounters,
  473. ProcessTimes,
  474. ProcessBasePriority,
  475. ProcessRaisePriority,
  476. ProcessDebugPort,
  477. ProcessExceptionPort,
  478. ProcessAccessToken,
  479. ProcessLdtInformation,
  480. ProcessLdtSize,
  481. ProcessDefaultHardErrorMode,
  482. ProcessIoPortHandlers, // Note: this is kernel mode only
  483. ProcessPooledUsageAndLimits,
  484. ProcessWorkingSetWatch,
  485. ProcessUserModeIOPL,
  486. ProcessEnableAlignmentFaultFixup,
  487. ProcessPriorityClass,
  488. ProcessWx86Information,
  489. ProcessHandleCount,
  490. ProcessAffinityMask,
  491. ProcessPriorityBoost,
  492. MaxProcessInfoClass
  493. } PROCESSINFOCLASS;
  494. //
  495. // Basic Process Information
  496. // NtQueryInformationProcess using ProcessBasicInfo
  497. //
  498. typedef struct _PROCESS_BASIC_INFORMATION {
  499. NTSTATUS ExitStatus;
  500. PPEB PebBaseAddress;
  501. KAFFINITY AffinityMask;
  502. KPRIORITY BasePriority;
  503. ULONG UniqueProcessId;
  504. ULONG InheritedFromUniqueProcessId;
  505. } PROCESS_BASIC_INFORMATION;
  506. typedef PROCESS_BASIC_INFORMATION *PPROCESS_BASIC_INFORMATION;
  507. //
  508. // Declare our function prototype for <NtQueryInformationProcess>.
  509. //
  510. typedef NTSTATUS (NTAPI* NTQIP)(HANDLE ProcessHandle,
  511. PROCESSINFOCLASS ProcessInformationClass,
  512. void* ProcessInformation,
  513. ULONG ProcessInformationLength,
  514. PULONG ReturnLength);
  515. //
  516. // Generic test for success on any status value (non-negative numbers
  517. // indicate success).
  518. //
  519. #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
  520. //
  521. // Name of the DLL containing <NtQueryInformationProcess>.
  522. //
  523. #define NTDLL_DLL "ntdll.dll"
  524. #define HET_MIN_WINEVENT EVENT_OBJECT_CREATE
  525. #define HET_MAX_WINEVENT EVENT_OBJECT_HIDE
  526. void CALLBACK HETTrackProc(HWINEVENTHOOK hEvent, DWORD event, HWND hwnd,
  527. LONG idObject, LONG idChild, DWORD dwThreadId, DWORD dwmsEventTime);
  528. #endif // IS_16
  529. void HETHandleCreate(HWND);
  530. void HETHandleDestroy(HWND);
  531. void HETHandleShow(HWND, BOOL);
  532. void HETHandleHide(HWND);
  533. void HETCheckParentChange(HWND);
  534. //
  535. // We try to do just one enumerate (and stop as soon as we can) on events
  536. // for purposes of speed.
  537. //
  538. BOOL CALLBACK HETShareEnum(HWND, LPARAM);
  539. typedef struct tagHET_TRACK_INFO
  540. {
  541. HWND hwndUs;
  542. #ifndef IS_16
  543. BOOL fWOW;
  544. #endif
  545. UINT cWndsApp;
  546. UINT cWndsSharedThread;
  547. UINT cWndsSharedProcess;
  548. DWORD idProcess;
  549. DWORD idThread;
  550. } HET_TRACK_INFO, FAR* LPHET_TRACK_INFO;
  551. void HETGetParentProcessID(DWORD processID, LPDWORD pParentProcessID);
  552. void HETNewTopLevelCount(void);
  553. BOOL CALLBACK HETCountTopLevel(HWND, LPARAM);
  554. BOOL CALLBACK HETUnshareWOWServiceWnds(HWND, LPARAM);
  555. #endif // DLL_HOOK
  556. BOOL WINAPI OSI_ShareWindow(HWND hwnd, UINT uType, BOOL fRepaint, BOOL fUpdateCount);
  557. BOOL WINAPI OSI_UnshareWindow(HWND hwnd, BOOL fUpdateCount);
  558. //
  559. // OSI_StartWindowTracking()
  560. // Called when we start sharing the very first app
  561. //
  562. BOOL WINAPI OSI_StartWindowTracking(void);
  563. //
  564. // OSI_StopWindowTracking()
  565. // Called when we stop sharing the very last app
  566. //
  567. void WINAPI OSI_StopWindowTracking(void);
  568. //
  569. // Utility functions for windows
  570. //
  571. BOOL WINAPI OSI_IsWindowScreenSaver(HWND hwnd);
  572. #define GCL_WOWWORDS -27
  573. BOOL WINAPI OSI_IsWOWWindow(HWND hwnd);
  574. #endif // _H_HET