/*
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Kernel Drivers, LLC.
- * Copyright (c) 2009, 2010, 2011, 2012, 2013 Your File System, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Your File System, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
stFileCleanup.LastAccessTime = pObjectInfo->LastAccessTime;
+ //
+ // If the file has been modified set the last write time in ObjectInfo to 'now'
+ // unless the last write time was set via this File Object. Then tell the
+ // following code to write the time.
+ //
+ if ( BooleanFlagOn( pFileObject->Flags, FO_FILE_MODIFIED) &&
+ !BooleanFlagOn( pCcb->Flags, CCB_FLAG_LAST_WRITE_TIME_SET)) {
+
+ SetFlag( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
+
+ SetFlag( pFcb->Flags, AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
+
+ KeQuerySystemTime(&pFcb->ObjectInformation->LastWriteTime);
+ }
+
if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED))
{
stFileCleanup.LastWriteTime = pObjectInfo->LastWriteTime;
- ClearFlag( pFcb->Flags, AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME | AFS_FCB_FLAG_UPDATE_WRITE_TIME);
+ ClearFlag( pFcb->Flags, AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
}
}
- if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_UPDATE_WRITE_TIME))
- {
-
- stFileCleanup.LastWriteTime = pObjectInfo->LastWriteTime;
- }
-
//
// If the count has dropped to one and there is a pending delete
// then delete the node. The final count will be decremented just
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
- * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2014 Your File System, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_WRITE;
SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
+
+ SetFlag( pCcb->Flags, CCB_FLAG_LAST_WRITE_TIME_SET);
+
+ } else if ( pBuffer->LastWriteTime.QuadPart == (ULONGLONG)-1) {
+
+ SetFlag( pCcb->Flags, CCB_FLAG_LAST_WRITE_TIME_SET);
}
pCcb->FileUnwindInfo.ChangeTime.QuadPart = (ULONGLONG)-1;
CcSetFileSizes( pFileObject,
(PCC_FILE_SIZES)&pFcb->Header.AllocationSize);
}
+
+ //
+ // Mark the file as modified so as to reflect the change into the last write on close.
+ //
+ SetFlag( pFileObject->Flags, FO_FILE_MODIFIED);
}
else
{
AFSTrimExtents( pFcb,
&pFcb->Header.FileSize);
}
+
+ //
+ // Mark the file as modified so as to reflect the change into the last write on close.
+ //
+ SetFlag( pFileObject->Flags, FO_FILE_MODIFIED);
}
else
{
pFcb->Header.ValidDataLength.QuadPart = liStartingByte.QuadPart + ulByteCount;
}
- if( !BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME))
- {
-
- SetFlag( pFcb->Flags, AFS_FCB_FLAG_UPDATE_WRITE_TIME);
-
- KeQuerySystemTime( &pFcb->ObjectInformation->LastWriteTime);
- }
+ //
+ // Register the File Object as having modified the file.
+ //
+ SetFlag( pFileObject->Flags, FO_FILE_MODIFIED);
}
}
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
- * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2014 Your File System, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#define AFS_FCB_FLAG_FILE_MODIFIED 0x00000001
#define AFS_FCB_FILE_CLOSED 0x00000002
-#define AFS_FCB_FLAG_UPDATE_WRITE_TIME 0x00000004
#define AFS_FCB_FLAG_UPDATE_CHANGE_TIME 0x00000008
#define AFS_FCB_FLAG_UPDATE_ACCESS_TIME 0x00000010
#define AFS_FCB_FLAG_UPDATE_CREATE_TIME 0x00000020
#define CCB_FLAG_MASK_OPENED_REPARSE_POINT 0x00000080
#define CCB_FLAG_INSERTED_CCB_LIST 0x00000100
#define CCB_FLAG_DIRECTORY_QUERY_DIRECT_QUERY 0x00000200
+#define CCB_FLAG_LAST_WRITE_TIME_SET 0x00000800
//
// DirEntry flags