BytesPerSector = DeviceExt->FatInfo.BytesPerSector;
BytesPerCluster = DeviceExt->FatInfo.BytesPerCluster;
- ASSERT(ReadOffset.QuadPart + Length <= ROUND_UP(Fcb->RFCB.FileSize.QuadPart, BytesPerSector));
+ ASSERT(ReadOffset.QuadPart + Length <= ROUND_UP_64(Fcb->RFCB.FileSize.QuadPart, BytesPerSector));
ASSERT(ReadOffset.u.LowPart % BytesPerSector == 0);
ASSERT(Length % BytesPerSector == 0);
PFATINFO FatInfo = &IrpContext->DeviceExt->FatInfo;
IrpContext->Stack->Parameters.Read.ByteOffset.QuadPart += FatInfo->dataStart * FatInfo->BytesPerSector;
IoSkipCurrentIrpStackLocation(IrpContext->Irp);
+ IrpContext->Flags &= ~IRPCONTEXT_COMPLETE;
DPRINT("Read from page file, disk offset %I64x\n", IrpContext->Stack->Parameters.Read.ByteOffset.QuadPart);
Status = IoCallDriver(IrpContext->DeviceExt->StorageDevice, IrpContext->Irp);
- VfatFreeIrpContext(IrpContext);
return Status;
}
goto ByeBye;
}
+ if (Length == 0)
+ {
+ IrpContext->Irp->IoStatus.Information = 0;
+ Status = STATUS_SUCCESS;
+ goto ByeBye;
+ }
+
if (ByteOffset.QuadPart >= Fcb->RFCB.FileSize.QuadPart)
{
IrpContext->Irp->IoStatus.Information = 0;
}
}
- if (Length == 0)
- {
- IrpContext->Irp->IoStatus.Information = 0;
- Status = STATUS_SUCCESS;
- goto ByeBye;
- }
-
if (Fcb->Flags & FCB_IS_VOLUME)
{
Resource = &IrpContext->DeviceExt->DirResource;
}
}
- Buffer = VfatGetUserBuffer(IrpContext->Irp);
- if (!Buffer)
+ Buffer = VfatGetUserBuffer(IrpContext->Irp, BooleanFlagOn(IrpContext->Irp->Flags, IRP_PAGING_IO));
+ Status = VfatLockUserBuffer(IrpContext->Irp, Length, IoWriteAccess);
+ if (!NT_SUCCESS(Status))
{
- Status = STATUS_INVALID_USER_BUFFER;
goto ByeBye;
}
Status = /*STATUS_END_OF_FILE*/STATUS_SUCCESS;
}
- if (IrpContext->FileObject->PrivateCacheMap == NULL)
+ _SEH2_TRY
{
- CcInitializeCacheMap(IrpContext->FileObject,
- (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
- FALSE,
- &(VfatGlobalData->CacheMgrCallbacks),
- Fcb);
- }
+ if (IrpContext->FileObject->PrivateCacheMap == NULL)
+ {
+ CcInitializeCacheMap(IrpContext->FileObject,
+ (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
+ FALSE,
+ &(VfatGlobalData->CacheMgrCallbacks),
+ Fcb);
+ }
- if (!CcCopyRead(IrpContext->FileObject, &ByteOffset, Length,
- (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT), Buffer,
- &IrpContext->Irp->IoStatus))
+ if (!CcCopyRead(IrpContext->FileObject,
+ &ByteOffset,
+ Length,
+ (IrpContext->Flags & IRPCONTEXT_CANWAIT) != 0,
+ Buffer,
+ &IrpContext->Irp->IoStatus))
+ {
+ ASSERT((IrpContext->Flags & IRPCONTEXT_CANWAIT) == 0);
+ Status = STATUS_PENDING;
+ goto ByeBye;
+ }
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- Status = STATUS_PENDING;
+ Status = _SEH2_GetExceptionCode();
goto ByeBye;
}
+ _SEH2_END;
if (!NT_SUCCESS(IrpContext->Irp->IoStatus.Status))
{
else
{
// non cached read
- if (ByteOffset.QuadPart + Length > ROUND_UP(Fcb->RFCB.FileSize.QuadPart, BytesPerSector))
- {
- Length = (ULONG)(ROUND_UP(Fcb->RFCB.FileSize.QuadPart, BytesPerSector) - ByteOffset.QuadPart);
- }
-
- Status = VfatLockUserBuffer(IrpContext->Irp, Length, IoWriteAccess);
- if (!NT_SUCCESS(Status))
+ if (ByteOffset.QuadPart + Length > ROUND_UP_64(Fcb->RFCB.FileSize.QuadPart, BytesPerSector))
{
- goto ByeBye;
+ Length = (ULONG)(ROUND_UP_64(Fcb->RFCB.FileSize.QuadPart, BytesPerSector) - ByteOffset.QuadPart);
}
Status = VfatReadFileData(IrpContext, Length, ByteOffset, &ReturnedLength);
Status = VfatLockUserBuffer(IrpContext->Irp, Length, IoWriteAccess);
if (NT_SUCCESS(Status))
{
- Status = VfatQueueRequest(IrpContext);
- }
- else
- {
- IrpContext->Irp->IoStatus.Status = Status;
- IoCompleteRequest(IrpContext->Irp, IO_NO_INCREMENT);
- VfatFreeIrpContext(IrpContext);
+ Status = VfatMarkIrpContextForQueue(IrpContext);
}
}
else
ByteOffset.QuadPart + IrpContext->Irp->IoStatus.Information;
}
- IoCompleteRequest(IrpContext->Irp,
- (CCHAR)(NT_SUCCESS(Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT));
- VfatFreeIrpContext(IrpContext);
+ if (NT_SUCCESS(Status))
+ IrpContext->PriorityBoost = IO_DISK_INCREMENT;
}
DPRINT("%x\n", Status);
return Status;
PFATINFO FatInfo = &IrpContext->DeviceExt->FatInfo;
IrpContext->Stack->Parameters.Write.ByteOffset.QuadPart += FatInfo->dataStart * FatInfo->BytesPerSector;
IoSkipCurrentIrpStackLocation(IrpContext->Irp);
+ IrpContext->Flags &= ~IRPCONTEXT_COMPLETE;
DPRINT("Write to page file, disk offset %I64x\n", IrpContext->Stack->Parameters.Write.ByteOffset.QuadPart);
Status = IoCallDriver(IrpContext->DeviceExt->StorageDevice, IrpContext->Irp);
- VfatFreeIrpContext(IrpContext);
return Status;
}
}
}
+ OldFileSize = Fcb->RFCB.FileSize;
+
if (Length == 0)
{
- /* FIXME: Update last write time */
+ /* Update last write time */
IrpContext->Irp->IoStatus.Information = 0;
Status = STATUS_SUCCESS;
- goto ByeBye;
+ goto Metadata;
}
if (IrpContext->Irp->Flags & IRP_PAGING_IO)
if (Fcb->Flags & FCB_IS_PAGE_FILE)
{
if (!ExAcquireResourceSharedLite(Resource,
- (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT)))
+ BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
{
Resource = NULL;
Status = STATUS_PENDING;
else
{
if (!ExAcquireResourceExclusiveLite(Resource,
- (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT)))
+ BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT)))
{
Resource = NULL;
Status = STATUS_PENDING;
}
}
- OldFileSize = Fcb->RFCB.FileSize;
-
- Buffer = VfatGetUserBuffer(IrpContext->Irp);
- if (!Buffer)
+ Buffer = VfatGetUserBuffer(IrpContext->Irp, BooleanFlagOn(IrpContext->Irp->Flags, IRP_PAGING_IO));
+ Status = VfatLockUserBuffer(IrpContext->Irp, Length, IoReadAccess);
+ if (!NT_SUCCESS(Status))
{
Status = STATUS_INVALID_USER_BUFFER;
goto ByeBye;
}
-
if (!(Fcb->Flags & (FCB_IS_FAT|FCB_IS_VOLUME)) &&
!(IrpContext->Irp->Flags & IRP_PAGING_IO) &&
ByteOffset.u.LowPart + Length > Fcb->RFCB.FileSize.u.LowPart)
{
// cached write
- if (IrpContext->FileObject->PrivateCacheMap == NULL)
+ _SEH2_TRY
{
- CcInitializeCacheMap(IrpContext->FileObject,
- (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
- FALSE,
- &VfatGlobalData->CacheMgrCallbacks,
- Fcb);
- }
+ if (IrpContext->FileObject->PrivateCacheMap == NULL)
+ {
+ CcInitializeCacheMap(IrpContext->FileObject,
+ (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
+ FALSE,
+ &VfatGlobalData->CacheMgrCallbacks,
+ Fcb);
+ }
- if (ByteOffset.QuadPart > OldFileSize.QuadPart)
- {
- CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE);
- }
+ if (ByteOffset.QuadPart > OldFileSize.QuadPart)
+ {
+ CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE);
+ }
- if (CcCopyWrite(IrpContext->FileObject, &ByteOffset, Length,
- 1 /*IrpContext->Flags & IRPCONTEXT_CANWAIT*/, Buffer))
- {
- IrpContext->Irp->IoStatus.Information = Length;
- Status = STATUS_SUCCESS;
+ if (CcCopyWrite(IrpContext->FileObject,
+ &ByteOffset,
+ Length,
+ TRUE /*(IrpContext->Flags & IRPCONTEXT_CANWAIT) != 0*/,
+ Buffer))
+ {
+ IrpContext->Irp->IoStatus.Information = Length;
+ Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ ASSERT(FALSE /*(IrpContext->Flags & IRPCONTEXT_CANWAIT) == 0*/);
+ Status = STATUS_UNSUCCESSFUL;
+ }
}
- else
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- Status = STATUS_UNSUCCESSFUL;
+ Status = _SEH2_GetExceptionCode();
}
+ _SEH2_END;
}
else
{
CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE);
}
- Status = VfatLockUserBuffer(IrpContext->Irp, Length, IoReadAccess);
- if (!NT_SUCCESS(Status))
- {
- goto ByeBye;
- }
-
Status = VfatWriteFileData(IrpContext, Length, ByteOffset);
if (NT_SUCCESS(Status))
{
}
}
+Metadata:
if (!(IrpContext->Irp->Flags & IRP_PAGING_IO) &&
!(Fcb->Flags & (FCB_IS_FAT|FCB_IS_VOLUME)))
{
if(!(*Fcb->Attributes & FILE_ATTRIBUTE_DIRECTORY))
{
LARGE_INTEGER SystemTime;
+ ULONG Filter;
+
// set dates and times
KeQuerySystemTime (&SystemTime);
if (Fcb->Flags & FCB_IS_FATX_ENTRY)
}
/* set date and times to dirty */
Fcb->Flags |= FCB_IS_DIRTY;
+
+ /* Time to notify the OS */
+ Filter = FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES;
+ if (ByteOffset.QuadPart != OldFileSize.QuadPart) Filter |= FILE_NOTIFY_CHANGE_SIZE;
+
+ FsRtlNotifyFullReportChange(IrpContext->DeviceExt->NotifySync,
+ &(IrpContext->DeviceExt->NotifyList),
+ (PSTRING)&Fcb->PathNameU,
+ Fcb->PathNameU.Length - Fcb->LongNameU.Length,
+ NULL,
+ NULL,
+ Filter,
+ FILE_ACTION_MODIFIED,
+ NULL);
}
}
Status = VfatLockUserBuffer(IrpContext->Irp, Length, IoReadAccess);
if (NT_SUCCESS(Status))
{
- Status = VfatQueueRequest(IrpContext);
- }
- else
- {
- IrpContext->Irp->IoStatus.Status = Status;
- IoCompleteRequest(IrpContext->Irp, IO_NO_INCREMENT);
- VfatFreeIrpContext(IrpContext);
+ Status = VfatMarkIrpContextForQueue(IrpContext);
}
}
else
ByteOffset.QuadPart + IrpContext->Irp->IoStatus.Information;
}
- IoCompleteRequest(IrpContext->Irp,
- (CCHAR)(NT_SUCCESS(Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT));
- VfatFreeIrpContext(IrpContext);
+ if (NT_SUCCESS(Status))
+ IrpContext->PriorityBoost = IO_DISK_INCREMENT;
}
DPRINT("%x\n", Status);
return Status;
}
-