MCPcopy Create free account
hub / github.com/bobranten/Ext4Fsd / Ext2SupersedeOrOverWriteFile

Function Ext2SupersedeOrOverWriteFile

Ext4Fsd/create.c:2139–2197  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2137
2138
2139NTSTATUS
2140Ext2SupersedeOrOverWriteFile(
2141 IN PEXT2_IRP_CONTEXT IrpContext,
2142 IN PFILE_OBJECT FileObject,
2143 IN PEXT2_VCB Vcb,
2144 IN PEXT2_FCB Fcb,
2145 IN PLARGE_INTEGER AllocationSize,
2146 IN ULONG Disposition
2147)
2148{
2149 LARGE_INTEGER CurrentTime;
2150 LARGE_INTEGER Size;
2151
2152 KeQuerySystemTime(&CurrentTime);
2153
2154 Size.QuadPart = 0;
2155 if (!MmCanFileBeTruncated(&(Fcb->SectionObject), &(Size))) {
2156 return STATUS_USER_MAPPED_FILE;
2157 }
2158
2159 /* purge all file cache and shrink cache windows size */
2160 CcPurgeCacheSection(&Fcb->SectionObject, NULL, 0, FALSE);
2161 Fcb->Header.AllocationSize.QuadPart =
2162 Fcb->Header.FileSize.QuadPart =
2163 Fcb->Header.ValidDataLength.QuadPart = 0;
2164 CcSetFileSizes(FileObject,
2165 (PCC_FILE_SIZES)&Fcb->Header.AllocationSize);
2166
2167 Size.QuadPart = CEILING_ALIGNED(ULONGLONG,
2168 (ULONGLONG)AllocationSize->QuadPart,
2169 (ULONGLONG)BLOCK_SIZE);
2170
2171 if ((loff_t)Size.QuadPart > Fcb->Inode->i_size) {
2172 Ext2ExpandFile(IrpContext, Vcb, Fcb->Mcb, &Size);
2173 } else {
2174 Ext2TruncateFile(IrpContext, Vcb, Fcb->Mcb, &Size);
2175 }
2176
2177 Fcb->Header.AllocationSize = Size;
2178 if (Fcb->Header.AllocationSize.QuadPart > 0) {
2179 SetLongFlag(Fcb->Flags, FCB_ALLOC_IN_CREATE);
2180 CcSetFileSizes(FileObject,
2181 (PCC_FILE_SIZES)&Fcb->Header.AllocationSize );
2182 }
2183
2184 /* remove all extent mappings */
2185 DEBUG(DL_EXT, ("Ext2SuperSede ...: %wZ\n", &Fcb->Mcb->FullName));
2186 Fcb->Inode->i_size = 0;
2187
2188 if (Disposition == FILE_SUPERSEDE) {
2189 Fcb->Inode->i_ctime = Ext2LinuxTime(CurrentTime);
2190 }
2191 Fcb->Inode->i_atime =
2192 Fcb->Inode->i_mtime = Ext2LinuxTime(CurrentTime);
2193 Ext2SaveInode(IrpContext, Vcb, Fcb->Inode);
2194
2195 // See if we need to overwrite EA of the file
2196 return Ext2OverwriteEa(IrpContext, Vcb, Fcb, &IrpContext->Irp->IoStatus);

Callers 1

Ext2CreateFileFunction · 0.85

Calls 5

Ext2ExpandFileFunction · 0.85
Ext2TruncateFileFunction · 0.85
Ext2LinuxTimeFunction · 0.85
Ext2SaveInodeFunction · 0.85
Ext2OverwriteEaFunction · 0.85

Tested by

no test coverage detected