sys: FileEaInformation and EaSize support

This commit is contained in:
Bill Zissimopoulos 2019-03-21 14:05:17 -07:00
parent 8c0957f702
commit 62b0e889b2
No known key found for this signature in database
GPG Key ID: 3D4F95D52C7B3EA3
3 changed files with 46 additions and 17 deletions

View File

@ -206,6 +206,8 @@ typedef struct
UINT16 VolumeLabelLength; UINT16 VolumeLabelLength;
WCHAR VolumeLabel[32]; WCHAR VolumeLabel[32];
} FSP_FSCTL_VOLUME_INFO; } FSP_FSCTL_VOLUME_INFO;
FSP_FSCTL_STATIC_ASSERT(88 == sizeof(FSP_FSCTL_VOLUME_INFO),
"sizeof(FSP_FSCTL_VOLUME_INFO) must be exactly 88.");
typedef struct typedef struct
{ {
UINT32 FileAttributes; UINT32 FileAttributes;
@ -218,13 +220,18 @@ typedef struct
UINT64 ChangeTime; UINT64 ChangeTime;
UINT64 IndexNumber; UINT64 IndexNumber;
UINT32 HardLinks; /* unimplemented: set to 0 */ UINT32 HardLinks; /* unimplemented: set to 0 */
UINT32 EaSize;
} FSP_FSCTL_FILE_INFO; } FSP_FSCTL_FILE_INFO;
FSP_FSCTL_STATIC_ASSERT(72 == sizeof(FSP_FSCTL_FILE_INFO),
"sizeof(FSP_FSCTL_FILE_INFO) must be exactly 72.");
typedef struct typedef struct
{ {
FSP_FSCTL_FILE_INFO FileInfo; FSP_FSCTL_FILE_INFO FileInfo;
PWSTR NormalizedName; PWSTR NormalizedName;
UINT16 NormalizedNameSize; UINT16 NormalizedNameSize;
} FSP_FSCTL_OPEN_FILE_INFO; } FSP_FSCTL_OPEN_FILE_INFO;
FSP_FSCTL_STATIC_ASSERT(88 == sizeof(FSP_FSCTL_OPEN_FILE_INFO),
"sizeof(FSP_FSCTL_OPEN_FILE_INFO) must be exactly 88.");
typedef struct typedef struct
{ {
UINT16 Size; UINT16 Size;
@ -233,6 +240,8 @@ typedef struct
/* make struct as big as FILE_ID_BOTH_DIR_INFORMATION; allows for in-place copying */ /* make struct as big as FILE_ID_BOTH_DIR_INFORMATION; allows for in-place copying */
WCHAR FileNameBuf[]; WCHAR FileNameBuf[];
} FSP_FSCTL_DIR_INFO; } FSP_FSCTL_DIR_INFO;
FSP_FSCTL_STATIC_ASSERT(104 == sizeof(FSP_FSCTL_DIR_INFO),
"sizeof(FSP_FSCTL_DIR_INFO) must be exactly 104.");
typedef struct typedef struct
{ {
UINT16 Size; UINT16 Size;
@ -240,6 +249,8 @@ typedef struct
UINT64 StreamAllocationSize; UINT64 StreamAllocationSize;
WCHAR StreamNameBuf[]; WCHAR StreamNameBuf[];
} FSP_FSCTL_STREAM_INFO; } FSP_FSCTL_STREAM_INFO;
FSP_FSCTL_STATIC_ASSERT(24 == sizeof(FSP_FSCTL_STREAM_INFO),
"sizeof(FSP_FSCTL_STREAM_INFO) must be exactly 24.");
typedef struct typedef struct
{ {
UINT64 UserContext; UINT64 UserContext;

View File

@ -25,6 +25,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
PUNICODE_STRING DirectoryPattern, BOOLEAN CaseInsensitive, PUNICODE_STRING DirectoryPattern, BOOLEAN CaseInsensitive,
PUNICODE_STRING DirectoryMarker, PUNICODE_STRING DirectoryMarkerOut, PUNICODE_STRING DirectoryMarker, PUNICODE_STRING DirectoryMarkerOut,
FILE_INFORMATION_CLASS FileInformationClass, BOOLEAN ReturnSingleEntry, FILE_INFORMATION_CLASS FileInformationClass, BOOLEAN ReturnSingleEntry,
BOOLEAN ReturnEaSize,
FSP_FSCTL_DIR_INFO **PDirInfo, ULONG DirInfoSize, FSP_FSCTL_DIR_INFO **PDirInfo, ULONG DirInfoSize,
PVOID DestBuf, PULONG PDestLen); PVOID DestBuf, PULONG PDestLen);
static NTSTATUS FspFsvolQueryDirectoryCopyCache( static NTSTATUS FspFsvolQueryDirectoryCopyCache(
@ -88,6 +89,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
PUNICODE_STRING DirectoryPattern, BOOLEAN CaseInsensitive, PUNICODE_STRING DirectoryPattern, BOOLEAN CaseInsensitive,
PUNICODE_STRING DirectoryMarker, PUNICODE_STRING DirectoryMarkerOut, PUNICODE_STRING DirectoryMarker, PUNICODE_STRING DirectoryMarkerOut,
FILE_INFORMATION_CLASS FileInformationClass, BOOLEAN ReturnSingleEntry, FILE_INFORMATION_CLASS FileInformationClass, BOOLEAN ReturnSingleEntry,
BOOLEAN ReturnEaSize,
FSP_FSCTL_DIR_INFO **PDirInfo, ULONG DirInfoSize, FSP_FSCTL_DIR_INFO **PDirInfo, ULONG DirInfoSize,
PVOID DestBuf, PULONG PDestLen) PVOID DestBuf, PULONG PDestLen)
{ {
@ -226,12 +228,12 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
break; break;
case FileFullDirectoryInformation: case FileFullDirectoryInformation:
FILL_INFO(FILE_FULL_DIR_INFORMATION, FILL_INFO(FILE_FULL_DIR_INFORMATION,
Info->EaSize = 0; Info->EaSize = ReturnEaSize ? DirInfo->FileInfo.EaSize : 0;
); );
break; break;
case FileIdFullDirectoryInformation: case FileIdFullDirectoryInformation:
FILL_INFO(FILE_ID_FULL_DIR_INFORMATION, FILL_INFO(FILE_ID_FULL_DIR_INFORMATION,
Info->EaSize = 0; Info->EaSize = ReturnEaSize ? DirInfo->FileInfo.EaSize : 0;
Info->FileId.QuadPart = DirInfo->FileInfo.IndexNumber; Info->FileId.QuadPart = DirInfo->FileInfo.IndexNumber;
); );
break; break;
@ -240,14 +242,14 @@ static NTSTATUS FspFsvolQueryDirectoryCopy(
break; break;
case FileBothDirectoryInformation: case FileBothDirectoryInformation:
FILL_INFO(FILE_BOTH_DIR_INFORMATION, FILL_INFO(FILE_BOTH_DIR_INFORMATION,
Info->EaSize = 0; Info->EaSize = ReturnEaSize ? DirInfo->FileInfo.EaSize : 0;
Info->ShortNameLength = 0; Info->ShortNameLength = 0;
RtlZeroMemory(Info->ShortName, sizeof Info->ShortName); RtlZeroMemory(Info->ShortName, sizeof Info->ShortName);
); );
break; break;
case FileIdBothDirectoryInformation: case FileIdBothDirectoryInformation:
FILL_INFO(FILE_ID_BOTH_DIR_INFORMATION, FILL_INFO(FILE_ID_BOTH_DIR_INFORMATION,
Info->EaSize = 0; Info->EaSize = ReturnEaSize ? DirInfo->FileInfo.EaSize : 0;
Info->ShortNameLength = 0; Info->ShortNameLength = 0;
RtlZeroMemory(Info->ShortName, sizeof Info->ShortName); RtlZeroMemory(Info->ShortName, sizeof Info->ShortName);
Info->FileId.QuadPart = DirInfo->FileInfo.IndexNumber; Info->FileId.QuadPart = DirInfo->FileInfo.IndexNumber;
@ -321,6 +323,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopyCache(
Result = FspFsvolQueryDirectoryCopy(DirectoryPattern, CaseInsensitive, Result = FspFsvolQueryDirectoryCopy(DirectoryPattern, CaseInsensitive,
0 != FileDesc->DirInfoCacheHint ? 0 : &FileDesc->DirectoryMarker, &DirectoryMarker, 0 != FileDesc->DirInfoCacheHint ? 0 : &FileDesc->DirectoryMarker, &DirectoryMarker,
FileInformationClass, ReturnSingleEntry, FileInformationClass, ReturnSingleEntry,
!!FspFsvolDeviceExtension(FileNode->FsvolDeviceObject)->VolumeParams.ExtendedAttributes,
&DirInfo, DirInfoSize, &DirInfo, DirInfoSize,
DestBuf, PDestLen); DestBuf, PDestLen);
@ -354,6 +357,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopyInPlace(
BOOLEAN CaseInsensitive = !FileDesc->CaseSensitive; BOOLEAN CaseInsensitive = !FileDesc->CaseSensitive;
PUNICODE_STRING DirectoryPattern = &FileDesc->DirectoryPattern; PUNICODE_STRING DirectoryPattern = &FileDesc->DirectoryPattern;
UNICODE_STRING DirectoryMarker = FileDesc->DirectoryMarker; UNICODE_STRING DirectoryMarker = FileDesc->DirectoryMarker;
FSP_FILE_NODE *FileNode = FileDesc->FileNode;
FSP_FSCTL_STATIC_ASSERT( FSP_FSCTL_STATIC_ASSERT(
FIELD_OFFSET(FSP_FSCTL_DIR_INFO, FileNameBuf) >= FIELD_OFFSET(FSP_FSCTL_DIR_INFO, FileNameBuf) >=
@ -363,6 +367,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopyInPlace(
Result = FspFsvolQueryDirectoryCopy(DirectoryPattern, CaseInsensitive, Result = FspFsvolQueryDirectoryCopy(DirectoryPattern, CaseInsensitive,
0, &DirectoryMarker, 0, &DirectoryMarker,
FileInformationClass, ReturnSingleEntry, FileInformationClass, ReturnSingleEntry,
!!FspFsvolDeviceExtension(FileNode->FsvolDeviceObject)->VolumeParams.ExtendedAttributes,
&DirInfo, DirInfoSize, &DirInfo, DirInfoSize,
DestBuf, PDestLen); DestBuf, PDestLen);

View File

@ -31,7 +31,8 @@ static NTSTATUS FspFsvolQueryBasicInformation(PFILE_OBJECT FileObject,
PVOID *PBuffer, PVOID BufferEnd, PVOID *PBuffer, PVOID BufferEnd,
const FSP_FSCTL_FILE_INFO *FileInfo); const FSP_FSCTL_FILE_INFO *FileInfo);
static NTSTATUS FspFsvolQueryEaInformation(PFILE_OBJECT FileObject, static NTSTATUS FspFsvolQueryEaInformation(PFILE_OBJECT FileObject,
PVOID *PBuffer, PVOID BufferEnd); PVOID *PBuffer, PVOID BufferEnd,
const FSP_FSCTL_FILE_INFO *FileInfo);
static NTSTATUS FspFsvolQueryInternalInformation(PFILE_OBJECT FileObject, static NTSTATUS FspFsvolQueryInternalInformation(PFILE_OBJECT FileObject,
PVOID *PBuffer, PVOID BufferEnd); PVOID *PBuffer, PVOID BufferEnd);
static NTSTATUS FspFsvolQueryNameInformation(PFILE_OBJECT FileObject, static NTSTATUS FspFsvolQueryNameInformation(PFILE_OBJECT FileObject,
@ -175,7 +176,9 @@ static NTSTATUS FspFsvolQueryAllInformation(PFILE_OBJECT FileObject,
Info->InternalInformation.IndexNumber.QuadPart = FileNode->IndexNumber; Info->InternalInformation.IndexNumber.QuadPart = FileNode->IndexNumber;
Info->EaInformation.EaSize = 0; Info->EaInformation.EaSize =
FspFsvolDeviceExtension(FileNode->FsvolDeviceObject)->VolumeParams.ExtendedAttributes ?
FileInfo->EaSize : 0;
Info->PositionInformation.CurrentByteOffset = FileObject->CurrentByteOffset; Info->PositionInformation.CurrentByteOffset = FileObject->CurrentByteOffset;
@ -236,20 +239,25 @@ static NTSTATUS FspFsvolQueryBasicInformation(PFILE_OBJECT FileObject,
} }
static NTSTATUS FspFsvolQueryEaInformation(PFILE_OBJECT FileObject, static NTSTATUS FspFsvolQueryEaInformation(PFILE_OBJECT FileObject,
PVOID *PBuffer, PVOID BufferEnd) PVOID *PBuffer, PVOID BufferEnd,
const FSP_FSCTL_FILE_INFO *FileInfo)
{ {
PAGED_CODE(); PAGED_CODE();
PFILE_EA_INFORMATION Info = (PFILE_EA_INFORMATION)*PBuffer; PFILE_EA_INFORMATION Info = (PFILE_EA_INFORMATION)*PBuffer;
if (0 == FileInfo)
{
if ((PVOID)(Info + 1) > BufferEnd) if ((PVOID)(Info + 1) > BufferEnd)
return STATUS_BUFFER_TOO_SMALL; return STATUS_BUFFER_TOO_SMALL;
/* return STATUS_SUCCESS;
* No EA support currently. We must nevertheless respond to this query }
* or SRV2 gets unhappy. Just tell them that we have 0 EA's.
*/ FSP_FILE_NODE *FileNode = FileObject->FsContext;
Info->EaSize = 0; Info->EaSize =
FspFsvolDeviceExtension(FileNode->FsvolDeviceObject)->VolumeParams.ExtendedAttributes ?
FileInfo->EaSize : 0;
*PBuffer = (PVOID)(Info + 1); *PBuffer = (PVOID)(Info + 1);
@ -679,9 +687,8 @@ static NTSTATUS FspFsvolQueryInformation(
Result = STATUS_INVALID_PARAMETER; /* no compression support */ Result = STATUS_INVALID_PARAMETER; /* no compression support */
return Result; return Result;
case FileEaInformation: case FileEaInformation:
Result = FspFsvolQueryEaInformation(FileObject, &Buffer, BufferEnd); Result = FspFsvolQueryEaInformation(FileObject, &Buffer, BufferEnd, 0);
Irp->IoStatus.Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Irp->AssociatedIrp.SystemBuffer); break;
return Result;
case FileHardLinkInformation: case FileHardLinkInformation:
Result = STATUS_NOT_SUPPORTED; /* no hard link support */ Result = STATUS_NOT_SUPPORTED; /* no hard link support */
return Result; return Result;
@ -733,6 +740,9 @@ static NTSTATUS FspFsvolQueryInformation(
case FileBasicInformation: case FileBasicInformation:
Result = FspFsvolQueryBasicInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf); Result = FspFsvolQueryBasicInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
break; break;
case FileEaInformation:
Result = FspFsvolQueryEaInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
break;
case FileNetworkOpenInformation: case FileNetworkOpenInformation:
Result = FspFsvolQueryNetworkOpenInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf); Result = FspFsvolQueryNetworkOpenInformation(FileObject, &Buffer, BufferEnd, &FileInfoBuf);
break; break;
@ -840,6 +850,9 @@ NTSTATUS FspFsvolQueryInformationComplete(
case FileBasicInformation: case FileBasicInformation:
Result = FspFsvolQueryBasicInformation(FileObject, &Buffer, BufferEnd, FileInfo); Result = FspFsvolQueryBasicInformation(FileObject, &Buffer, BufferEnd, FileInfo);
break; break;
case FileEaInformation:
Result = FspFsvolQueryEaInformation(FileObject, &Buffer, BufferEnd, FileInfo);
break;
case FileNetworkOpenInformation: case FileNetworkOpenInformation:
Result = FspFsvolQueryNetworkOpenInformation(FileObject, &Buffer, BufferEnd, FileInfo); Result = FspFsvolQueryNetworkOpenInformation(FileObject, &Buffer, BufferEnd, FileInfo);
break; break;