- Fix a large amount of bugs in ObpAllocateObjectAttributes & Name Modified: trunk/reactos/ntoskrnl/ke/wait.c Modified: trunk/reactos/ntoskrnl/ob/namespc.c Modified: trunk/reactos/ntoskrnl/ob/object.c _____
Modified: trunk/reactos/ntoskrnl/ke/wait.c --- trunk/reactos/ntoskrnl/ke/wait.c 2005-08-09 04:03:14 UTC (rev 17226) +++ trunk/reactos/ntoskrnl/ke/wait.c 2005-08-09 04:43:54 UTC (rev 17227) @@ -549,13 +549,15 @@
}
/* Block the Thread */ - DPRINT("Blocking the Thread: %d, %d, %d, %x\n", Alertable, WaitMode, WaitReason, KeGetCurrentThread()); + DPRINT("Blocking the Thread: %d, %d, %d, %x\n", Alertable, WaitMode, + WaitReason, KeGetCurrentThread()); KiBlockThread(&Status, Alertable, WaitMode, (UCHAR)WaitReason);
/* Check if we were executing an APC */ + DPRINT("Thread is back\n"); if (Status != STATUS_KERNEL_APC) {
/* Return Status */ @@ -568,7 +570,7 @@ } while (TRUE);
/* Release the Lock, we are done */ - DPRINT("Returning from KeWaitForMultipleObjects(), %x. Status: %d\n", KeGetCurrentThread(), Status); + DPRINT("Returning, %x. Status: %d\n", KeGetCurrentThread(), Status); KeReleaseDispatcherDatabaseLock(CurrentThread->WaitIrql); return Status;
@@ -577,7 +579,8 @@ KiAdjustQuantumThread(CurrentThread);
/* Release & Return */ - DPRINT("Returning from KeWaitForMultipleObjects(), %x. Status: %d\n. We did not wait.", KeGetCurrentThread(), Status); + DPRINT("Returning, %x. Status: %d\n. We did not wait.", + KeGetCurrentThread(), Status); KeReleaseDispatcherDatabaseLock(CurrentThread->WaitIrql); return Status; } _____
Modified: trunk/reactos/ntoskrnl/ob/namespc.c --- trunk/reactos/ntoskrnl/ob/namespc.c 2005-08-09 04:03:14 UTC (rev 17226) +++ trunk/reactos/ntoskrnl/ob/namespc.c 2005-08-09 04:43:54 UTC (rev 17227) @@ -65,30 +65,26 @@
PVOID Object = NULL; UNICODE_STRING RemainingPath; UNICODE_STRING ObjectName; - OBJECT_ATTRIBUTES ObjectAttributes; OBJECT_CREATE_INFORMATION ObjectCreateInfo; NTSTATUS Status;
PAGED_CODE();
- InitializeObjectAttributes(&ObjectAttributes, - ObjectPath, - Attributes | OBJ_OPENIF, - NULL, - NULL); - - /* Capture all the info */ - DPRINT("Capturing Create Info\n"); - Status = ObpCaptureObjectAttributes(&ObjectAttributes, - AccessMode, - ObjectType, - &ObjectCreateInfo, - &ObjectName); + /* Capture the name */ + DPRINT("Capturing Name\n"); + Status = ObpCaptureObjectName(&ObjectName, ObjectPath, AccessMode); if (!NT_SUCCESS(Status)) { - DPRINT("ObpCaptureObjectAttributes() failed (Status %lx)\n", Status); + DPRINT("ObpCaptureObjectName() failed (Status %lx)\n", Status); return Status; } + + /* + * Create a fake ObjectCreateInfo structure. Note that my upcoming + * ObFindObject refactoring will remove the need for this hack. + */ + ObjectCreateInfo.RootDirectory = NULL; + ObjectCreateInfo.Attributes = Attributes;
Status = ObFindObject(&ObjectCreateInfo, &ObjectName, @@ -96,7 +92,6 @@ &RemainingPath, ObjectType);
- ObpReleaseCapturedAttributes(&ObjectCreateInfo); if (ObjectName.Buffer) ExFreePool(ObjectName.Buffer);
if (!NT_SUCCESS(Status)) _____
Modified: trunk/reactos/ntoskrnl/ob/object.c --- trunk/reactos/ntoskrnl/ob/object.c 2005-08-09 04:03:14 UTC (rev 17226) +++ trunk/reactos/ntoskrnl/ob/object.c 2005-08-09 04:43:54 UTC (rev 17227) @@ -17,6 +17,7 @@
#define UNICODE_PATH_SEP L'\' #define UNICODE_NO_PATH L"..." +#define OB_NAME_TAG TAG('O','b','N','m')
typedef struct _RETENTION_CHECK_PARAMS { @@ -33,78 +34,85 @@ IN KPROCESSOR_MODE AccessMode) { NTSTATUS Status = STATUS_SUCCESS; + ULONG StringLength; + PWCHAR StringBuffer; UNICODE_STRING LocalName = {}; /* <= GCC 4.0 + Optimizer */
- /* First Probe the String */ - DPRINT("ObpCaptureObjectName: %wZ\n", ObjectName); - if (AccessMode != KernelMode) + /* Initialize the Input String */ + RtlInitUnicodeString(CapturedName, NULL); + + /* Protect everything */ + _SEH_TRY { - DPRINT("Probing Struct\n"); - _SEH_TRY + /* First Probe the String */ + DPRINT("ObpCaptureObjectName: %wZ\n", ObjectName); + if (AccessMode != KernelMode) { - /* FIXME: Explorer or win32 broken I think */ - #if 0 ProbeForRead(ObjectName, sizeof(UNICODE_STRING), sizeof(USHORT)); - #endif LocalName = *ObjectName; + + ProbeForRead(LocalName.Buffer, + LocalName.Length, + sizeof(WCHAR)); } - _SEH_HANDLE + else { - Status = _SEH_GetExceptionCode(); + /* No probing needed */ + LocalName = *ObjectName; } - _SEH_END; - - if (NT_SUCCESS(Status)) + + /* Make sure there really is a string */ + DPRINT("Probing OK\n"); + if ((StringLength = LocalName.Length)) { - DPRINT("Probing OK\n"); - _SEH_TRY + /* Check that the size is a valid WCHAR multiple */ + if ((StringLength & (sizeof(WCHAR) - 1)) || + /* Check that the NULL-termination below will work */ + (StringLength == (MAXUSHORT - sizeof(WCHAR) + 1))) { - #if 0 - DPRINT("Probing buffer\n"); - ProbeForRead(LocalName.Buffer, - LocalName.Length, - sizeof(USHORT)); - #endif + /* PS: Please keep the checks above expanded for clarity */ + DPRINT1("Invalid String Length\n"); + Status = STATUS_OBJECT_NAME_INVALID; } - _SEH_HANDLE + else { - Status = _SEH_GetExceptionCode(); + /* Allocate a non-paged buffer for this string */ + DPRINT("Capturing String\n"); + CapturedName->Length = StringLength; + CapturedName->MaximumLength = StringLength + sizeof(WCHAR); + if ((StringBuffer = ExAllocatePoolWithTag(NonPagedPool, + StringLength + sizeof(WCHAR), + OB_NAME_TAG))) + { + /* Copy the string and null-terminate it */ + RtlMoveMemory(StringBuffer, LocalName.Buffer, StringLength); + StringBuffer[StringLength / sizeof(WCHAR)] = UNICODE_NULL; + CapturedName->Buffer = StringBuffer; + DPRINT("String Captured: %wZ\n", CapturedName); + } + else + { + /* Fail */ + DPRINT1("Out of Memory!\n"); + Status = STATUS_INSUFFICIENT_RESOURCES; + } } - _SEH_END; } - - /* Fail if anything up to here died */ - if (!NT_SUCCESS(Status)) - { - DPRINT1("Probing failed\n"); - return Status; - } } - else + _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { - LocalName = *ObjectName; + Status = _SEH_GetExceptionCode(); + + /* Remember to free the buffer in case of failure */ + DPRINT1("Failed\n"); + if (StringBuffer) ExFreePool(StringBuffer); } + _SEH_END;
- /* Make sure there really is a string */ - DPRINT("Probing OK\n"); - if (LocalName.Length) - { - /* Allocate a non-paged buffer for this string */ - DPRINT("Capturing String\n"); - CapturedName->Length = LocalName.Length; - CapturedName->MaximumLength = LocalName.Length + sizeof(WCHAR); - CapturedName->Buffer = ExAllocatePoolWithTag(NonPagedPool, - CapturedName->MaximumLength, - TAG('O','b','N','m')); - - /* Copy the string and null-terminate it */ - RtlMoveMemory(CapturedName->Buffer, LocalName.Buffer, LocalName.Length); - CapturedName->Buffer[LocalName.Length / sizeof(WCHAR)] = UNICODE_NULL; - DPRINT("String Captured: %p, %wZ\n", CapturedName, CapturedName); - } - + /* Return */ + DPRINT("Returning: %lx\n", Status); return Status; }
@@ -125,115 +133,102 @@ DPRINT("ObpCaptureObjectAttributes\n"); RtlZeroMemory(ObjectCreateInfo, sizeof(OBJECT_CREATE_INFORMATION));
- /* Check if we got Oba */ - if (ObjectAttributes) + /* SEH everything here for protection */ + _SEH_TRY { - if (AccessMode != KernelMode) + /* Check if we got Oba */ + if (ObjectAttributes) { - DPRINT("Probing OBA\n"); - _SEH_TRY + if (AccessMode != KernelMode) { - /* FIXME: SMSS SENDS BULLSHIT. */ - #if 0 + DPRINT("Probing OBA\n"); ProbeForRead(ObjectAttributes, - sizeof(ObjectAttributes), + sizeof(OBJECT_ATTRIBUTES), sizeof(ULONG)); - #endif } - _SEH_HANDLE + + /* Validate the Size and Attributes */ + DPRINT("Validating OBA\n"); + if ((ObjectAttributes->Length != sizeof(OBJECT_ATTRIBUTES)) || + (ObjectAttributes->Attributes & ~OBJ_VALID_ATTRIBUTES)) { - Status = _SEH_GetExceptionCode(); + Status = STATUS_INVALID_PARAMETER; + DPRINT1("Invalid Size: %lx or Attributes: %lx\n", + ObjectAttributes->Length, ObjectAttributes->Attributes); + goto Quickie; } - _SEH_END; - }
- /* Validate the Size */ - DPRINT("Validating OBA\n"); - if (ObjectAttributes->Length != sizeof(OBJECT_ATTRIBUTES)) - { - Status = STATUS_INVALID_PARAMETER; - } - - /* Fail if SEH or Size Validation failed */ - if(!NT_SUCCESS(Status)) - { - DPRINT1("ObpCaptureObjectAttributes failed to probe object attributes\n"); - goto fail; - } + /* Set some Create Info */ + DPRINT("Creating OBCI\n"); + ObjectCreateInfo->RootDirectory = ObjectAttributes->RootDirectory; + ObjectCreateInfo->Attributes = ObjectAttributes->Attributes; + LocalObjectName = ObjectAttributes->ObjectName; + SecurityDescriptor = ObjectAttributes->SecurityDescriptor; + SecurityQos = ObjectAttributes->SecurityQualityOfService;
- /* Set some Create Info */ - DPRINT("Creating OBCI\n"); - ObjectCreateInfo->RootDirectory = ObjectAttributes->RootDirectory; - ObjectCreateInfo->Attributes = ObjectAttributes->Attributes; - LocalObjectName = ObjectAttributes->ObjectName; - SecurityDescriptor = ObjectAttributes->SecurityDescriptor; - SecurityQos = ObjectAttributes->SecurityQualityOfService; - - /* Validate the SD */ - if (SecurityDescriptor) - { - DPRINT("Probing SD: %x\n", SecurityDescriptor); - Status = SeCaptureSecurityDescriptor(SecurityDescriptor, - AccessMode, - NonPagedPool, - TRUE, - &ObjectCreateInfo->SecurityDescriptor); - if(!NT_SUCCESS(Status)) + /* Validate the SD */ + if (SecurityDescriptor) { - DPRINT1("Unable to capture the security descriptor!!!\n"); - ObjectCreateInfo->SecurityDescriptor = NULL; - goto fail; - } + DPRINT("Probing SD: %x\n", SecurityDescriptor); + Status = SeCaptureSecurityDescriptor(SecurityDescriptor, + AccessMode, + NonPagedPool, + TRUE, + &ObjectCreateInfo->SecurityDescriptor); + if(!NT_SUCCESS(Status)) + { + DPRINT1("Unable to capture the security descriptor!!!\n"); + ObjectCreateInfo->SecurityDescriptor = NULL; + goto Quickie; + }
- DPRINT("Probe done\n"); - ObjectCreateInfo->SecurityDescriptorCharge = 0; /* FIXME */ - ObjectCreateInfo->ProbeMode = AccessMode; - } + DPRINT("Probe done\n"); + ObjectCreateInfo->SecurityDescriptorCharge = 2048; /* FIXME */ + ObjectCreateInfo->ProbeMode = AccessMode; + }
- /* Validate the QoS */ - if (SecurityQos) - { - if (AccessMode != KernelMode) + /* Validate the QoS */ + if (SecurityQos) { - DPRINT("Probing QoS\n"); - _SEH_TRY + if (AccessMode != KernelMode) { + DPRINT("Probing QoS\n"); ProbeForRead(SecurityQos, sizeof(SECURITY_QUALITY_OF_SERVICE), sizeof(ULONG)); } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - } - - if(!NT_SUCCESS(Status)) - { - DPRINT1("Unable to capture QoS!!!\n"); - goto fail; - }
- ObjectCreateInfo->SecurityQualityOfService = *SecurityQos; - ObjectCreateInfo->SecurityQos = &ObjectCreateInfo->SecurityQualityOfService; + /* Save Info */ + ObjectCreateInfo->SecurityQualityOfService = *SecurityQos; + ObjectCreateInfo->SecurityQos = &ObjectCreateInfo->SecurityQualityOfService; + } } + else + { + LocalObjectName = NULL; + } } - - /* Clear Local Object Name */ - DPRINT("Clearing name\n"); - RtlZeroMemory(ObjectName, sizeof(UNICODE_STRING)); - + _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) + { + Status = _SEH_GetExceptionCode(); + DPRINT1("Failed\n"); + goto Quickie; + } + _SEH_END; + /* Now check if the Object Attributes had an Object Name */ if (LocalObjectName) { - DPRINT("Name Buffer: %x\n", LocalObjectName->Buffer); + DPRINT("Name Buffer: %wZ\n", LocalObjectName); Status = ObpCaptureObjectName(ObjectName, LocalObjectName, AccessMode); } else { + /* Clear the string */ + RtlInitUnicodeString(ObjectName, NULL); + /* He can't have specified a Root Directory */ if (ObjectCreateInfo->RootDirectory) { @@ -242,14 +237,14 @@ } }
-fail: +Quickie: if (!NT_SUCCESS(Status)) { DPRINT1("Failed to capture, cleaning up\n"); ObpReleaseCapturedAttributes(ObjectCreateInfo); }
- DPRINT("Return to caller\n"); + DPRINT("Return to caller %x\n", Status); return Status; }
@@ -795,7 +790,7 @@ /* Capture all the info */ DPRINT("Capturing Create Info\n"); Status = ObpCaptureObjectAttributes(ObjectAttributes, - AccessMode, + ObjectAttributesAccessMode, Type, ObjectCreateInfo, &ObjectName);