Do you even realize the consequences of running the entire Object
Manager code paths, the parse routine, and the other ~2500 lines of
code associated with these APIs under SEH?
I'd guess not.
On 22-Jun-08, at 9:24 AM, fireball(a)svn.reactos.org wrote:
Author: fireball
Date: Sun Jun 22 11:24:15 2008
New Revision: 34047
URL:
http://svn.reactos.org/svn/reactos?rev=34047&view=rev
Log:
- Extend SEH to cover writing result to output arguments. Noticed by
Stefan Ginsberg.
Modified:
trunk/reactos/ntoskrnl/config/ntapi.c
Modified: trunk/reactos/ntoskrnl/config/ntapi.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/ntapi.c?re…
=
=
=
=
=
=
=
=
======================================================================
--- trunk/reactos/ntoskrnl/config/ntapi.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/config/ntapi.c [iso-8859-1] Sun Jun 22
11:24:15 2008
@@ -63,6 +63,23 @@
/* Save the class directly */
if (Class) ParseContext.Class = *Class;
}
+
+ /* Setup the parse context */
+ ParseContext.CreateOperation = TRUE;
+ ParseContext.CreateOptions = CreateOptions;
+
+ /* Do the create */
+ Status = ObOpenObjectByName(ObjectAttributes,
+ CmpKeyObjectType,
+ PreviousMode,
+ NULL,
+ DesiredAccess,
+ &ParseContext,
+ &Handle);
+ if (NT_SUCCESS(Status)) *KeyHandle = Handle;
+
+ /* Return data to user */
+ if (Disposition) *Disposition = ParseContext.Disposition;
}
_SEH_HANDLE
{
@@ -70,24 +87,8 @@
Status = _SEH_GetExceptionCode();
}
_SEH_END;
- if (!NT_SUCCESS(Status)) return Status;
-
- /* Setup the parse context */
- ParseContext.CreateOperation = TRUE;
- ParseContext.CreateOptions = CreateOptions;
-
- /* Do the create */
- Status = ObOpenObjectByName(ObjectAttributes,
- CmpKeyObjectType,
- PreviousMode,
- NULL,
- DesiredAccess,
- &ParseContext,
- &Handle);
- if (NT_SUCCESS(Status)) *KeyHandle = Handle;
-
- /* Return data to user */
- if (Disposition) *Disposition = ParseContext.Disposition;
+
+ /* Return status */
return Status;
}
@@ -109,14 +110,24 @@
{
/* Check for user-mode caller */
if (PreviousMode == UserMode)
- {
+ {
/* Probe the key handle */
ProbeForWriteHandle(KeyHandle);
*KeyHandle = NULL;
-
+
/* Probe object attributes */
ProbeForRead(ObjectAttributes,
sizeof(OBJECT_ATTRIBUTES), 4);
}
+
+ /* Just let the object manager handle this */
+ Status = ObOpenObjectByName(ObjectAttributes,
+ CmpKeyObjectType,
+ ExGetPreviousMode(),
+ NULL,
+ DesiredAccess,
+ &ParseContext,
+ &Handle);
+ if (NT_SUCCESS(Status)) *KeyHandle = Handle;
}
_SEH_HANDLE
{
@@ -124,18 +135,7 @@
Status = _SEH_GetExceptionCode();
}
_SEH_END;
- if (!NT_SUCCESS(Status)) return Status;
-
- /* Just let the object manager handle this */
- Status = ObOpenObjectByName(ObjectAttributes,
- CmpKeyObjectType,
- ExGetPreviousMode(),
- NULL,
- DesiredAccess,
- &ParseContext,
- &Handle);
- if (NT_SUCCESS(Status)) *KeyHandle = Handle;
-
+
/* Return status */
return Status;
}