add SEH to NtW32Call and directly use KeUserModeCallback in win32k instead
Modified: trunk/reactos/include/ndk/kefuncs.h
Modified: trunk/reactos/ntoskrnl/ps/win32.c
Modified: trunk/reactos/subsys/win32k/ntuser/callback.c

Modified: trunk/reactos/include/ndk/kefuncs.h
--- trunk/reactos/include/ndk/kefuncs.h	2006-01-22 15:55:14 UTC (rev 20983)
+++ trunk/reactos/include/ndk/kefuncs.h	2006-01-22 20:34:47 UTC (rev 20984)
@@ -426,8 +426,8 @@
     IN ULONG RoutineIndex,
     IN PVOID Argument,
     IN ULONG ArgumentLength,
-    OUT PVOID* Result OPTIONAL,
-    OUT PULONG ResultLength OPTIONAL
+    OUT PVOID* Result,
+    OUT PULONG ResultLength
 );
 
 NTSTATUS

Modified: trunk/reactos/ntoskrnl/ps/win32.c
--- trunk/reactos/ntoskrnl/ps/win32.c	2006-01-22 15:55:14 UTC (rev 20983)
+++ trunk/reactos/ntoskrnl/ps/win32.c	2006-01-22 20:34:47 UTC (rev 20984)
@@ -192,25 +192,56 @@
 NtW32Call(IN ULONG RoutineIndex,
           IN PVOID Argument,
           IN ULONG ArgumentLength,
-          OUT PVOID* Result OPTIONAL,
-          OUT PULONG ResultLength OPTIONAL)
+          OUT PVOID* Result,
+          OUT PULONG ResultLength)
 {
-    NTSTATUS CallbackStatus;
+    PVOID RetResult;
+    ULONG RetResultLength;
+    NTSTATUS Status = STATUS_SUCCESS;
 
-    DPRINT("NtW32Call(RoutineIndex %d, Argument %X, ArgumentLength %d)\n",
+    DPRINT("NtW32Call(RoutineIndex %d, Argument %p, ArgumentLength %d)\n",
             RoutineIndex, Argument, ArgumentLength);
 
-    /* FIXME: SEH!!! */
+    /* must not be called as KernelMode! */
+    ASSERT(KeGetPreviousMode() != KernelMode);
 
-    /* Call kernel function */
-    CallbackStatus = KeUserModeCallback(RoutineIndex,
-                                        Argument,
-                                        ArgumentLength,
-                                        Result,
-                                        ResultLength);
+    _SEH_TRY
+    {
+        ProbeForWritePointer(Result);
+        ProbeForWriteUlong(ResultLength);
+    }
+    _SEH_HANDLE
+    {
+        Status = _SEH_GetExceptionCode();
+    }
+    _SEH_END;
 
+    if (NT_SUCCESS(Status))
+    {
+        /* Call kernel function */
+        Status = KeUserModeCallback(RoutineIndex,
+                                    Argument,
+                                    ArgumentLength,
+                                    &RetResult,
+                                    &RetResultLength);
+
+        if (NT_SUCCESS(Status))
+        {
+            _SEH_TRY
+            {
+                *Result = RetResult;
+                *ResultLength = RetResultLength;
+            }
+            _SEH_HANDLE
+            {
+                Status = _SEH_GetExceptionCode();
+            }
+            _SEH_END;
+        }
+    }
+
     /* Return the result */
-    return(CallbackStatus);
+    return Status;
 }
 
 /* EOF */

Modified: trunk/reactos/subsys/win32k/ntuser/callback.c
--- trunk/reactos/subsys/win32k/ntuser/callback.c	2006-01-22 15:55:14 UTC (rev 20983)
+++ trunk/reactos/subsys/win32k/ntuser/callback.c	2006-01-22 20:34:47 UTC (rev 20984)
@@ -116,6 +116,8 @@
                               LRESULT Result)
 {
    SENDASYNCPROC_CALLBACK_ARGUMENTS Arguments;
+   PVOID ResultPointer;
+   ULONG ResultLength;
    NTSTATUS Status;
 
    Arguments.Callback = CompletionCallback;
@@ -126,11 +128,11 @@
 
    UserLeaveCo();
 
-   Status = NtW32Call(USER32_CALLBACK_SENDASYNCPROC,
-                      &Arguments,
-                      sizeof(SENDASYNCPROC_CALLBACK_ARGUMENTS),
-                      NULL,
-                      NULL);
+   Status = KeUserModeCallback(USER32_CALLBACK_SENDASYNCPROC,
+                               &Arguments,
+                               sizeof(SENDASYNCPROC_CALLBACK_ARGUMENTS),
+                               &ResultPointer,
+                               &ResultLength);
 
    UserEnterCo();
 
@@ -187,11 +189,11 @@
 
    UserLeaveCo();
 
-   Status = NtW32Call(USER32_CALLBACK_WINDOWPROC,
-                      Arguments,
-                      ArgumentLength,
-                      &ResultPointer,
-                      &ResultLength);
+   Status = KeUserModeCallback(USER32_CALLBACK_WINDOWPROC,
+                               Arguments,
+                               ArgumentLength,
+                               &ResultPointer,
+                               &ResultLength);
 
    /* Simulate old behaviour: copy into our local buffer */
    RtlMoveMemory(Arguments, ResultPointer, ArgumentLength);
@@ -232,11 +234,11 @@
 
    UserLeaveCo();
 
-   Status = NtW32Call(USER32_CALLBACK_LOADSYSMENUTEMPLATE,
-                      NULL,
-                      0,
-                      &ResultPointer,
-                      &ResultLength);
+   Status = KeUserModeCallback(USER32_CALLBACK_LOADSYSMENUTEMPLATE,
+                               NULL,
+                               0,
+                               &ResultPointer,
+                               &ResultLength);
 
    /* Simulate old behaviour: copy into our local buffer */
    Result = *(LRESULT*)ResultPointer;
@@ -264,11 +266,11 @@
 
    UserLeaveCo();
 
-   Status = NtW32Call(USER32_CALLBACK_LOADDEFAULTCURSORS,
-                      &DefaultCursor,
-                      sizeof(BOOL),
-                      &ResultPointer,
-                      &ResultLength);
+   Status = KeUserModeCallback(USER32_CALLBACK_LOADDEFAULTCURSORS,
+                               &DefaultCursor,
+                               sizeof(BOOL),
+                               &ResultPointer,
+                               &ResultLength);
 
    /* Simulate old behaviour: copy into our local buffer */
    Result = *(LRESULT*)ResultPointer;
@@ -398,11 +400,11 @@
 
    UserLeaveCo();
 
-   Status = NtW32Call(USER32_CALLBACK_HOOKPROC,
-                      Argument,
-                      ArgumentLength,
-                      &ResultPointer,
-                      &ResultLength);
+   Status = KeUserModeCallback(USER32_CALLBACK_HOOKPROC,
+                               Argument,
+                               ArgumentLength,
+                               &ResultPointer,
+                               &ResultLength);
 
    /* Simulate old behaviour: copy into our local buffer */
    Result = *(LRESULT*)ResultPointer;