mirror of
https://github.com/reactos/reactos.git
synced 2024-09-14 06:42:52 +00:00
Add changes from cc rewrite brunch. The driver still works under the old cc because it makes use of the USE_ROS_CC_AND_FS define.
svn path=/trunk/; revision=25243
This commit is contained in:
parent
8bf9208764
commit
f01a075e09
|
@ -29,24 +29,50 @@ VfatCleanupFile(PVFAT_IRP_CONTEXT IrpContext)
|
||||||
pFcb = (PVFATFCB) FileObject->FsContext;
|
pFcb = (PVFATFCB) FileObject->FsContext;
|
||||||
if (pFcb)
|
if (pFcb)
|
||||||
{
|
{
|
||||||
if (!(*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY) &&
|
if (pFcb->Flags & FCB_IS_VOLUME)
|
||||||
FsRtlAreThereCurrentFileLocks(&pFcb->FileLock))
|
{
|
||||||
{
|
pFcb->OpenHandleCount--;
|
||||||
/* remove all locks this process have on this file */
|
|
||||||
FsRtlFastUnlockAll(&pFcb->FileLock,
|
|
||||||
FileObject,
|
|
||||||
IoGetRequestorProcess(IrpContext->Irp),
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pFcb->Flags & FCB_IS_DIRTY)
|
if (pFcb->OpenHandleCount != 0)
|
||||||
{
|
{
|
||||||
VfatUpdateEntry (pFcb);
|
IoRemoveShareAccess(FileObject, &pFcb->FCBShareAccess);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!ExAcquireResourceExclusiveLite (&pFcb->MainResource,
|
||||||
|
(BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT)))
|
||||||
|
{
|
||||||
|
return STATUS_PENDING;
|
||||||
|
}
|
||||||
|
if(!ExAcquireResourceExclusiveLite (&pFcb->PagingIoResource,
|
||||||
|
(BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT)))
|
||||||
|
{
|
||||||
|
ExReleaseResourceLite (&pFcb->MainResource);
|
||||||
|
return STATUS_PENDING;
|
||||||
|
}
|
||||||
|
|
||||||
|
pFcb->OpenHandleCount--;
|
||||||
|
|
||||||
if (pFcb->Flags & FCB_DELETE_PENDING &&
|
if (!(*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY) &&
|
||||||
pFcb->OpenHandleCount == 1)
|
FsRtlAreThereCurrentFileLocks(&pFcb->FileLock))
|
||||||
{
|
{
|
||||||
|
/* remove all locks this process have on this file */
|
||||||
|
FsRtlFastUnlockAll(&pFcb->FileLock,
|
||||||
|
FileObject,
|
||||||
|
IoGetRequestorProcess(IrpContext->Irp),
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pFcb->Flags & FCB_IS_DIRTY)
|
||||||
|
{
|
||||||
|
VfatUpdateEntry (pFcb);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pFcb->Flags & FCB_DELETE_PENDING &&
|
||||||
|
pFcb->OpenHandleCount == 0)
|
||||||
|
{
|
||||||
|
DPRINT("'%wZ'\n", &pFcb->PathNameU);
|
||||||
PFILE_OBJECT tmpFileObject;
|
PFILE_OBJECT tmpFileObject;
|
||||||
tmpFileObject = pFcb->FileObject;
|
tmpFileObject = pFcb->FileObject;
|
||||||
if (tmpFileObject != NULL)
|
if (tmpFileObject != NULL)
|
||||||
|
@ -71,10 +97,21 @@ VfatCleanupFile(PVFAT_IRP_CONTEXT IrpContext)
|
||||||
#ifdef USE_ROS_CC_AND_FS
|
#ifdef USE_ROS_CC_AND_FS
|
||||||
CcRosReleaseFileCache (FileObject);
|
CcRosReleaseFileCache (FileObject);
|
||||||
#else
|
#else
|
||||||
CcUninitializeCacheMap (FileObject, NULL, NULL);
|
if (FileObject->SectionObjectPointer->SharedCacheMap)
|
||||||
|
{
|
||||||
|
CcUninitializeCacheMap (FileObject, &pFcb->RFCB.FileSize, NULL);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
pFcb->OpenHandleCount--;
|
if (pFcb->OpenHandleCount != 0)
|
||||||
IoRemoveShareAccess(FileObject, &pFcb->FCBShareAccess);
|
{
|
||||||
|
IoRemoveShareAccess(FileObject, &pFcb->FCBShareAccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
FileObject->Flags |= FO_CLEANUP_COMPLETE;
|
||||||
|
|
||||||
|
ExReleaseResourceLite (&pFcb->PagingIoResource);
|
||||||
|
ExReleaseResourceLite (&pFcb->MainResource);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -104,6 +141,11 @@ NTSTATUS VfatCleanup (PVFAT_IRP_CONTEXT IrpContext)
|
||||||
|
|
||||||
ExReleaseResourceLite (&IrpContext->DeviceExt->DirResource);
|
ExReleaseResourceLite (&IrpContext->DeviceExt->DirResource);
|
||||||
|
|
||||||
|
if (Status == STATUS_PENDING)
|
||||||
|
{
|
||||||
|
return VfatQueueRequest(IrpContext);
|
||||||
|
}
|
||||||
|
|
||||||
ByeBye:
|
ByeBye:
|
||||||
IrpContext->Irp->IoStatus.Status = Status;
|
IrpContext->Irp->IoStatus.Status = Status;
|
||||||
IrpContext->Irp->IoStatus.Information = 0;
|
IrpContext->Irp->IoStatus.Information = 0;
|
||||||
|
|
|
@ -30,6 +30,8 @@ VfatCloseFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
|
||||||
pCcb = (PVFATCCB) (FileObject->FsContext2);
|
pCcb = (PVFATCCB) (FileObject->FsContext2);
|
||||||
pFcb = (PVFATFCB) (FileObject->FsContext);
|
pFcb = (PVFATFCB) (FileObject->FsContext);
|
||||||
|
|
||||||
|
FileObject->FsContext2 = NULL;
|
||||||
|
|
||||||
if (pFcb == NULL)
|
if (pFcb == NULL)
|
||||||
{
|
{
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
|
@ -43,7 +45,7 @@ VfatCloseFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (FileObject->DeletePending)
|
// if (FileObject->DeletePending)
|
||||||
{
|
{
|
||||||
if (pFcb->Flags & FCB_DELETE_PENDING)
|
if (pFcb->Flags & FCB_DELETE_PENDING)
|
||||||
{
|
{
|
||||||
|
@ -57,7 +59,6 @@ VfatCloseFile (PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
|
||||||
vfatReleaseFCB (DeviceExt, pFcb);
|
vfatReleaseFCB (DeviceExt, pFcb);
|
||||||
}
|
}
|
||||||
|
|
||||||
FileObject->FsContext2 = NULL;
|
|
||||||
FileObject->FsContext = NULL;
|
FileObject->FsContext = NULL;
|
||||||
FileObject->SectionObjectPointer = NULL;
|
FileObject->SectionObjectPointer = NULL;
|
||||||
|
|
||||||
|
|
|
@ -656,7 +656,24 @@ VfatCreateFile ( PDEVICE_OBJECT DeviceObject, PIRP Irp )
|
||||||
VfatCloseFile (DeviceExt, FileObject);
|
VfatCloseFile (DeviceExt, FileObject);
|
||||||
return(STATUS_NOT_A_DIRECTORY);
|
return(STATUS_NOT_A_DIRECTORY);
|
||||||
}
|
}
|
||||||
|
#ifndef USE_ROS_CC_AND_FS
|
||||||
|
if (!(*pFcb->Attributes & FILE_ATTRIBUTE_DIRECTORY))
|
||||||
|
{
|
||||||
|
if (Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA ||
|
||||||
|
RequestedDisposition == FILE_OVERWRITE ||
|
||||||
|
RequestedDisposition == FILE_OVERWRITE_IF)
|
||||||
|
{
|
||||||
|
if (!MmFlushImageSection(&pFcb->SectionObjectPointers, MmFlushForWrite))
|
||||||
|
{
|
||||||
|
DPRINT1("%wZ\n", &pFcb->PathNameU);
|
||||||
|
DPRINT1("%d %d %d\n", Stack->Parameters.Create.SecurityContext->DesiredAccess & FILE_WRITE_DATA,
|
||||||
|
RequestedDisposition == FILE_OVERWRITE, RequestedDisposition == FILE_OVERWRITE_IF);
|
||||||
|
VfatCloseFile (DeviceExt, FileObject);
|
||||||
|
return STATUS_SHARING_VIOLATION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (PagingFileCreate)
|
if (PagingFileCreate)
|
||||||
{
|
{
|
||||||
/* FIXME:
|
/* FIXME:
|
||||||
|
|
Loading…
Reference in a new issue