[WIN32SS] Implement NtGdiAddFontMemResourceEx and NtGdiRemoveFontMemResourceEx. CORE...
[reactos.git] / reactos / win32ss / user / ntuser / win32.h
index 5a7d217..cd9d796 100644 (file)
@@ -32,8 +32,8 @@
 #define W32PF_MANUALGUICHECK         (0x02000000)
 #define W32PF_CREATEDWINORDC         (0x04000000)
 #define W32PF_APIHOOKLOADED          (0x08000000)
-/*
-#define QSIDCOUNTS 6
+
+#define QSIDCOUNTS 7
 
 typedef enum _QS_ROS_TYPES
 {
@@ -43,16 +43,15 @@ typedef enum _QS_ROS_TYPES
     QSRosPostMessage,
     QSRosSendMessage,
     QSRosHotKey,
-}QS_ROS_TYPES,*PQS_ROS_TYPES;
-*/
+    QSRosEvent,
+} QS_ROS_TYPES, *PQS_ROS_TYPES;
+
 extern BOOL ClientPfnInit;
 extern HINSTANCE hModClient;
 extern HANDLE hModuleWin;    // This Win32k Instance.
-extern PCLS SystemClassList;
+extern struct _CLS *SystemClassList;
 extern BOOL RegisteredSysClasses;
 
-typedef struct _WIN32HEAP WIN32HEAP, *PWIN32HEAP;
-
 #include <pshpack1.h>
 // FIXME: Move to ntuser.h
 typedef struct _TL
@@ -65,7 +64,7 @@ typedef struct _TL
 typedef struct _W32THREAD
 {
     PETHREAD pEThread;
-    ULONG RefCount;
+    LONG RefCount;
     PTL ptlW32;
     PVOID pgdiDcattr;
     PVOID pgdiBrushAttr;
@@ -76,60 +75,77 @@ typedef struct _W32THREAD
     PVOID pUMPDObj;
 } W32THREAD, *PW32THREAD;
 
