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@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?rev... = = = = = = = = ====================================================================== --- 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 */ } _SEH_HANDLE {if (Disposition) *Disposition = ParseContext.Disposition;@@ -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); } _SEH_HANDLE {if (NT_SUCCESS(Status)) *KeyHandle = 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;
}
Best regards, Alex Ionescu