[WIN32K]
[reactos.git] / reactos / win32ss / user / ntuser / ntuser.c
index e763ed5..d86e563 100644 (file)
@@ -8,15 +8,20 @@
 #include <win32k.h>
 DBG_DEFAULT_CHANNEL(UserMisc);
 
+BOOL FASTCALL RegisterControlAtoms(VOID);
+
 /* GLOBALS ********************************************************************/
 
 PTHREADINFO gptiCurrent = NULL;
 PPROCESSINFO gppiInputProvider = NULL;
+BOOL g_AlwaysDisplayVersion = FALSE;
 ERESOURCE UserLock;
-ATOM AtomMessage; // Window Message atom.
-ATOM AtomWndObj;  // Window Object atom.
-ATOM AtomLayer;   // Window Layer atom.
+ATOM AtomMessage;       // Window Message atom.
+ATOM AtomWndObj;        // Window Object atom.
+ATOM AtomLayer;         // Window Layer atom.
 ATOM AtomFlashWndState; // Window Flash State atom.
+ATOM AtomDDETrack;      // Window DDE Tracking atom.
+ATOM AtomQOS;           // Window DDE Quality of Service atom.
 HINSTANCE hModClient = NULL;
 BOOL ClientPfnInit = FALSE;
 ATOM gaGuiConsoleWndClass;
@@ -27,6 +32,8 @@ static
 NTSTATUS FASTCALL
 InitUserAtoms(VOID)
 {
+    RegisterControlAtoms();
+
     gpsi->atomSysClass[ICLS_MENU]      = 32768;
     gpsi->atomSysClass[ICLS_DESKTOP]   = 32769;
     gpsi->atomSysClass[ICLS_DIALOG]    = 32770;
@@ -46,12 +53,16 @@ InitUserAtoms(VOID)
 
     gpsi->atomFrostedWindowProp = IntAddGlobalAtom(L"SysFrostedWindow", TRUE);
 
+    AtomDDETrack = IntAddGlobalAtom(L"SysDT", TRUE);
+    AtomQOS      = IntAddGlobalAtom(L"SysQOS", TRUE);
+
     /*
      * FIXME: AddPropW uses the global kernel atom table, thus leading to conflicts if we use
-     * the win32k atom table for this ones. What is the right thing to do ?
+     * the win32k atom table for this one. What is the right thing to do ?
      */
     // AtomWndObj = IntAddGlobalAtom(L"SysWNDO", TRUE);
     NtAddAtom(L"SysWNDO", 14, &AtomWndObj);
+
     AtomLayer = IntAddGlobalAtom(L"SysLayer", TRUE);
     AtomFlashWndState = IntAddGlobalAtom(L"FlashWState", TRUE);
 
@@ -66,6 +77,7 @@ NTAPI
 InitUserImpl(VOID)
 {
     NTSTATUS Status;
+    HKEY hKey;
 
     ExInitializeResourceLite(&UserLock);
 
@@ -84,6 +96,16 @@ InitUserImpl(VOID)
 
     InitUserAtoms();
 
+    Status = RegOpenKey(L"\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows",
+                        &hKey);
+    if (NT_SUCCESS(Status))
+    {
+        DWORD dwValue = 0;
+        RegReadDWORD(hKey, L"DisplayVersion", &dwValue);
+        g_AlwaysDisplayVersion = !!dwValue;
+        ZwClose(hKey);
+    }
+
     InitSysParams();
 
     return STATUS_SUCCESS;
@@ -103,8 +125,9 @@ UserInitialize(VOID)
     HBITMAP hPattern55AABitmap = NULL;
     NTSTATUS Status;
 
-// Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA)
-// Create Event for Diconnect Desktop.
+    NT_ASSERT(PsGetCurrentThreadWin32Thread() != NULL);
+
+// Create Event for Disconnect Desktop.
 
     Status = UserCreateWinstaDirectory();
     if (!NT_SUCCESS(Status)) return Status;
@@ -119,14 +142,7 @@ UserInitialize(VOID)
 //     Update Shared Device Caps.
 //     Initialize User Screen.
 // }
-// Create ThreadInfo for this Thread!
-// {
-
-    /* Initialize the current thread */
-    Status = InitThreadCallback(PsGetCurrentThread());
-    if (!NT_SUCCESS(Status)) return Status;
 
-// }
 // Set Global SERVERINFO Error flags.
 // Load Resources.
 
@@ -135,9 +151,13 @@ UserInitialize(VOID)
     if (gpsi->hbrGray == NULL)
     {
         hPattern55AABitmap = GreCreateBitmap(8, 8, 1, 1, (LPBYTE)wPattern55AA);
+        if (hPattern55AABitmap == NULL)
+            return STATUS_INSUFFICIENT_RESOURCES;
+
         gpsi->hbrGray = IntGdiCreatePatternBrush(hPattern55AABitmap);
-        GreDeleteObject(hPattern55AABitmap);
-        GreSetBrushOwner(gpsi->hbrGray, GDI_OBJ_HMGR_PUBLIC);
+
+        if (gpsi->hbrGray == NULL)
+            return STATUS_INSUFFICIENT_RESOURCES;
     }
 
     return STATUS_SUCCESS;