Author: fireball Date: Mon Jun 23 07:45:27 2008 New Revision: 34059
URL: http://svn.reactos.org/svn/reactos?rev=34059&view=rev Log: - Fix CM SEH by public demand.
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] Mon Jun 23 07:45:27 2008 @@ -34,11 +34,11 @@ PAGED_CODE(); DPRINT("NtCreateKey(OB 0x%wZ)\n", ObjectAttributes->ObjectName);
- /* Prepare to probe parameters */ - _SEH_TRY - { - /* Check for user-mode caller */ - if (PreviousMode == UserMode) + /* Check for user-mode caller */ + if (PreviousMode == UserMode) + { + /* Prepare to probe parameters */ + _SEH_TRY { /* Check if we have a class */ if (Class) @@ -50,32 +50,43 @@ sizeof(WCHAR)); ParseContext.Class = *Class; } - + /* Probe the key handle */ ProbeForWriteHandle(KeyHandle); *KeyHandle = NULL; - + /* Probe object attributes */ ProbeForRead(ObjectAttributes, sizeof(OBJECT_ATTRIBUTES), 4); } - else + _SEH_HANDLE { - /* Save the class directly */ - if (Class) ParseContext.Class = *Class; + /* Get the error code */ + Status = _SEH_GetExceptionCode(); } - - /* Setup the parse context */ - ParseContext.CreateOperation = TRUE; - ParseContext.CreateOptions = CreateOptions; - - /* Do the create */ - Status = ObOpenObjectByName(ObjectAttributes, - CmpKeyObjectType, - PreviousMode, - NULL, - DesiredAccess, - &ParseContext, - &Handle); + _SEH_END; + if(!NT_SUCCESS(Status)) return Status; + } + else + { + /* 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); + + _SEH_TRY + { if (NT_SUCCESS(Status)) *KeyHandle = Handle;
/* Return data to user */ @@ -105,11 +116,11 @@ PAGED_CODE(); DPRINT("NtOpenKey(OB 0x%wZ)\n", ObjectAttributes->ObjectName);
- /* Prepare to probe parameters */ - _SEH_TRY - { - /* Check for user-mode caller */ - if (PreviousMode == UserMode) + /* Check for user-mode caller */ + if (PreviousMode == UserMode) + { + /* Prepare to probe parameters */ + _SEH_TRY { /* Probe the key handle */ ProbeForWriteHandle(KeyHandle); @@ -118,23 +129,36 @@ /* 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 - { - /* Get the status */ - Status = _SEH_GetExceptionCode(); - } - _SEH_END; + _SEH_HANDLE + { + /* Get the status */ + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + } + + /* Just let the object manager handle this */ + Status = ObOpenObjectByName(ObjectAttributes, + CmpKeyObjectType, + ExGetPreviousMode(), + NULL, + DesiredAccess, + &ParseContext, + &Handle); + + if (NT_SUCCESS(Status)) + { + _SEH_TRY + { + *KeyHandle = Handle; + } + _SEH_HANDLE + { + /* Get the status */ + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + }
/* Return status */ return Status;