mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 19:48:38 -05:00 
			
		
		
		
	dll: IRP_MJ_QUERY_VOLUME_INFORMATION
This commit is contained in:
		| @@ -34,6 +34,7 @@ | ||||
|     <ClCompile Include="..\..\src\dll\loop.c" /> | ||||
|     <ClCompile Include="..\..\src\dll\ntstatus.c" /> | ||||
|     <ClCompile Include="..\..\src\dll\path.c" /> | ||||
|     <ClCompile Include="..\..\src\dll\volinfo.c" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <None Include="..\..\src\dll\ntstatus.i" /> | ||||
|   | ||||
| @@ -55,6 +55,9 @@ | ||||
|     <ClCompile Include="..\..\src\dll\fileinfo.c"> | ||||
|       <Filter>Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\src\dll\volinfo.c"> | ||||
|       <Filter>Source</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <None Include="..\..\src\dll\ntstatus.i"> | ||||
|   | ||||
| @@ -33,6 +33,9 @@ typedef VOID FSP_FILE_SYSTEM_DISPATCHER(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_RE | ||||
| typedef NTSTATUS FSP_FILE_SYSTEM_OPERATION(FSP_FILE_SYSTEM *, FSP_FSCTL_TRANSACT_REQ *); | ||||
| typedef struct _FSP_FILE_SYSTEM_INTERFACE | ||||
| { | ||||
|     NTSTATUS (*GetVolumeInfo)(FSP_FILE_SYSTEM *FileSystem, | ||||
|         FSP_FSCTL_TRANSACT_REQ *Request, | ||||
|         FSP_FSCTL_VOLUME_INFO *VolumeInfo); | ||||
|     NTSTATUS (*GetSecurity)(FSP_FILE_SYSTEM *FileSystem, | ||||
|         PWSTR FileName, PUINT32 PFileAttributes, | ||||
|         PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize); | ||||
| @@ -55,7 +58,7 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE | ||||
|     VOID (*Close)(FSP_FILE_SYSTEM *FileSystem, | ||||
|         FSP_FSCTL_TRANSACT_REQ *Request, | ||||
|         PVOID FileNode); | ||||
|     NTSTATUS (*GetInformation)(FSP_FILE_SYSTEM *FileSystem, | ||||
|     NTSTATUS (*GetFileInfo)(FSP_FILE_SYSTEM *FileSystem, | ||||
|         FSP_FSCTL_TRANSACT_REQ *Request, | ||||
|         PVOID FileNode, | ||||
|         FSP_FSCTL_FILE_INFO *FileInfo); | ||||
| @@ -164,6 +167,8 @@ FSP_API NTSTATUS FspFileSystemOpClose(FSP_FILE_SYSTEM *FileSystem, | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request); | ||||
| FSP_API NTSTATUS FspFileSystemOpQueryInformation(FSP_FILE_SYSTEM *FileSystem, | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request); | ||||
| FSP_API NTSTATUS FspFileSystemOpQueryVolumeInformation(FSP_FILE_SYSTEM *FileSystem, | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request); | ||||
| FSP_API NTSTATUS FspFileSystemSendCreateResponse(FSP_FILE_SYSTEM *FileSystem, | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request, UINT_PTR Information, | ||||
|     PVOID FileNode, UINT32 GrantedAccess, const FSP_FSCTL_FILE_INFO *FileInfo); | ||||
| @@ -176,6 +181,8 @@ FSP_API NTSTATUS FspFileSystemSendCloseResponse(FSP_FILE_SYSTEM *FileSystem, | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request); | ||||
| FSP_API NTSTATUS FspFileSystemSendQueryInformationResponse(FSP_FILE_SYSTEM *FileSystem, | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_FILE_INFO *FileInfo); | ||||
| FSP_API NTSTATUS FspFileSystemSendQueryVolumeInformationResponse(FSP_FILE_SYSTEM *FileSystem, | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_VOLUME_INFO *VolumeInfo); | ||||
|  | ||||
| static inline | ||||
| NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem, | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /** | ||||
|  * @file dll/close.c | ||||
|  * @file dll/fileinfo.c | ||||
|  * | ||||
|  * @copyright 2015 Bill Zissimopoulos | ||||
|  */ | ||||
| @@ -12,10 +12,10 @@ FSP_API NTSTATUS FspFileSystemOpQueryInformation(FSP_FILE_SYSTEM *FileSystem, | ||||
|     NTSTATUS Result; | ||||
|     FSP_FSCTL_FILE_INFO FileInfo; | ||||
|  | ||||
|     if (0 == FileSystem->Interface->GetInformation) | ||||
|     if (0 == FileSystem->Interface->GetFileInfo) | ||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_DEVICE_REQUEST); | ||||
|  | ||||
|     Result = FileSystem->Interface->GetInformation(FileSystem, Request, | ||||
|     Result = FileSystem->Interface->GetFileInfo(FileSystem, Request, | ||||
|         (PVOID)Request->Req.Close.UserContext, &FileInfo); | ||||
|     if (!NT_SUCCESS(Result)) | ||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
| @@ -30,7 +30,7 @@ FSP_API NTSTATUS FspFileSystemSendQueryInformationResponse(FSP_FILE_SYSTEM *File | ||||
|  | ||||
|     memset(&Response, 0, sizeof Response); | ||||
|     Response.Size = sizeof Response; | ||||
|     Response.Kind = FspFsctlTransactCloseKind; | ||||
|     Response.Kind = FspFsctlTransactQueryInformationKind; | ||||
|     Response.Hint = Request->Hint; | ||||
|     Response.IoStatus.Status = STATUS_SUCCESS; | ||||
|     Response.IoStatus.Information = 0; | ||||
|   | ||||
| @@ -47,6 +47,7 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath, | ||||
|     FileSystem->Operations[FspFsctlTransactCleanupKind] = FspFileSystemOpCleanup; | ||||
|     FileSystem->Operations[FspFsctlTransactCloseKind] = FspFileSystemOpClose; | ||||
|     FileSystem->Operations[FspFsctlTransactQueryInformationKind] = FspFileSystemOpQueryInformation; | ||||
|     FileSystem->Operations[FspFsctlTransactQueryVolumeInformationKind] = FspFileSystemOpQueryVolumeInformation; | ||||
|     // !!!: ... | ||||
|     FileSystem->Interface = Interface; | ||||
|  | ||||
|   | ||||
							
								
								
									
										38
									
								
								src/dll/volinfo.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/dll/volinfo.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| /** | ||||
|  * @file dll/volinfo.c | ||||
|  * | ||||
|  * @copyright 2015 Bill Zissimopoulos | ||||
|  */ | ||||
|  | ||||
| #include <dll/library.h> | ||||
|  | ||||
| FSP_API NTSTATUS FspFileSystemOpQueryVolumeInformation(FSP_FILE_SYSTEM *FileSystem, | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request) | ||||
| { | ||||
|     NTSTATUS Result; | ||||
|     FSP_FSCTL_VOLUME_INFO VolumeInfo; | ||||
|  | ||||
|     if (0 == FileSystem->Interface->GetVolumeInfo) | ||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_DEVICE_REQUEST); | ||||
|  | ||||
|     Result = FileSystem->Interface->GetVolumeInfo(FileSystem, Request, &VolumeInfo); | ||||
|     if (!NT_SUCCESS(Result)) | ||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
|  | ||||
|     return FspFileSystemSendQueryVolumeInformationResponse(FileSystem, Request, &VolumeInfo); | ||||
| } | ||||
|  | ||||
| FSP_API NTSTATUS FspFileSystemSendQueryVolumeInformationResponse(FSP_FILE_SYSTEM *FileSystem, | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request, const FSP_FSCTL_VOLUME_INFO *VolumeInfo) | ||||
| { | ||||
|     FSP_FSCTL_TRANSACT_RSP Response; | ||||
|  | ||||
|     memset(&Response, 0, sizeof Response); | ||||
|     Response.Size = sizeof Response; | ||||
|     Response.Kind = FspFsctlTransactQueryVolumeInformationKind; | ||||
|     Response.Hint = Request->Hint; | ||||
|     Response.IoStatus.Status = STATUS_SUCCESS; | ||||
|     Response.IoStatus.Information = 0; | ||||
|     Response.Rsp.QueryVolumeInformation.VolumeInfo = *VolumeInfo; | ||||
|     return FspFileSystemSendResponse(FileSystem, &Response); | ||||
| } | ||||
| @@ -187,6 +187,13 @@ BOOLEAN MemfsFileNodeMapHasChild(MEMFS_FILE_NODE_MAP *FileNodeMap, MEMFS_FILE_NO | ||||
|     return Result; | ||||
| } | ||||
|  | ||||
| static NTSTATUS GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem, | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request, | ||||
|     FSP_FSCTL_VOLUME_INFO *VolumeInfo) | ||||
| { | ||||
|     return STATUS_INVALID_DEVICE_REQUEST; | ||||
| } | ||||
|  | ||||
| static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem, | ||||
|     PWSTR FileName, PUINT32 PFileAttributes, | ||||
|     PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize) | ||||
| @@ -364,7 +371,7 @@ static VOID Close(FSP_FILE_SYSTEM *FileSystem, | ||||
|         MemfsFileNodeDelete(FileNode); | ||||
| } | ||||
|  | ||||
| static NTSTATUS GetInformation(FSP_FILE_SYSTEM *FileSystem, | ||||
| static NTSTATUS GetFileInfo(FSP_FILE_SYSTEM *FileSystem, | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request, | ||||
|     PVOID FileNode0, | ||||
|     FSP_FSCTL_FILE_INFO *FileInfo) | ||||
| @@ -378,13 +385,14 @@ static NTSTATUS GetInformation(FSP_FILE_SYSTEM *FileSystem, | ||||
|  | ||||
| static FSP_FILE_SYSTEM_INTERFACE MemfsInterface = | ||||
| { | ||||
|     GetVolumeInfo, | ||||
|     GetSecurity, | ||||
|     Create, | ||||
|     Open, | ||||
|     Overwrite, | ||||
|     Cleanup, | ||||
|     Close, | ||||
|     GetInformation, | ||||
|     GetFileInfo, | ||||
| }; | ||||
|  | ||||
| static VOID MemfsEnterOperation(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user