sys: IRP_MJ_SET_INFORMATION: testing

This commit is contained in:
Bill Zissimopoulos 2016-02-05 23:34:37 -08:00
parent 69627c216b
commit f65e2059e4
3 changed files with 86 additions and 78 deletions

View File

@ -47,6 +47,7 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath,
FileSystem->Operations[FspFsctlTransactCleanupKind] = FspFileSystemOpCleanup; FileSystem->Operations[FspFsctlTransactCleanupKind] = FspFileSystemOpCleanup;
FileSystem->Operations[FspFsctlTransactCloseKind] = FspFileSystemOpClose; FileSystem->Operations[FspFsctlTransactCloseKind] = FspFileSystemOpClose;
FileSystem->Operations[FspFsctlTransactQueryInformationKind] = FspFileSystemOpQueryInformation; FileSystem->Operations[FspFsctlTransactQueryInformationKind] = FspFileSystemOpQueryInformation;
FileSystem->Operations[FspFsctlTransactSetInformationKind] = FspFileSystemOpSetInformation;
FileSystem->Operations[FspFsctlTransactQueryVolumeInformationKind] = FspFileSystemOpQueryVolumeInformation; FileSystem->Operations[FspFsctlTransactQueryVolumeInformationKind] = FspFileSystemOpQueryVolumeInformation;
// !!!: ... // !!!: ...
FileSystem->Interface = Interface; FileSystem->Interface = Interface;

View File

