[NTOSKRNL]

Implement the reparse points loop in IopParseDevice().

Reviewed by Thomas

svn path=/trunk/; revision=67067
This commit is contained in:
Pierre Schweitzer 2015-04-05 20:02:30 +00:00
parent 14ce9b898d
commit e18a1e92bc
2 changed files with 679 additions and 665 deletions

View file

@ -80,6 +80,11 @@
//
#define RD_SYMLINK_CREATE_FAILED 5
//
// Max traversal of reparse points for a single open in IoParseDevice
//
#define IOP_MAX_REPARSE_TRAVERSAL 0x20
//
// We can call the Ob Inlined API, it's the same thing
//

View file

@ -300,9 +300,12 @@ IopParseDevice(IN PVOID ParseObject,
BOOLEAN AccessGranted, LockHeld = FALSE;
PPRIVILEGE_SET Privileges = NULL;
UNICODE_STRING FileString;
USHORT Attempt;
IOTRACE(IO_FILE_DEBUG, "ParseObject: %p. RemainingName: %wZ\n",
ParseObject, RemainingName);
for (Attempt = 0; Attempt < IOP_MAX_REPARSE_TRAVERSAL; ++Attempt)
{
/* Assume failure */
*Object = NULL;
@ -1042,10 +1045,16 @@ IopParseDevice(IN PVOID ParseObject,
return STATUS_REPARSE;
}
/* FIXME: At that point, we should loop again and reattempt an opening */
ASSERT(FALSE);
/* Loop again and reattempt an opening */
continue;
}
break;
}
if (Attempt == IOP_MAX_REPARSE_TRAVERSAL)
return STATUS_UNSUCCESSFUL;
/* Get the owner of the File Object */
OwnerDevice = IoGetRelatedDeviceObject(FileObject);