{
_SEH_TRY
{
- ProbeForWrite(DirectoryHandle,
- sizeof(HANDLE),
- sizeof(ULONG));
+ ProbeForWriteHandle(DirectoryHandle);
}
_SEH_HANDLE
{
ProbeForWrite(Buffer,
BufferLength,
sizeof(WCHAR));
- ProbeForWrite(Context,
- sizeof(ULONG),
- sizeof(ULONG));
+ ProbeForWriteUlong(Context);
if(!RestartScan)
{
SkipEntries = *Context;
}
if(ReturnLength != NULL)
{
- ProbeForWrite(ReturnLength,
- sizeof(ULONG),
- sizeof(ULONG));
+ ProbeForWriteUlong(ReturnLength);
}
}
_SEH_HANDLE
NULL);
if(NT_SUCCESS(Status))
{
- PVOID TemporaryBuffer = ExAllocatePool(PagedPool,
+ PVOID TemporaryBuffer = ExAllocatePool(NonPagedPool,
BufferLength);
if(TemporaryBuffer != NULL)
{
POBJECT_HEADER EntryHeader;
PLIST_ENTRY ListEntry;
KIRQL OldLevel;
- ULONG RequiredSize = 0;
+ ULONG RequiredSize = sizeof(OBJECT_DIRECTORY_INFORMATION);
ULONG nDirectories = 0;
POBJECT_DIRECTORY_INFORMATION DirInfo = (POBJECT_DIRECTORY_INFORMATION)TemporaryBuffer;
EntryHeader = CONTAINING_RECORD(ListEntry, OBJECT_HEADER, Entry);
/* calculate the size of the required buffer space for this entry */
- Name = (EntryHeader->NameInfo->Name.Length != 0 ? &EntryHeader->NameInfo->Name : NULL);
- Type = &EntryHeader->ObjectType->Name;
+ Name = (HEADER_TO_OBJECT_NAME(EntryHeader)->Name.Length != 0 ? &HEADER_TO_OBJECT_NAME(EntryHeader)->Name : NULL);
+ Type = &EntryHeader->Type->Name;
EntrySize = sizeof(OBJECT_DIRECTORY_INFORMATION) +
((Name != NULL) ? ((ULONG)Name->Length + sizeof(WCHAR)) : 0) +
- (ULONG)EntryHeader->ObjectType->Name.Length + sizeof(WCHAR);
+ (ULONG)EntryHeader->Type->Name.Length + sizeof(WCHAR);
if(RequiredSize + EntrySize <= BufferLength)
{
if(NT_SUCCESS(Status) && nDirectories > 0)
{
- PWSTR strbuf = (PWSTR)((POBJECT_DIRECTORY_INFORMATION)TemporaryBuffer + nDirectories);
- PWSTR deststrbuf = (PWSTR)((POBJECT_DIRECTORY_INFORMATION)Buffer + nDirectories);
+ PWSTR strbuf = (PWSTR)((POBJECT_DIRECTORY_INFORMATION)TemporaryBuffer + nDirectories + 1);
+ PWSTR deststrbuf = (PWSTR)((POBJECT_DIRECTORY_INFORMATION)Buffer + nDirectories + 1);
+ memset((POBJECT_DIRECTORY_INFORMATION)TemporaryBuffer + nDirectories, 0, sizeof(OBJECT_DIRECTORY_INFORMATION));
- CopyBytes = nDirectories * sizeof(OBJECT_DIRECTORY_INFORMATION);
+ CopyBytes = (nDirectories + 1) * sizeof(OBJECT_DIRECTORY_INFORMATION);
/* copy the names from the objects and append them to the list of the
objects. copy to the temporary buffer only because the directory
{
_SEH_TRY
{
- ProbeForWrite(DirectoryHandle,
- sizeof(HANDLE),
- sizeof(ULONG));
+ ProbeForWriteHandle(DirectoryHandle);
}
_SEH_HANDLE
{
0,
NULL,
&hDirectory);
+ if (!NT_SUCCESS(Status))
+ {
+ ObMakeTemporaryObject(Directory);
+ }
ObDereferenceObject(Directory);
if(NT_SUCCESS(Status))