@ -523,17 +523,13 @@ static NTSTATUS FspFsvolSetAllocationInformation(PFILE_OBJECT FileObject,
{ {
if (sizeof(FILE_ALLOCATION_INFORMATION) > Length) if (sizeof(FILE_ALLOCATION_INFORMATION) > Length)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
return STATUS_SUCCESS;
} }
else if (0 == Response)
if (0 != Response) {
return STATUS_SUCCESS;
PFILE_ALLOCATION_INFORMATION Info = (PFILE_ALLOCATION_INFORMATION)Buffer; PFILE_ALLOCATION_INFORMATION Info = (PFILE_ALLOCATION_INFORMATION)Buffer;
FSP_FILE_NODE *FileNode = FileObject->FsContext;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension =
FspFsvolDeviceExtension(FileObject->DeviceObject); FspFsvolDeviceExtension(FileNode->FsvolDeviceObject);
UINT64 AllocationSize = Info->AllocationSize.QuadPart; UINT64 AllocationSize = Info->AllocationSize.QuadPart;
UINT64 AllocationUnit; UINT64 AllocationUnit;
BOOLEAN Success; BOOLEAN Success;
@ -546,6 +542,13 @@ static NTSTATUS FspFsvolSetAllocationInformation(PFILE_OBJECT FileObject,
Success = MmCanFileBeTruncated(FileObject->SectionObjectPointer, &Info->AllocationSize); Success = MmCanFileBeTruncated(FileObject->SectionObjectPointer, &Info->AllocationSize);
if (!Success) if (!Success)
return STATUS_USER_MAPPED_FILE; return STATUS_USER_MAPPED_FILE;
}
else
{
FSP_FILE_NODE *FileNode = FileObject->FsContext;
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo);
}
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -560,13 +563,9 @@ static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject,
{ {
if (sizeof(FILE_BASIC_INFORMATION) > Length) if (sizeof(FILE_BASIC_INFORMATION) > Length)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
return STATUS_SUCCESS;
} }
else if (0 == Response)
if (0 != Response) {
return STATUS_SUCCESS;
PFILE_BASIC_INFORMATION Info = (PFILE_BASIC_INFORMATION)Buffer; PFILE_BASIC_INFORMATION Info = (PFILE_BASIC_INFORMATION)Buffer;
FSP_FILE_NODE *FileNode = FileObject->FsContext; FSP_FILE_NODE *FileNode = FileObject->FsContext;
UINT32 FileAttributes = Info->FileAttributes; UINT32 FileAttributes = Info->FileAttributes;
@ -580,10 +579,17 @@ static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject,
SetFlag(FileAttributes, FILE_ATTRIBUTE_DIRECTORY); SetFlag(FileAttributes, FILE_ATTRIBUTE_DIRECTORY);
} }
Request->Req.SetInformation.Info.Basic.FileAttributes = Info->FileAttributes; Request->Req.SetInformation.Info.Basic.FileAttributes = FileAttributes;
Request->Req.SetInformation.Info.Basic.CreationTime = Info->CreationTime.QuadPart; Request->Req.SetInformation.Info.Basic.CreationTime = Info->CreationTime.QuadPart;
Request->Req.SetInformation.Info.Basic.LastAccessTime = Info->LastAccessTime.QuadPart; Request->Req.SetInformation.Info.Basic.LastAccessTime = Info->LastAccessTime.QuadPart;
Request->Req.SetInformation.Info.Basic.LastWriteTime = Info->LastWriteTime.QuadPart; Request->Req.SetInformation.Info.Basic.LastWriteTime = Info->LastWriteTime.QuadPart;
}
else
{
FSP_FILE_NODE *FileNode = FileObject->FsContext;
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo);
}
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -598,11 +604,8 @@ static NTSTATUS FspFsvolSetDispositionInformation(PFILE_OBJECT FileObject,
{ {
if (sizeof(FILE_DISPOSITION_INFORMATION) > Length) if (sizeof(FILE_DISPOSITION_INFORMATION) > Length)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
return STATUS_SUCCESS;
} }
else if (0 == Response)
if (0 == Response)
{ {
PFILE_DISPOSITION_INFORMATION Info = (PFILE_DISPOSITION_INFORMATION)Buffer; PFILE_DISPOSITION_INFORMATION Info = (PFILE_DISPOSITION_INFORMATION)Buffer;
BOOLEAN Success; BOOLEAN Success;
@ -617,8 +620,6 @@ static NTSTATUS FspFsvolSetDispositionInformation(PFILE_OBJECT FileObject,
} }
Request->Req.SetInformation.Info.Disposition.Delete = Info->DeleteFile; Request->Req.SetInformation.Info.Disposition.Delete = Info->DeleteFile;
return STATUS_SUCCESS;
} }
else else
{ {
@ -627,9 +628,9 @@ static NTSTATUS FspFsvolSetDispositionInformation(PFILE_OBJECT FileObject,
FileNode->DeletePending = Info->DeleteFile; FileNode->DeletePending = Info->DeleteFile;
FileObject->DeletePending = Info->DeleteFile; FileObject->DeletePending = Info->DeleteFile;
}
return STATUS_SUCCESS; return STATUS_SUCCESS;
}
} }
static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject, static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject,
@ -642,13 +643,9 @@ static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject,
{ {
if (sizeof(FILE_END_OF_FILE_INFORMATION) > Length) if (sizeof(FILE_END_OF_FILE_INFORMATION) > Length)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
return STATUS_SUCCESS;
} }
else if (0 == Response)
if (0 != Response) {
return STATUS_SUCCESS;
PFILE_END_OF_FILE_INFORMATION Info = (PFILE_END_OF_FILE_INFORMATION)Buffer; PFILE_END_OF_FILE_INFORMATION Info = (PFILE_END_OF_FILE_INFORMATION)Buffer;
BOOLEAN Success; BOOLEAN Success;
@ -659,6 +656,13 @@ static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject,
Success = MmCanFileBeTruncated(FileObject->SectionObjectPointer, &Info->EndOfFile); Success = MmCanFileBeTruncated(FileObject->SectionObjectPointer, &Info->EndOfFile);
if (!Success) if (!Success)
return STATUS_USER_MAPPED_FILE; return STATUS_USER_MAPPED_FILE;
}
else
{
FSP_FILE_NODE *FileNode = FileObject->FsContext;
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo);
}
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -816,18 +820,15 @@ NTSTATUS FspFsvolSetInformationComplete(
switch (FileInformationClass) switch (FileInformationClass)
{ {
case FileAllocationInformation: case FileAllocationInformation:
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo);
Result = FspFsvolSetAllocationInformation(FileObject, Buffer, Length, Request, Response); Result = FspFsvolSetAllocationInformation(FileObject, Buffer, Length, Request, Response);
break; break;
case FileBasicInformation: case FileBasicInformation:
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo);
Result = FspFsvolSetBasicInformation(FileObject, Buffer, Length, Request, Response); Result = FspFsvolSetBasicInformation(FileObject, Buffer, Length, Request, Response);
break; break;
case FileDispositionInformation: case FileDispositionInformation:
Result = FspFsvolSetDispositionInformation(FileObject, Buffer, Length, Request, Response); Result = FspFsvolSetDispositionInformation(FileObject, Buffer, Length, Request, Response);
break; break;
case FileEndOfFileInformation: case FileEndOfFileInformation:
FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo);
Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length, Result = FspFsvolSetEndOfFileInformation(FileObject, Buffer, Length,
IrpSp->Parameters.SetFile.AdvanceOnly, Request, Response); IrpSp->Parameters.SetFile.AdvanceOnly, Request, Response);
break; break;

