revert my last changes back to Alex's version of ObpCaptureObjectAttributes as I'm being an incompetent ass. This will introduce several vulnerabilities and bugs again. Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c Modified: trunk/reactos/ntoskrnl/cm/registry.c Modified: trunk/reactos/ntoskrnl/include/internal/ob.h Modified: trunk/reactos/ntoskrnl/lpc/connect.c Modified: trunk/reactos/ntoskrnl/ob/handle.c Modified: trunk/reactos/ntoskrnl/ob/namespc.c Modified: trunk/reactos/ntoskrnl/ob/object.c _____
Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c --- trunk/reactos/ntoskrnl/cm/ntfunc.c 2005-08-08 16:57:50 UTC (rev 17216) +++ trunk/reactos/ntoskrnl/cm/ntfunc.c 2005-08-08 16:58:30 UTC (rev 17217) @@ -192,19 +192,20 @@
PWSTR Start; UNICODE_STRING ObjectName; OBJECT_CREATE_INFORMATION ObjectCreateInfo; - KPROCESSOR_MODE PreviousMode; unsigned i;
PAGED_CODE(); - - PreviousMode = KeGetPreviousMode();
+ DPRINT("NtCreateKey (Name %wZ KeyHandle 0x%p Root 0x%p)\n", + ObjectAttributes->ObjectName, + KeyHandle, + ObjectAttributes->RootDirectory); + /* Capture all the info */ DPRINT("Capturing Create Info\n"); Status = ObpCaptureObjectAttributes(ObjectAttributes, - PreviousMode, - PagedPool, - FALSE, + KeGetPreviousMode(), + CmiKeyType, &ObjectCreateInfo, &ObjectName); if (!NT_SUCCESS(Status)) @@ -218,10 +219,8 @@ (PVOID*)&Object, &RemainingPath, CmiKeyType); - ObpReleaseCapturedAttributes(&ObjectCreateInfo, - &ObjectName, - PreviousMode, - FALSE); + ObpReleaseCapturedAttributes(&ObjectCreateInfo); + if (ObjectName.Buffer) ExFreePool(ObjectName.Buffer); if (!NT_SUCCESS(Status)) { DPRINT("CmpFindObject failed, Status: 0x%x\n", Status); @@ -1170,8 +1169,7 @@ DPRINT("Capturing Create Info\n"); Status = ObpCaptureObjectAttributes(ObjectAttributes, PreviousMode, - PagedPool, - FALSE, + CmiKeyType, &ObjectCreateInfo, &ObjectName); if (!NT_SUCCESS(Status)) @@ -1187,10 +1185,8 @@ (PVOID*)&Object, &RemainingPath, CmiKeyType); - ObpReleaseCapturedAttributes(&ObjectCreateInfo, - &ObjectName, - PreviousMode, - FALSE); + ObpReleaseCapturedAttributes(&ObjectCreateInfo); + if (ObjectName.Buffer) ExFreePool(ObjectName.Buffer); if (!NT_SUCCESS(Status)) { DPRINT("CmpFindObject() returned 0x%08lx\n", Status); _____
Modified: trunk/reactos/ntoskrnl/cm/registry.c --- trunk/reactos/ntoskrnl/cm/registry.c 2005-08-08 16:57:50 UTC (rev 17216) +++ trunk/reactos/ntoskrnl/cm/registry.c 2005-08-08 16:58:30 UTC (rev 17217) @@ -705,8 +705,7 @@
DPRINT("Capturing Create Info\n"); Status = ObpCaptureObjectAttributes(KeyObjectAttributes, KernelMode, - PagedPool, - FALSE, + CmiKeyType, &ObjectCreateInfo, &ObjectName); if (!NT_SUCCESS(Status)) @@ -720,10 +719,8 @@ (PVOID*)&ParentKey, &RemainingPath, CmiKeyType); - ObpReleaseCapturedAttributes(&ObjectCreateInfo, - &ObjectName, - KernelMode, - FALSE); + ObpReleaseCapturedAttributes(&ObjectCreateInfo); + if (ObjectName.Buffer) ExFreePool(ObjectName.Buffer); if (!NT_SUCCESS(Status)) { return Status; _____
Modified: trunk/reactos/ntoskrnl/include/internal/ob.h --- trunk/reactos/ntoskrnl/include/internal/ob.h 2005-08-08 16:57:50 UTC (rev 17216) +++ trunk/reactos/ntoskrnl/include/internal/ob.h 2005-08-08 16:58:30 UTC (rev 17217) @@ -173,6 +173,14 @@
/* Secure object information functions */
+typedef struct _CAPTURED_OBJECT_ATTRIBUTES +{ + HANDLE RootDirectory; + ULONG Attributes; + PSECURITY_DESCRIPTOR SecurityDescriptor; + PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService; +} CAPTURED_OBJECT_ATTRIBUTES, *PCAPTURED_OBJECT_ATTRIBUTES; + NTSTATUS STDCALL ObpCaptureObjectName(IN PUNICODE_STRING CapturedName, @@ -181,19 +189,16 @@
NTSTATUS STDCALL -ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, +ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes, IN KPROCESSOR_MODE AccessMode, - IN POOL_TYPE PoolType, - IN BOOLEAN CaptureIfKernel, - OUT POBJECT_CREATE_INFORMATION CapturedObjectAttributes OPTIONAL, - OUT PUNICODE_STRING ObjectName OPTIONAL); + IN POBJECT_TYPE ObjectType, + IN POBJECT_CREATE_INFORMATION ObjectCreateInfo, + OUT PUNICODE_STRING ObjectName);
VOID STDCALL -ObpReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION CapturedObjectAttributes OPTIONAL, - IN PUNICODE_STRING ObjectName OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - IN BOOLEAN CaptureIfKernel); +ObpReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo); + /* object information classes */
#define ICIF_QUERY 0x1 _____
Modified: trunk/reactos/ntoskrnl/lpc/connect.c --- trunk/reactos/ntoskrnl/lpc/connect.c 2005-08-08 16:57:50 UTC (rev 17216) +++ trunk/reactos/ntoskrnl/lpc/connect.c 2005-08-08 16:58:30 UTC (rev 17217) @@ -410,7 +410,7 @@
NULL, PORT_ALL_ACCESS, /* DesiredAccess */ LpcPortObjectType, - PreviousMode, + UserMode, NULL, (PVOID*)&NamedPort); if (!NT_SUCCESS(Status)) @@ -430,7 +430,7 @@ Status = ObReferenceObjectByHandle(WriteMap.SectionHandle, SECTION_MAP_READ | SECTION_MAP_WRITE, MmSectionObjectType, - PreviousMode, + UserMode, (PVOID*)&SectionObject, NULL); if (!NT_SUCCESS(Status)) _____
Modified: trunk/reactos/ntoskrnl/ob/handle.c --- trunk/reactos/ntoskrnl/ob/handle.c 2005-08-08 16:57:50 UTC (rev 17216) +++ trunk/reactos/ntoskrnl/ob/handle.c 2005-08-08 16:58:30 UTC (rev 17217) @@ -955,7 +955,7 @@
/* First try to find the Object */ if (ObjectNameInfo && ObjectNameInfo->Name.Buffer) { - DPRINT("Object has a name. Trying to find it: "%wZ".\n", &ObjectNameInfo->Name); + DPRINT("Object has a name. Trying to find it: %wZ.\n", &ObjectNameInfo->Name); Status = ObFindObject(ObjectCreateInfo, &ObjectNameInfo->Name, &FoundObject, @@ -1132,10 +1132,7 @@
/* We can delete the Create Info now */ Header->ObjectCreateInfo = NULL; - ObpReleaseCapturedAttributes(ObjectCreateInfo, - NULL, - ObjectCreateInfo->ProbeMode, - FALSE); + ObpReleaseCapturedAttributes(ObjectCreateInfo); ExFreePool(ObjectCreateInfo);
DPRINT("Status %x\n", Status); _____
Modified: trunk/reactos/ntoskrnl/ob/namespc.c --- trunk/reactos/ntoskrnl/ob/namespc.c 2005-08-08 16:57:50 UTC (rev 17216) +++ trunk/reactos/ntoskrnl/ob/namespc.c 2005-08-08 16:58:30 UTC (rev 17217) @@ -70,35 +70,20 @@
NTSTATUS Status;
PAGED_CODE(); - - /* capture the ObjectPath */ - Status = RtlCaptureUnicodeString(&ObjectName, - AccessMode, - NonPagedPool, /* FIXME */ - FALSE, - ObjectPath); - if (!NT_SUCCESS(Status)) - { - DPRINT("RtlCaptureUnicodeString() failed (Status %lx)\n", Status); - return Status; - }
InitializeObjectAttributes(&ObjectAttributes, - &ObjectName, + ObjectPath, Attributes | OBJ_OPENIF, NULL, NULL);
- /* "Capture" all the info, it doesn't make sense to capture from the kernel - stack as the information should be safe anyway...just do a raw copy of the - data into the OBJECT_CREATE_INFORMATION structure */ + /* Capture all the info */ DPRINT("Capturing Create Info\n"); Status = ObpCaptureObjectAttributes(&ObjectAttributes, - KernelMode, /* raw copy! */ - NonPagedPool, - FALSE, + AccessMode, + ObjectType, &ObjectCreateInfo, - NULL); + &ObjectName); if (!NT_SUCCESS(Status)) { DPRINT("ObpCaptureObjectAttributes() failed (Status %lx)\n", Status); @@ -111,19 +96,9 @@ &RemainingPath, ObjectType);
- /* we don't need to release the "captured" object attributes! Nothing was allocated! */ -#if 0 - ObpReleaseCapturedAttributes(&ObjectCreateInfo, - NULL, - AccessMode, - FALSE); -#endif + ObpReleaseCapturedAttributes(&ObjectCreateInfo); + if (ObjectName.Buffer) ExFreePool(ObjectName.Buffer);
- /* free the captured ObjectPath if needed */ - RtlReleaseCapturedUnicodeString(&ObjectName, - AccessMode, - FALSE); - if (!NT_SUCCESS(Status)) { return(Status); @@ -194,8 +169,7 @@ DPRINT("Capturing Create Info\n"); Status = ObpCaptureObjectAttributes(ObjectAttributes, AccessMode, - PagedPool, - FALSE, + ObjectType, &ObjectCreateInfo, &ObjectName); if (!NT_SUCCESS(Status)) @@ -209,10 +183,8 @@ &Object, &RemainingPath, ObjectType); - ObpReleaseCapturedAttributes(&ObjectCreateInfo, - &ObjectName, - AccessMode, - FALSE); + ObpReleaseCapturedAttributes(&ObjectCreateInfo); + if (ObjectName.Buffer) ExFreePool(ObjectName.Buffer); if (!NT_SUCCESS(Status)) { DPRINT("ObFindObject() failed (Status %lx)\n", Status); _____
Modified: trunk/reactos/ntoskrnl/ob/object.c --- trunk/reactos/ntoskrnl/ob/object.c 2005-08-08 16:57:50 UTC (rev 17216) +++ trunk/reactos/ntoskrnl/ob/object.c 2005-08-08 16:58:30 UTC (rev 17217) @@ -110,297 +110,162 @@
NTSTATUS STDCALL -ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, +ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes, IN KPROCESSOR_MODE AccessMode, - IN POOL_TYPE PoolType, - IN BOOLEAN CaptureIfKernel, - OUT POBJECT_CREATE_INFORMATION CapturedObjectAttributes OPTIONAL, - OUT PUNICODE_STRING ObjectName OPTIONAL) + IN POBJECT_TYPE ObjectType, + IN POBJECT_CREATE_INFORMATION ObjectCreateInfo, + OUT PUNICODE_STRING ObjectName) { - OBJECT_ATTRIBUTES AttributesCopy; NTSTATUS Status = STATUS_SUCCESS; + PSECURITY_DESCRIPTOR SecurityDescriptor; + PSECURITY_QUALITY_OF_SERVICE SecurityQos; + PUNICODE_STRING LocalObjectName = NULL;
- /* at least one output parameter must be != NULL! */ - ASSERT(CapturedObjectAttributes != NULL || ObjectName != NULL); - - if (ObjectAttributes == NULL) + /* Zero out the Capture Data */ + DPRINT("ObpCaptureObjectAttributes\n"); + RtlZeroMemory(ObjectCreateInfo, sizeof(OBJECT_CREATE_INFORMATION)); + + /* Check if we got Oba */ + if (ObjectAttributes) { - /* we're going to return STATUS_SUCCESS! */ - goto failbasiccleanup; - } - - if (AccessMode != KernelMode) - { - _SEH_TRY + if (AccessMode != KernelMode) { - ProbeForRead(ObjectAttributes, - sizeof(ObjectAttributes), - sizeof(ULONG)); - /* make a copy on the stack */ - AttributesCopy = *ObjectAttributes; - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - if(!NT_SUCCESS(Status)) - { - DPRINT1("ObpCaptureObjectAttributes failed to probe object attributes 0x%p\n", ObjectAttributes); - goto failbasiccleanup; - } - } - else if (!CaptureIfKernel) - { - if (ObjectAttributes->Length == sizeof(OBJECT_ATTRIBUTES)) - { - if (ObjectName != NULL) + DPRINT("Probing OBA\n"); + _SEH_TRY { - /* we don't have to capture any memory, the caller considers the passed data - as valid */ - if (ObjectAttributes->ObjectName != NULL) - { - *ObjectName = *ObjectAttributes->ObjectName; - } - else - { - ObjectName->Length = ObjectName->MaximumLength = 0; - ObjectName->Buffer = NULL; - } + /* FIXME: SMSS SENDS BULLSHIT. */ + #if 0 + ProbeForRead(ObjectAttributes, + sizeof(ObjectAttributes), + sizeof(ULONG)); + #endif } - if (CapturedObjectAttributes != NULL) + _SEH_HANDLE { - CapturedObjectAttributes->RootDirectory = ObjectAttributes->RootDirectory; - CapturedObjectAttributes->Attributes = ObjectAttributes->Attributes; - CapturedObjectAttributes->SecurityDescriptor = ObjectAttributes->SecurityDescriptor; - CapturedObjectAttributes->SecurityDescriptorCharge = 0; /* FIXME */ - CapturedObjectAttributes->ProbeMode = AccessMode; + Status = _SEH_GetExceptionCode(); } - - return STATUS_SUCCESS; + _SEH_END; } - else + + /* Validate the Size */ + DPRINT("Validating OBA\n"); + if (ObjectAttributes->Length != sizeof(OBJECT_ATTRIBUTES)) { Status = STATUS_INVALID_PARAMETER; - goto failbasiccleanup; } - } - else - { - AttributesCopy = *ObjectAttributes; - }
- /* if Length isn't as expected, bail with an invalid parameter status code so - the caller knows he passed garbage... */ - if (AttributesCopy.Length != sizeof(OBJECT_ATTRIBUTES)) - { - Status = STATUS_INVALID_PARAMETER; - goto failbasiccleanup; - } - - if (CapturedObjectAttributes != NULL) - { - CapturedObjectAttributes->RootDirectory = AttributesCopy.RootDirectory; - CapturedObjectAttributes->Attributes = AttributesCopy.Attributes; - - if (AttributesCopy.SecurityDescriptor != NULL) + /* Fail if SEH or Size Validation failed */ + if(!NT_SUCCESS(Status)) { - Status = SeCaptureSecurityDescriptor(AttributesCopy.SecurityDescriptor, + 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; + + /* Validate the SD */ + if (SecurityDescriptor) + { + DPRINT("Probing SD: %x\n", SecurityDescriptor); + Status = SeCaptureSecurityDescriptor(SecurityDescriptor, AccessMode, - PoolType, + NonPagedPool, TRUE, - &CapturedObjectAttributes->SecurityDescriptor); - if (!NT_SUCCESS(Status)) + &ObjectCreateInfo->SecurityDescriptor); + if(!NT_SUCCESS(Status)) { DPRINT1("Unable to capture the security descriptor!!!\n"); - goto failbasiccleanup; + ObjectCreateInfo->SecurityDescriptor = NULL; + goto fail; } - CapturedObjectAttributes->SecurityDescriptorCharge = 0; /* FIXME */ + + DPRINT("Probe done\n"); + ObjectCreateInfo->SecurityDescriptorCharge = 0; /* FIXME */ + ObjectCreateInfo->ProbeMode = AccessMode; } - else + + /* Validate the QoS */ + if (SecurityQos) { - CapturedObjectAttributes->SecurityDescriptor = NULL; - CapturedObjectAttributes->SecurityDescriptorCharge = 0; - } - } - - if (ObjectName != NULL) - { - ObjectName->Buffer = NULL; - - if (AttributesCopy.ObjectName != NULL) - { - UNICODE_STRING OriginalCopy = {0}; - if (AccessMode != KernelMode) { + DPRINT("Probing QoS\n"); _SEH_TRY { - /* probe the ObjectName structure and make a local stack copy of it */ - ProbeForRead(AttributesCopy.ObjectName, - sizeof(UNICODE_STRING), + ProbeForRead(SecurityQos, + sizeof(SECURITY_QUALITY_OF_SERVICE), sizeof(ULONG)); - OriginalCopy = *AttributesCopy.ObjectName; - if (OriginalCopy.Length > 0) - { - ProbeForRead(OriginalCopy.Buffer, - OriginalCopy.Length, - sizeof(WCHAR)); - } } _SEH_HANDLE { Status = _SEH_GetExceptionCode(); } _SEH_END; - - if (NT_SUCCESS(Status)) - { - ObjectName->Length = OriginalCopy.Length; - - if(OriginalCopy.Length > 0) - { - ObjectName->MaximumLength = OriginalCopy.Length + sizeof(WCHAR); - ObjectName->Buffer = ExAllocatePool(PoolType, - ObjectName->MaximumLength); - if (ObjectName->Buffer != NULL) - { - _SEH_TRY - { - /* no need to probe OriginalCopy.Buffer again, we already did that - when capturing the UNICODE_STRING structure itself */ - RtlCopyMemory(ObjectName->Buffer, OriginalCopy.Buffer, OriginalCopy.Length); - ObjectName->Buffer[OriginalCopy.Length / sizeof(WCHAR)] = L'\0'; - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - if (!NT_SUCCESS(Status)) - { - DPRINT1("ObpCaptureObjectAttributes failed to copy the unicode string!\n"); - } - } - else - { - Status = STATUS_INSUFFICIENT_RESOURCES; - } - } - else if(AttributesCopy.RootDirectory != NULL /* && OriginalCopy.Length == 0 */) - { - /* if the caller specified a root directory, there must be an object name! */ - Status = STATUS_OBJECT_NAME_INVALID; - } - else - { - ObjectName->Length = ObjectName->MaximumLength = 0; - } - } -#ifdef DBG - else - { - DPRINT1("ObpCaptureObjectAttributes failed to probe the object name UNICODE_STRING structure!\n"); - } -#endif } - else /* AccessMode == KernelMode */ - { - OriginalCopy = *AttributesCopy.ObjectName; - ObjectName->Length = OriginalCopy.Length;
- if (OriginalCopy.Length > 0) - { - ObjectName->MaximumLength = OriginalCopy.Length + sizeof(WCHAR); - ObjectName->Buffer = ExAllocatePool(PoolType, - ObjectName->MaximumLength); - if (ObjectName->Buffer != NULL) - { - RtlCopyMemory(ObjectName->Buffer, OriginalCopy.Buffer, OriginalCopy.Length); - ObjectName->Buffer[OriginalCopy.Length / sizeof(WCHAR)] = L'\0'; - } - else - { - Status = STATUS_INSUFFICIENT_RESOURCES; - } - } - else if (AttributesCopy.RootDirectory != NULL /* && OriginalCopy.Length == 0 */) - { - /* if the caller specified a root directory, there must be an object name! */ - Status = STATUS_OBJECT_NAME_INVALID; - } - else - { - ObjectName->Length = ObjectName->MaximumLength = 0; - } + if(!NT_SUCCESS(Status)) + { + DPRINT1("Unable to capture QoS!!!\n"); + goto fail; } + + ObjectCreateInfo->SecurityQualityOfService = *SecurityQos; + ObjectCreateInfo->SecurityQos = &ObjectCreateInfo->SecurityQualityOfService; } - else + } + + /* Clear Local Object Name */ + DPRINT("Clearing name\n"); + RtlZeroMemory(ObjectName, sizeof(UNICODE_STRING)); + + /* Now check if the Object Attributes had an Object Name */ + if (LocalObjectName) + { + DPRINT("Name Buffer: %x\n", LocalObjectName->Buffer); + Status = ObpCaptureObjectName(ObjectName, + LocalObjectName, + AccessMode); + } + else + { + /* He can't have specified a Root Directory */ + if (ObjectCreateInfo->RootDirectory) { - ObjectName->Length = ObjectName->MaximumLength = 0; + DPRINT1("Invalid name\n"); + Status = STATUS_OBJECT_NAME_INVALID; } }
- CapturedObjectAttributes->ProbeMode = AccessMode; - +fail: if (!NT_SUCCESS(Status)) { - if (ObjectName != NULL && ObjectName->Buffer) - { - ExFreePool(ObjectName->Buffer); - } - if (CapturedObjectAttributes != NULL) - { - /* cleanup allocated resources */ - SeReleaseSecurityDescriptor(CapturedObjectAttributes->SecurityDescriptor , - AccessMode, - TRUE); - } - -failbasiccleanup: - if (ObjectName != NULL) - { - ObjectName->Length = ObjectName->MaximumLength = 0; - ObjectName->Buffer = NULL; - } - if (CapturedObjectAttributes != NULL) - { - RtlZeroMemory(CapturedObjectAttributes, sizeof(OBJECT_CREATE_INFORMATION)); - } + DPRINT1("Failed to capture, cleaning up\n"); + ObpReleaseCapturedAttributes(ObjectCreateInfo); } - + + DPRINT("Return to caller\n"); return Status; }
VOID STDCALL -ObpReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION CapturedObjectAttributes OPTIONAL, - IN PUNICODE_STRING ObjectName OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - IN BOOLEAN CaptureIfKernel) +ObpReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo) { - /* WARNING - You need to pass the same parameters to this function as you passed - to ObpCaptureObjectAttributes() to avoid memory leaks */ - if(AccessMode != KernelMode || CaptureIfKernel) - { - if(CapturedObjectAttributes != NULL && - CapturedObjectAttributes->SecurityDescriptor != NULL) + /* Release the SD, it's the only thing we allocated */ + if (ObjectCreateInfo->SecurityDescriptor) { - ExFreePool(CapturedObjectAttributes->SecurityDescriptor); - -#ifdef DBG - RtlZeroMemory(CapturedObjectAttributes, sizeof(OBJECT_CREATE_INFORMATION)); -#endif + SeReleaseSecurityDescriptor(ObjectCreateInfo->SecurityDescriptor, + ObjectCreateInfo->ProbeMode, + TRUE); + ObjectCreateInfo->SecurityDescriptor = NULL; } - if(ObjectName != NULL && - ObjectName->Length > 0) - { - ExFreePool(ObjectName->Buffer); - } - } }
@@ -483,7 +348,7 @@ ObjectName->Buffer[0] != L'\') { ObDereferenceObject (CurrentObject); - DPRINT1("failed: "%wZ"\n", ObjectName); + DPRINT1("failed\n"); return STATUS_UNSUCCESSFUL; }
@@ -930,9 +795,8 @@ /* Capture all the info */ DPRINT("Capturing Create Info\n"); Status = ObpCaptureObjectAttributes(ObjectAttributes, - ObjectAttributesAccessMode, - NonPagedPool, - TRUE, + AccessMode, + Type, ObjectCreateInfo, &ObjectName);
@@ -958,10 +822,8 @@
/* Release the Capture Info, we don't need it */ DPRINT1("Allocation failed\n"); - ObpReleaseCapturedAttributes(ObjectCreateInfo, - &ObjectName, - ObjectAttributesAccessMode, - TRUE); + ObpReleaseCapturedAttributes(ObjectCreateInfo); + if (ObjectName.Buffer) ExFreePool(ObjectName.Buffer); }
/* We failed, so release the Buffer */ @@ -1115,10 +977,7 @@ } if (Header->ObjectCreateInfo) { - ObpReleaseCapturedAttributes(Header->ObjectCreateInfo, - NULL, - Header->ObjectCreateInfo->ProbeMode, - FALSE); + ObpReleaseCapturedAttributes(Header->ObjectCreateInfo); ExFreePool(Header->ObjectCreateInfo); }