add SEH to NtW32Call and directly use KeUserModeCallback in win32k instead

svn path=/trunk/; revision=20984
This commit is contained in:
Thomas Bluemel 2006-01-22 20:34:47 +00:00
parent 6075158a14
commit 8833666d3e
3 changed files with 72 additions and 39 deletions

View file

@ -426,8 +426,8 @@ NtW32Call(
IN ULONG RoutineIndex, IN ULONG RoutineIndex,
IN PVOID Argument, IN PVOID Argument,
IN ULONG ArgumentLength, IN ULONG ArgumentLength,
OUT PVOID* Result OPTIONAL, OUT PVOID* Result,
OUT PULONG ResultLength OPTIONAL OUT PULONG ResultLength
); );
NTSTATUS NTSTATUS

View file

@ -192,25 +192,56 @@ STDCALL
NtW32Call(IN ULONG RoutineIndex, NtW32Call(IN ULONG RoutineIndex,
IN PVOID Argument, IN PVOID Argument,
IN ULONG ArgumentLength, IN ULONG ArgumentLength,
OUT PVOID* Result OPTIONAL, OUT PVOID* Result,
OUT PULONG ResultLength OPTIONAL) 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); RoutineIndex, Argument, ArgumentLength);
/* FIXME: SEH!!! */ /* must not be called as KernelMode! */
ASSERT(KeGetPreviousMode() != KernelMode);
_SEH_TRY
{
ProbeForWritePointer(Result);
ProbeForWriteUlong(ResultLength);
}
_SEH_HANDLE
{
Status = _SEH_GetExceptionCode();
}
_SEH_END;
if (NT_SUCCESS(Status))
{
/* Call kernel function */ /* Call kernel function */
CallbackStatus = KeUserModeCallback(RoutineIndex, Status = KeUserModeCallback(RoutineIndex,
Argument, Argument,
ArgumentLength, ArgumentLength,
Result, &RetResult,
ResultLength); &RetResultLength);
if (NT_SUCCESS(Status))
{
_SEH_TRY
{
*Result = RetResult;
*ResultLength = RetResultLength;
}
_SEH_HANDLE
{
Status = _SEH_GetExceptionCode();
}
_SEH_END;
}
}
/* Return the result */ /* Return the result */
return(CallbackStatus); return Status;
} }
/* EOF */ /* EOF */

View file

@ -116,6 +116,8 @@ co_IntCallSentMessageCallback(SENDASYNCPROC CompletionCallback,
LRESULT Result) LRESULT Result)
{ {
SENDASYNCPROC_CALLBACK_ARGUMENTS Arguments; SENDASYNCPROC_CALLBACK_ARGUMENTS Arguments;
PVOID ResultPointer;
ULONG ResultLength;
NTSTATUS Status; NTSTATUS Status;
Arguments.Callback = CompletionCallback; Arguments.Callback = CompletionCallback;
@ -126,11 +128,11 @@ co_IntCallSentMessageCallback(SENDASYNCPROC CompletionCallback,
UserLeaveCo(); UserLeaveCo();
Status = NtW32Call(USER32_CALLBACK_SENDASYNCPROC, Status = KeUserModeCallback(USER32_CALLBACK_SENDASYNCPROC,
&Arguments, &Arguments,
sizeof(SENDASYNCPROC_CALLBACK_ARGUMENTS), sizeof(SENDASYNCPROC_CALLBACK_ARGUMENTS),
NULL, &ResultPointer,
NULL); &ResultLength);
UserEnterCo(); UserEnterCo();
@ -187,7 +189,7 @@ co_IntCallWindowProc(WNDPROC Proc,
UserLeaveCo(); UserLeaveCo();
Status = NtW32Call(USER32_CALLBACK_WINDOWPROC, Status = KeUserModeCallback(USER32_CALLBACK_WINDOWPROC,
Arguments, Arguments,
ArgumentLength, ArgumentLength,
&ResultPointer, &ResultPointer,
@ -232,7 +234,7 @@ co_IntLoadSysMenuTemplate()
UserLeaveCo(); UserLeaveCo();
Status = NtW32Call(USER32_CALLBACK_LOADSYSMENUTEMPLATE, Status = KeUserModeCallback(USER32_CALLBACK_LOADSYSMENUTEMPLATE,
NULL, NULL,
0, 0,
&ResultPointer, &ResultPointer,
@ -264,7 +266,7 @@ co_IntLoadDefaultCursors(VOID)
UserLeaveCo(); UserLeaveCo();
Status = NtW32Call(USER32_CALLBACK_LOADDEFAULTCURSORS, Status = KeUserModeCallback(USER32_CALLBACK_LOADDEFAULTCURSORS,
&DefaultCursor, &DefaultCursor,
sizeof(BOOL), sizeof(BOOL),
&ResultPointer, &ResultPointer,
@ -398,7 +400,7 @@ co_IntCallHookProc(INT HookId,
UserLeaveCo(); UserLeaveCo();
Status = NtW32Call(USER32_CALLBACK_HOOKPROC, Status = KeUserModeCallback(USER32_CALLBACK_HOOKPROC,
Argument, Argument,
ArgumentLength, ArgumentLength,
&ResultPointer, &ResultPointer,