mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-30 12:23:28 +00:00
- Implemented ObQueryNameString().
- Added 'QueryName' object function. - Implemented 'QueryName' function for file objects. svn path=/trunk/; revision=4822
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
#ifndef _INCLUDE_DDK_OBTYPES_H
|
||||
#define _INCLUDE_DDK_OBTYPES_H
|
||||
/* $Id: obtypes.h,v 1.2 2003/06/01 14:59:01 chorns Exp $ */
|
||||
/* $Id: obtypes.h,v 1.3 2003/06/02 10:02:16 ekohl Exp $ */
|
||||
struct _DIRECTORY_OBJECT;
|
||||
struct _OBJECT_ATTRIBUTES;
|
||||
|
||||
@@ -8,9 +8,15 @@ struct _OBJECT_ATTRIBUTES;
|
||||
|
||||
typedef ULONG ACCESS_STATE, *PACCESS_STATE;
|
||||
|
||||
typedef struct _OBJECT_HANDLE_INFORMATION {
|
||||
ULONG HandleAttributes;
|
||||
ACCESS_MASK GrantedAccess;
|
||||
typedef struct _OBJECT_NAME_INFORMATION
|
||||
{
|
||||
UNICODE_STRING Name;
|
||||
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
|
||||
|
||||
typedef struct _OBJECT_HANDLE_INFORMATION
|
||||
{
|
||||
ULONG HandleAttributes;
|
||||
ACCESS_MASK GrantedAccess;
|
||||
} OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
|
||||
|
||||
#endif /* __USE_W32API */
|
||||
@@ -110,16 +116,22 @@ typedef struct _OBJECT_TYPE
|
||||
SECURITY_INFORMATION SecurityInformation,
|
||||
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||
PULONG BufferLength);
|
||||
|
||||
|
||||
/*
|
||||
* PURPOSE: Called to query the name of the object
|
||||
* RETURNS
|
||||
* STATUS_SUCCESS NextObject was found
|
||||
*/
|
||||
VOID STDCALL_FUNC (*QueryName)(VOID);
|
||||
|
||||
NTSTATUS STDCALL_FUNC (*QueryName)(PVOID ObjectBody,
|
||||
POBJECT_NAME_INFORMATION ObjectNameInfo,
|
||||
ULONG Length,
|
||||
PULONG ReturnLength);
|
||||
|
||||
/*
|
||||
* PURPOSE: Called when a process asks to close the object
|
||||
*/
|
||||
VOID STDCALL_FUNC (*OkayToClose)(VOID);
|
||||
|
||||
|
||||
NTSTATUS STDCALL_FUNC (*Create)(PVOID ObjectBody,
|
||||
PVOID Parent,
|
||||
PWSTR RemainingPath,
|
||||
|
||||
@@ -720,12 +720,6 @@ typedef struct _THREAD_BASIC_INFORMATION
|
||||
KPRIORITY BasePriority;
|
||||
} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
|
||||
|
||||
// object information
|
||||
|
||||
typedef struct _OBJECT_NAME_INFORMATION
|
||||
{
|
||||
UNICODE_STRING Name;
|
||||
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
|
||||
|
||||
// file information
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $Id: iomgr.c,v 1.33 2003/05/22 00:47:04 gdalsnes Exp $
|
||||
/* $Id: iomgr.c,v 1.34 2003/06/02 10:02:56 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
@@ -86,6 +86,7 @@ IopCloseFile(PVOID ObjectBody,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID STDCALL
|
||||
IopDeleteFile(PVOID ObjectBody)
|
||||
{
|
||||
@@ -132,6 +133,71 @@ IopDeleteFile(PVOID ObjectBody)
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS STDCALL
|
||||
IopQueryNameFile(PVOID ObjectBody,
|
||||
POBJECT_NAME_INFORMATION ObjectNameInfo,
|
||||
ULONG Length,
|
||||
PULONG ReturnLength)
|
||||
{
|
||||
POBJECT_NAME_INFORMATION LocalInfo;
|
||||
PFILE_NAME_INFORMATION FileNameInfo;
|
||||
PFILE_OBJECT FileObject;
|
||||
ULONG LocalReturnLength;
|
||||
NTSTATUS Status;
|
||||
|
||||
DPRINT ("IopQueryNameFile() called\n");
|
||||
|
||||
FileObject = (PFILE_OBJECT)ObjectBody;
|
||||
|
||||
LocalInfo = ExAllocatePool (NonPagedPool,
|
||||
sizeof(OBJECT_NAME_INFORMATION) +
|
||||
MAX_PATH * sizeof(WCHAR));
|
||||
if (LocalInfo == NULL)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
||||
Status = ObQueryNameString (FileObject->DeviceObject->Vpb->RealDevice,
|
||||
LocalInfo,
|
||||
MAX_PATH * sizeof(WCHAR),
|
||||
&LocalReturnLength);
|
||||
if (!NT_SUCCESS (Status))
|
||||
{
|
||||
ExFreePool (LocalInfo);
|
||||
return Status;
|
||||
}
|
||||
DPRINT ("Device path: %wZ\n", &LocalInfo->Name);
|
||||
|
||||
Status = RtlAppendUnicodeStringToString (&ObjectNameInfo->Name,
|
||||
&LocalInfo->Name);
|
||||
|
||||
ExFreePool (LocalInfo);
|
||||
|
||||
FileNameInfo = ExAllocatePool (NonPagedPool,
|
||||
MAX_PATH * sizeof(WCHAR) + sizeof(ULONG));
|
||||
if (FileNameInfo == NULL)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
||||
Status = IoQueryFileInformation (FileObject,
|
||||
FileNameInformation,
|
||||
MAX_PATH * sizeof(WCHAR) + sizeof(ULONG),
|
||||
FileNameInfo,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
ExFreePool (FileNameInfo);
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = RtlAppendUnicodeToString (&ObjectNameInfo->Name,
|
||||
FileNameInfo->FileName);
|
||||
|
||||
DPRINT ("Total path: %wZ\n", &ObjectNameInfo->Name);
|
||||
|
||||
ExFreePool (FileNameInfo);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
VOID IoInit (VOID)
|
||||
{
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
@@ -144,7 +210,7 @@ VOID IoInit (VOID)
|
||||
/*
|
||||
* Register iomgr types: DeviceObjectType
|
||||
*/
|
||||
IoDeviceObjectType = ExAllocatePool (NonPagedPool,
|
||||
IoDeviceObjectType = ExAllocatePool (NonPagedPool,
|
||||
sizeof (OBJECT_TYPE));
|
||||
|
||||
IoDeviceObjectType->Tag = TAG_DEVICE_TYPE;
|
||||
@@ -188,7 +254,7 @@ VOID IoInit (VOID)
|
||||
IoFileObjectType->Delete = IopDeleteFile;
|
||||
IoFileObjectType->Parse = NULL;
|
||||
IoFileObjectType->Security = NULL;
|
||||
IoFileObjectType->QueryName = NULL;
|
||||
IoFileObjectType->QueryName = IopQueryNameFile;
|
||||
IoFileObjectType->OkayToClose = NULL;
|
||||
IoFileObjectType->Create = IopCreateFile;
|
||||
IoFileObjectType->DuplicationNotify = NULL;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
; $Id: ntoskrnl.def,v 1.152 2003/05/15 11:07:51 ekohl Exp $
|
||||
; $Id: ntoskrnl.def,v 1.153 2003/06/02 10:04:28 ekohl Exp $
|
||||
;
|
||||
; reactos/ntoskrnl/ntoskrnl.def
|
||||
;
|
||||
@@ -604,7 +604,7 @@ ObGetObjectSecurity@12
|
||||
ObMakeTemporaryObject@4
|
||||
ObOpenObjectByName@28
|
||||
ObOpenObjectByPointer@28
|
||||
;ObQueryNameString@16
|
||||
ObQueryNameString@16
|
||||
;ObQueryObjectAuditingByHandle@8
|
||||
@ObfDereferenceObject@4
|
||||
@ObfReferenceObject@4
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
; $Id: ntoskrnl.edf,v 1.138 2003/05/15 11:07:51 ekohl Exp $
|
||||
; $Id: ntoskrnl.edf,v 1.139 2003/06/02 10:04:28 ekohl Exp $
|
||||
;
|
||||
; reactos/ntoskrnl/ntoskrnl.def
|
||||
;
|
||||
@@ -603,7 +603,7 @@ ObGetObjectSecurity=ObGetObjectSecurity@12
|
||||
ObMakeTemporaryObject=ObMakeTemporaryObject@4
|
||||
ObOpenObjectByName=ObOpenObjectByName@28
|
||||
ObOpenObjectByPointer=ObOpenObjectByPointer@28
|
||||
;ObQueryNameString=ObQueryNameString@16
|
||||
ObQueryNameString=ObQueryNameString@16
|
||||
;ObQueryObjectAuditingByHandle=ObQueryObjectAuditingByHandle@8
|
||||
ObfDereferenceObject=@ObfDereferenceObject@4
|
||||
ObfReferenceObject=@ObfReferenceObject@4
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $Id: dirobj.c,v 1.16 2002/09/08 10:23:38 chorns Exp $
|
||||
/* $Id: dirobj.c,v 1.17 2003/06/02 10:03:52 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
@@ -45,9 +45,10 @@
|
||||
* NOTES
|
||||
* Undocumented.
|
||||
*/
|
||||
NTSTATUS STDCALL NtOpenDirectoryObject(PHANDLE DirectoryHandle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes)
|
||||
NTSTATUS STDCALL
|
||||
NtOpenDirectoryObject (OUT PHANDLE DirectoryHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes)
|
||||
{
|
||||
PVOID Object;
|
||||
NTSTATUS Status;
|
||||
@@ -121,14 +122,14 @@ NTSTATUS STDCALL NtOpenDirectoryObject(PHANDLE DirectoryHandle,
|
||||
* G.Nebbett "WNT/W2k Native API Reference".
|
||||
* Mostly rewritten.
|
||||
*/
|
||||
NTSTATUS STDCALL NtQueryDirectoryObject (IN HANDLE DirObjHandle,
|
||||
OUT POBJDIR_INFORMATION
|
||||
DirObjInformation,
|
||||
IN ULONG BufferLength,
|
||||
IN BOOLEAN ReturnSingleEntry,
|
||||
IN BOOLEAN RestartScan,
|
||||
IN OUT PULONG ObjectIndex,
|
||||
OUT PULONG DataWritten OPTIONAL)
|
||||
NTSTATUS STDCALL
|
||||
NtQueryDirectoryObject (IN HANDLE DirObjHandle,
|
||||
OUT POBJDIR_INFORMATION DirObjInformation,
|
||||
IN ULONG BufferLength,
|
||||
IN BOOLEAN ReturnSingleEntry,
|
||||
IN BOOLEAN RestartScan,
|
||||
IN OUT PULONG ObjectIndex,
|
||||
OUT PULONG DataWritten OPTIONAL)
|
||||
{
|
||||
PDIRECTORY_OBJECT dir = NULL;
|
||||
PLIST_ENTRY current_entry = NULL;
|
||||
@@ -326,9 +327,9 @@ NTSTATUS STDCALL NtQueryDirectoryObject (IN HANDLE DirObjHandle,
|
||||
* Status.
|
||||
*/
|
||||
NTSTATUS STDCALL
|
||||
NtCreateDirectoryObject(PHANDLE DirectoryHandle,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
POBJECT_ATTRIBUTES ObjectAttributes)
|
||||
NtCreateDirectoryObject (OUT PHANDLE DirectoryHandle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes)
|
||||
{
|
||||
PDIRECTORY_OBJECT dir;
|
||||
|
||||
|
||||
+2
-117
@@ -1,4 +1,4 @@
|
||||
/* $Id: ntobj.c,v 1.12 2003/06/01 15:09:34 ekohl Exp $
|
||||
/* $Id: ntobj.c,v 1.13 2003/06/02 10:03:52 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
@@ -43,41 +43,6 @@ NtSetInformationObject (IN HANDLE ObjectHandle,
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
internalNameBuilder(POBJECT_HEADER ObjectHeader,
|
||||
PUNICODE_STRING String)
|
||||
/* So, what's the purpose of this function?
|
||||
It will take any OBJECT_HEADER and traverse the Parent structure up to the root
|
||||
and form the name, i.e. this will only work on objects where the Parent/Name fields
|
||||
have any meaning (not files) */
|
||||
{
|
||||
NTSTATUS Status;
|
||||
|
||||
if (ObjectHeader->Parent)
|
||||
{
|
||||
Status = internalNameBuilder(BODY_TO_HEADER(ObjectHeader->Parent),
|
||||
String);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
if (ObjectHeader->Name.Buffer)
|
||||
{
|
||||
Status = RtlAppendUnicodeToString(String,
|
||||
L"\\");
|
||||
if (Status != STATUS_SUCCESS)
|
||||
return Status;
|
||||
|
||||
return RtlAppendUnicodeStringToString(String,
|
||||
&ObjectHeader->Name);
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*Very, very, very new implementation. Test it!
|
||||
|
||||
Probably we should add meaning to QueryName in POBJECT_TYPE, no matter if we know
|
||||
@@ -107,13 +72,10 @@ NtQueryObject (IN HANDLE ObjectHandle,
|
||||
IN ULONG Length,
|
||||
OUT PULONG ReturnLength)
|
||||
{
|
||||
POBJECT_NAME_INFORMATION NameInfo;
|
||||
POBJECT_TYPE_INFORMATION typeinfo;
|
||||
PFILE_NAME_INFORMATION filenameinfo;
|
||||
POBJECT_HEADER ObjectHeader;
|
||||
PVOID Object;
|
||||
NTSTATUS Status;
|
||||
POBJECT_HEADER ObjectHeader;
|
||||
PFILE_OBJECT fileob;
|
||||
|
||||
Status = ObReferenceObjectByHandle (ObjectHandle,
|
||||
0,
|
||||
@@ -131,88 +93,11 @@ NtQueryObject (IN HANDLE ObjectHandle,
|
||||
switch (ObjectInformationClass)
|
||||
{
|
||||
case ObjectNameInformation:
|
||||
#if 0
|
||||
Status = ObQueryNameString (Object,
|
||||
(POBJECT_NAME_INFORMATION)ObjectInformation,
|
||||
Length,
|
||||
ReturnLength);
|
||||
break;
|
||||
#endif
|
||||
|
||||
if (Length < sizeof(OBJECT_NAME_INFORMATION) + sizeof(WCHAR))
|
||||
return STATUS_INVALID_BUFFER_SIZE;
|
||||
|
||||
NameInfo = (POBJECT_NAME_INFORMATION)ObjectInformation;
|
||||
*ReturnLength = 0;
|
||||
|
||||
NameInfo->Name.MaximumLength = sizeof(WCHAR);
|
||||
NameInfo->Name.Length = 0;
|
||||
NameInfo->Name.Buffer = (PWCHAR)((ULONG_PTR)NameInfo + sizeof(OBJECT_NAME_INFORMATION));
|
||||
NameInfo->Name.Buffer[0] = 0;
|
||||
|
||||
// FIXME: Temporary QueryName implementation, or at least separate functions
|
||||
if (ObjectHeader->Type==InternalFileType)
|
||||
{
|
||||
NameInfo->Name.MaximumLength = Length - sizeof(OBJECT_NAME_INFORMATION);
|
||||
fileob = (PFILE_OBJECT) Object;
|
||||
Status = internalNameBuilder(BODY_TO_HEADER(fileob->DeviceObject->Vpb->RealDevice),
|
||||
&NameInfo->Name);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
NameInfo->Name.MaximumLength = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
filenameinfo = ExAllocatePool (NonPagedPool,
|
||||
MAX_PATH * sizeof(WCHAR) + sizeof(ULONG));
|
||||
if (filenameinfo == NULL)
|
||||
{
|
||||
NameInfo->Name.MaximumLength = 0;
|
||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
break;
|
||||
}
|
||||
|
||||
Status = IoQueryFileInformation (fileob,
|
||||
FileNameInformation,
|
||||
MAX_PATH * sizeof(WCHAR) + sizeof(ULONG),
|
||||
filenameinfo,
|
||||
NULL);
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
NameInfo->Name.MaximumLength = 0;
|
||||
ExFreePool (filenameinfo);
|
||||
break;
|
||||
}
|
||||
|
||||
Status = RtlAppendUnicodeToString (&(NameInfo->Name),
|
||||
filenameinfo->FileName);
|
||||
|
||||
ExFreePool (filenameinfo);
|
||||
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
NameInfo->Name.MaximumLength = NameInfo->Name.Length + sizeof(WCHAR);
|
||||
*ReturnLength = sizeof(OBJECT_NAME_INFORMATION) + NameInfo->Name.MaximumLength;
|
||||
}
|
||||
}
|
||||
else if (ObjectHeader->Name.Buffer)
|
||||
{
|
||||
// If it's got a name there, we can probably just make the full path through Name and Parent
|
||||
NameInfo->Name.MaximumLength = Length - sizeof(OBJECT_NAME_INFORMATION);
|
||||
|
||||
Status = internalNameBuilder (ObjectHeader,
|
||||
&NameInfo->Name);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
NameInfo->Name.MaximumLength = NameInfo->Name.Length + sizeof(WCHAR);
|
||||
*ReturnLength = sizeof(OBJECT_NAME_INFORMATION) + NameInfo->Name.MaximumLength;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Status = STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
break;
|
||||
|
||||
case ObjectTypeInformation:
|
||||
typeinfo = (POBJECT_TYPE_INFORMATION)ObjectInformation;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $Id: object.c,v 1.59 2003/05/11 19:41:22 ekohl Exp $
|
||||
/* $Id: object.c,v 1.60 2003/06/02 10:03:52 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
@@ -21,6 +21,7 @@
|
||||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
|
||||
/* FUNCTIONS ************************************************************/
|
||||
|
||||
PVOID HEADER_TO_BODY(POBJECT_HEADER obj)
|
||||
@@ -28,6 +29,7 @@ PVOID HEADER_TO_BODY(POBJECT_HEADER obj)
|
||||
return(((void *)obj)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER));
|
||||
}
|
||||
|
||||
|
||||
POBJECT_HEADER BODY_TO_HEADER(PVOID body)
|
||||
{
|
||||
PCOMMON_BODY_HEADER chdr = (PCOMMON_BODY_HEADER)body;
|
||||
@@ -219,6 +221,122 @@ NTSTATUS ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
* NAME EXPORTED
|
||||
* ObQueryNameString@16
|
||||
*
|
||||
* DESCRIPTION
|
||||
*
|
||||
* ARGUMENTS
|
||||
*
|
||||
* RETURN VALUE
|
||||
*/
|
||||
NTSTATUS STDCALL
|
||||
ObQueryNameString (IN PVOID Object,
|
||||
OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
|
||||
IN ULONG Length,
|
||||
OUT PULONG ReturnLength)
|
||||
{
|
||||
POBJECT_NAME_INFORMATION LocalInfo;
|
||||
POBJECT_HEADER ObjectHeader;
|
||||
ULONG LocalReturnLength;
|
||||
NTSTATUS Status;
|
||||
|
||||
*ReturnLength = 0;
|
||||
|
||||
if (Length < sizeof(OBJECT_NAME_INFORMATION) + sizeof(WCHAR))
|
||||
return STATUS_INVALID_BUFFER_SIZE;
|
||||
|
||||
ObjectNameInfo->Name.MaximumLength = Length - sizeof(OBJECT_NAME_INFORMATION);
|
||||
ObjectNameInfo->Name.Length = 0;
|
||||
ObjectNameInfo->Name.Buffer =
|
||||
(PWCHAR)((ULONG_PTR)ObjectNameInfo + sizeof(OBJECT_NAME_INFORMATION));
|
||||
ObjectNameInfo->Name.Buffer[0] = 0;
|
||||
|
||||
ObjectHeader = BODY_TO_HEADER(Object);
|
||||
|
||||
if (ObjectHeader->ObjectType != NULL &&
|
||||
ObjectHeader->ObjectType->QueryName != NULL)
|
||||
{
|
||||
DPRINT ("Calling %x\n", ObjectHeader->ObjectType->QueryName);
|
||||
Status = ObjectHeader->ObjectType->QueryName (Object,
|
||||
ObjectNameInfo,
|
||||
Length,
|
||||
ReturnLength);
|
||||
if (!NT_SUCCESS (Status))
|
||||
return Status;
|
||||
|
||||
Status = RtlAppendUnicodeStringToString (&ObjectNameInfo->Name,
|
||||
&ObjectHeader->Name);
|
||||
}
|
||||
else if (ObjectHeader->Name.Length > 0 && ObjectHeader->Name.Buffer != NULL)
|
||||
{
|
||||
DPRINT ("Object does not have a 'QueryName' function\n");
|
||||
|
||||
if (ObjectHeader->Parent == NameSpaceRoot)
|
||||
{
|
||||
DPRINT ("Reached the root directory\n");
|
||||
ObjectNameInfo->Name.Buffer[0] = 0;
|
||||
Status = STATUS_SUCCESS;
|
||||
}
|
||||
else if (ObjectHeader->Parent != NULL)
|
||||
{
|
||||
LocalInfo = ExAllocatePool (NonPagedPool,
|
||||
sizeof(OBJECT_NAME_INFORMATION) +
|
||||
MAX_PATH * sizeof(WCHAR));
|
||||
if (LocalInfo == NULL)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
||||
Status = ObQueryNameString (ObjectHeader->Parent,
|
||||
LocalInfo,
|
||||
MAX_PATH * sizeof(WCHAR),
|
||||
&LocalReturnLength);
|
||||
if (!NT_SUCCESS (Status))
|
||||
{
|
||||
ExFreePool (LocalInfo);
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = RtlAppendUnicodeStringToString (&ObjectNameInfo->Name,
|
||||
&LocalInfo->Name);
|
||||
|
||||
ExFreePool (LocalInfo);
|
||||
|
||||
if (!NT_SUCCESS (Status))
|
||||
return Status;
|
||||
}
|
||||
|
||||
DPRINT ("Object path %wZ\n", &ObjectHeader->Name);
|
||||
Status = RtlAppendUnicodeToString (&ObjectNameInfo->Name,
|
||||
L"\\");
|
||||
if (!NT_SUCCESS (Status))
|
||||
return Status;
|
||||
|
||||
Status = RtlAppendUnicodeStringToString (&ObjectNameInfo->Name,
|
||||
&ObjectHeader->Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT1 ("Object is unnamed\n");
|
||||
|
||||
/* FIXME */
|
||||
|
||||
Status = STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
if (NT_SUCCESS (Status))
|
||||
{
|
||||
ObjectNameInfo->Name.MaximumLength =
|
||||
ObjectNameInfo->Name.Length + sizeof(WCHAR);
|
||||
*ReturnLength =
|
||||
sizeof(OBJECT_NAME_INFORMATION) + ObjectNameInfo->Name.MaximumLength;
|
||||
DPRINT ("Returned object path: %wZ\n", &ObjectNameInfo->Name);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
* NAME EXPORTED
|
||||
* ObCreateObject@36
|
||||
@@ -230,11 +348,11 @@ NTSTATUS ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
* RETURN VALUE
|
||||
*/
|
||||
NTSTATUS STDCALL
|
||||
ObCreateObject(OUT PHANDLE Handle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
IN POBJECT_TYPE Type,
|
||||
OUT PVOID *Object)
|
||||
ObCreateObject (OUT PHANDLE Handle,
|
||||
IN ACCESS_MASK DesiredAccess,
|
||||
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
IN POBJECT_TYPE Type,
|
||||
OUT PVOID *Object)
|
||||
{
|
||||
PVOID Parent = NULL;
|
||||
UNICODE_STRING RemainingPath;
|
||||
|
||||
Reference in New Issue
Block a user