mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
winfsp-tests: memfs
This commit is contained in:
parent
025fb3c2a3
commit
a3abbc0eb5
@ -408,6 +408,67 @@ static VOID Close(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
MemfsFileNodeDelete(FileNode);
|
MemfsFileNodeDelete(FileNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NTSTATUS Read(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request,
|
||||||
|
PVOID FileNode0, PVOID Buffer, UINT64 Offset, ULONG Length,
|
||||||
|
PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
|
{
|
||||||
|
MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;
|
||||||
|
UINT64 EndOffset;
|
||||||
|
|
||||||
|
if (Offset >= FileNode->FileInfo.FileSize)
|
||||||
|
return STATUS_END_OF_FILE;
|
||||||
|
|
||||||
|
EndOffset = Offset + Length;
|
||||||
|
if (EndOffset > FileNode->FileInfo.FileSize)
|
||||||
|
EndOffset = FileNode->FileInfo.FileSize;
|
||||||
|
|
||||||
|
memcpy(Buffer, (PUINT8)FileNode->FileData + Offset, EndOffset - Offset);
|
||||||
|
|
||||||
|
*PBytesTransferred = (ULONG)(EndOffset - Offset);
|
||||||
|
*FileInfo = FileNode->FileInfo;
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS Write(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request,
|
||||||
|
PVOID FileNode0, PVOID Buffer, UINT64 Offset, ULONG Length, BOOLEAN Constrained,
|
||||||
|
PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
|
{
|
||||||
|
MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;
|
||||||
|
UINT64 EndOffset;
|
||||||
|
|
||||||
|
if ((UINT64)-1LL == Offset)
|
||||||
|
Offset = FileNode->FileInfo.FileSize;
|
||||||
|
|
||||||
|
if (Constrained)
|
||||||
|
{
|
||||||
|
if (Offset >= FileNode->FileInfo.FileSize)
|
||||||
|
{
|
||||||
|
*PBytesTransferred = 0;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EndOffset = Offset + Length;
|
||||||
|
if (EndOffset > FileNode->FileInfo.FileSize)
|
||||||
|
EndOffset = FileNode->FileInfo.FileSize;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EndOffset = Offset + Length;
|
||||||
|
if (EndOffset > FileNode->FileInfo.FileSize)
|
||||||
|
SetFileSize(FileSystem, Request, FileNode, EndOffset, FileInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy((PUINT8)FileNode->FileData + Offset, Buffer, EndOffset - Offset);
|
||||||
|
|
||||||
|
*PBytesTransferred = (ULONG)(EndOffset - Offset);
|
||||||
|
*FileInfo = FileNode->FileInfo;
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static NTSTATUS GetFileInfo(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS GetFileInfo(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request,
|
FSP_FSCTL_TRANSACT_REQ *Request,
|
||||||
PVOID FileNode0,
|
PVOID FileNode0,
|
||||||
@ -447,11 +508,15 @@ NTSTATUS SetAllocationSize(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
PVOID FileNode0, UINT64 AllocationSize,
|
PVOID FileNode0, UINT64 AllocationSize,
|
||||||
FSP_FSCTL_FILE_INFO *FileInfo)
|
FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
|
MEMFS *Memfs = (MEMFS *)FileSystem->UserContext;
|
||||||
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)
|
if (FileNode->FileInfo.AllocationSize != AllocationSize)
|
||||||
{
|
{
|
||||||
|
if (AllocationSize > Memfs->MaxFileSize)
|
||||||
|
return STATUS_DISK_FULL;
|
||||||
|
|
||||||
FileData = realloc(FileNode->FileData, AllocationSize);
|
FileData = realloc(FileNode->FileData, AllocationSize);
|
||||||
if (0 == FileData)
|
if (0 == FileData)
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
@ -487,6 +552,9 @@ NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (FileNode->FileInfo.FileSize < FileSize)
|
||||||
|
memset((PUINT8)FileNode->FileData + FileNode->FileInfo.FileSize, 0,
|
||||||
|
FileSize - FileNode->FileInfo.FileSize);
|
||||||
FileNode->FileInfo.FileSize = FileSize;
|
FileNode->FileInfo.FileSize = FileSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -615,6 +683,8 @@ static FSP_FILE_SYSTEM_INTERFACE MemfsInterface =
|
|||||||
Overwrite,
|
Overwrite,
|
||||||
Cleanup,
|
Cleanup,
|
||||||
Close,
|
Close,
|
||||||
|
Read,
|
||||||
|
Write,
|
||||||
GetFileInfo,
|
GetFileInfo,
|
||||||
SetBasicInfo,
|
SetBasicInfo,
|
||||||
SetAllocationSize,
|
SetAllocationSize,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user