mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 13:05:44 +00:00
add SEH to NtW32Call and directly use KeUserModeCallback in win32k instead
svn path=/trunk/; revision=20984
This commit is contained in:
parent
6075158a14
commit
8833666d3e
3 changed files with 72 additions and 39 deletions
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue