- reverted ObpCaptureObjectAttributes back to my old implementation (slightly modified and extended) because that one at least does what it's supposed to correctly 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 15:33:04 UTC (rev 17204) +++ trunk/reactos/ntoskrnl/cm/ntfunc.c 2005-08-08 15:39:35 UTC (rev 17205) @@ -192,20 +192,19 @@
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, - KeGetPreviousMode(), - CmiKeyType, + PreviousMode, + PagedPool, + FALSE, &ObjectCreateInfo, &ObjectName); if (!NT_SUCCESS(Status)) @@ -219,8 +218,10 @@ (PVOID*)&Object, &RemainingPath, CmiKeyType); - ObpReleaseCapturedAttributes(&ObjectCreateInfo); - if (ObjectName.Buffer) ExFreePool(ObjectName.Buffer); + ObpReleaseCapturedAttributes(&ObjectCreateInfo, + &ObjectName, + PreviousMode, + FALSE); if (!NT_SUCCESS(Status)) { DPRINT("CmpFindObject failed, Status: 0x%x\n", Status); @@ -1169,7 +1170,8 @@ DPRINT("Capturing Create Info\n"); Status = ObpCaptureObjectAttributes(ObjectAttributes, PreviousMode, - CmiKeyType, + PagedPool, + FALSE, &ObjectCreateInfo, &ObjectName); if (!NT_SUCCESS(Status)) @@ -1185,8 +1187,10 @@ (PVOID*)&Object, &RemainingPath, CmiKeyType); - ObpReleaseCapturedAttributes(&ObjectCreateInfo); - if (ObjectName.Buffer) ExFreePool(ObjectName.Buffer); + ObpReleaseCapturedAttributes(&ObjectCreateInfo, + &ObjectName, + PreviousMode, + FALSE); 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 15:33:04 UTC (rev 17204) +++ trunk/reactos/ntoskrnl/cm/registry.c 2005-08-08 15:39:35 UTC (rev 17205) @@ -705,7 +705,8 @@
DPRINT("Capturing Create Info\n"); Status = ObpCaptureObjectAttributes(KeyObjectAttributes, KernelMode, - CmiKeyType, + PagedPool, + FALSE, &ObjectCreateInfo, &ObjectName); if (!NT_SUCCESS(Status)) @@ -719,8 +720,10 @@ (PVOID*)&ParentKey, &RemainingPath, CmiKeyType); - ObpReleaseCapturedAttributes(&ObjectCreateInfo); - if (ObjectName.Buffer) ExFreePool(ObjectName.Buffer); + ObpReleaseCapturedAttributes(&ObjectCreateInfo, + &ObjectName, + KernelMode, + FALSE); if (!NT_SUCCESS(Status)) { return Status; _____
Modified: trunk/reactos/ntoskrnl/include/internal/ob.h --- trunk/reactos/ntoskrnl/include/internal/ob.h 2005-08-08 15:33:04 UTC (rev 17204) +++ trunk/reactos/ntoskrnl/include/internal/ob.h 2005-08-08 15:39:35 UTC (rev 17205) @@ -173,14 +173,6 @@
/* 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, @@ -189,16 +181,19 @@
NTSTATUS STDCALL -ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes, +ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN KPROCESSOR_MODE AccessMode, - IN POBJECT_TYPE ObjectType, - IN POBJECT_CREATE_INFORMATION ObjectCreateInfo, - OUT PUNICODE_STRING ObjectName); + IN POOL_TYPE PoolType, + IN BOOLEAN CaptureIfKernel, + OUT POBJECT_CREATE_INFORMATION CapturedObjectAttributes OPTIONAL, + OUT PUNICODE_STRING ObjectName OPTIONAL);
VOID STDCALL -ObpReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo); - +ObpReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION CapturedObjectAttributes OPTIONAL, + IN PUNICODE_STRING ObjectName OPTIONAL, + IN KPROCESSOR_MODE AccessMode, + IN BOOLEAN CaptureIfKernel); /* object information classes */
#define ICIF_QUERY 0x1 _____
Modified: trunk/reactos/ntoskrnl/lpc/connect.c --- trunk/reactos/ntoskrnl/lpc/connect.c 2005-08-08 15:33:04 UTC (rev 17204) +++ trunk/reactos/ntoskrnl/lpc/connect.c 2005-08-08 15:39:35 UTC (rev 17205) @@ -410,7 +410,7 @@
NULL, PORT_ALL_ACCESS, /* DesiredAccess */ LpcPortObjectType, - UserMode, + PreviousMode, NULL, (PVOID*)&NamedPort); if (!NT_SUCCESS(Status)) @@ -430,7 +430,7 @@ Status = ObReferenceObjectByHandle(WriteMap.SectionHandle, SECTION_MAP_READ | SECTION_MAP_WRITE, MmSectionObjectType, - UserMode, + PreviousMode, (PVOID*)&SectionObject, NULL); if (!NT_SUCCESS(Status)) _____
Modified: trunk/reactos/ntoskrnl/ob/handle.c --- trunk/reactos/ntoskrnl/ob/handle.c 2005-08-08 15:33:04 UTC (rev 17204) +++ trunk/reactos/ntoskrnl/ob/handle.c 2005-08-08 15:39:35 UTC (rev 17205) @@ -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,7 +1132,10 @@
/* We can delete the Create Info now */ Header->ObjectCreateInfo = NULL; - ObpReleaseCapturedAttributes(ObjectCreateInfo); + ObpReleaseCapturedAttributes(ObjectCreateInfo, + NULL, + ObjectCreateInfo->ProbeMode, + FALSE); ExFreePool(ObjectCreateInfo);
DPRINT("Status %x\n", Status); _____
Modified: trunk/reactos/ntoskrnl/ob/namespc.c --- trunk/reactos/ntoskrnl/ob/namespc.c 2005-08-08 15:33:04 UTC (rev 17204) +++ trunk/reactos/ntoskrnl/ob/namespc.c 2005-08-08 15:39:35 UTC (rev 17205) @@ -70,20 +70,35 @@
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, - ObjectPath, + &ObjectName, Attributes | OBJ_OPENIF, NULL, NULL);
- /* Capture all the info */ + /* "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 */ DPRINT("Capturing Create Info\n"); Status = ObpCaptureObjectAttributes(&ObjectAttributes, - AccessMode, - ObjectType, + KernelMode, /* raw copy! */ + NonPagedPool, + FALSE, &ObjectCreateInfo, - &ObjectName); + NULL); if (!NT_SUCCESS(Status)) { DPRINT("ObpCaptureObjectAttributes() failed (Status %lx)\n", Status); @@ -96,9 +111,19 @@ &RemainingPath, ObjectType);
- ObpReleaseCapturedAttributes(&ObjectCreateInfo); - if (ObjectName.Buffer) ExFreePool(ObjectName.Buffer); + /* we don't need to release the "captured" object attributes! Nothing was allocated! */ +#if 0 + ObpReleaseCapturedAttributes(&ObjectCreateInfo, + NULL, + AccessMode, + FALSE); +#endif
+ /* free the captured ObjectPath if needed */ + RtlReleaseCapturedUnicodeString(&ObjectName, + AccessMode, + FALSE); + if (!NT_SUCCESS(Status)) { return(Status); @@ -169,7 +194,8 @@ DPRINT("Capturing Create Info\n"); Status = ObpCaptureObjectAttributes(ObjectAttributes, AccessMode, - ObjectType, + PagedPool, + FALSE, &ObjectCreateInfo, &ObjectName); if (!NT_SUCCESS(Status)) @@ -183,8 +209,10 @@ &Object, &RemainingPath, ObjectType); - ObpReleaseCapturedAttributes(&ObjectCreateInfo); - if (ObjectName.Buffer) ExFreePool(ObjectName.Buffer); + ObpReleaseCapturedAttributes(&ObjectCreateInfo, + &ObjectName, + AccessMode, + FALSE); 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 15:33:04 UTC (rev 17204) +++ trunk/reactos/ntoskrnl/ob/object.c 2005-08-08 15:39:35 UTC (rev 17205) @@ -110,162 +110,298 @@
NTSTATUS STDCALL -ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes, +ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN KPROCESSOR_MODE AccessMode, - IN POBJECT_TYPE ObjectType, - IN POBJECT_CREATE_INFORMATION ObjectCreateInfo, - OUT PUNICODE_STRING ObjectName) + IN POOL_TYPE PoolType, + IN BOOLEAN CaptureIfKernel, + OUT POBJECT_CREATE_INFORMATION CapturedObjectAttributes OPTIONAL, + OUT PUNICODE_STRING ObjectName OPTIONAL) { + OBJECT_ATTRIBUTES AttributesCopy; NTSTATUS Status = STATUS_SUCCESS; - PSECURITY_DESCRIPTOR SecurityDescriptor; - PSECURITY_QUALITY_OF_SERVICE SecurityQos; - PUNICODE_STRING LocalObjectName = NULL;
- /* Zero out the Capture Data */ - DPRINT("ObpCaptureObjectAttributes\n"); - RtlZeroMemory(ObjectCreateInfo, sizeof(OBJECT_CREATE_INFORMATION)); - - /* Check if we got Oba */ - if (ObjectAttributes) + /* at least one output parameter must be != NULL! */ + ASSERT(CapturedObjectAttributes != NULL || ObjectName != NULL); + + if (ObjectAttributes == NULL) { - if (AccessMode != KernelMode) + /* we're going to return STATUS_SUCCESS! */ + goto failbasiccleanup; + } + + if (AccessMode != KernelMode) + { + _SEH_TRY { - DPRINT("Probing OBA\n"); - _SEH_TRY + 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); + KEBUGCHECK(0); + goto failbasiccleanup; + } + } + else if (!CaptureIfKernel) + { + if (ObjectAttributes->Length == sizeof(OBJECT_ATTRIBUTES)) + { + if (ObjectName != NULL) { - /* FIXME: SMSS SENDS BULLSHIT. */ - #if 0 - ProbeForRead(ObjectAttributes, - sizeof(ObjectAttributes), - sizeof(ULONG)); - #endif + /* 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; + } } - _SEH_HANDLE + if (CapturedObjectAttributes != NULL) { - Status = _SEH_GetExceptionCode(); + CapturedObjectAttributes->RootDirectory = ObjectAttributes->RootDirectory; + CapturedObjectAttributes->Attributes = ObjectAttributes->Attributes; + CapturedObjectAttributes->SecurityDescriptor = ObjectAttributes->SecurityDescriptor; + CapturedObjectAttributes->SecurityDescriptorCharge = 0; /* FIXME */ + CapturedObjectAttributes->ProbeMode = AccessMode; } - _SEH_END; + + return STATUS_SUCCESS; } - - /* Validate the Size */ - DPRINT("Validating OBA\n"); - if (ObjectAttributes->Length != sizeof(OBJECT_ATTRIBUTES)) + else { Status = STATUS_INVALID_PARAMETER; + goto failbasiccleanup; } + } + else + { + AttributesCopy = *ObjectAttributes; + }
- /* Fail if SEH or Size Validation failed */ - if(!NT_SUCCESS(Status)) + /* 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) { - 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, + Status = SeCaptureSecurityDescriptor(AttributesCopy.SecurityDescriptor, AccessMode, - NonPagedPool, + PoolType, TRUE, - &ObjectCreateInfo->SecurityDescriptor); - if(!NT_SUCCESS(Status)) + &CapturedObjectAttributes->SecurityDescriptor); + if (!NT_SUCCESS(Status)) { DPRINT1("Unable to capture the security descriptor!!!\n"); - ObjectCreateInfo->SecurityDescriptor = NULL; - goto fail; + goto failbasiccleanup; } - - DPRINT("Probe done\n"); - ObjectCreateInfo->SecurityDescriptorCharge = 0; /* FIXME */ - ObjectCreateInfo->ProbeMode = AccessMode; + CapturedObjectAttributes->SecurityDescriptorCharge = 0; /* FIXME */ } - - /* Validate the QoS */ - if (SecurityQos) + else { + 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 { - ProbeForRead(SecurityQos, - sizeof(SECURITY_QUALITY_OF_SERVICE), + /* probe the ObjectName structure and make a local stack copy of it */ + ProbeForRead(AttributesCopy.ObjectName, + sizeof(UNICODE_STRING), 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(!NT_SUCCESS(Status)) - { - DPRINT1("Unable to capture QoS!!!\n"); - goto fail; + 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; + } } - - ObjectCreateInfo->SecurityQualityOfService = *SecurityQos; - ObjectCreateInfo->SecurityQos = &ObjectCreateInfo->SecurityQualityOfService; } - } - - /* 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) + else { - DPRINT1("Invalid name\n"); - Status = STATUS_OBJECT_NAME_INVALID; + ObjectName->Length = ObjectName->MaximumLength = 0; } }
-fail: + CapturedObjectAttributes->ProbeMode = AccessMode; + if (!NT_SUCCESS(Status)) { - DPRINT1("Failed to capture, cleaning up\n"); - ObpReleaseCapturedAttributes(ObjectCreateInfo); + if (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)); + } } - - DPRINT("Return to caller\n"); + return Status; }
VOID STDCALL -ObpReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo) +ObpReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION CapturedObjectAttributes OPTIONAL, + IN PUNICODE_STRING ObjectName OPTIONAL, + IN KPROCESSOR_MODE AccessMode, + IN BOOLEAN CaptureIfKernel) { - /* Release the SD, it's the only thing we allocated */ - if (ObjectCreateInfo->SecurityDescriptor) + /* 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) { - SeReleaseSecurityDescriptor(ObjectCreateInfo->SecurityDescriptor, - ObjectCreateInfo->ProbeMode, - TRUE); - ObjectCreateInfo->SecurityDescriptor = NULL; + ExFreePool(CapturedObjectAttributes->SecurityDescriptor); + +#ifdef DBG + RtlZeroMemory(CapturedObjectAttributes, sizeof(OBJECT_CREATE_INFORMATION)); +#endif } + if(ObjectName != NULL && + ObjectName->Length > 0) + { + ExFreePool(ObjectName->Buffer); + } + } }
@@ -348,7 +484,7 @@ ObjectName->Buffer[0] != L'\') { ObDereferenceObject (CurrentObject); - DPRINT1("failed\n"); + DPRINT1("failed: "%wZ"\n", ObjectName); return STATUS_UNSUCCESSFUL; }
@@ -795,8 +931,9 @@ /* Capture all the info */ DPRINT("Capturing Create Info\n"); Status = ObpCaptureObjectAttributes(ObjectAttributes, - AccessMode, - Type, + ObjectAttributesAccessMode, + NonPagedPool, + TRUE, ObjectCreateInfo, &ObjectName);
@@ -822,8 +959,10 @@
/* Release the Capture Info, we don't need it */ DPRINT1("Allocation failed\n"); - ObpReleaseCapturedAttributes(ObjectCreateInfo); - if (ObjectName.Buffer) ExFreePool(ObjectName.Buffer); + ObpReleaseCapturedAttributes(ObjectCreateInfo, + &ObjectName, + ObjectAttributesAccessMode, + TRUE); }
/* We failed, so release the Buffer */ @@ -977,7 +1116,10 @@ } if (Header->ObjectCreateInfo) { - ObpReleaseCapturedAttributes(Header->ObjectCreateInfo); + ObpReleaseCapturedAttributes(Header->ObjectCreateInfo, + NULL, + Header->ObjectCreateInfo->ProbeMode, + FALSE); ExFreePool(Header->ObjectCreateInfo); }