Windows NT 4.0 source code leak
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.

237 lines
11 KiB

4 years ago
  1. /******************************Module*Header*******************************\
  2. * Module Name: wowuserp.h *
  3. * *
  4. * Declarations of USER services provided to WOW. *
  5. * *
  6. * Created: 03-Mar-1993 *
  7. * Author: John Colleran [johnc] *
  8. * *
  9. * Copyright (c) 1993 Microsoft Corporation *
  10. \**************************************************************************/
  11. #pragma pack(1)
  12. typedef struct _NE_MODULE_SEG {
  13. USHORT ns_sector;
  14. USHORT ns_cbseg;
  15. USHORT ns_flags;
  16. USHORT ns_minalloc;
  17. USHORT ns_handle;
  18. } NEMODULESEG;
  19. typedef struct _NE_MODULE_SEG UNALIGNED *PNEMODULESEG;
  20. #pragma pack()
  21. // Shared WOW32 prototypes called by USER32.
  22. typedef HLOCAL (WINAPI *PFNLALLOC)(UINT dwFlags, UINT dwBytes, HANDLE hInstance);
  23. typedef HLOCAL (WINAPI *PFNLREALLOC)(HLOCAL hMem, UINT dwBytes, UINT dwFlags, HANDLE hInstance, PVOID* ppv);
  24. typedef LPVOID (WINAPI *PFNLLOCK)(HLOCAL hMem, HANDLE hInstance);
  25. typedef BOOL (WINAPI *PFNLUNLOCK)(HLOCAL hMem, HANDLE hInstance);
  26. typedef UINT (WINAPI *PFNLSIZE)(HLOCAL hMem, HANDLE hInstance);
  27. typedef HLOCAL (WINAPI *PFNLFREE)(HLOCAL hMem, HANDLE hInstance);
  28. typedef DWORD (WINAPI *PFNINITDLGCB)(HWND hwndDlg, LONG lParam);
  29. typedef WORD (WINAPI *PFN16GALLOC)(UINT flags, DWORD cb);
  30. typedef VOID (WINAPI *PFN16GFREE)(WORD h16Mem);
  31. typedef DWORD (WINAPI *PFNGETMODFNAME)(HANDLE hModule, LPTSTR lpszPath, DWORD cchPath);
  32. typedef VOID (WINAPI *PFNEMPTYCB)(VOID);
  33. typedef DWORD (WINAPI *PFNGETEXPWINVER)(HANDLE hModule);
  34. typedef HANDLE (WINAPI *PFNFINDA)(HANDLE hModule, LPCSTR lpName, LPCSTR lpType, WORD wLang);
  35. typedef HANDLE (WINAPI *PFNFINDW)(HANDLE hModule, LPCWSTR lpName, LPCWSTR lpType, WORD wLang);
  36. typedef HANDLE (WINAPI *PFNLOAD)(HANDLE hModule, HANDLE hResInfo);
  37. typedef BOOL (WINAPI *PFNFREE)(HANDLE hResData, HANDLE hModule);
  38. typedef LPSTR (WINAPI *PFNLOCK)(HANDLE hResData, HANDLE hModule);
  39. typedef BOOL (WINAPI *PFNUNLOCK)(HANDLE hResData, HANDLE hModule);
  40. typedef DWORD (WINAPI *PFNSIZEOF)(HANDLE hModule, HANDLE hResInfo);
  41. typedef DWORD (WINAPI *PFNWOWWNDPROCEX)(HWND hwnd, UINT uMsg, UINT uParam, LONG lParam, DWORD dw, PVOID adwWOW);
  42. typedef int (WINAPI *PFNWOWEDITNEXTWORD)(LPSTR lpch, int ichCurrent, int cch, int code, DWORD dwProc16);
  43. typedef VOID (WINAPI *PFNWOWSETFAKEDIALOGCLASS)(HWND hwnd);
  44. typedef VOID (WINAPI *PFNWOWCBSTOREHANDLE)(WORD wFmt, WORD h16);
  45. // Shared USER32 prototypes called by WOW32
  46. typedef HWND (WINAPI *PFNCSCREATEWINDOWEX)(DWORD dwExStyle, LPCTSTR lpClassName,
  47. LPCTSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HANDLE hInstance, LPVOID lpParam, DWORD Flags, LPDWORD lpWOW);
  48. typedef VOID (WINAPI *PFNDIRECTEDYIELD)(DWORD ThreadId);
  49. typedef VOID (WINAPI *PFNFREEDDEDATA)(HANDLE hDDE, BOOL fIgnorefRelease, BOOL fFreeTruelyGlobalObjects);
  50. typedef LONG (WINAPI *PFNGETCLASSWOWWORDS)(HINSTANCE hInstance, LPCTSTR pString);
  51. typedef BOOL (WINAPI *PFNINITTASK)(UINT dwExpWinVer, LPCSTR lpszAppName, DWORD hTaskWow, DWORD dwHotkey, DWORD idTask, DWORD dwX, DWORD dwY, DWORD dwXSize, DWORD dwYSize, WORD wShowWindow);
  52. typedef ATOM (WINAPI *PFNREGISTERCLASSWOWA)(PVOID lpWndClass, LPDWORD pdwWOWstuff);
  53. typedef BOOL (WINAPI *PFNREGISTERUSERHUNGAPPHANDLERS)(PFNW32ET pfnW32EndTask, HANDLE hEventWowExec);
  54. typedef HWND (WINAPI *PFNSERVERCREATEDIALOG)(HANDLE hmod, LPDLGTEMPLATE lpDlgTemplate, DWORD cb, HWND hwndOwner , DLGPROC pfnWndProc, LONG dwInitParam, UINT fFlags);
  55. typedef HCURSOR (WINAPI *PFNSERVERLOADCREATECURSORICON)(HANDLE hmod, LPTSTR lpModName, DWORD dwExpWinVer, LPCTSTR lpName, DWORD cb, PVOID pcur, LPTSTR lpType, BOOL fClient);
  56. typedef HMENU (WINAPI *PFNSERVERLOADCREATEMENU)(HANDLE hMod, LPTSTR lpName, CONST LPMENUTEMPLATE pmt, DWORD cb, BOOL fCallClient);
  57. typedef BOOL (WINAPI *PFNWOWCLEANUP)(HANDLE hInstance, DWORD hTaskWow, PNEMODULESEG SelList, DWORD nSel);
  58. typedef HWND (WINAPI *PFNWOWFINDWINDOW)(LPCSTR lpClassName, LPCSTR lpWindowName);
  59. typedef int (WINAPI *PFNWOWGETIDFROMDIRECTORY)(PBYTE presbits, UINT rt);
  60. typedef HBITMAP (WINAPI *PFNWOWLOADBITMAPA)(HINSTANCE hmod, LPCSTR lpName, LPBYTE pResData, DWORD cbResData);
  61. typedef BOOL (WINAPI *PFNWOWWAITFORMSGANDEVENT)(HANDLE hevent);
  62. typedef BOOL (WINAPI *PFNYIELDTASK)(VOID);
  63. typedef DWORD (WINAPI *PFNGETFULLUSERHANDLE)(WORD wHandle);
  64. typedef DWORD (WINAPI *PFNGETMENUINDEX)(HMENU hMenu, HMENU hSubMenu);
  65. typedef WORD (WINAPI *PFNWOWGETDEFWINDOWPROCBITS)(PBYTE pDefWindowProcBits, WORD cbDefWindowProcBits);
  66. typedef VOID (WINAPI *PFNFILLWINDOW)(HWND hwndParent, HWND hwnd, HDC hdc, HANDLE hBrush);
  67. // other prototypes
  68. typedef BOOL (WINAPI *PFNWOWGLOBALFREEHOOK)(HGLOBAL hMem);
  69. /*
  70. * MEASUREITEMSTRUCT itemWidth tag telling wow the itemData is a flat pointer
  71. */
  72. #define MIFLAG_FLAT 0x464C4154
  73. /*
  74. * CallWindowProc Bits
  75. */
  76. #define WNDPROC_WOW 0x80000000 // This bit for WOW Window Procs
  77. #define WNDPROC_MASK 0x7fffffff // To mask off wow bit
  78. #define WNDPROC_HANDLE 0xFFFF // HIWORD(x) == 0xFFFF for handle
  79. /*
  80. * CreateWindow flags
  81. */
  82. #define CW_FLAGS_ANSI 0x00000001
  83. typedef struct tagAPFNWOWHANDLERSIN
  84. {
  85. // In'ees - passed from WOW32 to USER32 and called by USER32
  86. PFNLALLOC pfnLocalAlloc;
  87. PFNLREALLOC pfnLocalReAlloc;
  88. PFNLLOCK pfnLocalLock;
  89. PFNLUNLOCK pfnLocalUnlock;
  90. PFNLSIZE pfnLocalSize;
  91. PFNLFREE pfnLocalFree;
  92. PFNGETEXPWINVER pfnGetExpWinVer;
  93. PFNINITDLGCB pfnInitDlgCb;
  94. PFN16GALLOC pfn16GlobalAlloc;
  95. PFN16GFREE pfn16GlobalFree;
  96. PFNEMPTYCB pfnEmptyCB;
  97. PFNFINDA pfnFindResourceEx;
  98. PFNLOAD pfnLoadResource;
  99. PFNFREE pfnFreeResource;
  100. PFNLOCK pfnLockResource;
  101. PFNUNLOCK pfnUnlockResource;
  102. PFNSIZEOF pfnSizeofResource;
  103. PFNWOWWNDPROCEX pfnWowWndProcEx;
  104. PFNWOWEDITNEXTWORD pfnWowEditNextWord;
  105. PFNWOWSETFAKEDIALOGCLASS pfnWowSetFakeDialogClass;
  106. PFNWOWCBSTOREHANDLE pfnWowCBStoreHandle;
  107. } PFNWOWHANDLERSIN, * APFNWOWHANDLERSIN;
  108. typedef struct tagAPFNWOWHANDLERSOUT
  109. {
  110. // Out'ees - passed from USER32 to WOW32 and called/used by WOW32
  111. DWORD dwBldInfo;
  112. PFNCSCREATEWINDOWEX pfnCsCreateWindowEx;
  113. PFNDIRECTEDYIELD pfnDirectedYield;
  114. PFNFREEDDEDATA pfnFreeDDEData;
  115. PFNGETCLASSWOWWORDS pfnGetClassWOWWords;
  116. PFNINITTASK pfnInitTask;
  117. PFNREGISTERCLASSWOWA pfnRegisterClassWOWA;
  118. PFNREGISTERUSERHUNGAPPHANDLERS pfnRegisterUserHungAppHandlers;
  119. PFNSERVERCREATEDIALOG pfnServerCreateDialog;
  120. PFNSERVERLOADCREATECURSORICON pfnServerLoadCreateCursorIcon;
  121. PFNSERVERLOADCREATEMENU pfnServerLoadCreateMenu;
  122. PFNWOWCLEANUP pfnWOWCleanup;
  123. PFNWOWFINDWINDOW pfnWOWFindWindow;
  124. PFNWOWGETIDFROMDIRECTORY pfnWOWGetIdFromDirectory;
  125. PFNWOWLOADBITMAPA pfnWOWLoadBitmapA;
  126. PFNWOWWAITFORMSGANDEVENT pfnWowWaitForMsgAndEvent;
  127. PFNYIELDTASK pfnYieldTask;
  128. PFNGETFULLUSERHANDLE pfnGetFullUserHandle;
  129. PFNGETMENUINDEX pfnGetMenuIndex;
  130. PFNWOWGETDEFWINDOWPROCBITS pfnWowGetDefWindowProcBits;
  131. PFNFILLWINDOW pfnFillWindow;
  132. } PFNWOWHANDLERSOUT, * APFNWOWHANDLERSOUT;
  133. //
  134. // The WW structure is embedded at the end of USER's WND structure.
  135. // However, WOW and USER use different names to access the WW
  136. // fields. So this structure is defined as a union of two structures,
  137. // WHICH MUST HAVE THE SAME SIZE, just different field names.
  138. //
  139. // Make sure that WND_CNT_WOWDWORDS matches the number of DWORDs
  140. // used by the WOW only fields.
  141. //
  142. // FindPWW(hwnd) returns a read-only pointer to this structure for
  143. // a given window. To change elements of this structure, use
  144. // SETWW (== SetWindowLong) with the appropriate GWL_WOW* offset
  145. // defined below.
  146. //
  147. #define WND_CNT_WOWDWORDS 0x3
  148. //
  149. // When including this from USER, VPWNDPROC is undefined
  150. //
  151. #ifndef _WALIAS_
  152. typedef DWORD VPWNDPROC;
  153. #endif
  154. typedef struct _WW { /* ww */
  155. union {
  156. struct { /* WOW declaration */
  157. //
  158. // wow fields
  159. //
  160. WORD iClass; // WOW class index
  161. WORD flState; // state of the alias
  162. VPWNDPROC vpfnWndProc; // associated 16-bit function address
  163. VPWNDPROC vpfnDlgProc; // 16-bit dialog function
  164. //
  165. // WOW/USER fields.
  166. // note that we don't change these fields using
  167. // SETWW() and SetWL as we do the fields above.
  168. //
  169. DWORD dwUserSrvState; // UserSrv calls this state.
  170. DWORD dwUserSrvState2;
  171. DWORD dwExStyle;
  172. DWORD dwStyle; // UserSrv calls this style.
  173. HANDLE hInstance; // UserSrv calls this hModule.
  174. };
  175. struct { /* USER declaration */
  176. /*
  177. * These DWORDs are used by WOW only.
  178. */
  179. DWORD adwWOW[WND_CNT_WOWDWORDS];
  180. /*
  181. *
  182. * WOW/USER fields
  183. * NOTE: The order and size of the following 4 fields is assumed
  184. * by the SetWF, ClrWF, TestWF, MaskWF macros.
  185. *
  186. */
  187. DWORD state; // State flags
  188. DWORD state2; //
  189. DWORD ExStyle; // Extended Style
  190. DWORD style; // Style flags
  191. HANDLE hModule; // Handle to module instance data (32-bit).
  192. };
  193. };
  194. } WW, *PWW, **PPWW;
  195. DWORD UserRegisterWowHandlers(APFNWOWHANDLERSIN apfnWowIn, APFNWOWHANDLERSOUT apfnWowOut);
  196. VOID WINAPI RegisterWowBaseHandlers(PFNWOWGLOBALFREEHOOK pfn);
  197. BOOL
  198. InitTask(
  199. UINT dwExpWinVer,
  200. LPCSTR lpszAppName,
  201. DWORD hTaskWow,
  202. DWORD dwHotkey,
  203. DWORD idTask,
  204. DWORD dwX,
  205. DWORD dwY,
  206. DWORD dwXSize,
  207. DWORD dwYSize,
  208. WORD wShowWindow);
  209. BOOL YieldTask(VOID);
  210. #define DY_OLDYIELD ((DWORD)-1)
  211. VOID DirectedYield(DWORD ThreadId);
  212. DWORD UserGetInt16State(void);