DPRINT("'%wZ'\n", &FileObject->RelatedFileObject->FileName);
*ParentFcb = FileObject->RelatedFileObject->FsContext;
- vfatGrabFCB(DeviceExt, *ParentFcb);
}
else
{
if (FileObject->FileName.Length == 0 &&
(FileObject->RelatedFileObject == NULL || FileObject->RelatedFileObject->FsContext2 != NULL))
{
- DPRINT1("Volume opening\n");
+ DPRINT("Volume opening\n");
if (RequestedDisposition != FILE_OPEN &&
RequestedDisposition != FILE_OPEN_IF)
}
pFcb = DeviceExt->VolumeFcb;
+
+ if (pFcb->OpenHandleCount == 0)
+ {
+ IoSetShareAccess(Stack->Parameters.Create.SecurityContext->DesiredAccess,
+ Stack->Parameters.Create.ShareAccess,
+ FileObject,
+ &pFcb->FCBShareAccess);
+ }
+ else
+ {
+ Status = IoCheckShareAccess(Stack->Parameters.Create.SecurityContext->DesiredAccess,
+ Stack->Parameters.Create.ShareAccess,
+ FileObject,
+ &pFcb->FCBShareAccess,
+ FALSE);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+ }
+
vfatAttachFCBToFileObject(DeviceExt, pFcb, FileObject);
DeviceExt->OpenHandleCount++;
LONG idx, FileNameLen;
ParentFcb = (FileObject->RelatedFileObject != NULL) ? FileObject->RelatedFileObject->FsContext : NULL;
+ if (ParentFcb)
+ {
+ vfatGrabFCB(DeviceExt, ParentFcb);
+ }
Status = vfatGetFCBForFile(DeviceExt, &ParentFcb, &TargetFcb, &PathNameU);
- if (Status == STATUS_SUCCESS)
+ if (NT_SUCCESS(Status))
{
- vfatGrabFCB(DeviceExt, ParentFcb);
vfatReleaseFCB(DeviceExt, TargetFcb);
Irp->IoStatus.Information = FILE_EXISTS;
}
idx = FileObject->FileName.Length / sizeof(WCHAR) - 1;
- /* Skip tailing \ - if any */
+ /* Skip trailing \ - if any */
if (PathNameU.Buffer[idx] == L'\\')
{
--idx;
if (NT_SUCCESS(Status))
{
pFcb = FileObject->FsContext;
+ ASSERT(pFcb == ParentFcb);
if (pFcb->OpenHandleCount == 0)
{
FALSE);
if (!NT_SUCCESS(Status))
{
- vfatReleaseFCB(DeviceExt, ParentFcb);
VfatCloseFile(DeviceExt, FileObject);
return Status;
}