+#ifdef __cplusplus
+typedef struct _THREADINFO : _W32THREAD
+{
+#else
 typedef struct _THREADINFO
 {
     W32THREAD;
+#endif
     PTL                 ptl;
     PPROCESSINFO        ppi;
     struct _USER_MESSAGE_QUEUE* MessageQueue;
     struct tagKL*       KeyboardLayout;
-    PCLIENTTHREADINFO   pcti;
+    struct _CLIENTTHREADINFO  * pcti;
     struct _DESKTOP*    rpdesk;
-    PDESKTOPINFO        pDeskInfo;
-    PCLIENTINFO         pClientInfo;
+    struct _DESKTOPINFO  *  pDeskInfo;
+    struct _CLIENTINFO * pClientInfo;
     FLONG               TIF_flags;
     PUNICODE_STRING     pstrAppName;
-    LIST_ENTRY          psmsSent;        // DispatchingMessagesHead
+    struct _USER_SENT_MESSAGE *pusmSent;
     struct _USER_SENT_MESSAGE *pusmCurrent;
-    LIST_ENTRY          psmsReceiveList; // SentMessagesListHead
+    /* Queue of messages sent to the queue. */
+    LIST_ENTRY          SentMessagesListHead;    // psmsReceiveList
+    /* Last time PeekMessage() was called. */
     LONG                timeLast;
     ULONG_PTR           idLast;
+    /* True if a WM_QUIT message is pending. */
     BOOLEAN             QuitPosted;
-    INT                 exitCode;     // QuitExitCode
+    /* The quit exit code. */
+    INT                 exitCode;
     HDESK               hdesk;
     UINT                cPaintsReady; /* Count of paints pending. */
     UINT                cTimersReady; /* Count of timers pending. */
+    struct tagMENUSTATE* pMenuState;
     DWORD               dwExpWinVer;
     DWORD               dwCompatFlags;
     DWORD               dwCompatFlags2;
     struct _USER_MESSAGE_QUEUE* pqAttach;
     PTHREADINFO         ptiSibling;
     ULONG               fsHooks;
-    PHOOK               sphkCurrent;
+    struct tagHOOK *    sphkCurrent;
     LPARAM              lParamHkCurrent;
     WPARAM              wParamHkCurrent;
     struct tagSBTRACK*  pSBTrack;
-    HANDLE              hEventQueueClient; // NewMessagesHandle
-    PKEVENT             pEventQueueServer; // NewMessages
+    /* Set if there are new messages specified by WakeMask in any of the queues. */
+    HANDLE              hEventQueueClient;
+    /* Handle for the above event (in the context of the process owning the queue). */
+    PKEVENT             pEventQueueServer;
     LIST_ENTRY          PtiLink;
     INT                 iCursorLevel;
     POINT               ptLast;
 
-    LIST_ENTRY          mlPost; // PostedMessagesListHead
-
+    INT                 cEnterCount;
+    /* Queue of messages posted to the queue. */
+    LIST_ENTRY          PostedMessagesListHead; // mlPost
+    WORD                fsChangeBitsRemoved;
+    WCHAR               wchInjected;
+    UINT                cWindows;
+    UINT                cVisWindows;
+#ifndef __cplusplus /// FIXME!
     LIST_ENTRY          aphkStart[NB_HOOKS];
     CLIENTTHREADINFO    cti;  // Used only when no Desktop or pcti NULL.
 
     /* ReactOS */
 
-    /* Queue state tracking */
+    /* Thread Queue state tracking */
     // Send list QS_SENDMESSAGE
     // Post list QS_POSTMESSAGE|QS_HOTKEY|QS_PAINT|QS_TIMER|QS_KEY
     // Hard list QS_MOUSE|QS_KEY only
     // Accounting of queue bit sets, the rest are flags. QS_TIMER QS_PAINT counts are handled in thread information.
-    //DWORD nCntsQBits[QSIDCOUNTS]; // QS_KEY QS_MOUSEMOVE QS_MOUSEBUTTON QS_POSTMESSAGE QS_SENDMESSAGE QS_HOTKEY
+    DWORD nCntsQBits[QSIDCOUNTS]; // QS_KEY QS_MOUSEMOVE QS_MOUSEBUTTON QS_POSTMESSAGE QS_SENDMESSAGE QS_HOTKEY
 
-    LIST_ENTRY LocalDispatchingMessagesHead;
     LIST_ENTRY WindowListHead;
     LIST_ENTRY W32CallbackListHead;
     SINGLE_LIST_ENTRY  ReferencesList;
@@ -137,14 +153,45 @@ typedef struct _THREADINFO
 #if DBG
     USHORT acExclusiveLockCount[GDIObjTypeTotal + 1];
 #endif
-
+#endif // __cplusplus
 } THREADINFO;
 
 #include <poppack.h>
 
+
+#define IntReferenceThreadInfo(pti) \
+    InterlockedIncrement(&(pti)->RefCount)
+
+VOID UserDeleteW32Thread(PTHREADINFO);
+
+#define IntDereferenceThreadInfo(pti) \
+do { \
+    if (InterlockedDecrement(&(pti)->RefCount) == 0) \
+    { \
+        ASSERT(((pti)->TIF_flags & (TIF_INCLEANUP|TIF_DONTATTACHQUEUE)) == (TIF_INCLEANUP|TIF_DONTATTACHQUEUE)); \
+        UserDeleteW32Thread(pti); \
+    } \
+} while(0)
+
+
+#define IntReferenceProcessInfo(ppi) \
+    InterlockedIncrement((volatile LONG*)(&(ppi)->RefCount))
+
+VOID UserDeleteW32Process(_Pre_notnull_ __drv_freesMem(Mem) PPROCESSINFO);
+
+#define IntDereferenceProcessInfo(ppi) \
+do { \
+    if (InterlockedDecrement((volatile LONG*)(&(ppi)->RefCount)) == 0) \
+    { \
+        ASSERT(((ppi)->W32PF_flags & W32PF_TERMINATED) != 0); \
+        UserDeleteW32Process(ppi); \
+    } \
+} while(0)
+
+
 typedef struct _W32HEAP_USER_MAPPING
 {
-    struct _W32HEAP_USER_MAPPING *Next;
+    struct _W32HEAP_USER_MAPPINGNext;
     PVOID KernelMapping;
     PVOID UserMapping;
     ULONG_PTR Limit;
@@ -170,67 +217,81 @@ typedef struct tagUSERSTARTUPINFO
 
 typedef struct _W32PROCESS
 {
-  PEPROCESS     peProcess;
-  DWORD         RefCount;
-  ULONG         W32PF_flags;
-  PKEVENT       InputIdleEvent;
-  DWORD         StartCursorHideTime;
-  struct _W32PROCESS * NextStart;
-  PVOID         pDCAttrList;
-  PVOID         pBrushAttrList;
-  DWORD         W32Pid;
-  LONG          GDIHandleCount;
-  LONG          UserHandleCount;
-  PEX_PUSH_LOCK GDIPushLock;  /* Locking Process during access to structure. */
-  RTL_AVL_TABLE GDIEngUserMemAllocTable;  /* Process AVL Table. */
-  LIST_ENTRY    GDIDcAttrFreeList;
-  LIST_ENTRY    GDIBrushAttrFreeList;
+    PEPROCESS     peProcess;
+    DWORD         RefCount;
+    ULONG         W32PF_flags;
+    PKEVENT       InputIdleEvent;
+    DWORD         StartCursorHideTime;
+    struct _W32PROCESS* NextStart;
+    PVOID         pDCAttrList;
+    PVOID         pBrushAttrList;
+    DWORD         W32Pid;
+    LONG          GDIHandleCount;
+    LONG          UserHandleCount;
+    PEX_PUSH_LOCK GDIPushLock;  /* Locking Process during access to structure. */
+    RTL_AVL_TABLE GDIEngUserMemAllocTable;  /* Process AVL Table. */
+    LIST_ENTRY    GDIDcAttrFreeList;
+    LIST_ENTRY    GDIBrushAttrFreeList;
 } W32PROCESS, *PW32PROCESS;
 
 #define CLIBS 32
 
+#ifdef __cplusplus
+typedef struct _PROCESSINFO : _W32PROCESS
+{
+#else
 typedef struct _PROCESSINFO
 {
-  W32PROCESS;
-  PTHREADINFO ptiList;
-  PTHREADINFO ptiMainThread;
-  struct _DESKTOP* rpdeskStartup;
-  PPROCESSINFO ppiNext;
-  PCLS pclsPrivateList;
-  PCLS pclsPublicList;
-  INT cThreads;
-  HDESK hdeskStartup;
-  DWORD dwhmodLibLoadedMask;
-  HANDLE ahmodLibLoaded[CLIBS];
-  struct _WINSTATION_OBJECT *prpwinsta;
-  HWINSTA hwinsta;
-  ACCESS_MASK amwinsta;
-  DWORD dwHotkey;
-  HMONITOR hMonitor;
-  LUID luidSession;
-  USERSTARTUPINFO usi;
-  DWORD dwLayout;
-  DWORD dwRegisteredClasses;
-  /* ReactOS */
-  LIST_ENTRY MenuListHead;
-  FAST_MUTEX PrivateFontListLock;
-  LIST_ENTRY PrivateFontListHead;
-  FAST_MUTEX DriverObjListLock;
-  LIST_ENTRY DriverObjListHead;
-  struct tagKL* KeyboardLayout; // THREADINFO only
-  W32HEAP_USER_MAPPING HeapMappings;
-  struct _GDI_POOL *pPoolDcAttr;
-  struct _GDI_POOL *pPoolBrushAttr;
-  struct _GDI_POOL *pPoolRgnAttr;
+    W32PROCESS;
+#endif
+    PTHREADINFO ptiList;
+    PTHREADINFO ptiMainThread;
+    struct _DESKTOP* rpdeskStartup;
+    struct _CLS *pclsPrivateList;
+    struct _CLS *pclsPublicList;
+    PPROCESSINFO ppiNext;
+    INT cThreads;
+    HDESK hdeskStartup;
+    DWORD dwhmodLibLoadedMask;
+    HANDLE ahmodLibLoaded[CLIBS];
+    struct _WINSTATION_OBJECT* prpwinsta;
+    HWINSTA hwinsta;
+    ACCESS_MASK amwinsta;
+    DWORD dwHotkey;
+    HMONITOR hMonitor;
+    UINT iClipSerialNumber;
+    struct _CURICON_OBJECT* pCursorCache;
+    PVOID pClientBase;
+    DWORD dwLpkEntryPoints;
+    PVOID pW32Job;
+    DWORD dwImeCompatFlags;
+    LUID luidSession;
+    USERSTARTUPINFO usi;
+    DWORD dwLayout;
+    DWORD dwRegisteredClasses;
+
+    /* ReactOS */
+    FAST_MUTEX PrivateFontListLock;
+    LIST_ENTRY PrivateFontListHead;
+    LIST_ENTRY PrivateMemFontListHead;
+    UINT PrivateMemFontHandleCount;
+
+    FAST_MUTEX DriverObjListLock;
+    LIST_ENTRY DriverObjListHead;
+    W32HEAP_USER_MAPPING HeapMappings;
+    struct _GDI_POOL* pPoolDcAttr;
+    struct _GDI_POOL* pPoolBrushAttr;
+    struct _GDI_POOL* pPoolRgnAttr;
 
 #if DBG
-  BYTE DbgChannelLevel[DbgChCount];
-  DWORD DbgHandleCount[TYPE_CTYPES];
-#endif
+    BYTE DbgChannelLevel[DbgChCount];
+#ifndef __cplusplus
+    DWORD DbgHandleCount[TYPE_CTYPES];
+#endif // __cplusplus
+#endif // DBG
 } PROCESSINFO;
 
 #if DBG
 void NTAPI UserDbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments);
 ULONG_PTR NTAPI UserDbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult);
 #endif
-