diff --git a/src/dll/fsop.c b/src/dll/fsop.c index 5bff8957..c1a3cf9b 100644 --- a/src/dll/fsop.c +++ b/src/dll/fsop.c @@ -1004,7 +1004,7 @@ FSP_FSCTL_STATIC_ASSERT( sizeof(UINT16) == sizeof ((FSP_FSCTL_DIR_INFO *)0)->Size && sizeof(UINT16) == sizeof ((FSP_FSCTL_STREAM_INFO *)0)->Size, "FSP_FSCTL_DIR_INFO::Size and FSP_FSCTL_STREAM_INFO::Size: sizeof must be 2."); -static BOOLEAN FspFileSystemAddXxxInfo(PVOID Info, SIZE_T InfoSize, +static BOOLEAN FspFileSystemAddXxxInfo(PVOID Info, PVOID Buffer, ULONG Length, PULONG PBytesTransferred) { static UINT8 Zero[sizeof(UINT16)] = { 0 }; @@ -1038,7 +1038,7 @@ static BOOLEAN FspFileSystemAddXxxInfo(PVOID Info, SIZE_T InfoSize, FSP_API BOOLEAN FspFileSystemAddDirInfo(FSP_FSCTL_DIR_INFO *DirInfo, PVOID Buffer, ULONG Length, PULONG PBytesTransferred) { - return FspFileSystemAddXxxInfo(DirInfo, sizeof *DirInfo, Buffer, Length, PBytesTransferred); + return FspFileSystemAddXxxInfo(DirInfo, Buffer, Length, PBytesTransferred); } FSP_API BOOLEAN FspFileSystemFindReparsePoint(FSP_FILE_SYSTEM *FileSystem, @@ -1305,5 +1305,5 @@ FSP_API NTSTATUS FspFileSystemCanReplaceReparsePoint( FSP_API BOOLEAN FspFileSystemAddStreamInfo(FSP_FSCTL_STREAM_INFO *StreamInfo, PVOID Buffer, ULONG Length, PULONG PBytesTransferred) { - return FspFileSystemAddXxxInfo(StreamInfo, sizeof *StreamInfo, Buffer, Length, PBytesTransferred); + return FspFileSystemAddXxxInfo(StreamInfo, Buffer, Length, PBytesTransferred); } diff --git a/src/sys/driver.h b/src/sys/driver.h index 5eb3385f..4cffe2af 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1052,6 +1052,8 @@ BOOLEAN FspFileNodeTrySetStreamInfo(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULON static inline ULONG FspFileNodeStreamInfoChangeNumber(FSP_FILE_NODE *FileNode) { + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; return FileNode->StreamInfoChangeNumber; } VOID FspFileNodeNotifyChange(FSP_FILE_NODE *FileNode, ULONG Filter, ULONG Action); diff --git a/src/sys/file.c b/src/sys/file.c index bd37e02f..0cc85f1f 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -1073,6 +1073,9 @@ BOOLEAN FspFileNodeReferenceStreamInfo(FSP_FILE_NODE *FileNode, PCVOID *PBuffer, { // !PAGED_CODE(); + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; + FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FileNode->FsvolDeviceObject); FSP_FILE_NODE_NONPAGED *NonPaged = FileNode->NonPaged; @@ -1089,6 +1092,9 @@ VOID FspFileNodeSetStreamInfo(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG Size { // !PAGED_CODE(); + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; + FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FileNode->FsvolDeviceObject); FSP_FILE_NODE_NONPAGED *NonPaged = FileNode->NonPaged; @@ -1114,7 +1120,7 @@ BOOLEAN FspFileNodeTrySetStreamInfo(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULON { // !PAGED_CODE(); - if (FileNode->StreamInfoChangeNumber != StreamInfoChangeNumber) + if (FspFileNodeStreamInfoChangeNumber(FileNode) != StreamInfoChangeNumber) return FALSE; FspFileNodeSetStreamInfo(FileNode, Buffer, Size); @@ -1125,6 +1131,9 @@ static VOID FspFileNodeInvalidateStreamInfo(FSP_FILE_NODE *FileNode) { // !PAGED_CODE(); + if (0 != FileNode->MainFileNode) + FileNode = FileNode->MainFileNode; + PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject; FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); FSP_FILE_NODE_NONPAGED *NonPaged = FileNode->NonPaged; diff --git a/src/sys/fileinfo.c b/src/sys/fileinfo.c index 9ed1ae18..af221118 100644 --- a/src/sys/fileinfo.c +++ b/src/sys/fileinfo.c @@ -364,8 +364,8 @@ static NTSTATUS FspFsvolQueryStreamInformationCopy( PVOID DestBuf, PULONG PDestLen) { #define STREAM_TYPE ":$DATA" -#define STREAM_TYPE_LENGTH (sizeof L"" STREAM_TYPE - sizeof "") -#define STREAM_EXTRA_LENGTH (sizeof L":" STREAM_TYPE - sizeof "") +#define STREAM_TYPE_LENGTH (sizeof L"" STREAM_TYPE - sizeof(WCHAR)) +#define STREAM_EXTRA_LENGTH (sizeof L":" STREAM_TYPE - sizeof(WCHAR)) #define FILL_INFO()\ do\ {\