View File

@ -420,9 +420,9 @@ NTSTATUS SetBasicInfo(FSP_FILE_SYSTEM *FileSystem,
if (0 != CreationTime) if (0 != CreationTime)
FileNode->FileInfo.CreationTime = CreationTime; FileNode->FileInfo.CreationTime = CreationTime;
if (0 != LastAccessTime) if (0 != LastAccessTime)
FileNode->FileInfo.CreationTime = LastAccessTime; FileNode->FileInfo.LastAccessTime = LastAccessTime;
if (0 != LastWriteTime) if (0 != LastWriteTime)
FileNode->FileInfo.CreationTime = LastWriteTime; FileNode->FileInfo.LastWriteTime = LastWriteTime;
*FileInfo = FileNode->FileInfo; *FileInfo = FileNode->FileInfo;
@ -437,6 +437,8 @@ NTSTATUS SetAllocationSize(FSP_FILE_SYSTEM *FileSystem,
MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;
PVOID FileData; PVOID FileData;
if (FileNode->FileInfo.AllocationSize != AllocationSize)
{
FileData = realloc(FileNode->FileData, AllocationSize); FileData = realloc(FileNode->FileData, AllocationSize);
if (0 == FileData) if (0 == FileData)
return STATUS_INSUFFICIENT_RESOURCES; return STATUS_INSUFFICIENT_RESOURCES;
@ -446,6 +448,7 @@ NTSTATUS SetAllocationSize(FSP_FILE_SYSTEM *FileSystem,
FileNode->FileInfo.AllocationSize = AllocationSize; FileNode->FileInfo.AllocationSize = AllocationSize;
if (FileNode->FileInfo.FileSize > AllocationSize) if (FileNode->FileInfo.FileSize > AllocationSize)
FileNode->FileInfo.FileSize = AllocationSize; FileNode->FileInfo.FileSize = AllocationSize;
}
*FileInfo = FileNode->FileInfo; *FileInfo = FileNode->FileInfo;
@ -459,6 +462,8 @@ NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem,
{ {
MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;
if (FileNode->FileInfo.FileSize != FileSize)
{
if (FileNode->FileInfo.AllocationSize < FileSize) if (FileNode->FileInfo.AllocationSize < FileSize)
{ {
UINT64 AllocationUnit = MEMFS_SECTOR_SIZE * MEMFS_SECTORS_PER_ALLOCATION_UNIT; UINT64 AllocationUnit = MEMFS_SECTOR_SIZE * MEMFS_SECTORS_PER_ALLOCATION_UNIT;
@ -470,6 +475,7 @@ NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem,
} }
FileNode->FileInfo.FileSize = FileSize; FileNode->FileInfo.FileSize = FileSize;
}
*FileInfo = FileNode->FileInfo; *FileInfo = FileNode->FileInfo;