mirror of
https://github.com/winfsp/winfsp.git
synced 2025-07-03 01:12:58 -05:00
Compare commits
270 Commits
Author | SHA1 | Date | |
---|---|---|---|
4e0690e65f | |||
e7b81e4bac | |||
9dc774d306 | |||
26fe1a741b | |||
efdb6d1c86 | |||
b18df6bba8 | |||
39aad2b4fa | |||
ab1e024965 | |||
5a67c47d0f | |||
39c189aff7 | |||
3d9fc467ef | |||
23b5c67913 | |||
4b5478e50c | |||
c7fc728ad0 | |||
254174b8e9 | |||
5110b3c5a1 | |||
847eab3da4 | |||
5131ed5c01 | |||
b513128cfe | |||
3fe69f2208 | |||
29fd9bf779 | |||
3c391ca711 | |||
82a8545d8f | |||
79be3e445a | |||
b04266e0fe | |||
25adfaec00 | |||
ce20747534 | |||
d3d75bf977 | |||
6f1f1cda71 | |||
21dfeca124 | |||
6f585ce63e | |||
8f90305726 | |||
490d0577bb | |||
c9d3cb74c7 | |||
7d2ff3afeb | |||
c415c87195 | |||
d161ca59a7 | |||
bc03af3b2a | |||
ed1543665c | |||
a99fa512d4 | |||
a6800dd73d | |||
aa9354773b | |||
05b37c744b | |||
1d15c9546b | |||
51b33f02aa | |||
97ffa741b2 | |||
073645db3b | |||
fd9ac1c9e0 | |||
62b08c3d1e | |||
9436fd8402 | |||
de75454d50 | |||
430d7a5650 | |||
4655926d03 | |||
565caebe4c | |||
a47f853beb | |||
89ec3e6733 | |||
dbdfaeee1f | |||
2c64d59001 | |||
af8c74378e | |||
19c320350f | |||
d60b1de430 | |||
6a7b6c77c6 | |||
16b1b2b349 | |||
f181593f49 | |||
d2f42f4918 | |||
a73f1b9559 | |||
fb6893968a | |||
c97f2cb660 | |||
3a12d928e5 | |||
8fa337ae54 | |||
7f084787e3 | |||
369c0256f3 | |||
f25983853b | |||
757e23ded6 | |||
ebb9b8b799 | |||
804bcc3354 | |||
f5fde4c0bb | |||
dcf7e4c5a6 | |||
adc759447e | |||
f0d7e5b322 | |||
bfd8dca62d | |||
79b2f38d87 | |||
4ae03629f7 | |||
f4496786e5 | |||
b637a72ec8 | |||
2cd1bddafb | |||
6b83748d89 | |||
ed31a187ac | |||
781deff06f | |||
3902874ac9 | |||
8ad77fe62f | |||
f78b3464ce | |||
02fd6906c2 | |||
ce436fc29a | |||
879fa2464f | |||
af7e5432a7 | |||
1d619e0874 | |||
290896b010 | |||
c01402443d | |||
195f3bf92d | |||
ae86aeb633 | |||
369da895d3 | |||
17adae481c | |||
db34b8c913 | |||
f6212be687 | |||
7af36d8f78 | |||
f6e49a11c8 | |||
01ca9cef35 | |||
7cb29a4db3 | |||
5523320348 | |||
969651f5f6 | |||
a08fdccb17 | |||
859d4250c3 | |||
c6b7b7586e | |||
6406246ce2 | |||
9d8ff57be7 | |||
2b0d204ff1 | |||
851d0758d9 | |||
4f444b412e | |||
e9578b48ce | |||
3c3163c41b | |||
8beb534340 | |||
9dcc04f882 | |||
ce83619728 | |||
04b3675f12 | |||
6a23f28249 | |||
351b4f5294 | |||
ee1ae0370e | |||
1ebceb8214 | |||
e6bb463444 | |||
86231de113 | |||
a2cc564400 | |||
5239c63274 | |||
2d46387faa | |||
d2381f3425 | |||
4e7d2fd204 | |||
e6fb014c79 | |||
574efe3f72 | |||
88896c2fd8 | |||
46210b0c48 | |||
3d646bdf88 | |||
732e6cc38c | |||
b619dbfe97 | |||
948254f083 | |||
62b0e889b2 | |||
8c0957f702 | |||
0dbc3f9f25 | |||
2d0c8e14be | |||
8c6d037332 | |||
c23aabe533 | |||
6e2b509697 | |||
d2b6c4691e | |||
ff6421866d | |||
0664b492c8 | |||
58fa2a0620 | |||
e6d1de1cad | |||
37bcfc888a | |||
ff94a63c37 | |||
a830de9d04 | |||
02a650f8d0 | |||
5c42377c1b | |||
ad612c535d | |||
4d4bf92c32 | |||
7ee289fb13 | |||
c6e1b15b37 | |||
1dfbb0d9bf | |||
92dfb0be96 | |||
41c3465f2a | |||
9e5d75fadc | |||
91568edc45 | |||
67bd49d5d4 | |||
cdb1ca22fc | |||
ef6df51b5e | |||
1aa2353ca6 | |||
351285f5c6 | |||
c4ef64e31f | |||
5aa06358fc | |||
9fd491fa3d | |||
d3efdd9219 | |||
d59976bd5d | |||
3553aec992 | |||
795caec679 | |||
3dd8ae24a8 | |||
d8686a7726 | |||
58c6708123 | |||
b2912460e0 | |||
a811cd2cf8 | |||
7ec47f8125 | |||
778f5f70dc | |||
09d9928195 | |||
e2349fef10 | |||
ad866631b6 | |||
4cdc8b4d9c | |||
b350dffe6c | |||
70dd54e114 | |||
d2de5e996c | |||
85cdb37f10 | |||
c2553e3451 | |||
9cd2f6972b | |||
791a2162a3 | |||
5d8686b64e | |||
41f80d9c24 | |||
b69ed7e2f0 | |||
f214561832 | |||
35c06fe0ba | |||
d1c15b43ca | |||
f97b8fcc3a | |||
1d701a3560 | |||
0eb84d68e2 | |||
750e424ac3 | |||
58162a8d78 | |||
d2f6ceaf28 | |||
b323925d94 | |||
ab6e07853c | |||
3206e3dd15 | |||
0f185587c9 | |||
e0a6312387 | |||
5d2705f3f9 | |||
3119922708 | |||
5d90c35e20 | |||
a910385cb1 | |||
618a59fc0e | |||
fcd3aff811 | |||
17d687fe7e | |||
4deb7b96a9 | |||
36ba4ff402 | |||
55955b8514 | |||
1bebbcf634 | |||
a292cd4d73 | |||
74df26a28d | |||
0de00e872f | |||
60aee6867c | |||
33eb5d1703 | |||
4d49039abe | |||
fd9eccbe8b | |||
4255d4eec7 | |||
d813116f77 | |||
a201919291 | |||
1aab4662e5 | |||
02a4d3641e | |||
3dfbdc313b | |||
3a286324ff | |||
0d849ffcc8 | |||
084f0b5b36 | |||
901ef5e92f | |||
f09597a519 | |||
a03b480eeb | |||
c9f1c1c60d | |||
f32c914ee8 | |||
681eac9cd8 | |||
52f0d1e1d8 | |||
dcf3d612bc | |||
4551766f7a | |||
a168b96b76 | |||
4b3d9951bc | |||
79fd87598f | |||
9851f1b2c8 | |||
4725ff41d3 | |||
4756ee2d8a | |||
25f627f36f | |||
24b96e7e1b | |||
75ae8daf8f | |||
999847d8db | |||
773bb12146 | |||
bef5ba7f3b | |||
eecb7e00e2 | |||
9160f1c4ce | |||
796f97f078 | |||
5f1c3b7728 | |||
f672ae817a |
@ -1,6 +1,218 @@
|
|||||||
= Changelog
|
= Changelog
|
||||||
|
|
||||||
|
|
||||||
|
v1.5 (2019.3)::
|
||||||
|
|
||||||
|
Changes since v1.4:
|
||||||
|
|
||||||
|
* [GEN] WinFsp file systems can now be used by WSLinux. File systems must enable this support by setting the `FSP_FSCTL_VOLUME_PARAMS::WslFeatures` bit. Use the command `sudo mount -t drvfs x: /mnt/x` to mount.
|
||||||
|
* [GEN] Extended attribute support has been added for all WinFsp API's: native, .NET, FUSE2 and FUSE3.
|
||||||
|
* [GEN] Mount Manager support has been added and it works for current and new file systems:
|
||||||
|
** If the file system mountpoint is in the syntax `\\.\X:` then the Mount Manager is used.
|
||||||
|
** If the file system mountpoint is in the syntax `X:` then `DefineDosDeviceW` is used (i.e. same as today).
|
||||||
|
** If the file system mountpoint is in the syntax `X:\DIR` then a reparse point is used and the file system is mounted as a directory (i.e. same as today).
|
||||||
|
** Caveats:
|
||||||
|
*** It requires Administrator access. This is because opening the `\\.\MountPointManager` device requires Administrator access.
|
||||||
|
*** It currently works with drives (`\\.\X:`) but not directories (`\\.\X:\DIR`).
|
||||||
|
*** Mount Manager drives created by WinFsp are transient. WinFsp takes various steps to ensure that this is the case.
|
||||||
|
*** Mount Manager drives are global and are visible across Terminal Services sessions (they go into the `\GLOBAL??` portion of the NT namespace).
|
||||||
|
* [FSD] Support for kernel-mode file systems on top of WinFsp has been added. See `FspFsextProvider`. This is in preparation for WinFuse - FUSE for Windows and WSLinux.
|
||||||
|
* [FSD] FastIO support has been added. FastIO operations are enabled on cache-enabled file systems with the notable exception of `FastIoQueryOpen`, which allows opening files in kernel mode; this operation requires the file system to specify the `FSP_FSCTL_VOLUME_PARAMS::AllowOpenInKernelMode` flag.
|
||||||
|
* [FSD] Support for `FileFsSectorSizeInformation` and `IOCTL_STORAGE_QUERY_PROPERTY / StorageAccessAlignmentProperty` has been added.
|
||||||
|
* [DLL] The `FspFileSystemStartDispatcher` default number of threads (`ThreadCount==0`) has been changed. See commit 3902874ac93fe40685d9761f46a96358ba24f24c for more.
|
||||||
|
* [FUSE] FUSE has new `-o UserName=DOMAIN+USERNAME` and `-o GroupName=DOMAIN+GROUPNAME` options. These function like the `-o uid=UID` and `-o gid=GID` options, but accept Windows user and groups names.
|
||||||
|
* [FUSE] FUSE has new `-o dothidden` option that is used to add the Windows hidden file attribute to files that start with a dot.
|
||||||
|
* [FUSE] FUSE has new `-o create_file_umask=nnn` and `-o create_dir_umask=nnn` options that allow for more control than the `-o create_umask=nnn` option.
|
||||||
|
* [FUSE] FUSE has new `--ExactFileSystemName=FSNAME` option that removes the "FUSE-" prefix from the file system name. (Use with caution: see discussion in PR #251.) (Thanks @johntyner.)
|
||||||
|
* [.NET] The .NET API now supports asynchronous handling of `Read`, `Write` and `ReadDirectory`. (Thanks @dworkin.)
|
||||||
|
* [.NET] The .NET API now supports fine-grained timeouts (`VolumeInfoTimeout`, `DirInfoTimeout`, etc).
|
||||||
|
* [.NET] The .NET API has new method `FileSystemHost.MountEx` that adds a `ThreadCount` parameter.
|
||||||
|
* [LAUNCH] The Launcher can now rewrite path arguments passed to file systems during launching using "Path Transformation Language". See commit a73f1b95592617ac7484e16c2e642573a4d65644 for more.
|
||||||
|
* [MEMFS] A new memfs FUSE3 file system written in C++ has been added. See `tst/memfs-fuse3`.
|
||||||
|
* [AIRFS] John Oberschelp has done some fantastic work adding persistence to the airfs file system. (Thanks @JohnOberschelp.)
|
||||||
|
* [FIX] Fixes for very large (> 4GiB) files. (Thanks @dworkin.)
|
||||||
|
* [FIX] A fix for how FUSE handles the return value from `opendir`. (GitHub issue billziss-gh/sshfs-win#54)
|
||||||
|
* [FIX] A fix for an invalid UID to SID mapping on domains with a lot of users. (Thanks @sganis.)
|
||||||
|
* [FIX] A fix on the C++ layer. (Thanks @colatkinson.)
|
||||||
|
* Other fixes and improvements.
|
||||||
|
|
||||||
|
|
||||||
|
v1.5B4 (2019.3 B4)::
|
||||||
|
|
||||||
|
Changes since v1.4:
|
||||||
|
|
||||||
|
* [GEN] WinFsp file systems can now be used by WSLinux. File systems must enable this support by setting the `FSP_FSCTL_VOLUME_PARAMS::WslFeatures` bit. Use the command `sudo mount -t drvfs x: /mnt/x` to mount.
|
||||||
|
* [GEN] Extended attribute support has been added for all WinFsp API's: native, .NET, FUSE2 and FUSE3.
|
||||||
|
* [GEN] Mount Manager support has been added and it works for current and new file systems:
|
||||||
|
** If the file system mountpoint is in the syntax `\\.\X:` then the Mount Manager is used.
|
||||||
|
** If the file system mountpoint is in the syntax `X:` then `DefineDosDeviceW` is used (i.e. same as today).
|
||||||
|
** If the file system mountpoint is in the syntax `X:\DIR` then a reparse point is used and the file system is mounted as a directory (i.e. same as today).
|
||||||
|
** Caveats:
|
||||||
|
*** It requires Administrator access. This is because opening the `\\.\MountPointManager` device requires Administrator access.
|
||||||
|
*** It currently works with drives (`\\.\X:`) but not directories (`\\.\X:\DIR`).
|
||||||
|
*** Mount Manager drives created by WinFsp are transient. WinFsp takes various steps to ensure that this is the case.
|
||||||
|
*** Mount Manager drives are global and are visible across Terminal Services sessions (they go into the `\GLOBAL??` portion of the NT namespace).
|
||||||
|
* [FSD] Support for kernel-mode file systems on top of WinFsp has been added. See `FspFsextProvider`. This is in preparation for WinFuse - FUSE for Windows and WSLinux.
|
||||||
|
* [FSD] FastIO support has been added. FastIO operations are enabled on cache-enabled file systems with the notable exception of `FastIoQueryOpen`, which allows opening files in kernel mode; this operation requires the file system to specify the `FSP_FSCTL_VOLUME_PARAMS::AllowOpenInKernelMode` flag.
|
||||||
|
* [FSD] Support for `FileFsSectorSizeInformation` and `IOCTL_STORAGE_QUERY_PROPERTY / StorageAccessAlignmentProperty` has been added.
|
||||||
|
* [DLL] The `FspFileSystemStartDispatcher` default number of threads (`ThreadCount==0`) has been changed. See commit 3902874ac93fe40685d9761f46a96358ba24f24c for more.
|
||||||
|
* [FUSE] FUSE has new `-o UserName=DOMAIN+USERNAME` and `-o GroupName=DOMAIN+GROUPNAME` options. These function like the `-o uid=UID` and `-o gid=GID` options, but accept Windows user and groups names.
|
||||||
|
* [FUSE] FUSE has new `-o dothidden` option that is used to add the Windows hidden file attribute to files that start with a dot.
|
||||||
|
* [FUSE] FUSE has new `-o create_file_umask=nnn` and `-o create_dir_umask=nnn` options that allow for more control than the `-o create_umask=nnn` option.
|
||||||
|
* [FUSE] FUSE has new `--ExactFileSystemName=FSNAME` option that removes the "FUSE-" prefix from the file system name. (Use with caution: see discussion in PR #251.) (Thanks @johntyner.)
|
||||||
|
* [.NET] The .NET API now supports asynchronous handling of `Read`, `Write` and `ReadDirectory`. (Thanks @dworkin.)
|
||||||
|
* [.NET] The .NET API now supports fine-grained timeouts (`VolumeInfoTimeout`, `DirInfoTimeout`, etc).
|
||||||
|
* [.NET] The .NET API has new method `FileSystemHost.MountEx` that adds a `ThreadCount` parameter.
|
||||||
|
* [LAUNCH] The Launcher can now rewrite path arguments passed to file systems during launching using "Path Transformation Language". See commit a73f1b95592617ac7484e16c2e642573a4d65644 for more.
|
||||||
|
* [MEMFS] A new memfs FUSE3 file system written in C++ has been added. See `tst/memfs-fuse3`.
|
||||||
|
* [AIRFS] John Oberschelp has done some fantastic work adding persistence to the airfs file system. (Thanks @JohnOberschelp.)
|
||||||
|
* [FIX] Fixes for very large (> 4GiB) files. (Thanks @dworkin.)
|
||||||
|
* [FIX] A fix for how FUSE handles the return value from `opendir`. (GitHub issue billziss-gh/sshfs-win#54)
|
||||||
|
* [FIX] A fix for an invalid UID to SID mapping on domains with a lot of users. (Thanks @sganis.)
|
||||||
|
* [FIX] A fix on the C++ layer. (Thanks @colatkinson.)
|
||||||
|
* Other fixes and improvements.
|
||||||
|
|
||||||
|
|
||||||
|
v1.5B3 (2019.3 B3)::
|
||||||
|
|
||||||
|
Changes since v1.4:
|
||||||
|
|
||||||
|
* [GEN] WinFsp file systems can now be used by WSLinux. Use the command `sudo mount -t drvfs x: /mnt/x` to mount.
|
||||||
|
* [GEN] Extended attribute support has been added for all WinFsp API's: native, .NET, FUSE2 and FUSE3.
|
||||||
|
* [GEN] Mount Manager support has been added and it works for current and new file systems:
|
||||||
|
** If the file system mountpoint is in the syntax `\\.\X:` then the Mount Manager is used.
|
||||||
|
** If the file system mountpoint is in the syntax `X:` then `DefineDosDeviceW` is used (i.e. same as today).
|
||||||
|
** If the file system mountpoint is in the syntax `X:\DIR` then a reparse point is used and the file system is mounted as a directory (i.e. same as today).
|
||||||
|
** Caveats:
|
||||||
|
*** It requires Administrator access. This is because opening the `\\.\MountPointManager` device requires Administrator access.
|
||||||
|
*** It currently works with drives (`\\.\X:`) but not directories (`\\.\X:\DIR`).
|
||||||
|
*** Mount Manager drives created by WinFsp are transient. WinFsp takes various steps to ensure that this is the case.
|
||||||
|
*** Mount Manager drives are global and are visible across Terminal Services sessions (they go into the `\GLOBAL??` portion of the NT namespace).
|
||||||
|
* [FSD] Support for kernel-mode file systems on top of WinFsp has been added. See `FspFsextProvider`. This is in preparation for WinFuse - FUSE for Windows and WSLinux.
|
||||||
|
* [FSD] FastIO support has been added. FastIO operations are enabled on cache-enabled file systems with the notable exception of `FastIoQueryOpen`, which allows opening files in kernel mode; this operation requires the file system to specify the `FSP_FSCTL_VOLUME_PARAMS::AllowOpenInKernelMode` flag.
|
||||||
|
* [FSD] Support for `FileFsSectorSizeInformation` and `IOCTL_STORAGE_QUERY_PROPERTY / StorageAccessAlignmentProperty` has been added.
|
||||||
|
* [DLL] The `FspFileSystemStartDispatcher` default number of threads (`ThreadCount==0`) has been changed. See commit 3902874ac93fe40685d9761f46a96358ba24f24c for more.
|
||||||
|
* [FUSE] FUSE has new `-o UserName=DOMAIN+USERNAME` and `-o GroupName=DOMAIN+GROUPNAME` options. These function like the `-o uid=UID` and `-o gid=GID` options, but accept Windows user and groups names.
|
||||||
|
* [FUSE] FUSE has new `-o dothidden` option that is used to add the Windows hidden file attribute to files that start with a dot.
|
||||||
|
* [FUSE] FUSE has new `-o create_file_umask=nnn` and `-o create_dir_umask=nnn` options that allow for more control than the `-o create_umask=nnn` option.
|
||||||
|
* [FUSE] FUSE has new `--ExactFileSystemName=FSNAME` option that removes the "FUSE-" prefix from the file system name. (Use with caution: see discussion in PR #251.) (Thanks @johntyner.)
|
||||||
|
* [.NET] The .NET API now supports asynchronous handling of `Read`, `Write` and `ReadDirectory`. (Thanks @dworkin.)
|
||||||
|
* [.NET] The .NET API now supports fine-grained timeouts (`VolumeInfoTimeout`, `DirInfoTimeout`, etc).
|
||||||
|
* [.NET] The .NET API has new method `FileSystemHost.MountEx` that adds a `ThreadCount` parameter.
|
||||||
|
* [LAUNCH] The Launcher can now rewrite path arguments passed to file systems during launching using "Path Transformation Language". See commit a73f1b95592617ac7484e16c2e642573a4d65644 for more.
|
||||||
|
* [MEMFS] A new memfs FUSE3 file system written in C++ has been added. See `tst/memfs-fuse3`.
|
||||||
|
* [AIRFS] John Oberschelp has done some fantastic work adding persistence to the airfs file system. (Thanks @JohnOberschelp.)
|
||||||
|
* [FIX] Fixes for very large (> 4GiB) files. (Thanks @dworkin.)
|
||||||
|
* [FIX] A fix for how FUSE handles the return value from `opendir`. (GitHub issue billziss-gh/sshfs-win#54)
|
||||||
|
* [FIX] A fix for an invalid UID to SID mapping on domains with a lot of users. (Thanks @sganis.)
|
||||||
|
* [FIX] A fix on the C++ layer. (Thanks @colatkinson.)
|
||||||
|
* Other fixes and improvements.
|
||||||
|
|
||||||
|
|
||||||
|
v1.5B2 (2019.3 B2)::
|
||||||
|
|
||||||
|
Changes since v1.4:
|
||||||
|
|
||||||
|
* [GEN] WinFsp file systems can now be used by WSLinux. Use the command `sudo mount -t drvfs x: /mnt/x` to mount.
|
||||||
|
* [GEN] Extended attribute support has been added for all WinFsp API's: native, .NET, FUSE2 and FUSE3.
|
||||||
|
* [FSD] Support for kernel-mode file systems on top of WinFsp has been added. See `FspFsextProvider`. This is in preparation for WinFuse - FUSE for Windows and WSLinux.
|
||||||
|
* [FSD] FastIO support has been added. FastIO operations are enabled on cache-enabled file systems with the notable exception of `FastIoQueryOpen`, which allows opening files in kernel mode; this operation requires the file system to specify the `FSP_FSCTL_VOLUME_PARAMS::AllowOpenInKernelMode` flag.
|
||||||
|
* [DLL] The `FspFileSystemStartDispatcher` default number of threads (`ThreadCount==0`) has been changed. See commit 3902874ac93fe40685d9761f46a96358ba24f24c for more.
|
||||||
|
* [FUSE] FUSE has new `-o UserName=DOMAIN\USERNAME` and `-o GroupName=DOMAIN\GROUPNAME` options. These function like the `-o uid=UID` and `-o gid=GID` options, but accept Windows user and groups names.
|
||||||
|
* [FUSE] FUSE has new `-o dothidden` option that is used to add the Windows hidden file attribute to files that start with a dot.
|
||||||
|
* [FUSE] FUSE has new `-o create_file_umask=nnn` and `-o create_dir_umask=nnn` options that allow for more control than the `-o create_umask=nnn` option.
|
||||||
|
* [.NET] The .NET API now supports asynchronous handling of `Read`, `Write` and `ReadDirectory`. (Thanks @dworkin.)
|
||||||
|
* [.NET] The .NET API now supports fine-grained timeouts (`VolumeInfoTimeout`, `DirInfoTimeout`, etc).
|
||||||
|
* [.NET] The .NET API has new method `FileSystemHost.MountEx` that adds a `ThreadCount` parameter.
|
||||||
|
* [LAUNCH] The Launcher can now rewrite path arguments passed to file systems during launching using "Path Transformation Language". See commit a73f1b95592617ac7484e16c2e642573a4d65644 for more.
|
||||||
|
* [FIX] Fixes for very large (> 4GiB) files. (Thanks @dworkin.)
|
||||||
|
* [FIX] A fix for how FUSE handles the return value from `opendir`. (GitHub issue billziss-gh/sshfs-win#54)
|
||||||
|
* [FIX] A fix for an invalid UID to SID mapping on domains with a lot of users. (Thanks @sganis.)
|
||||||
|
* [FIX] A fix on the C++ layer. (Thanks @colatkinson.)
|
||||||
|
* Other fixes and improvements.
|
||||||
|
|
||||||
|
|
||||||
|
v1.5B1 (2019.3 B1)::
|
||||||
|
|
||||||
|
Changes since v1.4:
|
||||||
|
|
||||||
|
* Extended attribute support has been added for all WinFsp API's: native, .NET, FUSE2 and FUSE3.
|
||||||
|
* Initial FastIO support has been added. FastIO operations are enabled on cache-enabled file systems with the notable exception of `FastIoQueryOpen`, which allows opening files in kernel mode; this operation requires the file system to specify the `FSP_FSCTL_VOLUME_PARAMS::AllowOpenInKernelMode` flag.
|
||||||
|
* Fixes for very large (> 4GiB) files. (Thanks @dworkin.)
|
||||||
|
* A fix for an invalid UID to SID mapping on domains with a lot of users. (Thanks @sganis.)
|
||||||
|
* A fix on the C++ layer. (Thanks @colatkinson.)
|
||||||
|
|
||||||
|
|
||||||
|
v1.4.19049 (2019.2)::
|
||||||
|
|
||||||
|
Changes since v1.3:
|
||||||
|
|
||||||
|
* FUSE3 API (version 3.2) is now available. The FUSE2 API (version 2.8) also remains supported.
|
||||||
|
* New `Control` file system operation allows sending custom control codes to the file system using the Windows `DeviceIoControl` API. FUSE `ioctl` is also supported.
|
||||||
|
* New `SetDelete` file system operation can optionally be used instead of `CanDelete`. `SetDelete` or `CanDelete` are used to handle the file "disposition" flag, which determines if a file is marked for deletion. See the relevant documentation for more details.
|
||||||
|
* `FlushAndPurgeOnCleanup` has now been added to the .NET API. (GitHub PR #176; thanks @FrKaram.)
|
||||||
|
* The Launcher now supports running file systems under the user account that started them. Use `RunAs="."` in the file system registry entry.
|
||||||
|
* New sample file system "airfs" contributed by @JohnOberschelp. Airfs is an in-memory file system like Memfs on which it is based on; it has received substantial improvements in how the file name space is maintained and has been modified to use modern C++ techniques by John.
|
||||||
|
* New sample file system "passthrough-fuse3" passes all operations to an underlying file system. This file system is built using the FUSE3 API. It builds and runs on both Windows and Cygwin.
|
||||||
|
* The FUSE layer now supports multiple file systems within a single process. This is a long standing problem that has been fixed. (GitHub issue #135.)
|
||||||
|
* The FSD includes a fix for a Windows problem: that case-sensitive file systems do not work properly when mounted as directories. See FAQ entry #3.
|
||||||
|
* The FSD includes a fix for a rare but serious problem. (GitHub issue #177. Thanks @thinkport.)
|
||||||
|
* The FSD includes a fix for an incompatibility with DrWeb Antivirus. (GitHub issue #192)
|
||||||
|
* The DLL includes a fix for an errorenous `STATUS_ACCESS_DENIED` on read-only directories. (GitHub issue #190. Thanks @alfaunits.)
|
||||||
|
* The FUSE layer includes a fix for the `ioctl` operation. (GitHub PR #214. Thanks @felfert.)
|
||||||
|
|
||||||
|
|
||||||
|
v1.4 (2019.1)::
|
||||||
|
|
||||||
|
Changes since v1.3:
|
||||||
|
|
||||||
|
* FUSE3 API (version 3.2) is now available. The FUSE2 API (version 2.8) also remains supported.
|
||||||
|
* New `Control` file system operation allows sending custom control codes to the file system using the Windows `DeviceIoControl` API. FUSE `ioctl` is also supported.
|
||||||
|
* New `SetDelete` file system operation can optionally be used instead of `CanDelete`. `SetDelete` or `CanDelete` are used to handle the file "disposition" flag, which determines if a file is marked for deletion. See the relevant documentation for more details.
|
||||||
|
* `FlushAndPurgeOnCleanup` has now been added to the .NET API. (GitHub PR #176; thanks @FrKaram.)
|
||||||
|
* The Launcher now supports running file systems under the user account that started them. Use `RunAs="."` in the file system registry entry.
|
||||||
|
* New sample file system "airfs" contributed by @JohnOberschelp. Airfs is an in-memory file system like Memfs on which it is based on; it has received substantial improvements in how the file name space is maintained and has been modified to use modern C++ techniques by John.
|
||||||
|
* New sample file system "passthrough-fuse3" passes all operations to an underlying file system. This file system is built using the FUSE3 API. It builds and runs on both Windows and Cygwin.
|
||||||
|
* The FUSE layer now supports multiple file systems within a single process. This is a long standing problem that has been fixed. (GitHub issue #135.)
|
||||||
|
* The FSD includes a fix for a Windows problem: that case-sensitive file systems do not work properly when mounted as directories. See FAQ entry #3.
|
||||||
|
* The FSD includes a fix for a rare but serious problem. (GitHub issue #177. Thanks @thinkport.)
|
||||||
|
* The FSD includes a fix for an incompatibility with DrWeb Antivirus. (GitHub issue #192)
|
||||||
|
* The DLL includes a fix for an errorenous `STATUS_ACCESS_DENIED` on read-only directories. (GitHub issue #190. Thanks @alfaunits.)
|
||||||
|
|
||||||
|
|
||||||
|
v1.4B4 (2018.2 B4)::
|
||||||
|
|
||||||
|
Changes since v1.3:
|
||||||
|
|
||||||
|
* FUSE3 API (version 3.2) is now available. The FUSE2 API (version 2.8) also remains supported.
|
||||||
|
* New `Control` file system operation allows sending custom control codes to the file system using the Windows `DeviceIoControl` API. FUSE `ioctl` is also supported.
|
||||||
|
* New `SetDelete` file system operation can optionally be used instead of `CanDelete`. `SetDelete` or `CanDelete` are used to handle the file "disposition" flag, which determines if a file is marked for deletion. See the relevant documentation for more details.
|
||||||
|
* `FlushAndPurgeOnCleanup` has now been added to the .NET API. (GitHub PR #176; thanks @FrKaram.)
|
||||||
|
* The Launcher now supports running file systems under the user account that started them. Use `RunAs="."` in the file system registry entry.
|
||||||
|
* New sample file system "airfs" contributed by @JohnOberschelp. Airfs is an in-memory file system like Memfs on which it is based on; it has received substantial improvements in how the file name space is maintained and has been modified to use modern C++ techniques by John.
|
||||||
|
* New sample file system "passthrough-fuse3" passes all operations to an underlying file system. This file system is built using the FUSE3 API. It builds and runs on both Windows and Cygwin.
|
||||||
|
* The FUSE layer now supports multiple file systems within a single process. This is a long standing problem that has been fixed. (GitHub issue #135.)
|
||||||
|
* The FSD includes a fix for a Windows problem: that case-sensitive file systems do not work properly when mounted as directories. See FAQ entry #3.
|
||||||
|
* The FSD includes a fix for a rare but serious problem. (GitHub issue #177. Thanks @thinkport.)
|
||||||
|
* The FSD includes a fix for an incompatibility with DrWeb Antivirus. (GitHub issue #192)
|
||||||
|
* The DLL includes a fix for an errorenous `STATUS_ACCESS_DENIED` on read-only directories. (GitHub issue #190. Thanks @alfaunits.)
|
||||||
|
|
||||||
|
|
||||||
|
v1.4B3 (2018.2 B3)::
|
||||||
|
|
||||||
|
Changes since v1.3:
|
||||||
|
|
||||||
|
* FUSE3 API (version 3.2) is now available. The FUSE2 API (version 2.8) also remains supported.
|
||||||
|
* New `Control` file system operation allows sending custom control codes to the file system using the Windows `DeviceIoControl` API. FUSE `ioctl` is also supported.
|
||||||
|
* New `SetDelete` file system operation can optionally be used instead of `CanDelete`. `SetDelete` or `CanDelete` are used to handle the file "disposition" flag, which determines if a file is marked for deletion. See the relevant documentation for more details.
|
||||||
|
* `FlushAndPurgeOnCleanup` has now been added to the .NET API. (GitHub PR #176; thanks @FrKaram.)
|
||||||
|
* New sample file system "airfs" contributed by @JohnOberschelp. Airfs is an in-memory file system like Memfs on which it is based on; it has received substantial improvements in how the file name space is maintained and has been modified to use modern C++ techniques by John.
|
||||||
|
* New sample file system "passthrough-fuse3" passes all operations to an underlying file system. This file system is built using the FUSE3 API. It builds and runs on both Windows and Cygwin.
|
||||||
|
* The FUSE layer now supports multiple file systems within a single process. This is a long standing problem that has been fixed. (GitHub issue #135.)
|
||||||
|
* The FSD includes an experimental fix for a Windows problem: that case-sensitive file systems do not work properly when mounted as directories. See the relevant FAQ entry.
|
||||||
|
* The FSD includes a fix for an incompatibility with DrWeb Antivirus. (GitHub issue #192)
|
||||||
|
|
||||||
|
|
||||||
v1.4B2 (2018.2 B2)::
|
v1.4B2 (2018.2 B2)::
|
||||||
|
|
||||||
Changes since v1.3:
|
Changes since v1.3:
|
||||||
|
@ -56,9 +56,14 @@ CONTRIBUTOR LIST
|
|||||||
|===
|
|===
|
||||||
|Ben Rubson |ben.rubson at gmail.com
|
|Ben Rubson |ben.rubson at gmail.com
|
||||||
|Bill Zissimopoulos |billziss at navimatics.com
|
|Bill Zissimopoulos |billziss at navimatics.com
|
||||||
|
|Brett Dutro |brett.dutro at gmail.com
|
||||||
|
|Colin Atkinson (Atakama, https://atakama.com) |colin at atakama.com
|
||||||
|
|Felix Croes |felix at dworkin.nl
|
||||||
|Francois Karam (KS2, http://www.ks2.fr) |francois.karam at ks2.fr
|
|Francois Karam (KS2, http://www.ks2.fr) |francois.karam at ks2.fr
|
||||||
|Fritz Elfert |fritz-github at fritz-elfert.de
|
|Fritz Elfert |fritz-github at fritz-elfert.de
|
||||||
|John Oberschelp |john at oberschelp.net
|
|John Oberschelp |john at oberschelp.net
|
||||||
|
|John Tyner |jtyner at gmail.com
|
||||||
|Sam Kelly (DuroSoft Technologies LLC, https://durosoft.com) |sam at durosoft.com
|
|Sam Kelly (DuroSoft Technologies LLC, https://durosoft.com) |sam at durosoft.com
|
||||||
|
|Santiago Ganis |sganis at gmail.com
|
||||||
|Tobias Urlaub |saibotu at outlook.de
|
|Tobias Urlaub |saibotu at outlook.de
|
||||||
|===
|
|===
|
||||||
|
10
README.md
10
README.md
@ -29,6 +29,9 @@
|
|||||||
</a>
|
</a>
|
||||||
<br/>
|
<br/>
|
||||||
<br/>
|
<br/>
|
||||||
|
<b>Check out my new kernel driver project <a href="https://github.com/billziss-gh/winspd">WinSpd</a>.</b>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@ -93,6 +96,7 @@ The project source code is organized as follows:
|
|||||||
* :file_folder: [src/dll/fuse3](src/dll/fuse3): Source code to the FUSE3 compatibility layer.
|
* :file_folder: [src/dll/fuse3](src/dll/fuse3): Source code to the FUSE3 compatibility layer.
|
||||||
* :file_folder: [src/dotnet](src/dotnet): Source code to the .NET layer.
|
* :file_folder: [src/dotnet](src/dotnet): Source code to the .NET layer.
|
||||||
* :file_folder: [src/fsptool](src/fsptool): Source code to fsptool command line utility.
|
* :file_folder: [src/fsptool](src/fsptool): Source code to fsptool command line utility.
|
||||||
|
* :file_folder: [src/ku](src/ku): Source code that can be used from kernel or user mode.
|
||||||
* :file_folder: [src/launcher](src/launcher): Source code to the launcher service and the launchctl utility.
|
* :file_folder: [src/launcher](src/launcher): Source code to the launcher service and the launchctl utility.
|
||||||
* :file_folder: [src/sys](src/sys): Source code to the WinFsp FSD.
|
* :file_folder: [src/sys](src/sys): Source code to the WinFsp FSD.
|
||||||
* :file_folder: [opt/cygfuse](opt/cygfuse): Source code to the FUSE for Cygwin package.
|
* :file_folder: [opt/cygfuse](opt/cygfuse): Source code to the FUSE for Cygwin package.
|
||||||
@ -104,8 +108,12 @@ The project source code is organized as follows:
|
|||||||
|
|
||||||
In order to build WinFsp you will need the following:
|
In order to build WinFsp you will need the following:
|
||||||
|
|
||||||
* Visual Studio 2015
|
* Visual Studio 2015 - 2019
|
||||||
* Windows Driver Kit (WDK) 10
|
* Windows Driver Kit (WDK) 10
|
||||||
|
- **NOTE**: When using the latest WDK (Windows 10.0.18362.1) with Visual Studio 2015 you may get an error about a missing task `ValidateNTTargetVersion`. The fix is to edit the file `\Program Files (x86)\Windows Kits\10\build\WindowsDriver.Common.targets` and modify the `UsingTask` line for `ValidateNTTargetVersion` as follows:
|
||||||
|
```
|
||||||
|
<UsingTask TaskName="ValidateNTTargetVersion" AssemblyFile="$(WDKContentRoot)build\bin\Microsoft.DriverKit.Build.Tasks.16.0.dll"/>
|
||||||
|
```
|
||||||
* [Wix toolset](http://wixtoolset.org)
|
* [Wix toolset](http://wixtoolset.org)
|
||||||
|
|
||||||
To fully build WinFsp (including the installer) you must use `tools\build.bat`. By default it builds a Release build, but you can choose either the Debug or Release configuration by using the syntax:
|
To fully build WinFsp (including the installer) you must use `tools\build.bat`. By default it builds a Release build, but you can choose either the Debug or Release configuration by using the syntax:
|
||||||
|
11
appveyor.yml
11
appveyor.yml
@ -11,7 +11,17 @@ environment:
|
|||||||
#- CONFIGURATION: Release
|
#- CONFIGURATION: Release
|
||||||
# TESTING: Perf
|
# TESTING: Perf
|
||||||
|
|
||||||
|
init:
|
||||||
|
#- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
||||||
|
|
||||||
install:
|
install:
|
||||||
|
- ps: |
|
||||||
|
# Hack to make WDK 1903 work on VS2015.
|
||||||
|
# See https://github.com/appveyor-tests/WDK-10.0.14393.0/blob/31cf12217fe0c92b218c70d7027dfe145be4f4cb/appveyor.yml#L7
|
||||||
|
[xml]$targets = get-content "C:\Program Files (x86)\Windows Kits\10\build\WindowsDriver.Common.targets"
|
||||||
|
$usingTask = $targets.ChildNodes[1].UsingTask | ? {$_.TaskName -eq "ValidateNTTargetVersion"}
|
||||||
|
$usingTask.AssemblyFile = '$(WDKContentRoot)build\bin\Microsoft.DriverKit.Build.Tasks.16.0.dll'
|
||||||
|
$targets.Save("C:\Program Files (x86)\Windows Kits\10\build\WindowsDriver.Common.targets")
|
||||||
- git submodule update --init --recursive
|
- git submodule update --init --recursive
|
||||||
- appveyor AddMessage "Change boot configuration and reboot" -Category Information
|
- appveyor AddMessage "Change boot configuration and reboot" -Category Information
|
||||||
- bcdedit /set testsigning on
|
- bcdedit /set testsigning on
|
||||||
@ -42,3 +52,4 @@ test_script:
|
|||||||
on_finish:
|
on_finish:
|
||||||
- if exist %SystemRoot%\memory.dmp (7z a memory.dmp.zip %SystemRoot%\memory.dmp && appveyor PushArtifact memory.dmp.zip)
|
- if exist %SystemRoot%\memory.dmp (7z a memory.dmp.zip %SystemRoot%\memory.dmp && appveyor PushArtifact memory.dmp.zip)
|
||||||
- verifier /query
|
- verifier /query
|
||||||
|
#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
||||||
|
3
build/VStudio/.gitignore
vendored
3
build/VStudio/.gitignore
vendored
@ -4,3 +4,6 @@ build
|
|||||||
*.vcproj.*
|
*.vcproj.*
|
||||||
*.vcxproj.user
|
*.vcxproj.user
|
||||||
*.csproj.user
|
*.csproj.user
|
||||||
|
*.VC.db
|
||||||
|
*.VC.opendb
|
||||||
|
.vs
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file CustomActions.cpp
|
* @file CustomActions.cpp
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="..\..\version.properties" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
@ -14,18 +15,18 @@
|
|||||||
<ProjectGuid>{95C223E6-B5F1-4FD0-9376-41CDBC824445}</ProjectGuid>
|
<ProjectGuid>{95C223E6-B5F1-4FD0-9376-41CDBC824445}</ProjectGuid>
|
||||||
<RootNamespace>CustomActions</RootNamespace>
|
<RootNamespace>CustomActions</RootNamespace>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
@ -68,7 +69,6 @@
|
|||||||
<AdditionalDependencies>msi.lib;dutil.lib;wcautil.lib;Version.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>msi.lib;dutil.lib;wcautil.lib;Version.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(WIX)sdk\VS2015\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(WIX)sdk\VS2015\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
<ModuleDefinitionFile>CustomActions.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>CustomActions.def</ModuleDefinitionFile>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<TargetMachine>MachineX86</TargetMachine>
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
||||||
@ -92,7 +92,6 @@
|
|||||||
<AdditionalDependencies>msi.lib;dutil.lib;wcautil.lib;Version.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>msi.lib;dutil.lib;wcautil.lib;Version.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>$(WIX)sdk\VS2015\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>$(WIX)sdk\VS2015\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
<ModuleDefinitionFile>CustomActions.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>CustomActions.def</ModuleDefinitionFile>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
@ -348,18 +348,18 @@
|
|||||||
<Directory Id="OPTDIR.cygfuse" Name="cygfuse" FileSource="..\..\..\opt\cygfuse\dist">
|
<Directory Id="OPTDIR.cygfuse" Name="cygfuse" FileSource="..\..\..\opt\cygfuse\dist">
|
||||||
<Directory Id="OPTDIR.cygfuse.x64" Name="x64">
|
<Directory Id="OPTDIR.cygfuse.x64" Name="x64">
|
||||||
<Component Id="C.fuse.tar.xz.x64">
|
<Component Id="C.fuse.tar.xz.x64">
|
||||||
<File Id="FILE.fuse.tar.xz.x64" Name="fuse-2.8-9.tar.xz" KeyPath="yes" />
|
<File Id="FILE.fuse.tar.xz.x64" Name="fuse-2.8-10.tar.xz" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
<Component Id="C.fuse3.tar.xz.x64">
|
<Component Id="C.fuse3.tar.xz.x64">
|
||||||
<File Id="FILE.fuse3.tar.xz.x64" Name="fuse3-3.2-1.tar.xz" KeyPath="yes" />
|
<File Id="FILE.fuse3.tar.xz.x64" Name="fuse3-3.2-2.tar.xz" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
</Directory>
|
</Directory>
|
||||||
<Directory Id="OPTDIR.cygfuse.x86" Name="x86">
|
<Directory Id="OPTDIR.cygfuse.x86" Name="x86">
|
||||||
<Component Id="C.fuse.tar.xz.x86">
|
<Component Id="C.fuse.tar.xz.x86">
|
||||||
<File Id="FILE.fuse.tar.xz.x86" Name="fuse-2.8-9.tar.xz" KeyPath="yes" />
|
<File Id="FILE.fuse.tar.xz.x86" Name="fuse-2.8-10.tar.xz" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
<Component Id="C.fuse3.tar.xz.x86">
|
<Component Id="C.fuse3.tar.xz.x86">
|
||||||
<File Id="FILE.fuse3.tar.xz.x86" Name="fuse3-3.2-1.tar.xz" KeyPath="yes" />
|
<File Id="FILE.fuse3.tar.xz.x86" Name="fuse3-3.2-2.tar.xz" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
</Directory>
|
</Directory>
|
||||||
<Component Id="C.fuse.install.sh">
|
<Component Id="C.fuse.install.sh">
|
||||||
@ -369,6 +369,23 @@
|
|||||||
<File Name="uninstall.sh" KeyPath="yes" />
|
<File Name="uninstall.sh" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
</Directory>
|
</Directory>
|
||||||
|
<Directory Id="OPTDIR.fsext" Name="fsext" FileSource="..\..\..\opt\fsext">
|
||||||
|
<Directory Id="OPTDIR.fsext.inc" Name="inc">
|
||||||
|
<Directory Id="OPTDIR.fsext.inc.winfsp" Name="winfsp">
|
||||||
|
<Component Id="C.fsext.h">
|
||||||
|
<File Name="fsext.h" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
</Directory>
|
||||||
|
</Directory>
|
||||||
|
<Directory Id="OPTDIR.fsext.lib" Name="lib">
|
||||||
|
<Component Id="C.fsext.winfsp_x64.lib">
|
||||||
|
<File Id="FILE.fsext.winfsp_x64.lib" Name="winfsp-x64.lib" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.fsext.winfsp_x86.lib">
|
||||||
|
<File Id="FILE.fsext.winfsp_x86.lib" Name="winfsp-x86.lib" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
</Directory>
|
||||||
|
</Directory>
|
||||||
</DirectoryRef>
|
</DirectoryRef>
|
||||||
<DirectoryRef Id="SMPDIR" FileSource="..\..\..\tst">
|
<DirectoryRef Id="SMPDIR" FileSource="..\..\..\tst">
|
||||||
<Directory Id="SMPDIR.memfs" Name="memfs">
|
<Directory Id="SMPDIR.memfs" Name="memfs">
|
||||||
@ -382,6 +399,29 @@
|
|||||||
<File Name="memfs-main.c" KeyPath="yes" />
|
<File Name="memfs-main.c" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
</Directory>
|
</Directory>
|
||||||
|
<Directory Id="SMPDIR.memfs_fuse3" Name="memfs-fuse3">
|
||||||
|
<Component Id="C.memfs_fuse3.cpp">
|
||||||
|
<File Name="memfs-fuse3.cpp" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.memfs_fuse3.compat.h">
|
||||||
|
<File Id="F.memfs_fuse3.compat.h" Name="compat.h" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.memfs_fuse3.sln">
|
||||||
|
<File Name="memfs-fuse3.sln" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.memfs_fuse3.vcxproj">
|
||||||
|
<File Name="memfs-fuse3.vcxproj" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.memfs_fuse3.vcxproj.filters">
|
||||||
|
<File Name="memfs-fuse3.vcxproj.filters" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.memfs_fuse3.Makefile">
|
||||||
|
<File Id="F.memfs_fuse3.Makefile" Name="Makefile" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.memfs_fuse3.README.md">
|
||||||
|
<File Id="F.memfsx_fuse3.README.md" Name="README.md" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
</Directory>
|
||||||
<Directory Id="SMPDIR.memfs_dotnet" Name="memfs-dotnet">
|
<Directory Id="SMPDIR.memfs_dotnet" Name="memfs-dotnet">
|
||||||
<Component Id="C.memfs_dotnet.Program.cs">
|
<Component Id="C.memfs_dotnet.Program.cs">
|
||||||
<File Id="FILE.memfs_dotnet.Program.cs" Name="Program.cs" KeyPath="yes" />
|
<File Id="FILE.memfs_dotnet.Program.cs" Name="Program.cs" KeyPath="yes" />
|
||||||
@ -391,6 +431,12 @@
|
|||||||
<Component Id="C.airfs.cpp">
|
<Component Id="C.airfs.cpp">
|
||||||
<File Name="airfs.cpp" KeyPath="yes" />
|
<File Name="airfs.cpp" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
|
<Component Id="C.persistence.cpp">
|
||||||
|
<File Name="persistence.cpp" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.common.h">
|
||||||
|
<File Name="common.h" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
<Component Id="C.airfs.sln">
|
<Component Id="C.airfs.sln">
|
||||||
<File Name="airfs.sln" KeyPath="yes" />
|
<File Name="airfs.sln" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
@ -580,13 +626,27 @@
|
|||||||
<ComponentRef Id="C.fuse.install.sh" />
|
<ComponentRef Id="C.fuse.install.sh" />
|
||||||
<ComponentRef Id="C.fuse.uninstall.sh" />
|
<ComponentRef Id="C.fuse.uninstall.sh" />
|
||||||
</ComponentGroup>
|
</ComponentGroup>
|
||||||
|
<ComponentGroup Id="C.WinFsp.opt.fsext">
|
||||||
|
<ComponentRef Id="C.fsext.h" />
|
||||||
|
<ComponentRef Id="C.fsext.winfsp_x64.lib" />
|
||||||
|
<ComponentRef Id="C.fsext.winfsp_x86.lib" />
|
||||||
|
</ComponentGroup>
|
||||||
<ComponentGroup Id="C.WinFsp.smp">
|
<ComponentGroup Id="C.WinFsp.smp">
|
||||||
<ComponentRef Id="C.memfs_x64.exe" />
|
<ComponentRef Id="C.memfs_x64.exe" />
|
||||||
<ComponentRef Id="C.memfs_x86.exe" />
|
<ComponentRef Id="C.memfs_x86.exe" />
|
||||||
<ComponentRef Id="C.memfs.h" />
|
<ComponentRef Id="C.memfs.h" />
|
||||||
<ComponentRef Id="C.memfs.cpp" />
|
<ComponentRef Id="C.memfs.cpp" />
|
||||||
<ComponentRef Id="C.memfs_main.c" />
|
<ComponentRef Id="C.memfs_main.c" />
|
||||||
|
<ComponentRef Id="C.memfs_fuse3.cpp" />
|
||||||
|
<ComponentRef Id="C.memfs_fuse3.compat.h" />
|
||||||
|
<ComponentRef Id="C.memfs_fuse3.sln" />
|
||||||
|
<ComponentRef Id="C.memfs_fuse3.vcxproj" />
|
||||||
|
<ComponentRef Id="C.memfs_fuse3.vcxproj.filters" />
|
||||||
|
<ComponentRef Id="C.memfs_fuse3.Makefile" />
|
||||||
|
<ComponentRef Id="C.memfs_fuse3.README.md" />
|
||||||
<ComponentRef Id="C.airfs.cpp" />
|
<ComponentRef Id="C.airfs.cpp" />
|
||||||
|
<ComponentRef Id="C.persistence.cpp" />
|
||||||
|
<ComponentRef Id="C.common.h" />
|
||||||
<ComponentRef Id="C.airfs.sln" />
|
<ComponentRef Id="C.airfs.sln" />
|
||||||
<ComponentRef Id="C.airfs.vcxproj" />
|
<ComponentRef Id="C.airfs.vcxproj" />
|
||||||
<ComponentRef Id="C.airfs.vcxproj.filters" />
|
<ComponentRef Id="C.airfs.vcxproj.filters" />
|
||||||
@ -694,6 +754,16 @@
|
|||||||
<ComponentGroupRef Id="C.WinFsp.smp.net" />
|
<ComponentGroupRef Id="C.WinFsp.smp.net" />
|
||||||
<ComponentGroupRef Id="C.WinFsp.sym" />
|
<ComponentGroupRef Id="C.WinFsp.sym" />
|
||||||
</Feature>
|
</Feature>
|
||||||
|
<Feature
|
||||||
|
Id="F.KernelDeveloper"
|
||||||
|
Level="1000"
|
||||||
|
Title="Kernel Developer"
|
||||||
|
Description="Additional files needed for in-kernel development."
|
||||||
|
AllowAdvertise="no"
|
||||||
|
InstallDefault="local"
|
||||||
|
Absent="allow">
|
||||||
|
<ComponentGroupRef Id="C.WinFsp.opt.fsext" />
|
||||||
|
</Feature>
|
||||||
<Feature
|
<Feature
|
||||||
Id="F.Cygfuse"
|
Id="F.Cygfuse"
|
||||||
Level="1000"
|
Level="1000"
|
||||||
@ -750,4 +820,4 @@
|
|||||||
</ScheduleReboot>
|
</ScheduleReboot>
|
||||||
</InstallExecuteSequence>
|
</InstallExecuteSequence>
|
||||||
</Product>
|
</Product>
|
||||||
</Wix>
|
</Wix>
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="..\version.properties" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
@ -22,32 +23,32 @@
|
|||||||
<ProjectGuid>{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}</ProjectGuid>
|
<ProjectGuid>{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}</ProjectGuid>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<RootNamespace>fsbench</RootNamespace>
|
<RootNamespace>fsbench</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@ -106,7 +107,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
@ -122,7 +122,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
@ -142,7 +141,6 @@
|
|||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
@ -162,7 +160,6 @@
|
|||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="..\version.properties" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
@ -22,32 +23,32 @@
|
|||||||
<ProjectGuid>{10757011-749D-4954-873B-AE38D8145472}</ProjectGuid>
|
<ProjectGuid>{10757011-749D-4954-873B-AE38D8145472}</ProjectGuid>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<RootNamespace>fscrash</RootNamespace>
|
<RootNamespace>fscrash</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@ -106,7 +107,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
@ -122,7 +122,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
@ -142,7 +141,6 @@
|
|||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
@ -162,7 +160,6 @@
|
|||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="..\version.properties" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
@ -22,33 +23,33 @@
|
|||||||
<ProjectGuid>{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}</ProjectGuid>
|
<ProjectGuid>{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}</ProjectGuid>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<RootNamespace>memfs</RootNamespace>
|
<RootNamespace>memfs</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
|
||||||
<ProjectName>memfs</ProjectName>
|
<ProjectName>memfs</ProjectName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@ -107,7 +108,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
@ -124,7 +124,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
@ -143,7 +142,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
@ -164,7 +162,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="..\version.properties" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
@ -22,32 +23,32 @@
|
|||||||
<ProjectGuid>{262DF8CC-E7A8-4460-A22C-683CBA322C32}</ProjectGuid>
|
<ProjectGuid>{262DF8CC-E7A8-4460-A22C-683CBA322C32}</ProjectGuid>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<RootNamespace>winfsptests</RootNamespace>
|
<RootNamespace>winfsptests</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@ -106,7 +107,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<AdditionalDependencies>ntdll.lib;netapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>ntdll.lib;netapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
@ -123,7 +123,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<AdditionalDependencies>ntdll.lib;netapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>ntdll.lib;netapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
@ -142,7 +141,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<AdditionalDependencies>ntdll.lib;netapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>ntdll.lib;netapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
@ -163,7 +161,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<AdditionalDependencies>ntdll.lib;netapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>ntdll.lib;netapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
@ -185,6 +182,7 @@
|
|||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\devctl-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\devctl-test.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\dirbuf-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\dirbuf-test.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\dirctl-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\dirctl-test.c" />
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\ea-test.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\eventlog-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\eventlog-test.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\exec-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\exec-test.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\flush-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\flush-test.c" />
|
||||||
@ -193,6 +191,7 @@
|
|||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\hooks.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\hooks.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\info-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\info-test.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\launch-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\launch-test.c" />
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\launcher-ptrans-test.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\lock-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\lock-test.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\memfs-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\memfs-test.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\mount-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\mount-test.c" />
|
||||||
@ -205,8 +204,11 @@
|
|||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\security-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\security-test.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\stream-tests.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\stream-tests.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\timeout-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\timeout-test.c" />
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\uuid5-test.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\version-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\version-test.c" />
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\volpath-test.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\winfsp-tests.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\winfsp-tests.c" />
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\wsl-test.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\..\ext\tlib\testsuite.h" />
|
<ClInclude Include="..\..\..\ext\tlib\testsuite.h" />
|
||||||
|
@ -94,6 +94,21 @@
|
|||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\fuse-test.c">
|
<ClCompile Include="..\..\..\tst\winfsp-tests\fuse-test.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\ea-test.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\wsl-test.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\launcher-ptrans-test.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\volpath-test.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\uuid5-test.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\..\ext\tlib\testsuite.h">
|
<ClInclude Include="..\..\..\ext\tlib\testsuite.h">
|
||||||
|
@ -23,32 +23,32 @@
|
|||||||
<ProjectGuid>{1E997BEC-1642-4A5C-B252-852DA094E11E}</ProjectGuid>
|
<ProjectGuid>{1E997BEC-1642-4A5C-B252-852DA094E11E}</ProjectGuid>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<RootNamespace>fsptool</RootNamespace>
|
<RootNamespace>fsptool</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@ -108,7 +108,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
@ -127,7 +126,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
@ -149,7 +147,6 @@
|
|||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
@ -171,7 +168,6 @@
|
|||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
|
@ -23,32 +23,32 @@
|
|||||||
<ProjectGuid>{264A5D09-126F-4760-A3F1-4B3B95C925AA}</ProjectGuid>
|
<ProjectGuid>{264A5D09-126F-4760-A3F1-4B3B95C925AA}</ProjectGuid>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<RootNamespace>launchctl</RootNamespace>
|
<RootNamespace>launchctl</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@ -110,7 +110,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
@ -131,7 +130,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
@ -155,7 +153,6 @@
|
|||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
@ -179,7 +176,6 @@
|
|||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
|
@ -23,32 +23,32 @@
|
|||||||
<ProjectGuid>{6CDF9411-B852-4EAC-822D-8F930675F17B}</ProjectGuid>
|
<ProjectGuid>{6CDF9411-B852-4EAC-822D-8F930675F17B}</ProjectGuid>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<RootNamespace>launcher</RootNamespace>
|
<RootNamespace>launcher</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@ -110,7 +110,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;userenv.lib</AdditionalDependencies>
|
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;userenv.lib</AdditionalDependencies>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
@ -132,7 +131,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;userenv.lib</AdditionalDependencies>
|
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;userenv.lib</AdditionalDependencies>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
@ -157,7 +155,6 @@
|
|||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;userenv.lib</AdditionalDependencies>
|
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;userenv.lib</AdditionalDependencies>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
@ -182,7 +179,6 @@
|
|||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;userenv.lib</AdditionalDependencies>
|
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;userenv.lib</AdditionalDependencies>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
@ -190,6 +186,7 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\..\src\launcher\launcher.c" />
|
<ClCompile Include="..\..\..\src\launcher\launcher.c" />
|
||||||
|
<ClCompile Include="..\..\..\src\launcher\ptrans.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\winfsp_dll.vcxproj">
|
<ProjectReference Include="..\winfsp_dll.vcxproj">
|
||||||
|
@ -16,6 +16,9 @@
|
|||||||
<ClCompile Include="..\..\..\src\launcher\launcher.c">
|
<ClCompile Include="..\..\..\src\launcher\launcher.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\src\launcher\ptrans.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\..\src\shared\minimal.h">
|
<ClInclude Include="..\..\..\src\shared\minimal.h">
|
||||||
|
@ -13,13 +13,13 @@
|
|||||||
|
|
||||||
<MyProductName>WinFsp</MyProductName>
|
<MyProductName>WinFsp</MyProductName>
|
||||||
<MyDescription>Windows File System Proxy</MyDescription>
|
<MyDescription>Windows File System Proxy</MyDescription>
|
||||||
<MyCompanyName>Navimatics Corporation</MyCompanyName>
|
<MyCompanyName>Navimatics LLC</MyCompanyName>
|
||||||
<MyCopyright>2015-$([System.DateTime]::Now.ToString(`yyyy`)) Bill Zissimopoulos</MyCopyright>
|
<MyCopyright>2015-$([System.DateTime]::Now.ToString(`yyyy`)) Bill Zissimopoulos</MyCopyright>
|
||||||
|
|
||||||
<MyCanonicalVersion>1.4</MyCanonicalVersion>
|
<MyCanonicalVersion>1.5</MyCanonicalVersion>
|
||||||
|
|
||||||
<MyProductVersion>2018.2 B2</MyProductVersion>
|
<MyProductVersion>2019.3</MyProductVersion>
|
||||||
<MyProductStage>Beta</MyProductStage>
|
<MyProductStage>Gold</MyProductStage>
|
||||||
|
|
||||||
<MyVersion>$(MyCanonicalVersion).$(MyBuildNumber)</MyVersion>
|
<MyVersion>$(MyCanonicalVersion).$(MyBuildNumber)</MyVersion>
|
||||||
<MyVersionWithCommas>$(MyVersion.Replace('.',',')),0</MyVersionWithCommas>
|
<MyVersionWithCommas>$(MyVersion.Replace('.',',')),0</MyVersionWithCommas>
|
||||||
@ -37,4 +37,17 @@
|
|||||||
<PreprocessorDefinitions>MyProductName=$(MyProductName);MyDescription=$(MyDescription);MyCompanyName=$(MyCompanyName);MyCopyright=$(MyCopyright);MyProductVersion=$(MyProductVersion);MyProductStage=$(MyProductStage);MyVersion=$(MyVersion);MyVersionWithCommas=$(MyVersionWithCommas);MyFullVersion=$(MyFullVersion)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>MyProductName=$(MyProductName);MyDescription=$(MyDescription);MyCompanyName=$(MyCompanyName);MyCopyright=$(MyCopyright);MyProductVersion=$(MyProductVersion);MyProductStage=$(MyProductStage);MyVersion=$(MyVersion);MyVersionWithCommas=$(MyVersionWithCommas);MyFullVersion=$(MyFullVersion)</PreprocessorDefinitions>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(DefaultPlatformToolset)'=='v140'">
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(DefaultPlatformToolset)'!='v140'">
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>DebugFull</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SpectreMitigation>false</SpectreMitigation>
|
||||||
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
@ -60,232 +60,168 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fsptool", "tools\fsptool.vc
|
|||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Debug|x64 = Debug|x64
|
Debug|x64 = Debug|x64
|
||||||
Debug|x86 = Debug|x86
|
Debug|x86 = Debug|x86
|
||||||
Installer.Debug|Any CPU = Installer.Debug|Any CPU
|
|
||||||
Installer.Debug|x64 = Installer.Debug|x64
|
Installer.Debug|x64 = Installer.Debug|x64
|
||||||
Installer.Debug|x86 = Installer.Debug|x86
|
Installer.Debug|x86 = Installer.Debug|x86
|
||||||
Installer.Release|Any CPU = Installer.Release|Any CPU
|
|
||||||
Installer.Release|x64 = Installer.Release|x64
|
Installer.Release|x64 = Installer.Release|x64
|
||||||
Installer.Release|x86 = Installer.Release|x86
|
Installer.Release|x86 = Installer.Release|x86
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
Release|x64 = Release|x64
|
Release|x64 = Release|x64
|
||||||
Release|x86 = Release|x86
|
Release|x86 = Release|x86
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Debug|x64.ActiveCfg = Debug|x64
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Debug|x64.Build.0 = Debug|x64
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Debug|x64.Build.0 = Debug|x64
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Debug|x86.ActiveCfg = Debug|Win32
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Debug|x86.Build.0 = Debug|Win32
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Release|x64.ActiveCfg = Release|x64
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Release|x86.ActiveCfg = Release|Win32
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|x64.ActiveCfg = Release|x64
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|x64.ActiveCfg = Release|x64
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|x64.Build.0 = Release|x64
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|x64.Build.0 = Release|x64
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|x86.ActiveCfg = Release|Win32
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|x86.Build.0 = Release|Win32
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|x86.Build.0 = Release|Win32
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Debug|x64.ActiveCfg = Debug|x64
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Debug|x64.Build.0 = Debug|x64
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Debug|x64.Build.0 = Debug|x64
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Debug|x86.ActiveCfg = Debug|Win32
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Debug|x86.Build.0 = Debug|Win32
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Release|x64.ActiveCfg = Release|x64
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Release|x86.ActiveCfg = Release|Win32
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|x64.ActiveCfg = Release|x64
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|x64.ActiveCfg = Release|x64
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|x64.Build.0 = Release|x64
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|x64.Build.0 = Release|x64
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|x86.ActiveCfg = Release|Win32
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|x86.Build.0 = Release|Win32
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|x86.Build.0 = Release|Win32
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Debug|x64.ActiveCfg = Debug|x64
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Debug|x64.Build.0 = Debug|x64
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Debug|x64.Build.0 = Debug|x64
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Debug|x86.ActiveCfg = Debug|Win32
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Debug|x86.Build.0 = Debug|Win32
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Release|x64.ActiveCfg = Release|x64
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Release|x86.ActiveCfg = Release|Win32
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|x64.ActiveCfg = Release|x64
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|x64.ActiveCfg = Release|x64
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|x64.Build.0 = Release|x64
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|x64.Build.0 = Release|x64
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|x86.ActiveCfg = Release|Win32
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|x86.Build.0 = Release|Win32
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|x86.Build.0 = Release|Win32
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Debug|x64.ActiveCfg = Debug|x64
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Debug|x64.Build.0 = Debug|x64
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Debug|x64.Build.0 = Debug|x64
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Debug|x86.ActiveCfg = Debug|Win32
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Debug|x86.Build.0 = Debug|Win32
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Release|x64.ActiveCfg = Release|x64
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Release|x86.ActiveCfg = Release|Win32
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|x64.ActiveCfg = Release|x64
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|x64.ActiveCfg = Release|x64
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|x64.Build.0 = Release|x64
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|x64.Build.0 = Release|x64
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|x86.ActiveCfg = Release|Win32
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|x86.Build.0 = Release|Win32
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|x86.Build.0 = Release|Win32
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Debug|Any CPU.ActiveCfg = Debug|x86
|
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Debug|x64.ActiveCfg = Debug|x86
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Debug|x64.ActiveCfg = Debug|x86
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Debug|x86.ActiveCfg = Debug|x86
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|Any CPU.ActiveCfg = Release|x86
|
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|Any CPU.Build.0 = Release|x86
|
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|x64.ActiveCfg = Release|x86
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|x64.ActiveCfg = Release|x86
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|x64.Build.0 = Release|x86
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|x64.Build.0 = Release|x86
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|x86.ActiveCfg = Debug|x86
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|x86.ActiveCfg = Debug|x86
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|x86.Build.0 = Debug|x86
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|x86.Build.0 = Debug|x86
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|Any CPU.ActiveCfg = Release|x86
|
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|Any CPU.Build.0 = Release|x86
|
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|x64.ActiveCfg = Release|x86
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|x64.ActiveCfg = Release|x86
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|x64.Build.0 = Release|x86
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|x64.Build.0 = Release|x86
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|x86.ActiveCfg = Release|x86
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|x86.ActiveCfg = Release|x86
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|x86.Build.0 = Release|x86
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|x86.Build.0 = Release|x86
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Release|Any CPU.ActiveCfg = Release|x86
|
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Release|x64.ActiveCfg = Release|x86
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Release|x64.ActiveCfg = Release|x86
|
||||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Release|x86.ActiveCfg = Release|x86
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Release|x86.ActiveCfg = Release|x86
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Debug|x64.ActiveCfg = Debug|Win32
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Debug|x64.ActiveCfg = Debug|Win32
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Debug|x86.ActiveCfg = Debug|Win32
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|Any CPU.Build.0 = Release|Win32
|
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|x64.ActiveCfg = Release|Win32
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|x64.ActiveCfg = Release|Win32
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|x64.Build.0 = Release|Win32
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|x64.Build.0 = Release|Win32
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|x86.Build.0 = Debug|Win32
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|x86.Build.0 = Debug|Win32
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|Any CPU.Build.0 = Release|Win32
|
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|x64.ActiveCfg = Release|Win32
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|x64.ActiveCfg = Release|Win32
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|x64.Build.0 = Release|Win32
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|x64.Build.0 = Release|Win32
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|x86.ActiveCfg = Release|Win32
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|x86.Build.0 = Release|Win32
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|x86.Build.0 = Release|Win32
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Release|x64.ActiveCfg = Release|Win32
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Release|x64.ActiveCfg = Release|Win32
|
||||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Release|x86.ActiveCfg = Release|Win32
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Debug|x64.ActiveCfg = Debug|x64
|
{10757011-749D-4954-873B-AE38D8145472}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Debug|x64.Build.0 = Debug|x64
|
{10757011-749D-4954-873B-AE38D8145472}.Debug|x64.Build.0 = Debug|x64
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Debug|x86.ActiveCfg = Debug|Win32
|
{10757011-749D-4954-873B-AE38D8145472}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Debug|x86.Build.0 = Debug|Win32
|
{10757011-749D-4954-873B-AE38D8145472}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
{10757011-749D-4954-873B-AE38D8145472}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
{10757011-749D-4954-873B-AE38D8145472}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Release|x64.ActiveCfg = Release|x64
|
{10757011-749D-4954-873B-AE38D8145472}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Release|x86.ActiveCfg = Release|Win32
|
{10757011-749D-4954-873B-AE38D8145472}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Release|x64.ActiveCfg = Release|x64
|
{10757011-749D-4954-873B-AE38D8145472}.Release|x64.ActiveCfg = Release|x64
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Release|x64.Build.0 = Release|x64
|
{10757011-749D-4954-873B-AE38D8145472}.Release|x64.Build.0 = Release|x64
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Release|x86.ActiveCfg = Release|Win32
|
{10757011-749D-4954-873B-AE38D8145472}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{10757011-749D-4954-873B-AE38D8145472}.Release|x86.Build.0 = Release|Win32
|
{10757011-749D-4954-873B-AE38D8145472}.Release|x86.Build.0 = Release|Win32
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Debug|x64.ActiveCfg = Debug|x64
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Debug|x64.Build.0 = Debug|x64
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Debug|x64.Build.0 = Debug|x64
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Debug|x86.ActiveCfg = Debug|Win32
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Debug|x86.Build.0 = Debug|Win32
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Release|x64.ActiveCfg = Release|x64
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Release|x86.ActiveCfg = Release|Win32
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|x64.ActiveCfg = Release|x64
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|x64.ActiveCfg = Release|x64
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|x64.Build.0 = Release|x64
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|x64.Build.0 = Release|x64
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|x86.ActiveCfg = Release|Win32
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|x86.Build.0 = Release|Win32
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|x86.Build.0 = Release|Win32
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|x64.Build.0 = Debug|Any CPU
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|x86.Build.0 = Debug|Any CPU
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Debug|x64.ActiveCfg = Debug|Any CPU
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Debug|x86.ActiveCfg = Debug|Any CPU
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Release|x64.ActiveCfg = Release|Any CPU
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Release|x86.ActiveCfg = Release|Any CPU
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|x64.ActiveCfg = Release|Any CPU
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|x64.Build.0 = Release|Any CPU
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|x86.ActiveCfg = Release|Any CPU
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|x86.Build.0 = Release|Any CPU
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|x64.Build.0 = Debug|Any CPU
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|x86.Build.0 = Debug|Any CPU
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Debug|x64.ActiveCfg = Debug|Any CPU
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Debug|x86.ActiveCfg = Debug|Any CPU
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Release|x64.ActiveCfg = Release|Any CPU
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Release|x86.ActiveCfg = Release|Any CPU
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|x64.ActiveCfg = Release|Any CPU
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|x64.Build.0 = Release|Any CPU
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|x86.ActiveCfg = Release|Any CPU
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|x86.Build.0 = Release|Any CPU
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Debug|x64.ActiveCfg = Debug|x64
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Debug|x64.Build.0 = Debug|x64
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Debug|x64.Build.0 = Debug|x64
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Debug|x86.ActiveCfg = Debug|Win32
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Debug|x86.Build.0 = Debug|Win32
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Installer.Debug|Any CPU.ActiveCfg = Release|x64
|
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Installer.Release|Any CPU.ActiveCfg = Release|x64
|
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Installer.Release|x64.ActiveCfg = Release|x64
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Installer.Release|x86.ActiveCfg = Release|Win32
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Release|x64.ActiveCfg = Release|x64
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Release|x64.ActiveCfg = Release|x64
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Release|x64.Build.0 = Release|x64
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Release|x64.Build.0 = Release|x64
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Release|x86.ActiveCfg = Release|Win32
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Release|x86.Build.0 = Release|Win32
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Release|x86.Build.0 = Release|Win32
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Debug|x64.ActiveCfg = Debug|x64
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Debug|x64.Build.0 = Debug|x64
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Debug|x64.Build.0 = Debug|x64
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Debug|x86.ActiveCfg = Debug|Win32
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Debug|x86.Build.0 = Debug|Win32
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Installer.Debug|Any CPU.ActiveCfg = Release|x64
|
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Installer.Release|Any CPU.ActiveCfg = Release|x64
|
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Installer.Release|x64.ActiveCfg = Release|x64
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Installer.Release|x86.ActiveCfg = Release|Win32
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Release|x64.ActiveCfg = Release|x64
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Release|x64.ActiveCfg = Release|x64
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Release|x64.Build.0 = Release|x64
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Release|x64.Build.0 = Release|x64
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Release|x86.ActiveCfg = Release|Win32
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Release|x86.Build.0 = Release|Win32
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Release|x86.Build.0 = Release|Win32
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Debug|x64.ActiveCfg = Debug|x64
|
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Debug|x64.Build.0 = Debug|x64
|
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Debug|x64.Build.0 = Debug|x64
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Debug|x86.ActiveCfg = Debug|Win32
|
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Debug|x86.Build.0 = Debug|Win32
|
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Installer.Debug|Any CPU.ActiveCfg = Release|x64
|
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Installer.Release|Any CPU.ActiveCfg = Release|x64
|
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Installer.Release|x64.ActiveCfg = Release|x64
|
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Installer.Release|x86.ActiveCfg = Release|Win32
|
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Release|Any CPU.ActiveCfg = Release|Win32
|
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Release|x64.ActiveCfg = Release|x64
|
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Release|x64.ActiveCfg = Release|x64
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Release|x64.Build.0 = Release|x64
|
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Release|x64.Build.0 = Release|x64
|
||||||
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Release|x86.ActiveCfg = Release|Win32
|
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
<ClInclude Include="..\..\src\dll\fuse3\library.h" />
|
<ClInclude Include="..\..\src\dll\fuse3\library.h" />
|
||||||
<ClInclude Include="..\..\src\dll\fuse\library.h" />
|
<ClInclude Include="..\..\src\dll\fuse\library.h" />
|
||||||
<ClInclude Include="..\..\src\dll\library.h" />
|
<ClInclude Include="..\..\src\dll\library.h" />
|
||||||
|
<ClInclude Include="..\..\src\ku\library.h" />
|
||||||
<ClInclude Include="..\..\src\shared\minimal.h" />
|
<ClInclude Include="..\..\src\shared\minimal.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -50,8 +51,8 @@
|
|||||||
<ClCompile Include="..\..\src\dll\fuse\fuse_main.c" />
|
<ClCompile Include="..\..\src\dll\fuse\fuse_main.c" />
|
||||||
<ClCompile Include="..\..\src\dll\fuse\fuse_opt.c" />
|
<ClCompile Include="..\..\src\dll\fuse\fuse_opt.c" />
|
||||||
<ClCompile Include="..\..\src\dll\launch.c" />
|
<ClCompile Include="..\..\src\dll\launch.c" />
|
||||||
|
<ClCompile Include="..\..\src\dll\mount.c" />
|
||||||
<ClCompile Include="..\..\src\dll\np.c" />
|
<ClCompile Include="..\..\src\dll\np.c" />
|
||||||
<ClCompile Include="..\..\src\dll\posix.c" />
|
|
||||||
<ClCompile Include="..\..\src\dll\security.c" />
|
<ClCompile Include="..\..\src\dll\security.c" />
|
||||||
<ClCompile Include="..\..\src\dll\debug.c" />
|
<ClCompile Include="..\..\src\dll\debug.c" />
|
||||||
<ClCompile Include="..\..\src\dll\fsctl.c" />
|
<ClCompile Include="..\..\src\dll\fsctl.c" />
|
||||||
@ -63,6 +64,7 @@
|
|||||||
<ClCompile Include="..\..\src\dll\service.c" />
|
<ClCompile Include="..\..\src\dll\service.c" />
|
||||||
<ClCompile Include="..\..\src\dll\util.c" />
|
<ClCompile Include="..\..\src\dll\util.c" />
|
||||||
<ClCompile Include="..\..\src\dll\wksid.c" />
|
<ClCompile Include="..\..\src\dll\wksid.c" />
|
||||||
|
<ClCompile Include="..\..\src\ku\posix.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<CustomBuild Include="..\..\src\dll\fuse\fuse.pc.in">
|
<CustomBuild Include="..\..\src\dll\fuse\fuse.pc.in">
|
||||||
@ -126,33 +128,33 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
<ProjectGuid>{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}</ProjectGuid>
|
<ProjectGuid>{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}</ProjectGuid>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<RootNamespace>winfspdll</RootNamespace>
|
<RootNamespace>winfspdll</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
|
||||||
<ProjectName>winfsp.dll</ProjectName>
|
<ProjectName>winfsp.dll</ProjectName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@ -216,13 +218,12 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
||||||
<GenerateMapFile>true</GenerateMapFile>
|
<GenerateMapFile>true</GenerateMapFile>
|
||||||
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
||||||
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
||||||
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;credui.lib;version.lib</AdditionalDependencies>
|
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib</AdditionalDependencies>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
@ -244,13 +245,12 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
||||||
<GenerateMapFile>true</GenerateMapFile>
|
<GenerateMapFile>true</GenerateMapFile>
|
||||||
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
||||||
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;credui.lib;version.lib</AdditionalDependencies>
|
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib</AdditionalDependencies>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
@ -273,7 +273,6 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
||||||
@ -281,7 +280,7 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
||||||
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
||||||
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;credui.lib;version.lib</AdditionalDependencies>
|
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib</AdditionalDependencies>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
@ -304,7 +303,6 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
||||||
@ -312,7 +310,7 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
||||||
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;credui.lib;version.lib</AdditionalDependencies>
|
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib</AdditionalDependencies>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
@ -27,6 +27,9 @@
|
|||||||
<Filter Include="Source\fuse3">
|
<Filter Include="Source\fuse3">
|
||||||
<UniqueIdentifier>{96091a7b-3923-4a74-9491-3ee230c688f9}</UniqueIdentifier>
|
<UniqueIdentifier>{96091a7b-3923-4a74-9491-3ee230c688f9}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="Source\ku">
|
||||||
|
<UniqueIdentifier>{613cce77-2428-4f9a-9187-f37e009253c1}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\inc\winfsp\fsctl.h">
|
<ClInclude Include="..\..\inc\winfsp\fsctl.h">
|
||||||
@ -77,6 +80,9 @@
|
|||||||
<ClInclude Include="..\..\src\dll\fuse3\library.h">
|
<ClInclude Include="..\..\src\dll\fuse3\library.h">
|
||||||
<Filter>Source\fuse3</Filter>
|
<Filter>Source\fuse3</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\ku\library.h">
|
||||||
|
<Filter>Source\ku</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\src\dll\library.c">
|
<ClCompile Include="..\..\src\dll\library.c">
|
||||||
@ -124,9 +130,6 @@
|
|||||||
<ClCompile Include="..\..\src\dll\fuse\fuse_main.c">
|
<ClCompile Include="..\..\src\dll\fuse\fuse_main.c">
|
||||||
<Filter>Source\fuse</Filter>
|
<Filter>Source\fuse</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\dll\posix.c">
|
|
||||||
<Filter>Source</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\dll\fuse\fuse_intf.c">
|
<ClCompile Include="..\..\src\dll\fuse\fuse_intf.c">
|
||||||
<Filter>Source\fuse</Filter>
|
<Filter>Source\fuse</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@ -154,6 +157,12 @@
|
|||||||
<ClCompile Include="..\..\src\dll\fuse3\fuse3_compat.c">
|
<ClCompile Include="..\..\src\dll\fuse3\fuse3_compat.c">
|
||||||
<Filter>Source\fuse3</Filter>
|
<Filter>Source\fuse3</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\ku\posix.c">
|
||||||
|
<Filter>Source\ku</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\dll\mount.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="..\..\src\dll\library.def">
|
<None Include="..\..\src\dll\library.def">
|
||||||
|
@ -101,11 +101,11 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>..\..\src;..\..\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\..\src;..\..\opt\fsext\inc;..\..\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions> _X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions> _X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<AdditionalDependencies>wdmsec.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>cng.lib;wdmsec.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<GenerateMapFile>true</GenerateMapFile>
|
<GenerateMapFile>true</GenerateMapFile>
|
||||||
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
||||||
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
@ -114,11 +114,11 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>..\..\src;..\..\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\..\src;..\..\opt\fsext\inc;..\..\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions> _X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions> _X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<AdditionalDependencies>wdmsec.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>cng.lib;wdmsec.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<GenerateMapFile>true</GenerateMapFile>
|
<GenerateMapFile>true</GenerateMapFile>
|
||||||
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
||||||
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
@ -127,11 +127,11 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>..\..\src;..\..\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\..\src;..\..\opt\fsext\inc;..\..\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions> _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions> _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<AdditionalDependencies>wdmsec.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>cng.lib;wdmsec.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<GenerateMapFile>true</GenerateMapFile>
|
<GenerateMapFile>true</GenerateMapFile>
|
||||||
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
||||||
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
@ -140,11 +140,11 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>..\..\src;..\..\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\..\src;..\..\opt\fsext\inc;..\..\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions> _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions> _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<AdditionalDependencies>wdmsec.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>cng.lib;wdmsec.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<GenerateMapFile>true</GenerateMapFile>
|
<GenerateMapFile>true</GenerateMapFile>
|
||||||
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
||||||
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
@ -155,6 +155,8 @@
|
|||||||
<FilesToPackage Include="$(TargetPath)" />
|
<FilesToPackage Include="$(TargetPath)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\src\ku\posix.c" />
|
||||||
|
<ClCompile Include="..\..\src\ku\uuid5.c" />
|
||||||
<ClCompile Include="..\..\src\sys\cleanup.c" />
|
<ClCompile Include="..\..\src\sys\cleanup.c" />
|
||||||
<ClCompile Include="..\..\src\sys\close.c" />
|
<ClCompile Include="..\..\src\sys\close.c" />
|
||||||
<ClCompile Include="..\..\src\sys\create.c" />
|
<ClCompile Include="..\..\src\sys\create.c" />
|
||||||
@ -169,10 +171,12 @@
|
|||||||
<ClCompile Include="..\..\src\sys\fileinfo.c" />
|
<ClCompile Include="..\..\src\sys\fileinfo.c" />
|
||||||
<ClCompile Include="..\..\src\sys\flush.c" />
|
<ClCompile Include="..\..\src\sys\flush.c" />
|
||||||
<ClCompile Include="..\..\src\sys\fsctl.c" />
|
<ClCompile Include="..\..\src\sys\fsctl.c" />
|
||||||
|
<ClCompile Include="..\..\src\sys\fsext.c" />
|
||||||
<ClCompile Include="..\..\src\sys\iop.c" />
|
<ClCompile Include="..\..\src\sys\iop.c" />
|
||||||
<ClCompile Include="..\..\src\sys\ioq.c" />
|
<ClCompile Include="..\..\src\sys\ioq.c" />
|
||||||
<ClCompile Include="..\..\src\sys\lockctl.c" />
|
<ClCompile Include="..\..\src\sys\lockctl.c" />
|
||||||
<ClCompile Include="..\..\src\sys\meta.c" />
|
<ClCompile Include="..\..\src\sys\meta.c" />
|
||||||
|
<ClCompile Include="..\..\src\sys\mountdev.c" />
|
||||||
<ClCompile Include="..\..\src\sys\mup.c" />
|
<ClCompile Include="..\..\src\sys\mup.c" />
|
||||||
<ClCompile Include="..\..\src\sys\name.c" />
|
<ClCompile Include="..\..\src\sys\name.c" />
|
||||||
<ClCompile Include="..\..\src\sys\psbuffer.c" />
|
<ClCompile Include="..\..\src\sys\psbuffer.c" />
|
||||||
@ -188,6 +192,8 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\inc\winfsp\fsctl.h" />
|
<ClInclude Include="..\..\inc\winfsp\fsctl.h" />
|
||||||
|
<ClInclude Include="..\..\opt\fsext\inc\winfsp\fsext.h" />
|
||||||
|
<ClInclude Include="..\..\src\ku\library.h" />
|
||||||
<ClInclude Include="..\..\src\sys\driver.h" />
|
<ClInclude Include="..\..\src\sys\driver.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -212,7 +218,7 @@ for /f "delims=" %%l in (%(FullPath)) do (
|
|||||||
echo !line! >>$(OutDir)driver-$(PlatformTarget).inf
|
echo !line! >>$(OutDir)driver-$(PlatformTarget).inf
|
||||||
)
|
)
|
||||||
|
|
||||||
stampinf -v $(MyVersion) -f $(OutDir)driver-$(PlatformTarget).inf</Command>
|
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(PlatformTarget).inf</Command>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">set DriverFile=$(TargetFileName)
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">set DriverFile=$(TargetFileName)
|
||||||
set Provider="$(MyCompanyName)"
|
set Provider="$(MyCompanyName)"
|
||||||
@ -225,7 +231,7 @@ for /f "delims=" %%l in (%(FullPath)) do (
|
|||||||
echo !line! >>$(OutDir)driver-$(PlatformTarget).inf
|
echo !line! >>$(OutDir)driver-$(PlatformTarget).inf
|
||||||
)
|
)
|
||||||
|
|
||||||
stampinf -v $(MyVersion) -f $(OutDir)driver-$(PlatformTarget).inf</Command>
|
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(PlatformTarget).inf</Command>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">set DriverFile=$(TargetFileName)
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">set DriverFile=$(TargetFileName)
|
||||||
set Provider="$(MyCompanyName)"
|
set Provider="$(MyCompanyName)"
|
||||||
@ -238,7 +244,7 @@ for /f "delims=" %%l in (%(FullPath)) do (
|
|||||||
echo !line! >>$(OutDir)driver-$(PlatformTarget).inf
|
echo !line! >>$(OutDir)driver-$(PlatformTarget).inf
|
||||||
)
|
)
|
||||||
|
|
||||||
stampinf -v $(MyVersion) -f $(OutDir)driver-$(PlatformTarget).inf</Command>
|
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(PlatformTarget).inf</Command>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkObjects>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">set DriverFile=$(TargetFileName)
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">set DriverFile=$(TargetFileName)
|
||||||
set Provider="$(MyCompanyName)"
|
set Provider="$(MyCompanyName)"
|
||||||
@ -251,7 +257,7 @@ for /f "delims=" %%l in (%(FullPath)) do (
|
|||||||
echo !line! >>$(OutDir)driver-$(PlatformTarget).inf
|
echo !line! >>$(OutDir)driver-$(PlatformTarget).inf
|
||||||
)
|
)
|
||||||
|
|
||||||
stampinf -v $(MyVersion) -f $(OutDir)driver-$(PlatformTarget).inf</Command>
|
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(PlatformTarget).inf</Command>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkObjects>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Writing driver-$(PlatformTarget).inf</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Writing driver-$(PlatformTarget).inf</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)driver-$(PlatformTarget).inf</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)driver-$(PlatformTarget).inf</Outputs>
|
||||||
|
@ -12,6 +12,9 @@
|
|||||||
<Filter Include="Include\winfsp">
|
<Filter Include="Include\winfsp">
|
||||||
<UniqueIdentifier>{904f0df1-2fb8-4f84-aa46-fa929488c39a}</UniqueIdentifier>
|
<UniqueIdentifier>{904f0df1-2fb8-4f84-aa46-fa929488c39a}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="Source\ku">
|
||||||
|
<UniqueIdentifier>{235076b8-290c-4dec-b005-71d9b8e8cba7}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\src\sys\driver.c">
|
<ClCompile Include="..\..\src\sys\driver.c">
|
||||||
@ -104,6 +107,18 @@
|
|||||||
<ClCompile Include="..\..\src\sys\mup.c">
|
<ClCompile Include="..\..\src\sys\mup.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\sys\fsext.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\ku\posix.c">
|
||||||
|
<Filter>Source\ku</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\ku\uuid5.c">
|
||||||
|
<Filter>Source\ku</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\sys\mountdev.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\src\sys\driver.h">
|
<ClInclude Include="..\..\src\sys\driver.h">
|
||||||
@ -112,6 +127,12 @@
|
|||||||
<ClInclude Include="..\..\inc\winfsp\fsctl.h">
|
<ClInclude Include="..\..\inc\winfsp\fsctl.h">
|
||||||
<Filter>Include\winfsp</Filter>
|
<Filter>Include\winfsp</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\opt\fsext\inc\winfsp\fsext.h">
|
||||||
|
<Filter>Include\winfsp</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\ku\library.h">
|
||||||
|
<Filter>Source\ku</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="..\..\src\sys\version.rc">
|
<ResourceCompile Include="..\..\src\sys\version.rc">
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
I am running Windows 7 and I am finding that the installed driver is not signed.::
|
I am running Windows 7 and I am finding that the installed driver is not signed.::
|
||||||
|
|
||||||
Your Windows 7 OS is missing SHA-2 Code Signing Support. You need to install the following security advisory that will rectify the problem:
|
Your Windows 7 OS is missing SHA-2 Code Signing Support. You need to install the following security advisory that will rectify the problem:
|
||||||
https://technet.microsoft.com/en-us/library/security/3033929.aspx
|
https://technet.microsoft.com/en-us/library/security/3033929.aspx
|
||||||
|
|
||||||
|
|
||||||
Disconnecting (unmapping) a network drive does not work.::
|
Disconnecting (unmapping) a network drive does not work.::
|
||||||
@ -17,9 +17,7 @@ Disconnecting (unmapping) a network drive does not work.::
|
|||||||
|
|
||||||
Case-sensitive file systems do not work properly when mounted as a directory.::
|
Case-sensitive file systems do not work properly when mounted as a directory.::
|
||||||
|
|
||||||
Windows and WinFsp support case-sensitive file systems. These file systems work properly when mounted as a drive. Unfortunately when a file system is mounted as a directory over NTFS, Windows expects it to be case-insensitive and will UPPERCASE many of the file names sent to the file system.
|
This is fixed as of WinFsp 2018.2 B3.
|
||||||
+
|
|
||||||
This is an unfortunate but well understood Windows limitation. Case-sensitive file systems should only be mounted as drives.
|
|
||||||
|
|
||||||
|
|
||||||
Why is the DLL not installed in the Windows system directories?::
|
Why is the DLL not installed in the Windows system directories?::
|
||||||
@ -66,5 +64,10 @@ With this in mind here are the reasons for the current WinFsp-FUSE behavior:
|
|||||||
WinFsp-FUSE does not have the ability to support multiple file systems from within the same process. Why?::
|
WinFsp-FUSE does not have the ability to support multiple file systems from within the same process. Why?::
|
||||||
|
|
||||||
This is supported as of WinFsp 2018.2 B2.
|
This is supported as of WinFsp 2018.2 B2.
|
||||||
|
|
||||||
|
|
||||||
|
I have problems getting permissions to work properly in a WinFsp-FUSE file system. Can you help?::
|
||||||
|
|
||||||
|
The WinFsp-FUSE layer includes a built-in command line option that can help: `-o uid=-1`. This instructs the WinFsp-FUSE layer to present all file system files as if they are owned by the user that launched the file system.
|
||||||
+
|
+
|
||||||
The core WinFsp layer always supported multiple file systems in the same process either simultaneously or one after another. However this was not the case with WinFsp-FUSE (i.e. the FUSE layer of WinFsp) prior to version 2018.2 B2. This limitation has been rectified as of WinFsp 2018 B2.
|
Alternatives include `-o uid=-1,gid=-1`, which presents files as owned by the user *and* group that launched the file system and `-o uid=-1,gid=11`, which presents files as owned by the user that launched the file system and the group "Authenticated Users". (The `fsptool` utility in the `bin` subdirectory of the WinFsp installation directory can be used to convert Windows accounts/SID's to UID's and vice versa.)
|
||||||
|
@ -5,6 +5,7 @@ This document contains a list of known file systems and file system libraries th
|
|||||||
== File Systems
|
== File Systems
|
||||||
|
|
||||||
- https://github.com/vgough/encfs[EncFS] - an Encrypted Filesystem for FUSE
|
- https://github.com/vgough/encfs[EncFS] - an Encrypted Filesystem for FUSE
|
||||||
|
- https://github.com/lowleveldesign/fsmemfs[fsmemfs] - Memory File System written in F#
|
||||||
- https://github.com/ihaveamac/fuse-3ds[fuse-3ds] - FUSE Filesystem Python scripts for Nintendo 3DS files
|
- https://github.com/ihaveamac/fuse-3ds[fuse-3ds] - FUSE Filesystem Python scripts for Nintendo 3DS files
|
||||||
- https://github.com/FrKaram/KS2.Drive[KS2.Drive] - Mount a webDAV/AOS server as a local drive
|
- https://github.com/FrKaram/KS2.Drive[KS2.Drive] - Mount a webDAV/AOS server as a local drive
|
||||||
- https://github.com/billziss-gh/nfs-win[nfs-win] - NFS for Windows
|
- https://github.com/billziss-gh/nfs-win[nfs-win] - NFS for Windows
|
||||||
@ -13,6 +14,7 @@ This document contains a list of known file systems and file system libraries th
|
|||||||
- https://github.com/billziss-gh/redditfs[redditfs] - ls -l /r/programming
|
- https://github.com/billziss-gh/redditfs[redditfs] - ls -l /r/programming
|
||||||
- https://github.com/netheril96/securefs[securefs] - Filesystem in userspace (FUSE) with transparent authenticated encryption
|
- https://github.com/netheril96/securefs[securefs] - Filesystem in userspace (FUSE) with transparent authenticated encryption
|
||||||
- https://github.com/billziss-gh/sshfs-win[sshfs-win] - SSHFS for Windows
|
- https://github.com/billziss-gh/sshfs-win[sshfs-win] - SSHFS for Windows
|
||||||
|
- https://github.com/UtrechtUniversity/YodaDrive[YodaDrive] - Mount a Yoda drive as a local drive
|
||||||
|
|
||||||
== File System Libraries
|
== File System Libraries
|
||||||
|
|
||||||
@ -20,3 +22,4 @@ This document contains a list of known file systems and file system libraries th
|
|||||||
- https://github.com/DuroSoft/fuse-bindings[Nodejs: fuse-bindings] - Fully maintained FUSE bindings for Node that aims to cover the entire FUSE api
|
- https://github.com/DuroSoft/fuse-bindings[Nodejs: fuse-bindings] - Fully maintained FUSE bindings for Node that aims to cover the entire FUSE api
|
||||||
- https://github.com/SerCeMan/jnr-fuse[Java: jnr-fuse] - FUSE implementation in Java using Java Native Runtime (JNR)
|
- https://github.com/SerCeMan/jnr-fuse[Java: jnr-fuse] - FUSE implementation in Java using Java Native Runtime (JNR)
|
||||||
- https://github.com/billziss-gh/fusepy[Python: fusepy] - Simple ctypes bindings for FUSE
|
- https://github.com/billziss-gh/fusepy[Python: fusepy] - Simple ctypes bindings for FUSE
|
||||||
|
- https://github.com/Scille/winfspy[Python: winfspy] - WinFSP binding for Python
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
Taken from secfs.core/src/tlib codebase:
|
Taken from secfs.core/src/tlib codebase:
|
||||||
commit 16296d2ac64a7d532b1c486dd3c44af5865d4851
|
commit 16296d2ac64a7d532b1c486dd3c44af5865d4851
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file tlib/callstack.c
|
* @file tlib/callstack.c
|
||||||
*
|
*
|
||||||
* @copyright 2014-2018 Bill Zissimopoulos
|
* @copyright 2014-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <tlib/callstack.h>
|
#include <tlib/callstack.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file tlib/callstack.h
|
* @file tlib/callstack.h
|
||||||
*
|
*
|
||||||
* @copyright 2014-2018 Bill Zissimopoulos
|
* @copyright 2014-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef TLIB_CALLSTACK_H_INCLUDED
|
#ifndef TLIB_CALLSTACK_H_INCLUDED
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file tlib/injected/allfunc.h
|
* @file tlib/injected/allfunc.h
|
||||||
*
|
*
|
||||||
* @copyright 2014-2018 Bill Zissimopoulos
|
* @copyright 2014-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef TLIB_INJECTED_ALLFUNC_H_INCLUDED
|
#ifndef TLIB_INJECTED_ALLFUNC_H_INCLUDED
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file tlib/injected/curlfunc.c
|
* @file tlib/injected/curlfunc.c
|
||||||
*
|
*
|
||||||
* @copyright 2014-2018 Bill Zissimopoulos
|
* @copyright 2014-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <tlib/injected/curlfunc.h>
|
#include <tlib/injected/curlfunc.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file tlib/injected/curlfunc.h
|
* @file tlib/injected/curlfunc.h
|
||||||
*
|
*
|
||||||
* @copyright 2014-2018 Bill Zissimopoulos
|
* @copyright 2014-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef TLIB_INJECTED_CURLFUNC_H_INCLUDED
|
#ifndef TLIB_INJECTED_CURLFUNC_H_INCLUDED
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file tlib/injected/stdfunc.c
|
* @file tlib/injected/stdfunc.c
|
||||||
*
|
*
|
||||||
* @copyright 2014-2018 Bill Zissimopoulos
|
* @copyright 2014-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <tlib/injected/stdfunc.h>
|
#include <tlib/injected/stdfunc.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file tlib/injected/stdfunc.h
|
* @file tlib/injected/stdfunc.h
|
||||||
*
|
*
|
||||||
* @copyright 2014-2018 Bill Zissimopoulos
|
* @copyright 2014-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef TLIB_INJECTED_STDFUNC_H_INCLUDED
|
#ifndef TLIB_INJECTED_STDFUNC_H_INCLUDED
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file tlib/injection.c
|
* @file tlib/injection.c
|
||||||
*
|
*
|
||||||
* @copyright 2014-2018 Bill Zissimopoulos
|
* @copyright 2014-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <tlib/injection.h>
|
#include <tlib/injection.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file tlib/injection.h
|
* @file tlib/injection.h
|
||||||
*
|
*
|
||||||
* @copyright 2014-2018 Bill Zissimopoulos
|
* @copyright 2014-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* NOTE: This header may usefully be included multiple times.
|
/* NOTE: This header may usefully be included multiple times.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file tlib/testsuite.c
|
* @file tlib/testsuite.c
|
||||||
*
|
*
|
||||||
* @copyright 2014-2018 Bill Zissimopoulos
|
* @copyright 2014-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <tlib/testsuite.h>
|
#include <tlib/testsuite.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file tlib/testsuite.h
|
* @file tlib/testsuite.h
|
||||||
*
|
*
|
||||||
* @copyright 2014-2018 Bill Zissimopoulos
|
* @copyright 2014-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef TLIB_TESTSUITE_H_INCLUDED
|
#ifndef TLIB_TESTSUITE_H_INCLUDED
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* FUSE: Filesystem in Userspace
|
* FUSE: Filesystem in Userspace
|
||||||
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FUSE_H_
|
#ifndef FUSE_H_
|
||||||
@ -63,11 +67,11 @@ struct fuse_operations
|
|||||||
/* S */ int (*flush)(const char *path, struct fuse_file_info *fi);
|
/* S */ int (*flush)(const char *path, struct fuse_file_info *fi);
|
||||||
/* S */ int (*release)(const char *path, struct fuse_file_info *fi);
|
/* S */ int (*release)(const char *path, struct fuse_file_info *fi);
|
||||||
/* S */ int (*fsync)(const char *path, int datasync, struct fuse_file_info *fi);
|
/* S */ int (*fsync)(const char *path, int datasync, struct fuse_file_info *fi);
|
||||||
/* _ */ int (*setxattr)(const char *path, const char *name, const char *value, size_t size,
|
/* S */ int (*setxattr)(const char *path, const char *name, const char *value, size_t size,
|
||||||
int flags);
|
int flags);
|
||||||
/* _ */ int (*getxattr)(const char *path, const char *name, char *value, size_t size);
|
/* S */ int (*getxattr)(const char *path, const char *name, char *value, size_t size);
|
||||||
/* _ */ int (*listxattr)(const char *path, char *namebuf, size_t size);
|
/* S */ int (*listxattr)(const char *path, char *namebuf, size_t size);
|
||||||
/* _ */ int (*removexattr)(const char *path, const char *name);
|
/* S */ int (*removexattr)(const char *path, const char *name);
|
||||||
/* S */ int (*opendir)(const char *path, struct fuse_file_info *fi);
|
/* S */ int (*opendir)(const char *path, struct fuse_file_info *fi);
|
||||||
/* S */ int (*readdir)(const char *path, void *buf, fuse_fill_dir_t filler, fuse_off_t off,
|
/* S */ int (*readdir)(const char *path, void *buf, fuse_fill_dir_t filler, fuse_off_t off,
|
||||||
struct fuse_file_info *fi);
|
struct fuse_file_info *fi);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* FUSE: Filesystem in Userspace
|
* FUSE: Filesystem in Userspace
|
||||||
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FUSE_COMMON_H_
|
#ifndef FUSE_COMMON_H_
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* FUSE: Filesystem in Userspace
|
* FUSE: Filesystem in Userspace
|
||||||
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FUSE_OPT_H_
|
#ifndef FUSE_OPT_H_
|
||||||
@ -41,16 +45,16 @@ extern "C" {
|
|||||||
|
|
||||||
struct fuse_opt
|
struct fuse_opt
|
||||||
{
|
{
|
||||||
const char *templ;
|
const char *templ;
|
||||||
unsigned int offset;
|
unsigned int offset;
|
||||||
int value;
|
int value;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fuse_args
|
struct fuse_args
|
||||||
{
|
{
|
||||||
int argc;
|
int argc;
|
||||||
char **argv;
|
char **argv;
|
||||||
int allocated;
|
int allocated;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef int (*fuse_opt_proc_t)(void *data, const char *arg, int key,
|
typedef int (*fuse_opt_proc_t)(void *data, const char *arg, int key,
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* @file fuse/winfsp_fuse.h
|
* @file fuse/winfsp_fuse.h
|
||||||
* WinFsp FUSE compatible API.
|
* WinFsp FUSE compatible API.
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -11,9 +11,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FUSE_WINFSP_FUSE_H_INCLUDED
|
#ifndef FUSE_WINFSP_FUSE_H_INCLUDED
|
||||||
@ -55,7 +59,7 @@ extern "C" {
|
|||||||
|
|
||||||
#define FSP_FUSE_DEVICE_TYPE (0x8000 | 'W' | 'F' * 0x100) /* DeviceIoControl -> ioctl */
|
#define FSP_FUSE_DEVICE_TYPE (0x8000 | 'W' | 'F' * 0x100) /* DeviceIoControl -> ioctl */
|
||||||
#define FSP_FUSE_CTLCODE_FROM_IOCTL(cmd)\
|
#define FSP_FUSE_CTLCODE_FROM_IOCTL(cmd)\
|
||||||
(FSP_FUSE_DEVICE_TYPE << 16) | (((c) & 0x0fff) << 2)
|
(FSP_FUSE_DEVICE_TYPE << 16) | (((cmd) & 0x0fff) << 2)
|
||||||
#define FSP_FUSE_IOCTL(cmd, isiz, osiz) \
|
#define FSP_FUSE_IOCTL(cmd, isiz, osiz) \
|
||||||
( \
|
( \
|
||||||
(((osiz) != 0) << 31) | \
|
(((osiz) != 0) << 31) | \
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* FUSE: Filesystem in Userspace
|
* FUSE: Filesystem in Userspace
|
||||||
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FUSE_H_
|
#ifndef FUSE_H_
|
||||||
@ -102,11 +106,11 @@ struct fuse3_operations
|
|||||||
/* S */ int (*flush)(const char *path, struct fuse3_file_info *fi);
|
/* S */ int (*flush)(const char *path, struct fuse3_file_info *fi);
|
||||||
/* S */ int (*release)(const char *path, struct fuse3_file_info *fi);
|
/* S */ int (*release)(const char *path, struct fuse3_file_info *fi);
|
||||||
/* S */ int (*fsync)(const char *path, int datasync, struct fuse3_file_info *fi);
|
/* S */ int (*fsync)(const char *path, int datasync, struct fuse3_file_info *fi);
|
||||||
/* _ */ int (*setxattr)(const char *path, const char *name, const char *value, size_t size,
|
/* S */ int (*setxattr)(const char *path, const char *name, const char *value, size_t size,
|
||||||
int flags);
|
int flags);
|
||||||
/* _ */ int (*getxattr)(const char *path, const char *name, char *value, size_t size);
|
/* S */ int (*getxattr)(const char *path, const char *name, char *value, size_t size);
|
||||||
/* _ */ int (*listxattr)(const char *path, char *namebuf, size_t size);
|
/* S */ int (*listxattr)(const char *path, char *namebuf, size_t size);
|
||||||
/* _ */ int (*removexattr)(const char *path, const char *name);
|
/* S */ int (*removexattr)(const char *path, const char *name);
|
||||||
/* S */ int (*opendir)(const char *path, struct fuse3_file_info *fi);
|
/* S */ int (*opendir)(const char *path, struct fuse3_file_info *fi);
|
||||||
/* S */ int (*readdir)(const char *path, void *buf, fuse3_fill_dir_t filler, fuse_off_t off,
|
/* S */ int (*readdir)(const char *path, void *buf, fuse3_fill_dir_t filler, fuse_off_t off,
|
||||||
struct fuse3_file_info *fi, enum fuse3_readdir_flags);
|
struct fuse3_file_info *fi, enum fuse3_readdir_flags);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* FUSE: Filesystem in Userspace
|
* FUSE: Filesystem in Userspace
|
||||||
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -15,9 +15,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FUSE_COMMON_H_
|
#ifndef FUSE_COMMON_H_
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* @file fuse3/fuse_opt.h
|
* @file fuse3/fuse_opt.h
|
||||||
* WinFsp FUSE3 compatible API.
|
* WinFsp FUSE3 compatible API.
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -11,9 +11,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../fuse/fuse_opt.h"
|
#include "../fuse/fuse_opt.h"
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* @file fuse3/winfsp_fuse.h
|
* @file fuse3/winfsp_fuse.h
|
||||||
* WinFsp FUSE3 compatible API.
|
* WinFsp FUSE3 compatible API.
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -11,9 +11,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FUSE3_WINFSP_FUSE_H_INCLUDED
|
#ifndef FUSE3_WINFSP_FUSE_H_INCLUDED
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file winfsp/fsctl.h
|
* @file winfsp/fsctl.h
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef WINFSP_FSCTL_H_INCLUDED
|
#ifndef WINFSP_FSCTL_H_INCLUDED
|
||||||
@ -50,6 +54,8 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid =
|
|||||||
#define FSP_FSCTL_DECLSPEC_ALIGN __declspec(align(FSP_FSCTL_DEFAULT_ALIGNMENT))
|
#define FSP_FSCTL_DECLSPEC_ALIGN __declspec(align(FSP_FSCTL_DEFAULT_ALIGNMENT))
|
||||||
|
|
||||||
/* fsctl device codes */
|
/* fsctl device codes */
|
||||||
|
#define FSP_FSCTL_MOUNTDEV \
|
||||||
|
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'M', METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||||
#define FSP_FSCTL_VOLUME_NAME \
|
#define FSP_FSCTL_VOLUME_NAME \
|
||||||
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'N', METHOD_BUFFERED, FILE_ANY_ACCESS)
|
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'N', METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||||
#define FSP_FSCTL_VOLUME_LIST \
|
#define FSP_FSCTL_VOLUME_LIST \
|
||||||
@ -61,6 +67,10 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid =
|
|||||||
#define FSP_FSCTL_STOP \
|
#define FSP_FSCTL_STOP \
|
||||||
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'S', METHOD_BUFFERED, FILE_ANY_ACCESS)
|
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'S', METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||||
|
|
||||||
|
/* fsctl internal device codes (usable only in-kernel) */
|
||||||
|
#define FSP_FSCTL_TRANSACT_INTERNAL \
|
||||||
|
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'I', METHOD_NEITHER, FILE_ANY_ACCESS)
|
||||||
|
|
||||||
#define FSP_FSCTL_VOLUME_PARAMS_PREFIX "\\VolumeParams="
|
#define FSP_FSCTL_VOLUME_PARAMS_PREFIX "\\VolumeParams="
|
||||||
|
|
||||||
#define FSP_FSCTL_VOLUME_NAME_SIZE (64 * sizeof(WCHAR))
|
#define FSP_FSCTL_VOLUME_NAME_SIZE (64 * sizeof(WCHAR))
|
||||||
@ -79,14 +89,14 @@ FSP_FSCTL_STATIC_ASSERT(FSP_FSCTL_VOLUME_NAME_SIZEMAX <= 260 * sizeof(WCHAR),
|
|||||||
#define FSP_FSCTL_TRANSACT_BATCH_BUFFER_SIZEMIN (64 * 1024)
|
#define FSP_FSCTL_TRANSACT_BATCH_BUFFER_SIZEMIN (64 * 1024)
|
||||||
#define FSP_FSCTL_TRANSACT_BUFFER_SIZEMIN FSP_FSCTL_TRANSACT_REQ_SIZEMAX
|
#define FSP_FSCTL_TRANSACT_BUFFER_SIZEMIN FSP_FSCTL_TRANSACT_REQ_SIZEMAX
|
||||||
|
|
||||||
#define FSP_FSCTL_TRANSACT_REQ_TOKEN_HANDLE(T) ((HANDLE)((T) & 0xffffffff))
|
#define FSP_FSCTL_TRANSACT_REQ_TOKEN_HANDLE(T) ((HANDLE)((UINT_PTR)((T) & 0xffffffff)))
|
||||||
#define FSP_FSCTL_TRANSACT_REQ_TOKEN_PID(T) ((UINT32)(((T) >> 32) & 0xffffffff))
|
#define FSP_FSCTL_TRANSACT_REQ_TOKEN_PID(T) ((UINT32)(((T) >> 32) & 0xffffffff))
|
||||||
|
|
||||||
#define FSP_FSCTL_DEVICECONTROL_SIZEMAX (4 * 1024) /* must be < FSP_FSCTL_TRANSACT_{REQ,RSP}_SIZEMAX */
|
#define FSP_FSCTL_DEVICECONTROL_SIZEMAX (4 * 1024) /* must be < FSP_FSCTL_TRANSACT_{REQ,RSP}_SIZEMAX */
|
||||||
|
|
||||||
/* marshalling */
|
/* marshalling */
|
||||||
#pragma warning(push)
|
#pragma warning(push)
|
||||||
#pragma warning(disable:4200) /* zero-sized array in struct/union */
|
#pragma warning(disable:4200 4201) /* zero-sized array in struct/union; nameless struct/union */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
FspFsctlTransactReservedKind = 0,
|
FspFsctlTransactReservedKind = 0,
|
||||||
@ -117,7 +127,7 @@ enum
|
|||||||
{
|
{
|
||||||
FspFsctlTransactTimeoutMinimum = 1000,
|
FspFsctlTransactTimeoutMinimum = 1000,
|
||||||
FspFsctlTransactTimeoutMaximum = 10000,
|
FspFsctlTransactTimeoutMaximum = 10000,
|
||||||
FspFsctlTransactTimeoutDefault = 1000,
|
FspFsctlTransactTimeoutDefault = 1000, /* DEPRECATED: default is unspecified */
|
||||||
FspFsctlIrpTimeoutMinimum = 60000,
|
FspFsctlIrpTimeoutMinimum = 60000,
|
||||||
FspFsctlIrpTimeoutMaximum = 600000,
|
FspFsctlIrpTimeoutMaximum = 600000,
|
||||||
FspFsctlIrpTimeoutDefault = 300000,
|
FspFsctlIrpTimeoutDefault = 300000,
|
||||||
@ -135,7 +145,7 @@ enum
|
|||||||
UINT64 VolumeCreationTime;\
|
UINT64 VolumeCreationTime;\
|
||||||
UINT32 VolumeSerialNumber;\
|
UINT32 VolumeSerialNumber;\
|
||||||
/* I/O timeouts, capacity, etc. */\
|
/* I/O timeouts, capacity, etc. */\
|
||||||
UINT32 TransactTimeout; /* FSP_FSCTL_TRANSACT timeout (millis; 1 sec - 10 sec) */\
|
UINT32 TransactTimeout; /* DEPRECATED: (millis; 1 sec - 10 sec) */\
|
||||||
UINT32 IrpTimeout; /* pending IRP timeout (millis; 1 min - 10 min) */\
|
UINT32 IrpTimeout; /* pending IRP timeout (millis; 1 min - 10 min) */\
|
||||||
UINT32 IrpCapacity; /* maximum number of pending IRP's (100 - 1000)*/\
|
UINT32 IrpCapacity; /* maximum number of pending IRP's (100 - 1000)*/\
|
||||||
UINT32 FileInfoTimeout; /* FileInfo/Security/VolumeInfo timeout (millis) */\
|
UINT32 FileInfoTimeout; /* FileInfo/Security/VolumeInfo timeout (millis) */\
|
||||||
@ -148,7 +158,7 @@ enum
|
|||||||
UINT32 ReparsePointsAccessCheck:1; /* file system performs reparse point access checks */\
|
UINT32 ReparsePointsAccessCheck:1; /* file system performs reparse point access checks */\
|
||||||
UINT32 NamedStreams:1; /* file system supports named streams */\
|
UINT32 NamedStreams:1; /* file system supports named streams */\
|
||||||
UINT32 HardLinks:1; /* unimplemented; set to 0 */\
|
UINT32 HardLinks:1; /* unimplemented; set to 0 */\
|
||||||
UINT32 ExtendedAttributes:1; /* unimplemented; set to 0 */\
|
UINT32 ExtendedAttributes:1; /* file system supports extended attributes */\
|
||||||
UINT32 ReadOnlyVolume:1;\
|
UINT32 ReadOnlyVolume:1;\
|
||||||
/* kernel-mode flags */\
|
/* kernel-mode flags */\
|
||||||
UINT32 PostCleanupWhenModifiedOnly:1; /* post Cleanup when a file was modified/deleted */\
|
UINT32 PostCleanupWhenModifiedOnly:1; /* post Cleanup when a file was modified/deleted */\
|
||||||
@ -162,7 +172,11 @@ enum
|
|||||||
UINT32 UmFileContextIsFullContext:1; /* user mode: FileContext parameter is FullContext */\
|
UINT32 UmFileContextIsFullContext:1; /* user mode: FileContext parameter is FullContext */\
|
||||||
UINT32 UmReservedFlags:6;\
|
UINT32 UmReservedFlags:6;\
|
||||||
/* additional kernel-mode flags */\
|
/* additional kernel-mode flags */\
|
||||||
UINT32 KmReservedFlags:8;\
|
UINT32 AllowOpenInKernelMode:1; /* allow kernel mode to open files when possible */\
|
||||||
|
UINT32 CasePreservedExtendedAttributes:1; /* preserve case of EA (default is UPPERCASE) */\
|
||||||
|
UINT32 WslFeatures:1; /* support features required for WSLinux */\
|
||||||
|
UINT32 DirectoryMarkerAsNextOffset:1; /* directory marker is next offset instead of last name */\
|
||||||
|
UINT32 KmReservedFlags:4;\
|
||||||
WCHAR Prefix[FSP_FSCTL_VOLUME_PREFIX_SIZE / sizeof(WCHAR)]; /* UNC prefix (\Server\Share) */\
|
WCHAR Prefix[FSP_FSCTL_VOLUME_PREFIX_SIZE / sizeof(WCHAR)]; /* UNC prefix (\Server\Share) */\
|
||||||
WCHAR FileSystemName[FSP_FSCTL_VOLUME_FSNAME_SIZE / sizeof(WCHAR)];
|
WCHAR FileSystemName[FSP_FSCTL_VOLUME_FSNAME_SIZE / sizeof(WCHAR)];
|
||||||
#define FSP_FSCTL_VOLUME_PARAMS_V1_FIELD_DEFN\
|
#define FSP_FSCTL_VOLUME_PARAMS_V1_FIELD_DEFN\
|
||||||
@ -171,22 +185,29 @@ enum
|
|||||||
UINT32 DirInfoTimeoutValid:1; /* DirInfoTimeout field is valid */\
|
UINT32 DirInfoTimeoutValid:1; /* DirInfoTimeout field is valid */\
|
||||||
UINT32 SecurityTimeoutValid:1; /* SecurityTimeout field is valid*/\
|
UINT32 SecurityTimeoutValid:1; /* SecurityTimeout field is valid*/\
|
||||||
UINT32 StreamInfoTimeoutValid:1; /* StreamInfoTimeout field is valid */\
|
UINT32 StreamInfoTimeoutValid:1; /* StreamInfoTimeout field is valid */\
|
||||||
UINT32 KmAdditionalReservedFlags:28;\
|
UINT32 EaTimeoutValid:1; /* EaTimeout field is valid */\
|
||||||
|
UINT32 KmAdditionalReservedFlags:27;\
|
||||||
UINT32 VolumeInfoTimeout; /* volume info timeout (millis); overrides FileInfoTimeout */\
|
UINT32 VolumeInfoTimeout; /* volume info timeout (millis); overrides FileInfoTimeout */\
|
||||||
UINT32 DirInfoTimeout; /* dir info timeout (millis); overrides FileInfoTimeout */\
|
UINT32 DirInfoTimeout; /* dir info timeout (millis); overrides FileInfoTimeout */\
|
||||||
UINT32 SecurityTimeout; /* security info timeout (millis); overrides FileInfoTimeout */\
|
UINT32 SecurityTimeout; /* security info timeout (millis); overrides FileInfoTimeout */\
|
||||||
UINT32 StreamInfoTimeout; /* stream info timeout (millis); overrides FileInfoTimeout */\
|
UINT32 StreamInfoTimeout; /* stream info timeout (millis); overrides FileInfoTimeout */\
|
||||||
UINT32 Reserved32[3];\
|
UINT32 EaTimeout; /* EA timeout (millis); overrides FileInfoTimeout */\
|
||||||
|
UINT32 FsextControlCode;\
|
||||||
|
UINT32 Reserved32[1];\
|
||||||
UINT64 Reserved64[2];
|
UINT64 Reserved64[2];
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
FSP_FSCTL_VOLUME_PARAMS_V0_FIELD_DEFN
|
FSP_FSCTL_VOLUME_PARAMS_V0_FIELD_DEFN
|
||||||
} FSP_FSCTL_VOLUME_PARAMS_V0;
|
} FSP_FSCTL_VOLUME_PARAMS_V0;
|
||||||
|
FSP_FSCTL_STATIC_ASSERT(456 == sizeof(FSP_FSCTL_VOLUME_PARAMS_V0),
|
||||||
|
"sizeof(FSP_FSCTL_VOLUME_PARAMS_V0) must be exactly 456.");
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
FSP_FSCTL_VOLUME_PARAMS_V0_FIELD_DEFN
|
FSP_FSCTL_VOLUME_PARAMS_V0_FIELD_DEFN
|
||||||
FSP_FSCTL_VOLUME_PARAMS_V1_FIELD_DEFN
|
FSP_FSCTL_VOLUME_PARAMS_V1_FIELD_DEFN
|
||||||
} FSP_FSCTL_VOLUME_PARAMS;
|
} FSP_FSCTL_VOLUME_PARAMS;
|
||||||
|
FSP_FSCTL_STATIC_ASSERT(504 == sizeof(FSP_FSCTL_VOLUME_PARAMS),
|
||||||
|
"sizeof(FSP_FSCTL_VOLUME_PARAMS) is currently 504. Update this assertion check if it changes.");
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
UINT64 TotalSize;
|
UINT64 TotalSize;
|
||||||
@ -194,6 +215,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;
|
||||||
@ -206,7 +229,10 @@ 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;
|
||||||
@ -217,10 +243,16 @@ typedef struct
|
|||||||
{
|
{
|
||||||
UINT16 Size;
|
UINT16 Size;
|
||||||
FSP_FSCTL_FILE_INFO FileInfo;
|
FSP_FSCTL_FILE_INFO FileInfo;
|
||||||
UINT8 Padding[24];
|
union
|
||||||
/* make struct as big as FILE_ID_BOTH_DIR_INFORMATION; allows for in-place copying */
|
{
|
||||||
|
UINT64 NextOffset;
|
||||||
|
UINT8 Padding[24];
|
||||||
|
/* make struct as big as FILE_ID_BOTH_DIR_INFORMATION; allows for in-place copying */
|
||||||
|
} DUMMYUNIONNAME;
|
||||||
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;
|
||||||
@ -228,6 +260,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;
|
||||||
@ -256,7 +290,7 @@ typedef struct
|
|||||||
UINT32 DesiredAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */
|
UINT32 DesiredAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */
|
||||||
UINT32 GrantedAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */
|
UINT32 GrantedAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */
|
||||||
UINT32 ShareAccess; /* FILE_SHARE_{READ,WRITE,DELETE} */
|
UINT32 ShareAccess; /* FILE_SHARE_{READ,WRITE,DELETE} */
|
||||||
FSP_FSCTL_TRANSACT_BUF Ea; /* reserved; not currently implemented */
|
FSP_FSCTL_TRANSACT_BUF Ea; /* extended attributes or reparse point buffer */
|
||||||
UINT32 UserMode:1; /* request originated in user mode */
|
UINT32 UserMode:1; /* request originated in user mode */
|
||||||
UINT32 HasTraversePrivilege:1; /* requestor has TOKEN_HAS_TRAVERSE_PRIVILEGE */
|
UINT32 HasTraversePrivilege:1; /* requestor has TOKEN_HAS_TRAVERSE_PRIVILEGE */
|
||||||
UINT32 HasBackupPrivilege:1; /* requestor has TOKEN_HAS_BACKUP_PRIVILEGE */
|
UINT32 HasBackupPrivilege:1; /* requestor has TOKEN_HAS_BACKUP_PRIVILEGE */
|
||||||
@ -264,7 +298,9 @@ typedef struct
|
|||||||
UINT32 OpenTargetDirectory:1; /* open target dir and report FILE_{EXISTS,DOES_NOT_EXIST} */
|
UINT32 OpenTargetDirectory:1; /* open target dir and report FILE_{EXISTS,DOES_NOT_EXIST} */
|
||||||
UINT32 CaseSensitive:1; /* FileName comparisons should be case-sensitive */
|
UINT32 CaseSensitive:1; /* FileName comparisons should be case-sensitive */
|
||||||
UINT32 HasTrailingBackslash:1; /* FileName had trailing backslash */
|
UINT32 HasTrailingBackslash:1; /* FileName had trailing backslash */
|
||||||
UINT32 ReservedFlags:25;
|
UINT32 AcceptsSecurityDescriptor:1;
|
||||||
|
UINT32 EaIsReparsePoint:1; /* Ea buffer is reparse point */
|
||||||
|
UINT32 ReservedFlags:24;
|
||||||
UINT16 NamedStream; /* request targets named stream; colon offset in FileName */
|
UINT16 NamedStream; /* request targets named stream; colon offset in FileName */
|
||||||
} Create;
|
} Create;
|
||||||
struct
|
struct
|
||||||
@ -274,6 +310,7 @@ typedef struct
|
|||||||
UINT32 FileAttributes; /* file attributes for overwritten/superseded files */
|
UINT32 FileAttributes; /* file attributes for overwritten/superseded files */
|
||||||
UINT64 AllocationSize; /* allocation size for overwritten/superseded files */
|
UINT64 AllocationSize; /* allocation size for overwritten/superseded files */
|
||||||
UINT32 Supersede:1; /* 0: FILE_OVERWRITE operation, 1: FILE_SUPERSEDE operation */
|
UINT32 Supersede:1; /* 0: FILE_OVERWRITE operation, 1: FILE_SUPERSEDE operation */
|
||||||
|
FSP_FSCTL_TRANSACT_BUF Ea; /* extended attributes buffer */
|
||||||
} Overwrite;
|
} Overwrite;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
@ -350,6 +387,17 @@ typedef struct
|
|||||||
} Info;
|
} Info;
|
||||||
} SetInformation;
|
} SetInformation;
|
||||||
struct
|
struct
|
||||||
|
{
|
||||||
|
UINT64 UserContext;
|
||||||
|
UINT64 UserContext2;
|
||||||
|
} QueryEa;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
UINT64 UserContext;
|
||||||
|
UINT64 UserContext2;
|
||||||
|
FSP_FSCTL_TRANSACT_BUF Ea;
|
||||||
|
} SetEa;
|
||||||
|
struct
|
||||||
{
|
{
|
||||||
UINT64 UserContext;
|
UINT64 UserContext;
|
||||||
UINT64 UserContext2;
|
UINT64 UserContext2;
|
||||||
@ -435,9 +483,11 @@ typedef struct
|
|||||||
UINT64 UserContext; /* user context associated with file node */
|
UINT64 UserContext; /* user context associated with file node */
|
||||||
UINT64 UserContext2; /* user context associated with file descriptor (handle) */
|
UINT64 UserContext2; /* user context associated with file descriptor (handle) */
|
||||||
UINT32 GrantedAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */
|
UINT32 GrantedAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */
|
||||||
|
FSP_FSCTL_TRANSACT_BUF SecurityDescriptor;
|
||||||
FSP_FSCTL_FILE_INFO FileInfo;
|
FSP_FSCTL_FILE_INFO FileInfo;
|
||||||
FSP_FSCTL_TRANSACT_BUF FileName;
|
FSP_FSCTL_TRANSACT_BUF FileName;
|
||||||
UINT32 DisableCache:1;
|
UINT32 DisableCache:1;
|
||||||
|
UINT32 HasSecurityDescriptor:1;
|
||||||
} Opened;
|
} Opened;
|
||||||
/* IoStatus.Status == STATUS_REPARSE */
|
/* IoStatus.Status == STATUS_REPARSE */
|
||||||
struct
|
struct
|
||||||
@ -462,6 +512,15 @@ typedef struct
|
|||||||
FSP_FSCTL_FILE_INFO FileInfo; /* valid: File{Allocation,Basic,EndOfFile}Information */
|
FSP_FSCTL_FILE_INFO FileInfo; /* valid: File{Allocation,Basic,EndOfFile}Information */
|
||||||
} SetInformation;
|
} SetInformation;
|
||||||
struct
|
struct
|
||||||
|
{
|
||||||
|
FSP_FSCTL_TRANSACT_BUF Ea;
|
||||||
|
} QueryEa;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
FSP_FSCTL_FILE_INFO FileInfo;
|
||||||
|
FSP_FSCTL_TRANSACT_BUF Ea; /* Size==0 means no extended atttributed returned */
|
||||||
|
} SetEa;
|
||||||
|
struct
|
||||||
{
|
{
|
||||||
FSP_FSCTL_FILE_INFO FileInfo; /* valid when flushing file (not volume) */
|
FSP_FSCTL_FILE_INFO FileInfo; /* valid when flushing file (not volume) */
|
||||||
} FlushBuffers;
|
} FlushBuffers;
|
||||||
@ -541,11 +600,13 @@ static inline FSP_FSCTL_TRANSACT_RSP *FspFsctlTransactConsumeResponse(
|
|||||||
return NextResponse <= ResponseBufEnd ? (FSP_FSCTL_TRANSACT_RSP *)NextResponse : 0;
|
return NextResponse <= ResponseBufEnd ? (FSP_FSCTL_TRANSACT_RSP *)NextResponse : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(WINFSP_SYS_INTERNAL)
|
#if !defined(_KERNEL_MODE)
|
||||||
FSP_API NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath,
|
FSP_API NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath,
|
||||||
const FSP_FSCTL_VOLUME_PARAMS *VolumeParams,
|
const FSP_FSCTL_VOLUME_PARAMS *VolumeParams,
|
||||||
PWCHAR VolumeNameBuf, SIZE_T VolumeNameSize,
|
PWCHAR VolumeNameBuf, SIZE_T VolumeNameSize,
|
||||||
PHANDLE PVolumeHandle);
|
PHANDLE PVolumeHandle);
|
||||||
|
FSP_API NTSTATUS FspFsctlMakeMountdev(HANDLE VolumeHandle,
|
||||||
|
BOOLEAN Persistent, GUID *UniqueId);
|
||||||
FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
|
FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
|
||||||
PVOID ResponseBuf, SIZE_T ResponseBufSize,
|
PVOID ResponseBuf, SIZE_T ResponseBufSize,
|
||||||
PVOID RequestBuf, SIZE_T *PRequestBufSize,
|
PVOID RequestBuf, SIZE_T *PRequestBufSize,
|
||||||
@ -554,6 +615,20 @@ FSP_API NTSTATUS FspFsctlStop(HANDLE VolumeHandle);
|
|||||||
FSP_API NTSTATUS FspFsctlGetVolumeList(PWSTR DevicePath,
|
FSP_API NTSTATUS FspFsctlGetVolumeList(PWSTR DevicePath,
|
||||||
PWCHAR VolumeListBuf, PSIZE_T PVolumeListSize);
|
PWCHAR VolumeListBuf, PSIZE_T PVolumeListSize);
|
||||||
FSP_API NTSTATUS FspFsctlPreflight(PWSTR DevicePath);
|
FSP_API NTSTATUS FspFsctlPreflight(PWSTR DevicePath);
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/* in */
|
||||||
|
HANDLE VolumeHandle; /* volume handle returned by FspFsctlCreateVolume */
|
||||||
|
PWSTR VolumeName; /* volume name returned by FspFsctlCreateVolume */
|
||||||
|
PSECURITY_DESCRIPTOR Security; /* optional: security descriptor for directories */
|
||||||
|
UINT64 Reserved; /* reserved for future use */
|
||||||
|
/* in/out */
|
||||||
|
PWSTR MountPoint; /* FspMountSet sets drive in buffer when passed "*:" */
|
||||||
|
HANDLE MountHandle; /* FspMountSet sets, FspMountRemove uses */
|
||||||
|
} FSP_MOUNT_DESC;
|
||||||
|
FSP_API NTSTATUS FspMountSet(FSP_MOUNT_DESC *Desc);
|
||||||
|
FSP_API NTSTATUS FspMountRemove(FSP_MOUNT_DESC *Desc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* In order to use the WinFsp Launch API a program must include <winfsp/launch.h>
|
* In order to use the WinFsp Launch API a program must include <winfsp/launch.h>
|
||||||
* and link with the winfsp_x64.dll (or winfsp_x86.dll) library.
|
* and link with the winfsp_x64.dll (or winfsp_x86.dll) library.
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -14,9 +14,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef WINFSP_LAUNCH_H_INCLUDED
|
#ifndef WINFSP_LAUNCH_H_INCLUDED
|
||||||
@ -107,7 +111,43 @@ enum
|
|||||||
*/
|
*/
|
||||||
FSP_API NTSTATUS FspLaunchCallLauncherPipe(
|
FSP_API NTSTATUS FspLaunchCallLauncherPipe(
|
||||||
WCHAR Command, ULONG Argc, PWSTR *Argv, ULONG *Argl,
|
WCHAR Command, ULONG Argc, PWSTR *Argv, ULONG *Argl,
|
||||||
PWSTR Buffer, PULONG PSize, PULONG PLauncherError);
|
PWSTR Buffer, PULONG PSize,
|
||||||
|
PULONG PLauncherError);
|
||||||
|
/**
|
||||||
|
* Call launcher pipe.
|
||||||
|
*
|
||||||
|
* This function is used to send a command to the launcher and receive a response.
|
||||||
|
*
|
||||||
|
* @param Command
|
||||||
|
* Launcher command to send. For example, the 'L' launcher command instructs
|
||||||
|
* the launcher to list all running service instances.
|
||||||
|
* @param Argc
|
||||||
|
* Command argument count. May be 0.
|
||||||
|
* @param Argv
|
||||||
|
* Command argument array. May be NULL.
|
||||||
|
* @param Argl
|
||||||
|
* Command argument length array. May be NULL. If this is NULL all command arguments
|
||||||
|
* are assumed to be NULL-terminated strings. It is also possible for specific arguments
|
||||||
|
* to be NULL-terminated; in this case pass -1 in the corresponding Argl position.
|
||||||
|
* @param Buffer
|
||||||
|
* Buffer that receives the command response. May be NULL.
|
||||||
|
* @param PSize
|
||||||
|
* Pointer to a ULONG. On input it contains the size of the Buffer. On output it
|
||||||
|
* contains the number of bytes transferred. May be NULL.
|
||||||
|
* @param AllowImpersonation
|
||||||
|
* Allow caller to be impersonated by launcher.
|
||||||
|
* @param PLauncherError
|
||||||
|
* Receives the launcher error if any. This is always a Win32 error code. May not be NULL.
|
||||||
|
* @return
|
||||||
|
* STATUS_SUCCESS if the command is sent successfully to the launcher, even if the launcher
|
||||||
|
* returns an error. Other status codes indicate a communication error. Launcher errors are
|
||||||
|
* reported through PLauncherError.
|
||||||
|
*/
|
||||||
|
FSP_API NTSTATUS FspLaunchCallLauncherPipeEx(
|
||||||
|
WCHAR Command, ULONG Argc, PWSTR *Argv, ULONG *Argl,
|
||||||
|
PWSTR Buffer, PULONG PSize,
|
||||||
|
BOOLEAN AllowImpersonation,
|
||||||
|
PULONG PLauncherError);
|
||||||
/**
|
/**
|
||||||
* Start a service instance.
|
* Start a service instance.
|
||||||
*
|
*
|
||||||
@ -134,6 +174,35 @@ FSP_API NTSTATUS FspLaunchStart(
|
|||||||
PWSTR ClassName, PWSTR InstanceName, ULONG Argc, PWSTR *Argv,
|
PWSTR ClassName, PWSTR InstanceName, ULONG Argc, PWSTR *Argv,
|
||||||
BOOLEAN HasSecret,
|
BOOLEAN HasSecret,
|
||||||
PULONG PLauncherError);
|
PULONG PLauncherError);
|
||||||
|
/**
|
||||||
|
* Start a service instance.
|
||||||
|
*
|
||||||
|
* @param ClassName
|
||||||
|
* Class name of the service instance to start.
|
||||||
|
* @param InstanceName
|
||||||
|
* Instance name of the service instance to start.
|
||||||
|
* @param Argc
|
||||||
|
* Service instance argument count. May be 0.
|
||||||
|
* @param Argv
|
||||||
|
* Service instance argument array. May be NULL.
|
||||||
|
* @param HasSecret
|
||||||
|
* Whether the last argument in Argv is assumed to be a secret (e.g. password) or not.
|
||||||
|
* Secrets are passed to service instances through standard input rather than the command
|
||||||
|
* line.
|
||||||
|
* @param AllowImpersonation
|
||||||
|
* Allow caller to be impersonated by launcher.
|
||||||
|
* @param PLauncherError
|
||||||
|
* Receives the launcher error if any. This is always a Win32 error code. May not be NULL.
|
||||||
|
* @return
|
||||||
|
* STATUS_SUCCESS if the command is sent successfully to the launcher, even if the launcher
|
||||||
|
* returns an error. Other status codes indicate a communication error. Launcher errors are
|
||||||
|
* reported through PLauncherError.
|
||||||
|
*/
|
||||||
|
FSP_API NTSTATUS FspLaunchStartEx(
|
||||||
|
PWSTR ClassName, PWSTR InstanceName, ULONG Argc, PWSTR *Argv,
|
||||||
|
BOOLEAN HasSecret,
|
||||||
|
BOOLEAN AllowImpersonation,
|
||||||
|
PULONG PLauncherError);
|
||||||
/**
|
/**
|
||||||
* Stop a service instance.
|
* Stop a service instance.
|
||||||
*
|
*
|
||||||
@ -217,10 +286,12 @@ typedef struct _FSP_LAUNCH_REG_RECORD
|
|||||||
PWSTR WorkDirectory;
|
PWSTR WorkDirectory;
|
||||||
PWSTR RunAs;
|
PWSTR RunAs;
|
||||||
PWSTR Security;
|
PWSTR Security;
|
||||||
PVOID Reserved0[6];
|
PWSTR AuthPackage;
|
||||||
|
PVOID Reserved0[5];
|
||||||
ULONG JobControl;
|
ULONG JobControl;
|
||||||
ULONG Credentials;
|
ULONG Credentials;
|
||||||
ULONG Reserved1[6];
|
ULONG AuthPackageId;
|
||||||
|
ULONG Reserved1[5];
|
||||||
UINT8 Buffer[];
|
UINT8 Buffer[];
|
||||||
} FSP_LAUNCH_REG_RECORD;
|
} FSP_LAUNCH_REG_RECORD;
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* In order to use the WinFsp API the user mode file system must include <winfsp/winfsp.h>
|
* In order to use the WinFsp API the user mode file system must include <winfsp/winfsp.h>
|
||||||
* and link with the winfsp_x64.dll (or winfsp_x86.dll) library.
|
* and link with the winfsp_x64.dll (or winfsp_x86.dll) library.
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -14,9 +14,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef WINFSP_WINFSP_H_INCLUDED
|
#ifndef WINFSP_WINFSP_H_INCLUDED
|
||||||
@ -81,6 +85,21 @@ typedef struct _REPARSE_DATA_BUFFER
|
|||||||
} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
|
} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The FILE_FULL_EA_INFORMATION definitions are missing from the user mode headers.
|
||||||
|
*/
|
||||||
|
#if !defined(FILE_NEED_EA)
|
||||||
|
#define FILE_NEED_EA 0x00000080
|
||||||
|
#endif
|
||||||
|
typedef struct _FILE_FULL_EA_INFORMATION
|
||||||
|
{
|
||||||
|
ULONG NextEntryOffset;
|
||||||
|
UCHAR Flags;
|
||||||
|
UCHAR EaNameLength;
|
||||||
|
USHORT EaValueLength;
|
||||||
|
CHAR EaName[1];
|
||||||
|
} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @group File System
|
* @group File System
|
||||||
*
|
*
|
||||||
@ -380,6 +399,7 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE
|
|||||||
* @see
|
* @see
|
||||||
* Close
|
* Close
|
||||||
* CanDelete
|
* CanDelete
|
||||||
|
* SetDelete
|
||||||
*/
|
*/
|
||||||
VOID (*Cleanup)(FSP_FILE_SYSTEM *FileSystem,
|
VOID (*Cleanup)(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileContext, PWSTR FileName, ULONG Flags);
|
PVOID FileContext, PWSTR FileName, ULONG Flags);
|
||||||
@ -563,6 +583,9 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE
|
|||||||
* This function gets called when Win32 API's such as DeleteFile or RemoveDirectory are used.
|
* This function gets called when Win32 API's such as DeleteFile or RemoveDirectory are used.
|
||||||
* It does not get called when a file or directory is opened with FILE_DELETE_ON_CLOSE.
|
* It does not get called when a file or directory is opened with FILE_DELETE_ON_CLOSE.
|
||||||
*
|
*
|
||||||
|
* NOTE: If both CanDelete and SetDelete are defined, SetDelete takes precedence. However
|
||||||
|
* most file systems need only implement the CanDelete operation.
|
||||||
|
*
|
||||||
* @param FileSystem
|
* @param FileSystem
|
||||||
* The file system on which this request is posted.
|
* The file system on which this request is posted.
|
||||||
* @param FileContext
|
* @param FileContext
|
||||||
@ -573,6 +596,7 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE
|
|||||||
* STATUS_SUCCESS or error code.
|
* STATUS_SUCCESS or error code.
|
||||||
* @see
|
* @see
|
||||||
* Cleanup
|
* Cleanup
|
||||||
|
* SetDelete
|
||||||
*/
|
*/
|
||||||
NTSTATUS (*CanDelete)(FSP_FILE_SYSTEM *FileSystem,
|
NTSTATUS (*CanDelete)(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileContext, PWSTR FileName);
|
PVOID FileContext, PWSTR FileName);
|
||||||
@ -851,12 +875,175 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE
|
|||||||
PVOID FileContext, UINT32 ControlCode,
|
PVOID FileContext, UINT32 ControlCode,
|
||||||
PVOID InputBuffer, ULONG InputBufferLength,
|
PVOID InputBuffer, ULONG InputBufferLength,
|
||||||
PVOID OutputBuffer, ULONG OutputBufferLength, PULONG PBytesTransferred);
|
PVOID OutputBuffer, ULONG OutputBufferLength, PULONG PBytesTransferred);
|
||||||
|
/**
|
||||||
|
* Set the file delete flag.
|
||||||
|
*
|
||||||
|
* This function sets a flag to indicates whether the FSD file should delete a file
|
||||||
|
* when it is closed. This function does not need to perform access checks, but may
|
||||||
|
* performs tasks such as check for empty directories, etc.
|
||||||
|
*
|
||||||
|
* This function should <b>NEVER</b> delete the file or directory in question. Deletion should
|
||||||
|
* happen during Cleanup with the FspCleanupDelete flag set.
|
||||||
|
*
|
||||||
|
* This function gets called when Win32 API's such as DeleteFile or RemoveDirectory are used.
|
||||||
|
* It does not get called when a file or directory is opened with FILE_DELETE_ON_CLOSE.
|
||||||
|
*
|
||||||
|
* NOTE: If both CanDelete and SetDelete are defined, SetDelete takes precedence. However
|
||||||
|
* most file systems need only implement the CanDelete operation.
|
||||||
|
*
|
||||||
|
* @param FileSystem
|
||||||
|
* The file system on which this request is posted.
|
||||||
|
* @param FileContext
|
||||||
|
* The file context of the file or directory to set the delete flag for.
|
||||||
|
* @param FileName
|
||||||
|
* The name of the file or directory to set the delete flag for.
|
||||||
|
* @param DeleteFile
|
||||||
|
* If set to TRUE the FSD indicates that the file will be deleted on Cleanup; otherwise
|
||||||
|
* it will not be deleted. It is legal to receive multiple SetDelete calls for the same
|
||||||
|
* file with different DeleteFile parameters.
|
||||||
|
* @return
|
||||||
|
* STATUS_SUCCESS or error code.
|
||||||
|
* @see
|
||||||
|
* Cleanup
|
||||||
|
* CanDelete
|
||||||
|
*/
|
||||||
|
NTSTATUS (*SetDelete)(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
PVOID FileContext, PWSTR FileName, BOOLEAN DeleteFile);
|
||||||
|
/**
|
||||||
|
* Create new file or directory.
|
||||||
|
*
|
||||||
|
* This function works like Create, except that it also accepts an extra buffer that
|
||||||
|
* may contain extended attributes or a reparse point.
|
||||||
|
*
|
||||||
|
* NOTE: If both Create and CreateEx are defined, CreateEx takes precedence.
|
||||||
|
*
|
||||||
|
* @param FileSystem
|
||||||
|
* The file system on which this request is posted.
|
||||||
|
* @param FileName
|
||||||
|
* The name of the file or directory to be created.
|
||||||
|
* @param CreateOptions
|
||||||
|
* Create options for this request. This parameter has the same meaning as the
|
||||||
|
* CreateOptions parameter of the NtCreateFile API. User mode file systems should typically
|
||||||
|
* only be concerned with the flag FILE_DIRECTORY_FILE, which is an instruction to create a
|
||||||
|
* directory rather than a file. Some file systems may also want to pay attention to the
|
||||||
|
* FILE_NO_INTERMEDIATE_BUFFERING and FILE_WRITE_THROUGH flags, although these are
|
||||||
|
* typically handled by the FSD component.
|
||||||
|
* @param GrantedAccess
|
||||||
|
* Determines the specific access rights that have been granted for this request. Upon
|
||||||
|
* receiving this call all access checks have been performed and the user mode file system
|
||||||
|
* need not perform any additional checks. However this parameter may be useful to a user
|
||||||
|
* mode file system; for example the WinFsp-FUSE layer uses this parameter to determine
|
||||||
|
* which flags to use in its POSIX open() call.
|
||||||
|
* @param FileAttributes
|
||||||
|
* File attributes to apply to the newly created file or directory.
|
||||||
|
* @param SecurityDescriptor
|
||||||
|
* Security descriptor to apply to the newly created file or directory. This security
|
||||||
|
* descriptor will always be in self-relative format. Its length can be retrieved using the
|
||||||
|
* Windows GetSecurityDescriptorLength API. Will be NULL for named streams.
|
||||||
|
* @param AllocationSize
|
||||||
|
* Allocation size for the newly created file.
|
||||||
|
* @param ExtraBuffer
|
||||||
|
* Extended attributes or reparse point buffer.
|
||||||
|
* @param ExtraLength
|
||||||
|
* Extended attributes or reparse point buffer length.
|
||||||
|
* @param ExtraBufferIsReparsePoint
|
||||||
|
* FALSE: extra buffer is extended attributes; TRUE: extra buffer is reparse point.
|
||||||
|
* @param PFileContext [out]
|
||||||
|
* Pointer that will receive the file context on successful return from this call.
|
||||||
|
* @param FileInfo [out]
|
||||||
|
* Pointer to a structure that will receive the file information on successful return
|
||||||
|
* from this call. This information includes file attributes, file times, etc.
|
||||||
|
* @return
|
||||||
|
* STATUS_SUCCESS or error code.
|
||||||
|
*/
|
||||||
|
NTSTATUS (*CreateEx)(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess,
|
||||||
|
UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize,
|
||||||
|
PVOID ExtraBuffer, ULONG ExtraLength, BOOLEAN ExtraBufferIsReparsePoint,
|
||||||
|
PVOID *PFileContext, FSP_FSCTL_FILE_INFO *FileInfo);
|
||||||
|
/**
|
||||||
|
* Overwrite a file.
|
||||||
|
*
|
||||||
|
* This function works like Overwrite, except that it also accepts EA (extended attributes).
|
||||||
|
*
|
||||||
|
* NOTE: If both Overwrite and OverwriteEx are defined, OverwriteEx takes precedence.
|
||||||
|
*
|
||||||
|
* @param FileSystem
|
||||||
|
* The file system on which this request is posted.
|
||||||
|
* @param FileContext
|
||||||
|
* The file context of the file to overwrite.
|
||||||
|
* @param FileAttributes
|
||||||
|
* File attributes to apply to the overwritten file.
|
||||||
|
* @param ReplaceFileAttributes
|
||||||
|
* When TRUE the existing file attributes should be replaced with the new ones.
|
||||||
|
* When FALSE the existing file attributes should be merged (or'ed) with the new ones.
|
||||||
|
* @param AllocationSize
|
||||||
|
* Allocation size for the overwritten file.
|
||||||
|
* @param Ea
|
||||||
|
* Extended attributes buffer.
|
||||||
|
* @param EaLength
|
||||||
|
* Extended attributes buffer length.
|
||||||
|
* @param FileInfo [out]
|
||||||
|
* Pointer to a structure that will receive the file information on successful return
|
||||||
|
* from this call. This information includes file attributes, file times, etc.
|
||||||
|
* @return
|
||||||
|
* STATUS_SUCCESS or error code.
|
||||||
|
*/
|
||||||
|
NTSTATUS (*OverwriteEx)(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
PVOID FileContext, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize,
|
||||||
|
PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength,
|
||||||
|
FSP_FSCTL_FILE_INFO *FileInfo);
|
||||||
|
/**
|
||||||
|
* Get extended attributes.
|
||||||
|
*
|
||||||
|
* @param FileSystem
|
||||||
|
* The file system on which this request is posted.
|
||||||
|
* @param FileContext
|
||||||
|
* The file context of the file to get extended attributes for.
|
||||||
|
* @param Ea
|
||||||
|
* Extended attributes buffer.
|
||||||
|
* @param EaLength
|
||||||
|
* Extended attributes buffer length.
|
||||||
|
* @param PBytesTransferred [out]
|
||||||
|
* Pointer to a memory location that will receive the actual number of bytes transferred.
|
||||||
|
* @return
|
||||||
|
* STATUS_SUCCESS or error code.
|
||||||
|
* @see
|
||||||
|
* SetEa
|
||||||
|
* FspFileSystemAddEa
|
||||||
|
*/
|
||||||
|
NTSTATUS (*GetEa)(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
PVOID FileContext,
|
||||||
|
PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength, PULONG PBytesTransferred);
|
||||||
|
/**
|
||||||
|
* Set extended attributes.
|
||||||
|
*
|
||||||
|
* @param FileSystem
|
||||||
|
* The file system on which this request is posted.
|
||||||
|
* @param FileContext
|
||||||
|
* The file context of the file to set extended attributes for.
|
||||||
|
* @param Ea
|
||||||
|
* Extended attributes buffer.
|
||||||
|
* @param EaLength
|
||||||
|
* Extended attributes buffer length.
|
||||||
|
* @param FileInfo [out]
|
||||||
|
* Pointer to a structure that will receive the file information on successful return
|
||||||
|
* from this call. This information includes file attributes, file times, etc.
|
||||||
|
* @return
|
||||||
|
* STATUS_SUCCESS or error code.
|
||||||
|
* @see
|
||||||
|
* GetEa
|
||||||
|
*/
|
||||||
|
NTSTATUS (*SetEa)(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
PVOID FileContext,
|
||||||
|
PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength,
|
||||||
|
FSP_FSCTL_FILE_INFO *FileInfo);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This ensures that this interface will always contain 64 function pointers.
|
* This ensures that this interface will always contain 64 function pointers.
|
||||||
* Please update when changing the interface as it is important for future compatibility.
|
* Please update when changing the interface as it is important for future compatibility.
|
||||||
*/
|
*/
|
||||||
NTSTATUS (*Reserved[38])();
|
NTSTATUS (*Reserved[33])();
|
||||||
} FSP_FILE_SYSTEM_INTERFACE;
|
} FSP_FILE_SYSTEM_INTERFACE;
|
||||||
FSP_FSCTL_STATIC_ASSERT(sizeof(FSP_FILE_SYSTEM_INTERFACE) == 64 * sizeof(NTSTATUS (*)()),
|
FSP_FSCTL_STATIC_ASSERT(sizeof(FSP_FILE_SYSTEM_INTERFACE) == 64 * sizeof(NTSTATUS (*)()),
|
||||||
"FSP_FILE_SYSTEM_INTERFACE must have 64 entries.");
|
"FSP_FILE_SYSTEM_INTERFACE must have 64 entries.");
|
||||||
@ -1160,6 +1347,10 @@ FSP_API NTSTATUS FspFileSystemOpQueryInformation(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
|
FSP_API NTSTATUS FspFileSystemOpQueryEa(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
|
FSP_API NTSTATUS FspFileSystemOpSetEa(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
FSP_API NTSTATUS FspFileSystemOpFlushBuffers(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpFlushBuffers(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
FSP_API NTSTATUS FspFileSystemOpQueryVolumeInformation(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpQueryVolumeInformation(FSP_FILE_SYSTEM *FileSystem,
|
||||||
@ -1390,6 +1581,70 @@ FSP_API NTSTATUS FspFileSystemCanReplaceReparsePoint(
|
|||||||
*/
|
*/
|
||||||
FSP_API BOOLEAN FspFileSystemAddStreamInfo(FSP_FSCTL_STREAM_INFO *StreamInfo,
|
FSP_API BOOLEAN FspFileSystemAddStreamInfo(FSP_FSCTL_STREAM_INFO *StreamInfo,
|
||||||
PVOID Buffer, ULONG Length, PULONG PBytesTransferred);
|
PVOID Buffer, ULONG Length, PULONG PBytesTransferred);
|
||||||
|
/**
|
||||||
|
* Enumerate extended attributes in a buffer.
|
||||||
|
*
|
||||||
|
* This is a helper for implementing the CreateEx and SetEa operations in file systems
|
||||||
|
* that support extended attributes.
|
||||||
|
*
|
||||||
|
* @param FileSystem
|
||||||
|
* The file system object.
|
||||||
|
* @param EnumerateEa
|
||||||
|
* Pointer to function that receives a single extended attribute. The function
|
||||||
|
* should return STATUS_SUCCESS or an error code if unsuccessful.
|
||||||
|
* @param Context
|
||||||
|
* User context to supply to EnumEa.
|
||||||
|
* @param Ea
|
||||||
|
* Extended attributes buffer.
|
||||||
|
* @param EaLength
|
||||||
|
* Extended attributes buffer length.
|
||||||
|
* @return
|
||||||
|
* STATUS_SUCCESS or error code from EnumerateEa.
|
||||||
|
*/
|
||||||
|
FSP_API NTSTATUS FspFileSystemEnumerateEa(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
NTSTATUS (*EnumerateEa)(
|
||||||
|
FSP_FILE_SYSTEM *FileSystem, PVOID Context,
|
||||||
|
PFILE_FULL_EA_INFORMATION SingleEa),
|
||||||
|
PVOID Context,
|
||||||
|
PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength);
|
||||||
|
/**
|
||||||
|
* Add extended attribute to a buffer.
|
||||||
|
*
|
||||||
|
* This is a helper for implementing the GetEa operation.
|
||||||
|
*
|
||||||
|
* @param SingleEa
|
||||||
|
* The extended attribute to add. A value of NULL acts as an EOF marker for a GetEa
|
||||||
|
* operation.
|
||||||
|
* @param Ea
|
||||||
|
* Pointer to a buffer that will receive the extended attribute. This should contain
|
||||||
|
* the same value passed to the GetEa Ea parameter.
|
||||||
|
* @param EaLength
|
||||||
|
* Length of buffer. This should contain the same value passed to the GetEa
|
||||||
|
* EaLength parameter.
|
||||||
|
* @param PBytesTransferred [out]
|
||||||
|
* Pointer to a memory location that will receive the actual number of bytes stored. This should
|
||||||
|
* contain the same value passed to the GetEa PBytesTransferred parameter.
|
||||||
|
* @return
|
||||||
|
* TRUE if the extended attribute was added, FALSE if there was not enough space to add it.
|
||||||
|
* @see
|
||||||
|
* GetEa
|
||||||
|
*/
|
||||||
|
FSP_API BOOLEAN FspFileSystemAddEa(PFILE_FULL_EA_INFORMATION SingleEa,
|
||||||
|
PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength, PULONG PBytesTransferred);
|
||||||
|
/**
|
||||||
|
* Get extended attribute "packed" size. This computation matches what NTFS reports.
|
||||||
|
*
|
||||||
|
* @param SingleEa
|
||||||
|
* The extended attribute to get the size for.
|
||||||
|
* @return
|
||||||
|
* The packed size of the extended attribute.
|
||||||
|
*/
|
||||||
|
static inline
|
||||||
|
UINT32 FspFileSystemGetEaPackedSize(PFILE_FULL_EA_INFORMATION SingleEa)
|
||||||
|
{
|
||||||
|
/* magic computations are courtesy of NTFS */
|
||||||
|
return 5 + SingleEa->EaNameLength + SingleEa->EaValueLength;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Directory buffering
|
* Directory buffering
|
||||||
@ -1752,6 +2007,10 @@ FSP_API NTSTATUS FspCallNamedPipeSecurely(PWSTR PipeName,
|
|||||||
PVOID InBuffer, ULONG InBufferSize, PVOID OutBuffer, ULONG OutBufferSize,
|
PVOID InBuffer, ULONG InBufferSize, PVOID OutBuffer, ULONG OutBufferSize,
|
||||||
PULONG PBytesTransferred, ULONG Timeout,
|
PULONG PBytesTransferred, ULONG Timeout,
|
||||||
PSID Sid);
|
PSID Sid);
|
||||||
|
FSP_API NTSTATUS FspCallNamedPipeSecurelyEx(PWSTR PipeName,
|
||||||
|
PVOID InBuffer, ULONG InBufferSize, PVOID OutBuffer, ULONG OutBufferSize,
|
||||||
|
PULONG PBytesTransferred, ULONG Timeout, BOOLEAN AllowImpersonation,
|
||||||
|
PSID Sid);
|
||||||
FSP_API NTSTATUS FspVersion(PUINT32 PVersion);
|
FSP_API NTSTATUS FspVersion(PUINT32 PVersion);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* @file winfsp/winfsp.hpp
|
* @file winfsp/winfsp.hpp
|
||||||
* WinFsp C++ Layer.
|
* WinFsp C++ Layer.
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -11,9 +11,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef WINFSP_WINFSP_HPP_INCLUDED
|
#ifndef WINFSP_WINFSP_HPP_INCLUDED
|
||||||
@ -608,6 +612,14 @@ public:
|
|||||||
{
|
{
|
||||||
_VolumeParams.PassQueryDirectoryPattern = !!PassQueryDirectoryPattern;
|
_VolumeParams.PassQueryDirectoryPattern = !!PassQueryDirectoryPattern;
|
||||||
}
|
}
|
||||||
|
BOOLEAN FlushAndPurgeOnCleanup()
|
||||||
|
{
|
||||||
|
return _VolumeParams.FlushAndPurgeOnCleanup;
|
||||||
|
}
|
||||||
|
VOID SetFlushAndPurgeOnCleanup(BOOLEAN FlushAndPurgeOnCleanup)
|
||||||
|
{
|
||||||
|
_VolumeParams.FlushAndPurgeOnCleanup = !!FlushAndPurgeOnCleanup;
|
||||||
|
}
|
||||||
PWSTR Prefix()
|
PWSTR Prefix()
|
||||||
{
|
{
|
||||||
return _VolumeParams.Prefix;
|
return _VolumeParams.Prefix;
|
||||||
|
0
opt/cygfuse/Makefile
Executable file → Normal file
0
opt/cygfuse/Makefile
Executable file → Normal file
BIN
opt/cygfuse/dist/x64/fuse-2.8-10.tar.xz
vendored
Normal file
BIN
opt/cygfuse/dist/x64/fuse-2.8-10.tar.xz
vendored
Normal file
Binary file not shown.
BIN
opt/cygfuse/dist/x64/fuse-2.8-9.tar.xz
vendored
BIN
opt/cygfuse/dist/x64/fuse-2.8-9.tar.xz
vendored
Binary file not shown.
BIN
opt/cygfuse/dist/x64/fuse3-3.2-1.tar.xz
vendored
BIN
opt/cygfuse/dist/x64/fuse3-3.2-1.tar.xz
vendored
Binary file not shown.
BIN
opt/cygfuse/dist/x64/fuse3-3.2-2.tar.xz
vendored
Normal file
BIN
opt/cygfuse/dist/x64/fuse3-3.2-2.tar.xz
vendored
Normal file
Binary file not shown.
BIN
opt/cygfuse/dist/x86/fuse-2.8-10.tar.xz
vendored
Normal file
BIN
opt/cygfuse/dist/x86/fuse-2.8-10.tar.xz
vendored
Normal file
Binary file not shown.
BIN
opt/cygfuse/dist/x86/fuse-2.8-9.tar.xz
vendored
BIN
opt/cygfuse/dist/x86/fuse-2.8-9.tar.xz
vendored
Binary file not shown.
BIN
opt/cygfuse/dist/x86/fuse3-3.2-1.tar.xz
vendored
BIN
opt/cygfuse/dist/x86/fuse3-3.2-1.tar.xz
vendored
Binary file not shown.
BIN
opt/cygfuse/dist/x86/fuse3-3.2-2.tar.xz
vendored
Normal file
BIN
opt/cygfuse/dist/x86/fuse3-3.2-2.tar.xz
vendored
Normal file
Binary file not shown.
@ -1,6 +1,6 @@
|
|||||||
#include <fuse.h>
|
#include <fuse.h>
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
return !(FUSE_VERSION == fuse_version());
|
return !(FUSE_VERSION == fuse_version());
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file fuse/cygfuse.c
|
* @file fuse/cygfuse.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
NAME="fuse"
|
NAME="fuse"
|
||||||
VERSION=2.8
|
VERSION=2.8
|
||||||
RELEASE=9
|
RELEASE=10
|
||||||
CATEGORY="Utils"
|
CATEGORY="Utils"
|
||||||
SUMMARY="WinFsp FUSE compatibility layer"
|
SUMMARY="WinFsp FUSE compatibility layer"
|
||||||
DESCRIPTION="Enables FUSE file systems to be run on Cygwin."
|
DESCRIPTION="Enables FUSE file systems to be run on Cygwin."
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#include <fuse.h>
|
#include <fuse.h>
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
return !(FUSE_VERSION == fuse_version());
|
return !(FUSE_VERSION == fuse_version());
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file fuse3/cygfuse.c
|
* @file fuse3/cygfuse.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
NAME="fuse3"
|
NAME="fuse3"
|
||||||
VERSION=3.2
|
VERSION=3.2
|
||||||
RELEASE=1
|
RELEASE=2
|
||||||
CATEGORY="Utils"
|
CATEGORY="Utils"
|
||||||
SUMMARY="WinFsp FUSE3 compatibility layer"
|
SUMMARY="WinFsp FUSE3 compatibility layer"
|
||||||
DESCRIPTION="Enables FUSE3 file systems to be run on Cygwin."
|
DESCRIPTION="Enables FUSE3 file systems to be run on Cygwin."
|
||||||
|
96
opt/fsext/inc/winfsp/fsext.h
Normal file
96
opt/fsext/inc/winfsp/fsext.h
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
/**
|
||||||
|
* @file winfsp/fsext.h
|
||||||
|
*
|
||||||
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* This file is part of WinFsp.
|
||||||
|
*
|
||||||
|
* You can redistribute it and/or modify it under the terms of the GNU
|
||||||
|
* General Public License version 3 as published by the Free Software
|
||||||
|
* Foundation.
|
||||||
|
*
|
||||||
|
* Licensees holding a valid commercial license may use this software
|
||||||
|
* in accordance with the commercial license agreement provided in
|
||||||
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef WINFSP_FSEXT_H_INCLUDED
|
||||||
|
#define WINFSP_FSEXT_H_INCLUDED
|
||||||
|
|
||||||
|
#if !defined(_KERNEL_MODE)
|
||||||
|
#error This file can only be included when compiling for kernel mode.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <winfsp/fsctl.h>
|
||||||
|
|
||||||
|
#if defined(WINFSP_SYS_INTERNAL)
|
||||||
|
#define FSP_DDI __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define FSP_DDI __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
#if !defined(FSP_DDI_DEF)
|
||||||
|
#define FSP_DDI_DEF(RetType, Name, ...) FSP_DDI RetType NTAPI Name ( __VA_ARGS__ );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
UINT32 Version;
|
||||||
|
/* in */
|
||||||
|
UINT32 DeviceTransactCode;
|
||||||
|
UINT32 DeviceExtensionSize;
|
||||||
|
NTSTATUS (*DeviceInit)(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_PARAMS *VolumeParams);
|
||||||
|
VOID (*DeviceFini)(PDEVICE_OBJECT DeviceObject);
|
||||||
|
VOID (*DeviceExpirationRoutine)(PDEVICE_OBJECT DeviceObject, UINT64 ExpirationTime);
|
||||||
|
NTSTATUS (*DeviceTransact)(PDEVICE_OBJECT DeviceObject, PIRP Irp);
|
||||||
|
/* out */
|
||||||
|
UINT32 DeviceExtensionOffset;
|
||||||
|
} FSP_FSEXT_PROVIDER;
|
||||||
|
|
||||||
|
FSP_DDI_DEF(NTSTATUS, FspFsextProviderRegister,
|
||||||
|
FSP_FSEXT_PROVIDER *Provider)
|
||||||
|
FSP_DDI_DEF(NTSTATUS, FspFsextProviderTransact,
|
||||||
|
PDEVICE_OBJECT DeviceObject, PFILE_OBJECT FileObject,
|
||||||
|
FSP_FSCTL_TRANSACT_RSP *Response, FSP_FSCTL_TRANSACT_REQ **PRequest)
|
||||||
|
|
||||||
|
FSP_DDI_DEF(NTSTATUS, FspPosixMapUidToSid,
|
||||||
|
UINT32 Uid,
|
||||||
|
PSID *PSid)
|
||||||
|
FSP_DDI_DEF(NTSTATUS, FspPosixMapSidToUid,
|
||||||
|
PSID Sid,
|
||||||
|
PUINT32 PUid)
|
||||||
|
FSP_DDI_DEF(VOID, FspDeleteSid,
|
||||||
|
PSID Sid,
|
||||||
|
NTSTATUS (*CreateFunc)())
|
||||||
|
FSP_DDI_DEF(NTSTATUS, FspPosixMapPermissionsToSecurityDescriptor,
|
||||||
|
UINT32 Uid,
|
||||||
|
UINT32 Gid,
|
||||||
|
UINT32 Mode,
|
||||||
|
PSECURITY_DESCRIPTOR *PSecurityDescriptor)
|
||||||
|
FSP_DDI_DEF(NTSTATUS, FspPosixMapSecurityDescriptorToPermissions,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||||
|
PUINT32 PUid,
|
||||||
|
PUINT32 PGid,
|
||||||
|
PUINT32 PMode)
|
||||||
|
FSP_DDI_DEF(NTSTATUS, FspPosixMapWindowsToPosixPathEx,
|
||||||
|
PWSTR WindowsPath,
|
||||||
|
char **PPosixPath,
|
||||||
|
BOOLEAN Translate)
|
||||||
|
FSP_DDI_DEF(NTSTATUS, FspPosixMapPosixToWindowsPathEx,
|
||||||
|
const char *PosixPath,
|
||||||
|
PWSTR *PWindowsPath,
|
||||||
|
BOOLEAN Translate)
|
||||||
|
FSP_DDI_DEF(VOID, FspPosixDeletePath,
|
||||||
|
void *Path)
|
||||||
|
FSP_DDI_DEF(VOID, FspPosixEncodeWindowsPath,
|
||||||
|
PWSTR WindowsPath,
|
||||||
|
ULONG Size)
|
||||||
|
FSP_DDI_DEF(VOID, FspPosixDecodeWindowsPath,
|
||||||
|
PWSTR WindowsPath,
|
||||||
|
ULONG Size)
|
||||||
|
|
||||||
|
#endif
|
BIN
opt/fsext/lib/winfsp-x64.lib
Normal file
BIN
opt/fsext/lib/winfsp-x64.lib
Normal file
Binary file not shown.
BIN
opt/fsext/lib/winfsp-x86.lib
Normal file
BIN
opt/fsext/lib/winfsp-x86.lib
Normal file
Binary file not shown.
6
opt/fsext/lib/winfsp.impdef
Normal file
6
opt/fsext/lib/winfsp.impdef
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// tools\impdef.bat lib\winfsp.impdef lib\winfsp-x64.lib
|
||||||
|
// tools\impdef.bat lib\winfsp.impdef lib\winfsp-x86.lib
|
||||||
|
|
||||||
|
#define FSP_DDI_DEF(RetType, Name, ...) __declspec(dllexport) RetType NTAPI Name ( __VA_ARGS__ ) {}
|
||||||
|
#include <ntifs.h>
|
||||||
|
#include <winfsp/fsext.h>
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/debug.c
|
* @file dll/debug.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/dirbuf.c
|
* @file dll/dirbuf.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/eventlog.c
|
* @file dll/eventlog.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
|
354
src/dll/fs.c
354
src/dll/fs.c
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fs.c
|
* @file dll/fs.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
@ -20,41 +24,19 @@
|
|||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
FspFileSystemDispatcherThreadCountMin = 2,
|
FspFileSystemDispatcherThreadCountMin = 2,
|
||||||
|
FspFileSystemDispatcherDefaultThreadCountMin = 4,
|
||||||
|
FspFileSystemDispatcherDefaultThreadCountMax = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
static FSP_FILE_SYSTEM_INTERFACE FspFileSystemNullInterface;
|
static FSP_FILE_SYSTEM_INTERFACE FspFileSystemNullInterface;
|
||||||
|
|
||||||
static INIT_ONCE FspFileSystemInitOnce = INIT_ONCE_STATIC_INIT;
|
static INIT_ONCE FspFileSystemInitOnce = INIT_ONCE_STATIC_INIT;
|
||||||
static DWORD FspFileSystemTlsKey = TLS_OUT_OF_INDEXES;
|
static DWORD FspFileSystemTlsKey = TLS_OUT_OF_INDEXES;
|
||||||
static NTSTATUS (NTAPI *FspNtOpenSymbolicLinkObject)(
|
|
||||||
PHANDLE LinkHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes);
|
|
||||||
static NTSTATUS (NTAPI *FspNtMakeTemporaryObject)(
|
|
||||||
HANDLE Handle);
|
|
||||||
static NTSTATUS (NTAPI *FspNtClose)(
|
|
||||||
HANDLE Handle);
|
|
||||||
|
|
||||||
static BOOL WINAPI FspFileSystemInitialize(
|
static BOOL WINAPI FspFileSystemInitialize(
|
||||||
PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context)
|
PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context)
|
||||||
{
|
{
|
||||||
HANDLE Handle;
|
|
||||||
|
|
||||||
FspFileSystemTlsKey = TlsAlloc();
|
FspFileSystemTlsKey = TlsAlloc();
|
||||||
|
|
||||||
Handle = GetModuleHandleW(L"ntdll.dll");
|
|
||||||
if (0 != Handle)
|
|
||||||
{
|
|
||||||
FspNtOpenSymbolicLinkObject = (PVOID)GetProcAddress(Handle, "NtOpenSymbolicLinkObject");
|
|
||||||
FspNtMakeTemporaryObject = (PVOID)GetProcAddress(Handle, "NtMakeTemporaryObject");
|
|
||||||
FspNtClose = (PVOID)GetProcAddress(Handle, "NtClose");
|
|
||||||
|
|
||||||
if (0 == FspNtOpenSymbolicLinkObject || 0 == FspNtMakeTemporaryObject || 0 == FspNtClose)
|
|
||||||
{
|
|
||||||
FspNtOpenSymbolicLinkObject = 0;
|
|
||||||
FspNtMakeTemporaryObject = 0;
|
|
||||||
FspNtClose = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,7 +69,9 @@ FSP_API NTSTATUS FspFileSystemPreflight(PWSTR DevicePath,
|
|||||||
Result = STATUS_SUCCESS;
|
Result = STATUS_SUCCESS;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (FspPathIsDrive(MountPoint))
|
if (FspPathIsMountmgrMountPoint(MountPoint))
|
||||||
|
Result = STATUS_SUCCESS; /* cannot check with the mount manager, assume success */
|
||||||
|
else if (FspPathIsDrive(MountPoint))
|
||||||
Result = QueryDosDeviceW(MountPoint, TargetPath, MAX_PATH) ?
|
Result = QueryDosDeviceW(MountPoint, TargetPath, MAX_PATH) ?
|
||||||
STATUS_OBJECT_NAME_COLLISION : STATUS_SUCCESS;
|
STATUS_OBJECT_NAME_COLLISION : STATUS_SUCCESS;
|
||||||
else
|
else
|
||||||
@ -157,6 +141,8 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath,
|
|||||||
FileSystem->Operations[FspFsctlTransactWriteKind] = FspFileSystemOpWrite;
|
FileSystem->Operations[FspFsctlTransactWriteKind] = FspFileSystemOpWrite;
|
||||||
FileSystem->Operations[FspFsctlTransactQueryInformationKind] = FspFileSystemOpQueryInformation;
|
FileSystem->Operations[FspFsctlTransactQueryInformationKind] = FspFileSystemOpQueryInformation;
|
||||||
FileSystem->Operations[FspFsctlTransactSetInformationKind] = FspFileSystemOpSetInformation;
|
FileSystem->Operations[FspFsctlTransactSetInformationKind] = FspFileSystemOpSetInformation;
|
||||||
|
FileSystem->Operations[FspFsctlTransactQueryEaKind] = FspFileSystemOpQueryEa;
|
||||||
|
FileSystem->Operations[FspFsctlTransactSetEaKind] = FspFileSystemOpSetEa;
|
||||||
FileSystem->Operations[FspFsctlTransactFlushBuffersKind] = FspFileSystemOpFlushBuffers;
|
FileSystem->Operations[FspFsctlTransactFlushBuffersKind] = FspFileSystemOpFlushBuffers;
|
||||||
FileSystem->Operations[FspFsctlTransactQueryVolumeInformationKind] = FspFileSystemOpQueryVolumeInformation;
|
FileSystem->Operations[FspFsctlTransactQueryVolumeInformationKind] = FspFileSystemOpQueryVolumeInformation;
|
||||||
FileSystem->Operations[FspFsctlTransactSetVolumeInformationKind] = FspFileSystemOpSetVolumeInformation;
|
FileSystem->Operations[FspFsctlTransactSetVolumeInformationKind] = FspFileSystemOpSetVolumeInformation;
|
||||||
@ -188,205 +174,6 @@ FSP_API VOID FspFileSystemDelete(FSP_FILE_SYSTEM *FileSystem)
|
|||||||
MemFree(FileSystem);
|
MemFree(FileSystem);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS FspFileSystemLauncherDefineDosDevice(
|
|
||||||
WCHAR Sign, PWSTR MountPoint, PWSTR VolumeName)
|
|
||||||
{
|
|
||||||
if (2 != lstrlenW(MountPoint) ||
|
|
||||||
FSP_FSCTL_VOLUME_NAME_SIZEMAX / sizeof(WCHAR) <= lstrlenW(VolumeName))
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
|
||||||
|
|
||||||
WCHAR Argv0[4];
|
|
||||||
PWSTR Argv[2];
|
|
||||||
NTSTATUS Result;
|
|
||||||
ULONG ErrorCode;
|
|
||||||
|
|
||||||
Argv0[0] = Sign;
|
|
||||||
Argv0[1] = MountPoint[0];
|
|
||||||
Argv0[2] = MountPoint[1];
|
|
||||||
Argv0[3] = L'\0';
|
|
||||||
|
|
||||||
Argv[0] = Argv0;
|
|
||||||
Argv[1] = VolumeName;
|
|
||||||
|
|
||||||
Result = FspLaunchCallLauncherPipe(FspLaunchCmdDefineDosDevice, 2, Argv, 0, 0, 0, &ErrorCode);
|
|
||||||
return !NT_SUCCESS(Result) ? Result : FspNtStatusFromWin32(ErrorCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
static NTSTATUS FspFileSystemSetMountPoint_Drive(PWSTR MountPoint, PWSTR VolumeName,
|
|
||||||
PHANDLE PMountHandle)
|
|
||||||
{
|
|
||||||
NTSTATUS Result;
|
|
||||||
BOOLEAN IsLocalSystem, IsServiceContext;
|
|
||||||
|
|
||||||
*PMountHandle = 0;
|
|
||||||
|
|
||||||
Result = FspServiceContextCheck(0, &IsLocalSystem);
|
|
||||||
IsServiceContext = NT_SUCCESS(Result) && !IsLocalSystem;
|
|
||||||
if (IsServiceContext)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* If the current process is in the service context but not LocalSystem,
|
|
||||||
* ask the launcher to DefineDosDevice for us. This is because the launcher
|
|
||||||
* runs in the LocalSystem context and can create global drives.
|
|
||||||
*
|
|
||||||
* In this case the launcher will also add DELETE access to the drive symlink
|
|
||||||
* for us, so that we can make it temporary below.
|
|
||||||
*/
|
|
||||||
Result = FspFileSystemLauncherDefineDosDevice(L'+', MountPoint, VolumeName);
|
|
||||||
if (!NT_SUCCESS(Result))
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!DefineDosDeviceW(DDD_RAW_TARGET_PATH, MountPoint, VolumeName))
|
|
||||||
return FspNtStatusFromWin32(GetLastError());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 != FspNtOpenSymbolicLinkObject)
|
|
||||||
{
|
|
||||||
WCHAR SymlinkBuf[6];
|
|
||||||
UNICODE_STRING Symlink;
|
|
||||||
OBJECT_ATTRIBUTES Obja;
|
|
||||||
|
|
||||||
memcpy(SymlinkBuf, L"\\??\\X:", sizeof SymlinkBuf);
|
|
||||||
SymlinkBuf[4] = MountPoint[0];
|
|
||||||
Symlink.Length = Symlink.MaximumLength = sizeof SymlinkBuf;
|
|
||||||
Symlink.Buffer = SymlinkBuf;
|
|
||||||
|
|
||||||
memset(&Obja, 0, sizeof Obja);
|
|
||||||
Obja.Length = sizeof Obja;
|
|
||||||
Obja.ObjectName = &Symlink;
|
|
||||||
Obja.Attributes = OBJ_CASE_INSENSITIVE;
|
|
||||||
|
|
||||||
Result = FspNtOpenSymbolicLinkObject(PMountHandle, DELETE, &Obja);
|
|
||||||
if (NT_SUCCESS(Result))
|
|
||||||
{
|
|
||||||
Result = FspNtMakeTemporaryObject(*PMountHandle);
|
|
||||||
if (!NT_SUCCESS(Result))
|
|
||||||
{
|
|
||||||
FspNtClose(*PMountHandle);
|
|
||||||
*PMountHandle = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* HACK:
|
|
||||||
*
|
|
||||||
* Handles do not use the low 2 bits (unless they are console handles).
|
|
||||||
* Abuse this fact to remember that we are running in the service context.
|
|
||||||
*/
|
|
||||||
*PMountHandle = (HANDLE)(UINT_PTR)((DWORD)(UINT_PTR)*PMountHandle | IsServiceContext);
|
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static NTSTATUS FspFileSystemSetMountPoint_Directory(PWSTR MountPoint, PWSTR VolumeName,
|
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor, PHANDLE PMountHandle)
|
|
||||||
{
|
|
||||||
NTSTATUS Result;
|
|
||||||
SECURITY_ATTRIBUTES SecurityAttributes;
|
|
||||||
HANDLE MountHandle = INVALID_HANDLE_VALUE;
|
|
||||||
DWORD Backslashes, Bytes;
|
|
||||||
USHORT VolumeNameLength, BackslashLength, ReparseDataLength;
|
|
||||||
PREPARSE_DATA_BUFFER ReparseData = 0;
|
|
||||||
PWSTR P, PathBuffer;
|
|
||||||
|
|
||||||
*PMountHandle = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Windows does not allow mount points (junctions) to point to network file systems.
|
|
||||||
*
|
|
||||||
* Count how many backslashes our VolumeName has. If it is 3 or more this is a network
|
|
||||||
* file system. Preemptively return STATUS_NETWORK_ACCESS_DENIED.
|
|
||||||
*/
|
|
||||||
for (P = VolumeName, Backslashes = 0; *P; P++)
|
|
||||||
if (L'\\' == *P)
|
|
||||||
if (3 == ++Backslashes)
|
|
||||||
{
|
|
||||||
Result = STATUS_NETWORK_ACCESS_DENIED;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&SecurityAttributes, 0, sizeof SecurityAttributes);
|
|
||||||
SecurityAttributes.nLength = sizeof SecurityAttributes;
|
|
||||||
SecurityAttributes.lpSecurityDescriptor = SecurityDescriptor;
|
|
||||||
|
|
||||||
MountHandle = CreateFileW(MountPoint,
|
|
||||||
FILE_WRITE_ATTRIBUTES,
|
|
||||||
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
|
||||||
&SecurityAttributes,
|
|
||||||
CREATE_NEW,
|
|
||||||
FILE_ATTRIBUTE_DIRECTORY |
|
|
||||||
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS | FILE_FLAG_DELETE_ON_CLOSE,
|
|
||||||
0);
|
|
||||||
if (INVALID_HANDLE_VALUE == MountHandle)
|
|
||||||
{
|
|
||||||
Result = FspNtStatusFromWin32(GetLastError());
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
VolumeNameLength = (USHORT)lstrlenW(VolumeName);
|
|
||||||
BackslashLength = 0 == VolumeNameLength || L'\\' != VolumeName[VolumeNameLength - 1];
|
|
||||||
VolumeNameLength *= sizeof(WCHAR);
|
|
||||||
BackslashLength *= sizeof(WCHAR);
|
|
||||||
|
|
||||||
ReparseDataLength = (USHORT)(
|
|
||||||
FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer) -
|
|
||||||
FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer)) +
|
|
||||||
2 * (VolumeNameLength + BackslashLength + sizeof(WCHAR));
|
|
||||||
ReparseData = MemAlloc(REPARSE_DATA_BUFFER_HEADER_SIZE + ReparseDataLength);
|
|
||||||
if (0 == ReparseData)
|
|
||||||
{
|
|
||||||
Result = STATUS_INSUFFICIENT_RESOURCES;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReparseData->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
|
|
||||||
ReparseData->ReparseDataLength = ReparseDataLength;
|
|
||||||
ReparseData->Reserved = 0;
|
|
||||||
ReparseData->MountPointReparseBuffer.SubstituteNameOffset = 0;
|
|
||||||
ReparseData->MountPointReparseBuffer.SubstituteNameLength =
|
|
||||||
VolumeNameLength + BackslashLength;
|
|
||||||
ReparseData->MountPointReparseBuffer.PrintNameOffset =
|
|
||||||
ReparseData->MountPointReparseBuffer.SubstituteNameLength + sizeof(WCHAR);
|
|
||||||
ReparseData->MountPointReparseBuffer.PrintNameLength =
|
|
||||||
VolumeNameLength + BackslashLength;
|
|
||||||
|
|
||||||
PathBuffer = ReparseData->MountPointReparseBuffer.PathBuffer;
|
|
||||||
memcpy(PathBuffer, VolumeName, VolumeNameLength);
|
|
||||||
if (BackslashLength)
|
|
||||||
PathBuffer[VolumeNameLength / sizeof(WCHAR)] = L'\\';
|
|
||||||
PathBuffer[(VolumeNameLength + BackslashLength) / sizeof(WCHAR)] = L'\0';
|
|
||||||
|
|
||||||
PathBuffer = ReparseData->MountPointReparseBuffer.PathBuffer +
|
|
||||||
(ReparseData->MountPointReparseBuffer.PrintNameOffset) / sizeof(WCHAR);
|
|
||||||
memcpy(PathBuffer, VolumeName, VolumeNameLength);
|
|
||||||
if (BackslashLength)
|
|
||||||
PathBuffer[VolumeNameLength / sizeof(WCHAR)] = L'\\';
|
|
||||||
PathBuffer[(VolumeNameLength + BackslashLength) / sizeof(WCHAR)] = L'\0';
|
|
||||||
|
|
||||||
if (!DeviceIoControl(MountHandle, FSCTL_SET_REPARSE_POINT,
|
|
||||||
ReparseData, REPARSE_DATA_BUFFER_HEADER_SIZE + ReparseData->ReparseDataLength,
|
|
||||||
0, 0,
|
|
||||||
&Bytes, 0))
|
|
||||||
{
|
|
||||||
Result = FspNtStatusFromWin32(GetLastError());
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
*PMountHandle = MountHandle;
|
|
||||||
|
|
||||||
Result = STATUS_SUCCESS;
|
|
||||||
|
|
||||||
exit:
|
|
||||||
if (!NT_SUCCESS(Result) && INVALID_HANDLE_VALUE != MountHandle)
|
|
||||||
CloseHandle(MountHandle);
|
|
||||||
|
|
||||||
MemFree(ReparseData);
|
|
||||||
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
FSP_API NTSTATUS FspFileSystemSetMountPoint(FSP_FILE_SYSTEM *FileSystem, PWSTR MountPoint)
|
FSP_API NTSTATUS FspFileSystemSetMountPoint(FSP_FILE_SYSTEM *FileSystem, PWSTR MountPoint)
|
||||||
{
|
{
|
||||||
return FspFileSystemSetMountPointEx(FileSystem, MountPoint, 0);
|
return FspFileSystemSetMountPointEx(FileSystem, MountPoint, 0);
|
||||||
@ -398,105 +185,55 @@ FSP_API NTSTATUS FspFileSystemSetMountPointEx(FSP_FILE_SYSTEM *FileSystem, PWSTR
|
|||||||
if (0 != FileSystem->MountPoint)
|
if (0 != FileSystem->MountPoint)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
FSP_MOUNT_DESC Desc;
|
||||||
|
int Size;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
HANDLE MountHandle = 0;
|
|
||||||
|
memset(&Desc, 0, sizeof Desc);
|
||||||
|
Desc.VolumeHandle = FileSystem->VolumeHandle;
|
||||||
|
Desc.VolumeName = FileSystem->VolumeName;
|
||||||
|
Desc.Security = SecurityDescriptor;
|
||||||
|
|
||||||
if (0 == MountPoint)
|
if (0 == MountPoint)
|
||||||
|
MountPoint = L"*:";
|
||||||
|
|
||||||
|
Size = (lstrlenW(MountPoint) + 1) * sizeof(WCHAR);
|
||||||
|
Desc.MountPoint = MemAlloc(Size);
|
||||||
|
if (0 == Desc.MountPoint)
|
||||||
{
|
{
|
||||||
DWORD Drives;
|
Result = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
WCHAR Drive;
|
goto exit;
|
||||||
|
|
||||||
MountPoint = MemAlloc(3 * sizeof(WCHAR));
|
|
||||||
if (0 == MountPoint)
|
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
|
||||||
MountPoint[1] = L':';
|
|
||||||
MountPoint[2] = L'\0';
|
|
||||||
|
|
||||||
Drives = GetLogicalDrives();
|
|
||||||
if (0 != Drives)
|
|
||||||
{
|
|
||||||
for (Drive = 'Z'; 'D' <= Drive; Drive--)
|
|
||||||
if (0 == (Drives & (1 << (Drive - 'A'))))
|
|
||||||
{
|
|
||||||
MountPoint[0] = Drive;
|
|
||||||
Result = FspFileSystemSetMountPoint_Drive(MountPoint, FileSystem->VolumeName,
|
|
||||||
&MountHandle);
|
|
||||||
if (NT_SUCCESS(Result))
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
Result = STATUS_NO_SUCH_DEVICE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Result = FspNtStatusFromWin32(GetLastError());
|
|
||||||
}
|
}
|
||||||
else
|
memcpy(Desc.MountPoint, MountPoint, Size);
|
||||||
{
|
|
||||||
PWSTR P;
|
|
||||||
ULONG L;
|
|
||||||
|
|
||||||
L = (ULONG)((lstrlenW(MountPoint) + 1) * sizeof(WCHAR));
|
Result = FspMountSet(&Desc);
|
||||||
|
|
||||||
P = MemAlloc(L);
|
|
||||||
if (0 == P)
|
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
|
||||||
memcpy(P, MountPoint, L);
|
|
||||||
MountPoint = P;
|
|
||||||
|
|
||||||
if (FspPathIsDrive(MountPoint))
|
|
||||||
Result = FspFileSystemSetMountPoint_Drive(MountPoint, FileSystem->VolumeName,
|
|
||||||
&MountHandle);
|
|
||||||
else
|
|
||||||
Result = FspFileSystemSetMountPoint_Directory(MountPoint, FileSystem->VolumeName,
|
|
||||||
SecurityDescriptor, &MountHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
if (NT_SUCCESS(Result))
|
if (NT_SUCCESS(Result))
|
||||||
{
|
{
|
||||||
FileSystem->MountPoint = MountPoint;
|
FileSystem->MountPoint = Desc.MountPoint;
|
||||||
FileSystem->MountHandle = MountHandle;
|
FileSystem->MountHandle = Desc.MountHandle;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
MemFree(MountPoint);
|
MemFree(Desc.MountPoint);
|
||||||
|
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID FspFileSystemRemoveMountPoint_Drive(PWSTR MountPoint, PWSTR VolumeName, HANDLE MountHandle)
|
|
||||||
{
|
|
||||||
BOOLEAN IsServiceContext = 0 != ((DWORD)(UINT_PTR)MountHandle & 1);
|
|
||||||
MountHandle = (HANDLE)(UINT_PTR)((DWORD)(UINT_PTR)MountHandle & ~1);
|
|
||||||
if (IsServiceContext)
|
|
||||||
/*
|
|
||||||
* If the current process is in the service context but not LocalSystem,
|
|
||||||
* ask the launcher to DefineDosDevice for us. This is because the launcher
|
|
||||||
* runs in the LocalSystem context and can remove global drives.
|
|
||||||
*/
|
|
||||||
FspFileSystemLauncherDefineDosDevice(L'-', MountPoint, VolumeName);
|
|
||||||
else
|
|
||||||
DefineDosDeviceW(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE,
|
|
||||||
MountPoint, VolumeName);
|
|
||||||
|
|
||||||
if (0 != MountHandle)
|
|
||||||
FspNtClose(MountHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VOID FspFileSystemRemoveMountPoint_Directory(HANDLE MountHandle)
|
|
||||||
{
|
|
||||||
/* directory is marked DELETE_ON_CLOSE */
|
|
||||||
CloseHandle(MountHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
FSP_API VOID FspFileSystemRemoveMountPoint(FSP_FILE_SYSTEM *FileSystem)
|
FSP_API VOID FspFileSystemRemoveMountPoint(FSP_FILE_SYSTEM *FileSystem)
|
||||||
{
|
{
|
||||||
if (0 == FileSystem->MountPoint)
|
if (0 == FileSystem->MountPoint)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (FspPathIsDrive(FileSystem->MountPoint))
|
FSP_MOUNT_DESC Desc;
|
||||||
FspFileSystemRemoveMountPoint_Drive(FileSystem->MountPoint, FileSystem->VolumeName,
|
|
||||||
FileSystem->MountHandle);
|
memset(&Desc, 0, sizeof Desc);
|
||||||
else
|
Desc.VolumeHandle = FileSystem->VolumeHandle;
|
||||||
FspFileSystemRemoveMountPoint_Directory(FileSystem->MountHandle);
|
Desc.VolumeName = FileSystem->VolumeName;
|
||||||
|
Desc.MountPoint = FileSystem->MountPoint;
|
||||||
|
Desc.MountHandle = FileSystem->MountHandle;
|
||||||
|
|
||||||
|
FspMountRemove(&Desc);
|
||||||
|
|
||||||
MemFree(FileSystem->MountPoint);
|
MemFree(FileSystem->MountPoint);
|
||||||
FileSystem->MountPoint = 0;
|
FileSystem->MountPoint = 0;
|
||||||
@ -630,6 +367,11 @@ FSP_API NTSTATUS FspFileSystemStartDispatcher(FSP_FILE_SYSTEM *FileSystem, ULONG
|
|||||||
|
|
||||||
for (ThreadCount = 0; 0 != ProcessMask; ProcessMask >>= 1)
|
for (ThreadCount = 0; 0 != ProcessMask; ProcessMask >>= 1)
|
||||||
ThreadCount += ProcessMask & 1;
|
ThreadCount += ProcessMask & 1;
|
||||||
|
|
||||||
|
if (ThreadCount < FspFileSystemDispatcherDefaultThreadCountMin)
|
||||||
|
ThreadCount = FspFileSystemDispatcherDefaultThreadCountMin;
|
||||||
|
else if (ThreadCount > FspFileSystemDispatcherDefaultThreadCountMax)
|
||||||
|
ThreadCount = FspFileSystemDispatcherDefaultThreadCountMax;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ThreadCount < FspFileSystemDispatcherThreadCountMin)
|
if (ThreadCount < FspFileSystemDispatcherThreadCountMin)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fsctl.c
|
* @file dll/fsctl.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
@ -103,6 +107,20 @@ exit:
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FSP_API NTSTATUS FspFsctlMakeMountdev(HANDLE VolumeHandle,
|
||||||
|
BOOLEAN Persistent, GUID *UniqueId)
|
||||||
|
{
|
||||||
|
DWORD Bytes;
|
||||||
|
|
||||||
|
if (!DeviceIoControl(VolumeHandle,
|
||||||
|
FSP_FSCTL_MOUNTDEV,
|
||||||
|
&Persistent, sizeof Persistent, UniqueId, sizeof *UniqueId,
|
||||||
|
&Bytes, 0))
|
||||||
|
return FspNtStatusFromWin32(GetLastError());
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
|
FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
|
||||||
PVOID ResponseBuf, SIZE_T ResponseBufSize,
|
PVOID ResponseBuf, SIZE_T ResponseBufSize,
|
||||||
PVOID RequestBuf, SIZE_T *PRequestBufSize,
|
PVOID RequestBuf, SIZE_T *PRequestBufSize,
|
||||||
|
273
src/dll/fsop.c
273
src/dll/fsop.c
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fsop.c
|
* @file dll/fsop.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
@ -238,7 +242,8 @@ NTSTATUS FspFileSystemCreateCheck(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
static inline
|
static inline
|
||||||
NTSTATUS FspFileSystemOpenCheck(FSP_FILE_SYSTEM *FileSystem,
|
NTSTATUS FspFileSystemOpenCheck(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response,
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response,
|
||||||
BOOLEAN AllowTraverseCheck, PUINT32 PGrantedAccess)
|
BOOLEAN AllowTraverseCheck, PUINT32 PGrantedAccess,
|
||||||
|
PSECURITY_DESCRIPTOR *PSecurityDescriptor)
|
||||||
{
|
{
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
UINT32 GrantedAccess;
|
UINT32 GrantedAccess;
|
||||||
@ -253,10 +258,11 @@ NTSTATUS FspFileSystemOpenCheck(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
* requested in DesiredAccess.
|
* requested in DesiredAccess.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Result = FspAccessCheck(FileSystem, Request, FALSE, AllowTraverseCheck,
|
Result = FspAccessCheckEx(FileSystem, Request, FALSE, AllowTraverseCheck,
|
||||||
Request->Req.Create.DesiredAccess |
|
Request->Req.Create.DesiredAccess |
|
||||||
((Request->Req.Create.CreateOptions & FILE_DELETE_ON_CLOSE) ? DELETE : 0),
|
((Request->Req.Create.CreateOptions & FILE_DELETE_ON_CLOSE) ? DELETE : 0),
|
||||||
&GrantedAccess);
|
&GrantedAccess,
|
||||||
|
Request->Req.Create.AcceptsSecurityDescriptor ? PSecurityDescriptor : 0);
|
||||||
if (STATUS_REPARSE == Result)
|
if (STATUS_REPARSE == Result)
|
||||||
Result = FspFileSystemCallResolveReparsePoints(FileSystem, Request, Response, GrantedAccess);
|
Result = FspFileSystemCallResolveReparsePoints(FileSystem, Request, Response, GrantedAccess);
|
||||||
else if (NT_SUCCESS(Result))
|
else if (NT_SUCCESS(Result))
|
||||||
@ -387,21 +393,40 @@ NTSTATUS FspFileSystemRenameCheck(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
VOID FspFileSystemOpCreate_SetOpenDescriptor(FSP_FSCTL_TRANSACT_RSP *Response,
|
||||||
|
PSECURITY_DESCRIPTOR OpenDescriptor)
|
||||||
|
{
|
||||||
|
FSP_FSCTL_TRANSACT_BUF Buf;
|
||||||
|
Buf.Offset = FSP_FSCTL_DEFAULT_ALIGN_UP(Response->Rsp.Create.Opened.FileName.Size);
|
||||||
|
Buf.Size = (UINT16)GetSecurityDescriptorLength(OpenDescriptor);
|
||||||
|
|
||||||
|
if (FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX >= Buf.Offset + Buf.Size)
|
||||||
|
{
|
||||||
|
Response->Size += Buf.Offset + Buf.Size;
|
||||||
|
Response->Rsp.Create.Opened.SecurityDescriptor.Offset = Buf.Offset;
|
||||||
|
Response->Rsp.Create.Opened.SecurityDescriptor.Size = Buf.Size;
|
||||||
|
Response->Rsp.Create.Opened.HasSecurityDescriptor = 1;
|
||||||
|
memcpy(Response->Buffer + Buf.Offset, OpenDescriptor, Buf.Size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
{
|
{
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
UINT32 GrantedAccess;
|
UINT32 GrantedAccess;
|
||||||
PSECURITY_DESCRIPTOR ParentDescriptor, ObjectDescriptor;
|
PSECURITY_DESCRIPTOR ParentDescriptor;
|
||||||
FSP_FSCTL_TRANSACT_FULL_CONTEXT FullContext;
|
FSP_FSCTL_TRANSACT_FULL_CONTEXT FullContext;
|
||||||
FSP_FSCTL_OPEN_FILE_INFO OpenFileInfo;
|
FSP_FSCTL_OPEN_FILE_INFO OpenFileInfo;
|
||||||
|
PSECURITY_DESCRIPTOR OpenDescriptor = 0;
|
||||||
|
|
||||||
Result = FspFileSystemCreateCheck(FileSystem, Request, Response, TRUE,
|
Result = FspFileSystemCreateCheck(FileSystem, Request, Response, TRUE,
|
||||||
&GrantedAccess, &ParentDescriptor);
|
&GrantedAccess, &ParentDescriptor);
|
||||||
if (!NT_SUCCESS(Result) || STATUS_REPARSE == Result)
|
if (!NT_SUCCESS(Result) || STATUS_REPARSE == Result)
|
||||||
return Result;
|
return Result;
|
||||||
|
|
||||||
Result = FspCreateSecurityDescriptor(FileSystem, Request, ParentDescriptor, &ObjectDescriptor);
|
Result = FspCreateSecurityDescriptor(FileSystem, Request, ParentDescriptor, &OpenDescriptor);
|
||||||
FspDeleteSecurityDescriptor(ParentDescriptor, FspAccessCheckEx);
|
FspDeleteSecurityDescriptor(ParentDescriptor, FspAccessCheckEx);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return Result;
|
return Result;
|
||||||
@ -411,13 +436,25 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
memset(&OpenFileInfo, 0, sizeof OpenFileInfo);
|
memset(&OpenFileInfo, 0, sizeof OpenFileInfo);
|
||||||
OpenFileInfo.NormalizedName = (PVOID)Response->Buffer;
|
OpenFileInfo.NormalizedName = (PVOID)Response->Buffer;
|
||||||
OpenFileInfo.NormalizedNameSize = FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX;
|
OpenFileInfo.NormalizedNameSize = FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX;
|
||||||
Result = FileSystem->Interface->Create(FileSystem,
|
if (0 != FileSystem->Interface->CreateEx)
|
||||||
(PWSTR)Request->Buffer, Request->Req.Create.CreateOptions, GrantedAccess,
|
Result = FileSystem->Interface->CreateEx(FileSystem,
|
||||||
Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize,
|
(PWSTR)Request->Buffer, Request->Req.Create.CreateOptions, GrantedAccess,
|
||||||
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
Request->Req.Create.FileAttributes, OpenDescriptor, Request->Req.Create.AllocationSize,
|
||||||
FspDeleteSecurityDescriptor(ObjectDescriptor, FspCreateSecurityDescriptor);
|
0 != Request->Req.Create.Ea.Size ?
|
||||||
|
(PVOID)(Request->Buffer + Request->Req.Create.Ea.Offset) : 0,
|
||||||
|
Request->Req.Create.Ea.Size,
|
||||||
|
Request->Req.Create.EaIsReparsePoint,
|
||||||
|
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
||||||
|
else
|
||||||
|
Result = FileSystem->Interface->Create(FileSystem,
|
||||||
|
(PWSTR)Request->Buffer, Request->Req.Create.CreateOptions, GrantedAccess,
|
||||||
|
Request->Req.Create.FileAttributes, OpenDescriptor, Request->Req.Create.AllocationSize,
|
||||||
|
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
FspDeleteSecurityDescriptor(OpenDescriptor, FspCreateSecurityDescriptor);
|
||||||
return Result;
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
if (FSP_FSCTL_TRANSACT_PATH_SIZEMAX >= OpenFileInfo.NormalizedNameSize)
|
if (FSP_FSCTL_TRANSACT_PATH_SIZEMAX >= OpenFileInfo.NormalizedNameSize)
|
||||||
{
|
{
|
||||||
@ -426,6 +463,12 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
Response->Rsp.Create.Opened.FileName.Size = (UINT16)OpenFileInfo.NormalizedNameSize;
|
Response->Rsp.Create.Opened.FileName.Size = (UINT16)OpenFileInfo.NormalizedNameSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (0 != OpenDescriptor)
|
||||||
|
{
|
||||||
|
FspFileSystemOpCreate_SetOpenDescriptor(Response, OpenDescriptor);
|
||||||
|
FspDeleteSecurityDescriptor(OpenDescriptor, FspCreateSecurityDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
Response->IoStatus.Information = FILE_CREATED;
|
Response->IoStatus.Information = FILE_CREATED;
|
||||||
SetFileContext(Response->Rsp.Create.Opened, FullContext);
|
SetFileContext(Response->Rsp.Create.Opened, FullContext);
|
||||||
Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess;
|
Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess;
|
||||||
@ -441,8 +484,10 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
UINT32 GrantedAccess;
|
UINT32 GrantedAccess;
|
||||||
FSP_FSCTL_TRANSACT_FULL_CONTEXT FullContext;
|
FSP_FSCTL_TRANSACT_FULL_CONTEXT FullContext;
|
||||||
FSP_FSCTL_OPEN_FILE_INFO OpenFileInfo;
|
FSP_FSCTL_OPEN_FILE_INFO OpenFileInfo;
|
||||||
|
PSECURITY_DESCRIPTOR OpenDescriptor = 0;
|
||||||
|
|
||||||
Result = FspFileSystemOpenCheck(FileSystem, Request, Response, TRUE, &GrantedAccess);
|
Result = FspFileSystemOpenCheck(FileSystem, Request, Response, TRUE, &GrantedAccess,
|
||||||
|
&OpenDescriptor);
|
||||||
if (!NT_SUCCESS(Result) || STATUS_REPARSE == Result)
|
if (!NT_SUCCESS(Result) || STATUS_REPARSE == Result)
|
||||||
return Result;
|
return Result;
|
||||||
|
|
||||||
@ -455,7 +500,10 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
(PWSTR)Request->Buffer, Request->Req.Create.CreateOptions, GrantedAccess,
|
(PWSTR)Request->Buffer, Request->Req.Create.CreateOptions, GrantedAccess,
|
||||||
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
FspDeleteSecurityDescriptor(OpenDescriptor, FspAccessCheckEx);
|
||||||
return Result;
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
if (FSP_FSCTL_TRANSACT_PATH_SIZEMAX >= OpenFileInfo.NormalizedNameSize)
|
if (FSP_FSCTL_TRANSACT_PATH_SIZEMAX >= OpenFileInfo.NormalizedNameSize)
|
||||||
{
|
{
|
||||||
@ -464,6 +512,12 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
Response->Rsp.Create.Opened.FileName.Size = (UINT16)OpenFileInfo.NormalizedNameSize;
|
Response->Rsp.Create.Opened.FileName.Size = (UINT16)OpenFileInfo.NormalizedNameSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (0 != OpenDescriptor)
|
||||||
|
{
|
||||||
|
FspFileSystemOpCreate_SetOpenDescriptor(Response, OpenDescriptor);
|
||||||
|
FspDeleteSecurityDescriptor(OpenDescriptor, FspAccessCheckEx);
|
||||||
|
}
|
||||||
|
|
||||||
Response->IoStatus.Information = FILE_OPENED;
|
Response->IoStatus.Information = FILE_OPENED;
|
||||||
SetFileContext(Response->Rsp.Create.Opened, FullContext);
|
SetFileContext(Response->Rsp.Create.Opened, FullContext);
|
||||||
Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess;
|
Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess;
|
||||||
@ -477,12 +531,14 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
{
|
{
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
UINT32 GrantedAccess;
|
UINT32 GrantedAccess;
|
||||||
PSECURITY_DESCRIPTOR ParentDescriptor, ObjectDescriptor;
|
PSECURITY_DESCRIPTOR ParentDescriptor;
|
||||||
FSP_FSCTL_TRANSACT_FULL_CONTEXT FullContext;
|
FSP_FSCTL_TRANSACT_FULL_CONTEXT FullContext;
|
||||||
FSP_FSCTL_OPEN_FILE_INFO OpenFileInfo;
|
FSP_FSCTL_OPEN_FILE_INFO OpenFileInfo;
|
||||||
|
PSECURITY_DESCRIPTOR OpenDescriptor = 0;
|
||||||
BOOLEAN Create = FALSE;
|
BOOLEAN Create = FALSE;
|
||||||
|
|
||||||
Result = FspFileSystemOpenCheck(FileSystem, Request, Response, TRUE, &GrantedAccess);
|
Result = FspFileSystemOpenCheck(FileSystem, Request, Response, TRUE, &GrantedAccess,
|
||||||
|
&OpenDescriptor);
|
||||||
if (!NT_SUCCESS(Result) || STATUS_REPARSE == Result)
|
if (!NT_SUCCESS(Result) || STATUS_REPARSE == Result)
|
||||||
{
|
{
|
||||||
if (STATUS_OBJECT_NAME_NOT_FOUND != Result)
|
if (STATUS_OBJECT_NAME_NOT_FOUND != Result)
|
||||||
@ -502,6 +558,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
{
|
{
|
||||||
|
FspDeleteSecurityDescriptor(OpenDescriptor, FspAccessCheckEx);
|
||||||
|
OpenDescriptor = 0;
|
||||||
|
|
||||||
if (STATUS_OBJECT_NAME_NOT_FOUND != Result)
|
if (STATUS_OBJECT_NAME_NOT_FOUND != Result)
|
||||||
return Result;
|
return Result;
|
||||||
Create = TRUE;
|
Create = TRUE;
|
||||||
@ -515,7 +574,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
if (!NT_SUCCESS(Result) || STATUS_REPARSE == Result)
|
if (!NT_SUCCESS(Result) || STATUS_REPARSE == Result)
|
||||||
return Result;
|
return Result;
|
||||||
|
|
||||||
Result = FspCreateSecurityDescriptor(FileSystem, Request, ParentDescriptor, &ObjectDescriptor);
|
Result = FspCreateSecurityDescriptor(FileSystem, Request, ParentDescriptor, &OpenDescriptor);
|
||||||
FspDeleteSecurityDescriptor(ParentDescriptor, FspAccessCheckEx);
|
FspDeleteSecurityDescriptor(ParentDescriptor, FspAccessCheckEx);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return Result;
|
return Result;
|
||||||
@ -525,13 +584,25 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
memset(&OpenFileInfo, 0, sizeof OpenFileInfo);
|
memset(&OpenFileInfo, 0, sizeof OpenFileInfo);
|
||||||
OpenFileInfo.NormalizedName = (PVOID)Response->Buffer;
|
OpenFileInfo.NormalizedName = (PVOID)Response->Buffer;
|
||||||
OpenFileInfo.NormalizedNameSize = FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX;
|
OpenFileInfo.NormalizedNameSize = FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX;
|
||||||
Result = FileSystem->Interface->Create(FileSystem,
|
if (0 != FileSystem->Interface->CreateEx)
|
||||||
(PWSTR)Request->Buffer, Request->Req.Create.CreateOptions, GrantedAccess,
|
Result = FileSystem->Interface->CreateEx(FileSystem,
|
||||||
Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize,
|
(PWSTR)Request->Buffer, Request->Req.Create.CreateOptions, GrantedAccess,
|
||||||
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
Request->Req.Create.FileAttributes, OpenDescriptor, Request->Req.Create.AllocationSize,
|
||||||
FspDeleteSecurityDescriptor(ObjectDescriptor, FspCreateSecurityDescriptor);
|
0 != Request->Req.Create.Ea.Size ?
|
||||||
|
(PVOID)(Request->Buffer + Request->Req.Create.Ea.Offset) : 0,
|
||||||
|
Request->Req.Create.Ea.Size,
|
||||||
|
Request->Req.Create.EaIsReparsePoint,
|
||||||
|
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
||||||
|
else
|
||||||
|
Result = FileSystem->Interface->Create(FileSystem,
|
||||||
|
(PWSTR)Request->Buffer, Request->Req.Create.CreateOptions, GrantedAccess,
|
||||||
|
Request->Req.Create.FileAttributes, OpenDescriptor, Request->Req.Create.AllocationSize,
|
||||||
|
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
FspDeleteSecurityDescriptor(OpenDescriptor, FspCreateSecurityDescriptor);
|
||||||
return Result;
|
return Result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FSP_FSCTL_TRANSACT_PATH_SIZEMAX >= OpenFileInfo.NormalizedNameSize)
|
if (FSP_FSCTL_TRANSACT_PATH_SIZEMAX >= OpenFileInfo.NormalizedNameSize)
|
||||||
@ -541,6 +612,13 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
Response->Rsp.Create.Opened.FileName.Size = (UINT16)OpenFileInfo.NormalizedNameSize;
|
Response->Rsp.Create.Opened.FileName.Size = (UINT16)OpenFileInfo.NormalizedNameSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (0 != OpenDescriptor)
|
||||||
|
{
|
||||||
|
FspFileSystemOpCreate_SetOpenDescriptor(Response, OpenDescriptor);
|
||||||
|
FspDeleteSecurityDescriptor(OpenDescriptor, Create ?
|
||||||
|
(NTSTATUS (*)())FspCreateSecurityDescriptor : (NTSTATUS (*)())FspAccessCheckEx);
|
||||||
|
}
|
||||||
|
|
||||||
Response->IoStatus.Information = Create ? FILE_CREATED : FILE_OPENED;
|
Response->IoStatus.Information = Create ? FILE_CREATED : FILE_OPENED;
|
||||||
SetFileContext(Response->Rsp.Create.Opened, FullContext);
|
SetFileContext(Response->Rsp.Create.Opened, FullContext);
|
||||||
Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess;
|
Response->Rsp.Create.Opened.GrantedAccess = GrantedAccess;
|
||||||
@ -641,10 +719,20 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste
|
|||||||
memset(&OpenFileInfo, 0, sizeof OpenFileInfo);
|
memset(&OpenFileInfo, 0, sizeof OpenFileInfo);
|
||||||
OpenFileInfo.NormalizedName = (PVOID)Response->Buffer;
|
OpenFileInfo.NormalizedName = (PVOID)Response->Buffer;
|
||||||
OpenFileInfo.NormalizedNameSize = FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX;
|
OpenFileInfo.NormalizedNameSize = FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX;
|
||||||
Result = FileSystem->Interface->Create(FileSystem,
|
if (0 != FileSystem->Interface->CreateEx)
|
||||||
(PWSTR)Request->Buffer, Request->Req.Create.CreateOptions, GrantedAccess,
|
Result = FileSystem->Interface->CreateEx(FileSystem,
|
||||||
Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize,
|
(PWSTR)Request->Buffer, Request->Req.Create.CreateOptions, GrantedAccess,
|
||||||
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize,
|
||||||
|
0 != Request->Req.Create.Ea.Size ?
|
||||||
|
(PVOID)(Request->Buffer + Request->Req.Create.Ea.Offset) : 0,
|
||||||
|
Request->Req.Create.Ea.Size,
|
||||||
|
Request->Req.Create.EaIsReparsePoint,
|
||||||
|
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
||||||
|
else
|
||||||
|
Result = FileSystem->Interface->Create(FileSystem,
|
||||||
|
(PWSTR)Request->Buffer, Request->Req.Create.CreateOptions, GrantedAccess,
|
||||||
|
Request->Req.Create.FileAttributes, ObjectDescriptor, Request->Req.Create.AllocationSize,
|
||||||
|
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
||||||
FspDeleteSecurityDescriptor(ObjectDescriptor, FspCreateSecurityDescriptor);
|
FspDeleteSecurityDescriptor(ObjectDescriptor, FspCreateSecurityDescriptor);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return Result;
|
return Result;
|
||||||
@ -807,9 +895,9 @@ FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
{
|
{
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
if (0 == FileSystem->Interface->Create ||
|
if ((0 == FileSystem->Interface->Create && 0 == FileSystem->Interface->CreateEx) ||
|
||||||
0 == FileSystem->Interface->Open ||
|
0 == FileSystem->Interface->Open ||
|
||||||
0 == FileSystem->Interface->Overwrite)
|
(0 == FileSystem->Interface->Overwrite && 0 == FileSystem->Interface->OverwriteEx))
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
||||||
if (Request->Req.Create.OpenTargetDirectory)
|
if (Request->Req.Create.OpenTargetDirectory)
|
||||||
@ -852,16 +940,27 @@ FSP_API NTSTATUS FspFileSystemOpOverwrite(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
FSP_FSCTL_FILE_INFO FileInfo;
|
FSP_FSCTL_FILE_INFO FileInfo;
|
||||||
|
|
||||||
if (0 == FileSystem->Interface->Overwrite)
|
if (0 == FileSystem->Interface->Overwrite && 0 == FileSystem->Interface->OverwriteEx)
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
||||||
memset(&FileInfo, 0, sizeof FileInfo);
|
memset(&FileInfo, 0, sizeof FileInfo);
|
||||||
Result = FileSystem->Interface->Overwrite(FileSystem,
|
if (0 != FileSystem->Interface->OverwriteEx)
|
||||||
(PVOID)ValOfFileContext(Request->Req.Overwrite),
|
Result = FileSystem->Interface->OverwriteEx(FileSystem,
|
||||||
Request->Req.Overwrite.FileAttributes,
|
(PVOID)ValOfFileContext(Request->Req.Overwrite),
|
||||||
Request->Req.Overwrite.Supersede,
|
Request->Req.Overwrite.FileAttributes,
|
||||||
Request->Req.Overwrite.AllocationSize,
|
Request->Req.Overwrite.Supersede,
|
||||||
&FileInfo);
|
Request->Req.Overwrite.AllocationSize,
|
||||||
|
0 != Request->Req.Overwrite.Ea.Size ?
|
||||||
|
(PVOID)(Request->Buffer + Request->Req.Overwrite.Ea.Offset) : 0,
|
||||||
|
Request->Req.Overwrite.Ea.Size,
|
||||||
|
&FileInfo);
|
||||||
|
else
|
||||||
|
Result = FileSystem->Interface->Overwrite(FileSystem,
|
||||||
|
(PVOID)ValOfFileContext(Request->Req.Overwrite),
|
||||||
|
Request->Req.Overwrite.FileAttributes,
|
||||||
|
Request->Req.Overwrite.Supersede,
|
||||||
|
Request->Req.Overwrite.AllocationSize,
|
||||||
|
&FileInfo);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
{
|
{
|
||||||
if (0 != FileSystem->Interface->Close)
|
if (0 != FileSystem->Interface->Close)
|
||||||
@ -1043,13 +1142,22 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (0 != FileSystem->Interface->CanDelete)
|
if (0 != FileSystem->Interface->SetDelete)
|
||||||
|
{
|
||||||
|
Result = FileSystem->Interface->SetDelete(FileSystem,
|
||||||
|
(PVOID)ValOfFileContext(Request->Req.SetInformation),
|
||||||
|
(PWSTR)Request->Buffer,
|
||||||
|
Request->Req.SetInformation.Info.Disposition.Delete);
|
||||||
|
}
|
||||||
|
else if (0 != FileSystem->Interface->CanDelete)
|
||||||
|
{
|
||||||
if (Request->Req.SetInformation.Info.Disposition.Delete)
|
if (Request->Req.SetInformation.Info.Disposition.Delete)
|
||||||
Result = FileSystem->Interface->CanDelete(FileSystem,
|
Result = FileSystem->Interface->CanDelete(FileSystem,
|
||||||
(PVOID)ValOfFileContext(Request->Req.SetInformation),
|
(PVOID)ValOfFileContext(Request->Req.SetInformation),
|
||||||
(PWSTR)Request->Buffer);
|
(PWSTR)Request->Buffer);
|
||||||
else
|
else
|
||||||
Result = STATUS_SUCCESS;
|
Result = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 10/*FileRenameInformation*/:
|
case 10/*FileRenameInformation*/:
|
||||||
if (0 != FileSystem->Interface->Rename)
|
if (0 != FileSystem->Interface->Rename)
|
||||||
@ -1078,6 +1186,49 @@ FSP_API NTSTATUS FspFileSystemOpSetInformation(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FSP_API NTSTATUS FspFileSystemOpQueryEa(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
|
{
|
||||||
|
NTSTATUS Result;
|
||||||
|
ULONG BytesTransferred;
|
||||||
|
|
||||||
|
if (0 == FileSystem->Interface->GetEa)
|
||||||
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
||||||
|
BytesTransferred = 0;
|
||||||
|
Result = FileSystem->Interface->GetEa(FileSystem,
|
||||||
|
(PVOID)ValOfFileContext(Request->Req.QueryEa),
|
||||||
|
(PVOID)Response->Buffer, FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX, &BytesTransferred);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
return STATUS_BUFFER_OVERFLOW != Result ? Result : STATUS_EA_LIST_INCONSISTENT;
|
||||||
|
|
||||||
|
Response->Size = (UINT16)(sizeof *Response + BytesTransferred);
|
||||||
|
Response->Rsp.QueryEa.Ea.Offset = 0;
|
||||||
|
Response->Rsp.QueryEa.Ea.Size = (UINT16)BytesTransferred;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
FSP_API NTSTATUS FspFileSystemOpSetEa(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
|
{
|
||||||
|
NTSTATUS Result;
|
||||||
|
FSP_FSCTL_FILE_INFO FileInfo;
|
||||||
|
|
||||||
|
if (0 == FileSystem->Interface->SetEa)
|
||||||
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
||||||
|
memset(&FileInfo, 0, sizeof FileInfo);
|
||||||
|
Result = FileSystem->Interface->SetEa(FileSystem,
|
||||||
|
(PVOID)ValOfFileContext(Request->Req.SetEa),
|
||||||
|
(PVOID)Request->Buffer, Request->Req.SetEa.Ea.Size,
|
||||||
|
&FileInfo);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
return Result;
|
||||||
|
|
||||||
|
memcpy(&Response->Rsp.SetEa.FileInfo, &FileInfo, sizeof FileInfo);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
FSP_API NTSTATUS FspFileSystemOpQueryVolumeInformation(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpQueryVolumeInformation(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
{
|
{
|
||||||
@ -1659,3 +1810,51 @@ FSP_API BOOLEAN FspFileSystemAddStreamInfo(FSP_FSCTL_STREAM_INFO *StreamInfo,
|
|||||||
{
|
{
|
||||||
return FspFileSystemAddXxxInfo(StreamInfo, Buffer, Length, PBytesTransferred);
|
return FspFileSystemAddXxxInfo(StreamInfo, Buffer, Length, PBytesTransferred);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FSP_API NTSTATUS FspFileSystemEnumerateEa(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
NTSTATUS (*EnumerateEa)(
|
||||||
|
FSP_FILE_SYSTEM *FileSystem, PVOID Context,
|
||||||
|
PFILE_FULL_EA_INFORMATION SingleEa),
|
||||||
|
PVOID Context,
|
||||||
|
PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength)
|
||||||
|
{
|
||||||
|
NTSTATUS Result = STATUS_SUCCESS;
|
||||||
|
for (PFILE_FULL_EA_INFORMATION EaEnd = (PVOID)((PUINT8)Ea + EaLength);
|
||||||
|
EaEnd > Ea; Ea = FSP_NEXT_EA(Ea, EaEnd))
|
||||||
|
{
|
||||||
|
Result = EnumerateEa(FileSystem, Context, Ea);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
FSP_API BOOLEAN FspFileSystemAddEa(PFILE_FULL_EA_INFORMATION SingleEa,
|
||||||
|
PFILE_FULL_EA_INFORMATION Ea, ULONG Length, PULONG PBytesTransferred)
|
||||||
|
{
|
||||||
|
if (0 != SingleEa)
|
||||||
|
{
|
||||||
|
PUINT8 EaPtr = (PUINT8)Ea + FSP_FSCTL_ALIGN_UP(*PBytesTransferred, sizeof(ULONG));
|
||||||
|
PUINT8 EaEnd = (PUINT8)Ea + Length;
|
||||||
|
ULONG EaLen = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) +
|
||||||
|
SingleEa->EaNameLength + 1 + SingleEa->EaValueLength;
|
||||||
|
|
||||||
|
if (EaEnd < EaPtr + EaLen)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
memcpy(EaPtr, SingleEa, EaLen);
|
||||||
|
((PFILE_FULL_EA_INFORMATION)EaPtr)->NextEntryOffset = FSP_FSCTL_ALIGN_UP(EaLen, sizeof(ULONG));
|
||||||
|
*PBytesTransferred = (ULONG)(EaPtr + EaLen - (PUINT8)Ea);
|
||||||
|
}
|
||||||
|
else if ((ULONG)FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) <= *PBytesTransferred)
|
||||||
|
{
|
||||||
|
PUINT8 EaEnd = (PUINT8)Ea + *PBytesTransferred;
|
||||||
|
|
||||||
|
while (EaEnd > (PUINT8)Ea + Ea->NextEntryOffset)
|
||||||
|
Ea = (PVOID)((PUINT8)Ea + Ea->NextEntryOffset);
|
||||||
|
|
||||||
|
Ea->NextEntryOffset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fuse/fuse.c
|
* @file dll/fuse/fuse.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/fuse/library.h>
|
#include <dll/fuse/library.h>
|
||||||
@ -50,6 +54,10 @@ static struct fuse_opt fsp_fuse_core_opts[] =
|
|||||||
FSP_FUSE_CORE_OPT("umask=%o", umask, 0),
|
FSP_FUSE_CORE_OPT("umask=%o", umask, 0),
|
||||||
FSP_FUSE_CORE_OPT("create_umask=", set_create_umask, 1),
|
FSP_FUSE_CORE_OPT("create_umask=", set_create_umask, 1),
|
||||||
FSP_FUSE_CORE_OPT("create_umask=%o", create_umask, 0),
|
FSP_FUSE_CORE_OPT("create_umask=%o", create_umask, 0),
|
||||||
|
FSP_FUSE_CORE_OPT("create_file_umask=", set_create_file_umask, 1),
|
||||||
|
FSP_FUSE_CORE_OPT("create_file_umask=%o", create_file_umask, 0),
|
||||||
|
FSP_FUSE_CORE_OPT("create_dir_umask=", set_create_dir_umask, 1),
|
||||||
|
FSP_FUSE_CORE_OPT("create_dir_umask=%o", create_dir_umask, 0),
|
||||||
FSP_FUSE_CORE_OPT("uid=", set_uid, 1),
|
FSP_FUSE_CORE_OPT("uid=", set_uid, 1),
|
||||||
FSP_FUSE_CORE_OPT("uid=%d", uid, 0),
|
FSP_FUSE_CORE_OPT("uid=%d", uid, 0),
|
||||||
FSP_FUSE_CORE_OPT("gid=", set_gid, 1),
|
FSP_FUSE_CORE_OPT("gid=", set_gid, 1),
|
||||||
@ -67,6 +75,9 @@ static struct fuse_opt fsp_fuse_core_opts[] =
|
|||||||
FSP_FUSE_CORE_OPT("rellinks", rellinks, 1),
|
FSP_FUSE_CORE_OPT("rellinks", rellinks, 1),
|
||||||
FSP_FUSE_CORE_OPT("norellinks", rellinks, 0),
|
FSP_FUSE_CORE_OPT("norellinks", rellinks, 0),
|
||||||
|
|
||||||
|
FSP_FUSE_CORE_OPT("dothidden", dothidden, 1),
|
||||||
|
FSP_FUSE_CORE_OPT("nodothidden", dothidden, 0),
|
||||||
|
|
||||||
FUSE_OPT_KEY("fstypename=", 'F'),
|
FUSE_OPT_KEY("fstypename=", 'F'),
|
||||||
FUSE_OPT_KEY("volname=", 'v'),
|
FUSE_OPT_KEY("volname=", 'v'),
|
||||||
|
|
||||||
@ -79,6 +90,8 @@ static struct fuse_opt fsp_fuse_core_opts[] =
|
|||||||
FSP_FUSE_CORE_OPT("FileInfoTimeout=%d", VolumeParams.FileInfoTimeout, 0),
|
FSP_FUSE_CORE_OPT("FileInfoTimeout=%d", VolumeParams.FileInfoTimeout, 0),
|
||||||
FSP_FUSE_CORE_OPT("DirInfoTimeout=", set_DirInfoTimeout, 1),
|
FSP_FUSE_CORE_OPT("DirInfoTimeout=", set_DirInfoTimeout, 1),
|
||||||
FSP_FUSE_CORE_OPT("DirInfoTimeout=%d", VolumeParams.DirInfoTimeout, 0),
|
FSP_FUSE_CORE_OPT("DirInfoTimeout=%d", VolumeParams.DirInfoTimeout, 0),
|
||||||
|
FSP_FUSE_CORE_OPT("EaTimeout=", set_EaTimeout, 1),
|
||||||
|
FSP_FUSE_CORE_OPT("EaTimeout=%d", VolumeParams.EaTimeout, 0),
|
||||||
FSP_FUSE_CORE_OPT("VolumeInfoTimeout=", set_VolumeInfoTimeout, 1),
|
FSP_FUSE_CORE_OPT("VolumeInfoTimeout=", set_VolumeInfoTimeout, 1),
|
||||||
FSP_FUSE_CORE_OPT("VolumeInfoTimeout=%d", VolumeParams.VolumeInfoTimeout, 0),
|
FSP_FUSE_CORE_OPT("VolumeInfoTimeout=%d", VolumeParams.VolumeInfoTimeout, 0),
|
||||||
FSP_FUSE_CORE_OPT("KeepFileCache=", set_KeepFileCache, 1),
|
FSP_FUSE_CORE_OPT("KeepFileCache=", set_KeepFileCache, 1),
|
||||||
@ -89,6 +102,17 @@ static struct fuse_opt fsp_fuse_core_opts[] =
|
|||||||
FUSE_OPT_KEY("--VolumePrefix=", 'U'),
|
FUSE_OPT_KEY("--VolumePrefix=", 'U'),
|
||||||
FUSE_OPT_KEY("FileSystemName=", 'F'),
|
FUSE_OPT_KEY("FileSystemName=", 'F'),
|
||||||
FUSE_OPT_KEY("--FileSystemName=", 'F'),
|
FUSE_OPT_KEY("--FileSystemName=", 'F'),
|
||||||
|
FUSE_OPT_KEY("ExactFileSystemName=", 'E'),
|
||||||
|
FUSE_OPT_KEY("--ExactFileSystemName=", 'E'),
|
||||||
|
|
||||||
|
FSP_FUSE_CORE_OPT("UserName=", set_uid, 1),
|
||||||
|
FUSE_OPT_KEY("UserName=", 'u'),
|
||||||
|
FSP_FUSE_CORE_OPT("--UserName=", set_uid, 1),
|
||||||
|
FUSE_OPT_KEY("--UserName=", 'u'),
|
||||||
|
FSP_FUSE_CORE_OPT("GroupName=", set_gid, 1),
|
||||||
|
FUSE_OPT_KEY("GroupName=", 'g'),
|
||||||
|
FSP_FUSE_CORE_OPT("--GroupName=", set_gid, 1),
|
||||||
|
FUSE_OPT_KEY("--GroupName=", 'g'),
|
||||||
|
|
||||||
FUSE_OPT_END,
|
FUSE_OPT_END,
|
||||||
};
|
};
|
||||||
@ -220,6 +244,43 @@ FSP_FUSE_API int fsp_fuse_is_lib_option(struct fsp_fuse_env *env,
|
|||||||
return fsp_fuse_opt_match(env, fsp_fuse_core_opts, opt);
|
return fsp_fuse_opt_match(env, fsp_fuse_core_opts, opt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int fsp_fuse_username_to_uid(const char *username, int *puid)
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
SID V;
|
||||||
|
UINT8 B[SECURITY_MAX_SID_SIZE];
|
||||||
|
} SidBuf;
|
||||||
|
char Name[256], Domn[256];
|
||||||
|
DWORD SidSize, NameSize, DomnSize;
|
||||||
|
SID_NAME_USE Use;
|
||||||
|
UINT32 Uid;
|
||||||
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
*puid = 0;
|
||||||
|
|
||||||
|
NameSize = lstrlenA(username) + 1;
|
||||||
|
if (sizeof Name / sizeof Name[0] < NameSize)
|
||||||
|
return -1;
|
||||||
|
memcpy(Name, username, NameSize);
|
||||||
|
for (PSTR P = Name, EndP = P + NameSize; EndP > P; P++)
|
||||||
|
if ('+' == *P)
|
||||||
|
*P = '\\';
|
||||||
|
|
||||||
|
SidSize = sizeof SidBuf;
|
||||||
|
DomnSize = sizeof Domn / sizeof Domn[0];
|
||||||
|
if (!LookupAccountNameA(0, Name, &SidBuf, &SidSize, Domn, &DomnSize, &Use))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
Result = FspPosixMapSidToUid(&SidBuf, &Uid);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
*puid = Uid;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int fsp_fuse_core_opt_proc(void *opt_data0, const char *arg, int key,
|
static int fsp_fuse_core_opt_proc(void *opt_data0, const char *arg, int key,
|
||||||
struct fuse_args *outargs)
|
struct fuse_args *outargs)
|
||||||
{
|
{
|
||||||
@ -235,9 +296,12 @@ static int fsp_fuse_core_opt_proc(void *opt_data0, const char *arg, int key,
|
|||||||
FSP_FUSE_LIBRARY_NAME " options:\n"
|
FSP_FUSE_LIBRARY_NAME " options:\n"
|
||||||
" -o umask=MASK set file permissions (octal)\n"
|
" -o umask=MASK set file permissions (octal)\n"
|
||||||
" -o create_umask=MASK set newly created file permissions (octal)\n"
|
" -o create_umask=MASK set newly created file permissions (octal)\n"
|
||||||
|
" -o create_file_umask=MASK for files only\n"
|
||||||
|
" -o create_dir_umask=MASK for directories only\n"
|
||||||
" -o uid=N set file owner (-1 for mounting user id)\n"
|
" -o uid=N set file owner (-1 for mounting user id)\n"
|
||||||
" -o gid=N set file group (-1 for mounting user group)\n"
|
" -o gid=N set file group (-1 for mounting user group)\n"
|
||||||
" -o rellinks interpret absolute symlinks as volume relative\n"
|
" -o rellinks interpret absolute symlinks as volume relative\n"
|
||||||
|
" -o dothidden dot files have the Windows hidden file attrib\n"
|
||||||
" -o volname=NAME set volume label\n"
|
" -o volname=NAME set volume label\n"
|
||||||
" -o VolumePrefix=UNC set UNC prefix (/Server/Share)\n"
|
" -o VolumePrefix=UNC set UNC prefix (/Server/Share)\n"
|
||||||
" --VolumePrefix=UNC set UNC prefix (\\Server\\Share)\n"
|
" --VolumePrefix=UNC set UNC prefix (\\Server\\Share)\n"
|
||||||
@ -248,6 +312,7 @@ static int fsp_fuse_core_opt_proc(void *opt_data0, const char *arg, int key,
|
|||||||
FSP_FUSE_LIBRARY_NAME " advanced options:\n"
|
FSP_FUSE_LIBRARY_NAME " advanced options:\n"
|
||||||
" -o FileInfoTimeout=N metadata timeout (millis, -1 for data caching)\n"
|
" -o FileInfoTimeout=N metadata timeout (millis, -1 for data caching)\n"
|
||||||
" -o DirInfoTimeout=N directory info timeout (millis)\n"
|
" -o DirInfoTimeout=N directory info timeout (millis)\n"
|
||||||
|
" -o EaTimeout=N extended attribute timeout (millis)\n"
|
||||||
" -o VolumeInfoTimeout=N volume info timeout (millis)\n"
|
" -o VolumeInfoTimeout=N volume info timeout (millis)\n"
|
||||||
" -o KeepFileCache do not discard cache when files are closed\n"
|
" -o KeepFileCache do not discard cache when files are closed\n"
|
||||||
" -o ThreadCount number of file system dispatcher threads\n"
|
" -o ThreadCount number of file system dispatcher threads\n"
|
||||||
@ -304,6 +369,40 @@ static int fsp_fuse_core_opt_proc(void *opt_data0, const char *arg, int key,
|
|||||||
[sizeof opt_data->VolumeParams.FileSystemName / sizeof(WCHAR) - 1] = L'\0';
|
[sizeof opt_data->VolumeParams.FileSystemName / sizeof(WCHAR) - 1] = L'\0';
|
||||||
memcpy(opt_data->VolumeParams.FileSystemName, L"FUSE-", 5 * sizeof(WCHAR));
|
memcpy(opt_data->VolumeParams.FileSystemName, L"FUSE-", 5 * sizeof(WCHAR));
|
||||||
return 0;
|
return 0;
|
||||||
|
case 'E':
|
||||||
|
if ('E' == arg[0])
|
||||||
|
arg += sizeof "ExactFileSystemName=" - 1;
|
||||||
|
else if ('E' == arg[2])
|
||||||
|
arg += sizeof "--ExactFileSystemName=" - 1;
|
||||||
|
if (0 == MultiByteToWideChar(CP_UTF8, 0, arg, -1,
|
||||||
|
opt_data->VolumeParams.FileSystemName,
|
||||||
|
sizeof opt_data->VolumeParams.FileSystemName / sizeof(WCHAR)))
|
||||||
|
return -1;
|
||||||
|
opt_data->VolumeParams.FileSystemName
|
||||||
|
[sizeof opt_data->VolumeParams.FileSystemName / sizeof(WCHAR) - 1] = L'\0';
|
||||||
|
return 0;
|
||||||
|
case 'u':
|
||||||
|
if ('U' == arg[0])
|
||||||
|
arg += sizeof "UserName=" - 1;
|
||||||
|
else if ('U' == arg[2])
|
||||||
|
arg += sizeof "--UserName=" - 1;
|
||||||
|
if (-1 == fsp_fuse_username_to_uid(arg, &opt_data->uid))
|
||||||
|
{
|
||||||
|
opt_data->username_to_uid_result = -1;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
case 'g':
|
||||||
|
if ('G' == arg[0])
|
||||||
|
arg += sizeof "GroupName=" - 1;
|
||||||
|
else if ('G' == arg[2])
|
||||||
|
arg += sizeof "--GroupName=" - 1;
|
||||||
|
if (-1 == fsp_fuse_username_to_uid(arg, &opt_data->gid))
|
||||||
|
{
|
||||||
|
opt_data->username_to_uid_result = -1;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
case 'v':
|
case 'v':
|
||||||
arg += sizeof "volname=" - 1;
|
arg += sizeof "volname=" - 1;
|
||||||
opt_data->VolumeLabelLength = (UINT16)(sizeof(WCHAR) *
|
opt_data->VolumeLabelLength = (UINT16)(sizeof(WCHAR) *
|
||||||
@ -348,7 +447,14 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
|
|||||||
opt_data.VolumeParams.FlushAndPurgeOnCleanup = TRUE;
|
opt_data.VolumeParams.FlushAndPurgeOnCleanup = TRUE;
|
||||||
|
|
||||||
if (-1 == fsp_fuse_core_opt_parse(env, args, &opt_data, /*help=*/1))
|
if (-1 == fsp_fuse_core_opt_parse(env, args, &opt_data, /*help=*/1))
|
||||||
|
{
|
||||||
|
if (-1 == opt_data.username_to_uid_result)
|
||||||
|
{
|
||||||
|
ErrorMessage = L": invalid user or group name.";
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
if (opt_data.help)
|
if (opt_data.help)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -388,6 +494,8 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
|
|||||||
opt_data.VolumeParams.FileInfoTimeout = opt_data.attr_timeout * 1000;
|
opt_data.VolumeParams.FileInfoTimeout = opt_data.attr_timeout * 1000;
|
||||||
if (opt_data.set_DirInfoTimeout)
|
if (opt_data.set_DirInfoTimeout)
|
||||||
opt_data.VolumeParams.DirInfoTimeoutValid = 1;
|
opt_data.VolumeParams.DirInfoTimeoutValid = 1;
|
||||||
|
if (opt_data.set_EaTimeout)
|
||||||
|
opt_data.VolumeParams.EaTimeoutValid = 1;
|
||||||
if (opt_data.set_VolumeInfoTimeout)
|
if (opt_data.set_VolumeInfoTimeout)
|
||||||
opt_data.VolumeParams.VolumeInfoTimeoutValid = 1;
|
opt_data.VolumeParams.VolumeInfoTimeoutValid = 1;
|
||||||
if (opt_data.set_KeepFileCache)
|
if (opt_data.set_KeepFileCache)
|
||||||
@ -413,9 +521,12 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
|
|||||||
f->env = env;
|
f->env = env;
|
||||||
f->set_umask = opt_data.set_umask; f->umask = opt_data.umask;
|
f->set_umask = opt_data.set_umask; f->umask = opt_data.umask;
|
||||||
f->set_create_umask = opt_data.set_create_umask; f->create_umask = opt_data.create_umask;
|
f->set_create_umask = opt_data.set_create_umask; f->create_umask = opt_data.create_umask;
|
||||||
|
f->set_create_file_umask = opt_data.set_create_file_umask; f->create_file_umask = opt_data.create_file_umask;
|
||||||
|
f->set_create_dir_umask = opt_data.set_create_dir_umask; f->create_dir_umask = opt_data.create_dir_umask;
|
||||||
f->set_uid = opt_data.set_uid; f->uid = opt_data.uid;
|
f->set_uid = opt_data.set_uid; f->uid = opt_data.uid;
|
||||||
f->set_gid = opt_data.set_gid; f->gid = opt_data.gid;
|
f->set_gid = opt_data.set_gid; f->gid = opt_data.gid;
|
||||||
f->rellinks = opt_data.rellinks;
|
f->rellinks = opt_data.rellinks;
|
||||||
|
f->dothidden = opt_data.dothidden;
|
||||||
f->ThreadCount = opt_data.ThreadCount;
|
f->ThreadCount = opt_data.ThreadCount;
|
||||||
memcpy(&f->ops, ops, opsize);
|
memcpy(&f->ops, ops, opsize);
|
||||||
f->data = data;
|
f->data = data;
|
||||||
@ -430,10 +541,6 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
|
|||||||
goto fail;
|
goto fail;
|
||||||
memcpy(f->MountPoint, ch->MountPoint, Size);
|
memcpy(f->MountPoint, ch->MountPoint, Size);
|
||||||
|
|
||||||
f->LoopEvent = CreateEventW(0, TRUE, FALSE, 0);
|
|
||||||
if (0 == f->LoopEvent)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
Result = FspFileSystemPreflight(
|
Result = FspFileSystemPreflight(
|
||||||
f->VolumeParams.Prefix[0] ? L"" FSP_FSCTL_NET_DEVICE_NAME : L"" FSP_FSCTL_DISK_DEVICE_NAME,
|
f->VolumeParams.Prefix[0] ? L"" FSP_FSCTL_NET_DEVICE_NAME : L"" FSP_FSCTL_DISK_DEVICE_NAME,
|
||||||
'*' != f->MountPoint[0] || '\0' != f->MountPoint[1] ? f->MountPoint : 0);
|
'*' != f->MountPoint[0] || '\0' != f->MountPoint[1] ? f->MountPoint : 0);
|
||||||
@ -481,9 +588,6 @@ fail:
|
|||||||
FSP_FUSE_API void fsp_fuse_destroy(struct fsp_fuse_env *env,
|
FSP_FUSE_API void fsp_fuse_destroy(struct fsp_fuse_env *env,
|
||||||
struct fuse *f)
|
struct fuse *f)
|
||||||
{
|
{
|
||||||
if (0 != f->LoopEvent)
|
|
||||||
CloseHandle(f->LoopEvent);
|
|
||||||
|
|
||||||
fsp_fuse_obj_free(f->MountPoint);
|
fsp_fuse_obj_free(f->MountPoint);
|
||||||
|
|
||||||
fsp_fuse_obj_free(f);
|
fsp_fuse_obj_free(f);
|
||||||
@ -492,7 +596,8 @@ FSP_FUSE_API void fsp_fuse_destroy(struct fsp_fuse_env *env,
|
|||||||
FSP_FUSE_API void fsp_fuse_exit(struct fsp_fuse_env *env,
|
FSP_FUSE_API void fsp_fuse_exit(struct fsp_fuse_env *env,
|
||||||
struct fuse *f)
|
struct fuse *f)
|
||||||
{
|
{
|
||||||
SetEvent(f->LoopEvent);
|
if (0 != f->LoopEvent)
|
||||||
|
SetEvent(f->LoopEvent);
|
||||||
f->exited = 1;
|
f->exited = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fuse/fuse_compat.c
|
* @file dll/fuse/fuse_compat.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fuse/fuse_intf.c
|
* @file dll/fuse/fuse_intf.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/fuse/library.h>
|
#include <dll/fuse/library.h>
|
||||||
@ -350,6 +354,7 @@ static inline UINT32 fsp_fuse_intf_MapFlagsToFileAttributes(uint32_t flags)
|
|||||||
return FileAttributes;
|
return FileAttributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define FUSE_FILE_INFO(IsDirectory, fi) ((IsDirectory) ? 0 : (fi))
|
||||||
#define fsp_fuse_intf_GetFileInfoEx(FileSystem, PosixPath, fi, PUid, PGid, PMode, FileInfo)\
|
#define fsp_fuse_intf_GetFileInfoEx(FileSystem, PosixPath, fi, PUid, PGid, PMode, FileInfo)\
|
||||||
fsp_fuse_intf_GetFileInfoFunnel(FileSystem, PosixPath, fi, 0, PUid, PGid, PMode, 0, FileInfo)
|
fsp_fuse_intf_GetFileInfoFunnel(FileSystem, PosixPath, fi, 0, PUid, PGid, PMode, 0, FileInfo)
|
||||||
static NTSTATUS fsp_fuse_intf_GetFileInfoFunnel(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_GetFileInfoFunnel(FSP_FILE_SYSTEM *FileSystem,
|
||||||
@ -425,6 +430,15 @@ static NTSTATUS fsp_fuse_intf_GetFileInfoFunnel(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
}
|
}
|
||||||
if (StatEx)
|
if (StatEx)
|
||||||
FileInfo->FileAttributes |= fsp_fuse_intf_MapFlagsToFileAttributes(stbuf.st_flags);
|
FileInfo->FileAttributes |= fsp_fuse_intf_MapFlagsToFileAttributes(stbuf.st_flags);
|
||||||
|
if (f->dothidden)
|
||||||
|
{
|
||||||
|
const char *basename = PosixPath;
|
||||||
|
for (const char *p = PosixPath; '\0' != *p; p++)
|
||||||
|
if ('/' == *p)
|
||||||
|
basename = p + 1;
|
||||||
|
if ('.' == basename[0])
|
||||||
|
FileInfo->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
|
||||||
|
}
|
||||||
FileInfo->FileSize = stbuf.st_size;
|
FileInfo->FileSize = stbuf.st_size;
|
||||||
FileInfo->AllocationSize =
|
FileInfo->AllocationSize =
|
||||||
(FileInfo->FileSize + AllocationUnit - 1) / AllocationUnit * AllocationUnit;
|
(FileInfo->FileSize + AllocationUnit - 1) / AllocationUnit * AllocationUnit;
|
||||||
@ -434,6 +448,9 @@ static NTSTATUS fsp_fuse_intf_GetFileInfoFunnel(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
FspPosixUnixTimeToFileTime((void *)&stbuf.st_ctim, &FileInfo->ChangeTime);
|
FspPosixUnixTimeToFileTime((void *)&stbuf.st_ctim, &FileInfo->ChangeTime);
|
||||||
FileInfo->IndexNumber = stbuf.st_ino;
|
FileInfo->IndexNumber = stbuf.st_ino;
|
||||||
|
|
||||||
|
FileInfo->HardLinks = 0;
|
||||||
|
FileInfo->EaSize = 0;
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -662,6 +679,9 @@ static NTSTATUS fsp_fuse_intf_GetReparsePointEx(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
static NTSTATUS fsp_fuse_intf_GetReparsePointByName(
|
static NTSTATUS fsp_fuse_intf_GetReparsePointByName(
|
||||||
FSP_FILE_SYSTEM *FileSystem, PVOID Context,
|
FSP_FILE_SYSTEM *FileSystem, PVOID Context,
|
||||||
PWSTR FileName, BOOLEAN IsDirectory, PVOID Buffer, PSIZE_T PSize);
|
PWSTR FileName, BOOLEAN IsDirectory, PVOID Buffer, PSIZE_T PSize);
|
||||||
|
static NTSTATUS fsp_fuse_intf_SetEaEntry(
|
||||||
|
FSP_FILE_SYSTEM *FileSystem, PVOID Context,
|
||||||
|
PFILE_FULL_EA_INFORMATION SingleEa);
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_VOLUME_INFO *VolumeInfo)
|
FSP_FSCTL_VOLUME_INFO *VolumeInfo)
|
||||||
@ -733,6 +753,7 @@ exit:
|
|||||||
static NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess,
|
PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess,
|
||||||
UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize,
|
UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize,
|
||||||
|
PVOID ExtraBuffer, ULONG ExtraLength, BOOLEAN ExtraBufferIsReparsePoint,
|
||||||
PVOID *PFileDesc, FSP_FSCTL_FILE_INFO *FileInfo)
|
PVOID *PFileDesc, FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
@ -746,6 +767,25 @@ static NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
int err;
|
int err;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
if (0 != ExtraBuffer)
|
||||||
|
{
|
||||||
|
if (!ExtraBufferIsReparsePoint)
|
||||||
|
{
|
||||||
|
if (0 == f->ops.listxattr || 0 == f->ops.getxattr ||
|
||||||
|
0 == f->ops.setxattr || 0 == f->ops.removexattr)
|
||||||
|
{
|
||||||
|
Result = STATUS_EAS_NOT_SUPPORTED;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* !!!: revisit */
|
||||||
|
Result = STATUS_INVALID_PARAMETER;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
filedesc = MemAlloc(sizeof *filedesc);
|
filedesc = MemAlloc(sizeof *filedesc);
|
||||||
if (0 == filedesc)
|
if (0 == filedesc)
|
||||||
{
|
{
|
||||||
@ -764,8 +804,22 @@ static NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
Mode &= ~context->umask;
|
Mode &= ~context->umask;
|
||||||
if (f->set_create_umask)
|
if (CreateOptions & FILE_DIRECTORY_FILE)
|
||||||
Mode = 0777 & ~f->create_umask;
|
{
|
||||||
|
if (f->set_create_dir_umask)
|
||||||
|
Mode = 0777 & ~f->create_dir_umask;
|
||||||
|
else
|
||||||
|
if (f->set_create_umask)
|
||||||
|
Mode = 0777 & ~f->create_umask;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (f->set_create_file_umask)
|
||||||
|
Mode = 0777 & ~f->create_file_umask;
|
||||||
|
else
|
||||||
|
if (f->set_create_umask)
|
||||||
|
Mode = 0777 & ~f->create_umask;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&fi, 0, sizeof fi);
|
memset(&fi, 0, sizeof fi);
|
||||||
if ('C' == f->env->environment) /* Cygwin */
|
if ('C' == f->env->environment) /* Cygwin */
|
||||||
@ -845,6 +899,22 @@ static NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (0 != ExtraBuffer)
|
||||||
|
{
|
||||||
|
if (!ExtraBufferIsReparsePoint)
|
||||||
|
{
|
||||||
|
Result = FspFileSystemEnumerateEa(FileSystem,
|
||||||
|
fsp_fuse_intf_SetEaEntry, contexthdr->PosixPath, ExtraBuffer, ExtraLength);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* !!!: revisit: WslFeatures, GetFileInfoFunnel, GetReparsePointEx, SetReparsePoint */
|
||||||
|
Result = STATUS_INVALID_PARAMETER;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Ignore fuse_file_info::direct_io, fuse_file_info::keep_cache.
|
* Ignore fuse_file_info::direct_io, fuse_file_info::keep_cache.
|
||||||
* NOTE: Originally WinFsp dit not support disabling the cache manager
|
* NOTE: Originally WinFsp dit not support disabling the cache manager
|
||||||
@ -853,7 +923,8 @@ static NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
* Ignore fuse_file_info::nonseekable.
|
* Ignore fuse_file_info::nonseekable.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, contexthdr->PosixPath, &fi,
|
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, contexthdr->PosixPath,
|
||||||
|
FUSE_FILE_INFO(CreateOptions & FILE_DIRECTORY_FILE, &fi),
|
||||||
&Uid, &Gid, &Mode, &FileInfoBuf);
|
&Uid, &Gid, &Mode, &FileInfoBuf);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
goto exit;
|
goto exit;
|
||||||
@ -955,6 +1026,20 @@ static NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Some Windows applications (notably Go programs) specify FILE_APPEND_DATA without
|
||||||
|
* FILE_WRITE_DATA when opening files for appending. This caused the WinFsp-FUSE layer
|
||||||
|
* to erroneously pass O_RDONLY to the FUSE file system in such cases. We add a test
|
||||||
|
* for FILE_APPEND_DATA to ensure that either O_WRONLY or O_RDWR is specified and that
|
||||||
|
* the O_APPEND flag is set.
|
||||||
|
*/
|
||||||
|
if (GrantedAccess & FILE_APPEND_DATA)
|
||||||
|
{
|
||||||
|
if (fi.flags == 0)
|
||||||
|
fi.flags = 1; /* need O_WRONLY as a bare minimum in order to append */
|
||||||
|
fi.flags |= 8/*O_APPEND*/;
|
||||||
|
}
|
||||||
|
|
||||||
if (0 != f->ops.open)
|
if (0 != f->ops.open)
|
||||||
{
|
{
|
||||||
err = f->ops.open(contexthdr->PosixPath, &fi);
|
err = f->ops.open(contexthdr->PosixPath, &fi);
|
||||||
@ -997,6 +1082,7 @@ exit:
|
|||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_Overwrite(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_Overwrite(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileDesc, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize,
|
PVOID FileDesc, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize,
|
||||||
|
PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength,
|
||||||
FSP_FSCTL_FILE_INFO *FileInfo)
|
FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
@ -1009,6 +1095,29 @@ static NTSTATUS fsp_fuse_intf_Overwrite(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
if (filedesc->IsDirectory || filedesc->IsReparsePoint)
|
if (filedesc->IsDirectory || filedesc->IsReparsePoint)
|
||||||
return STATUS_ACCESS_DENIED;
|
return STATUS_ACCESS_DENIED;
|
||||||
|
|
||||||
|
if (0 != Ea)
|
||||||
|
{
|
||||||
|
char names[3 * 1024];
|
||||||
|
int namesize;
|
||||||
|
|
||||||
|
if (0 == f->ops.listxattr || 0 == f->ops.getxattr ||
|
||||||
|
0 == f->ops.setxattr || 0 == f->ops.removexattr)
|
||||||
|
return STATUS_EAS_NOT_SUPPORTED;
|
||||||
|
|
||||||
|
namesize = f->ops.listxattr(filedesc->PosixPath, names, sizeof names);
|
||||||
|
if (0 < namesize)
|
||||||
|
for (char *p = names, *endp = p + namesize; endp > p; p += namesize)
|
||||||
|
{
|
||||||
|
namesize = lstrlenA(p) + 1;
|
||||||
|
f->ops.removexattr(filedesc->PosixPath, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result = FspFileSystemEnumerateEa(FileSystem,
|
||||||
|
fsp_fuse_intf_SetEaEntry, filedesc->PosixPath, Ea, EaLength);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
if (0 != f->ops.ftruncate)
|
if (0 != f->ops.ftruncate)
|
||||||
{
|
{
|
||||||
memset(&fi, 0, sizeof fi);
|
memset(&fi, 0, sizeof fi);
|
||||||
@ -1044,7 +1153,8 @@ static NTSTATUS fsp_fuse_intf_Overwrite(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
return fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath, &fi,
|
return fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath,
|
||||||
|
FUSE_FILE_INFO(filedesc->IsDirectory, &fi),
|
||||||
&Uid, &Gid, &Mode, FileInfo);
|
&Uid, &Gid, &Mode, FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1175,7 +1285,8 @@ static NTSTATUS fsp_fuse_intf_Write(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
fi.flags = filedesc->OpenFlags;
|
fi.flags = filedesc->OpenFlags;
|
||||||
fi.fh = filedesc->FileHandle;
|
fi.fh = filedesc->FileHandle;
|
||||||
|
|
||||||
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath, &fi,
|
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath,
|
||||||
|
FUSE_FILE_INFO(filedesc->IsDirectory, &fi),
|
||||||
&Uid, &Gid, &Mode, &FileInfoBuf);
|
&Uid, &Gid, &Mode, &FileInfoBuf);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return Result;
|
return Result;
|
||||||
@ -1255,7 +1366,8 @@ static NTSTATUS fsp_fuse_intf_Flush(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return Result;
|
return Result;
|
||||||
|
|
||||||
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath, &fi,
|
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath,
|
||||||
|
FUSE_FILE_INFO(filedesc->IsDirectory, &fi),
|
||||||
&Uid, &Gid, &Mode, &FileInfoBuf);
|
&Uid, &Gid, &Mode, &FileInfoBuf);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return Result;
|
return Result;
|
||||||
@ -1278,7 +1390,8 @@ static NTSTATUS fsp_fuse_intf_GetFileInfo(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
fi.flags = filedesc->OpenFlags;
|
fi.flags = filedesc->OpenFlags;
|
||||||
fi.fh = filedesc->FileHandle;
|
fi.fh = filedesc->FileHandle;
|
||||||
|
|
||||||
return fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath, &fi,
|
return fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath,
|
||||||
|
FUSE_FILE_INFO(filedesc->IsDirectory, &fi),
|
||||||
&Uid, &Gid, &Mode, FileInfo);
|
&Uid, &Gid, &Mode, FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1316,7 +1429,8 @@ static NTSTATUS fsp_fuse_intf_SetBasicInfo(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
{
|
{
|
||||||
if (0 == LastAccessTime || 0 == LastWriteTime)
|
if (0 == LastAccessTime || 0 == LastWriteTime)
|
||||||
{
|
{
|
||||||
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath, &fi,
|
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath,
|
||||||
|
FUSE_FILE_INFO(filedesc->IsDirectory, &fi),
|
||||||
&Uid, &Gid, &Mode, &FileInfoBuf);
|
&Uid, &Gid, &Mode, &FileInfoBuf);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return Result;
|
return Result;
|
||||||
@ -1363,7 +1477,8 @@ static NTSTATUS fsp_fuse_intf_SetBasicInfo(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
return fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath, &fi,
|
return fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath,
|
||||||
|
FUSE_FILE_INFO(filedesc->IsDirectory, &fi),
|
||||||
&Uid, &Gid, &Mode, FileInfo);
|
&Uid, &Gid, &Mode, FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1390,7 +1505,8 @@ static NTSTATUS fsp_fuse_intf_SetFileSize(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
fi.flags = filedesc->OpenFlags;
|
fi.flags = filedesc->OpenFlags;
|
||||||
fi.fh = filedesc->FileHandle;
|
fi.fh = filedesc->FileHandle;
|
||||||
|
|
||||||
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath, &fi,
|
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath,
|
||||||
|
FUSE_FILE_INFO(filedesc->IsDirectory, &fi),
|
||||||
&Uid, &Gid, &Mode, &FileInfoBuf);
|
&Uid, &Gid, &Mode, &FileInfoBuf);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return Result;
|
return Result;
|
||||||
@ -1537,7 +1653,8 @@ static NTSTATUS fsp_fuse_intf_GetSecurity(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
fi.flags = filedesc->OpenFlags;
|
fi.flags = filedesc->OpenFlags;
|
||||||
fi.fh = filedesc->FileHandle;
|
fi.fh = filedesc->FileHandle;
|
||||||
|
|
||||||
return fsp_fuse_intf_GetSecurityEx(FileSystem, filedesc->PosixPath, &fi,
|
return fsp_fuse_intf_GetSecurityEx(FileSystem, filedesc->PosixPath,
|
||||||
|
FUSE_FILE_INFO(filedesc->IsDirectory, &fi),
|
||||||
&FileAttributes, SecurityDescriptorBuf, PSecurityDescriptorSize);
|
&FileAttributes, SecurityDescriptorBuf, PSecurityDescriptorSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1561,8 +1678,9 @@ static NTSTATUS fsp_fuse_intf_SetSecurity(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
fi.flags = filedesc->OpenFlags;
|
fi.flags = filedesc->OpenFlags;
|
||||||
fi.fh = filedesc->FileHandle;
|
fi.fh = filedesc->FileHandle;
|
||||||
|
|
||||||
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath, &fi, &Uid, &Gid, &Mode,
|
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath,
|
||||||
&FileInfo);
|
FUSE_FILE_INFO(filedesc->IsDirectory, &fi),
|
||||||
|
&Uid, &Gid, &Mode, &FileInfo);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
@ -1660,7 +1778,7 @@ int fsp_fuse_intf_AddDirInfo(void *buf, const char *name,
|
|||||||
UINT32 Uid, Gid, Mode;
|
UINT32 Uid, Gid, Mode;
|
||||||
NTSTATUS Result0;
|
NTSTATUS Result0;
|
||||||
|
|
||||||
Result0 = fsp_fuse_intf_GetFileInfoFunnel(dh->FileSystem, 0, 0, stbuf,
|
Result0 = fsp_fuse_intf_GetFileInfoFunnel(dh->FileSystem, name, 0, stbuf,
|
||||||
&Uid, &Gid, &Mode, 0, &DirInfo->FileInfo);
|
&Uid, &Gid, &Mode, 0, &DirInfo->FileInfo);
|
||||||
if (NT_SUCCESS(Result0))
|
if (NT_SUCCESS(Result0))
|
||||||
DirInfo->Padding[0] = 1; /* HACK: remember that the FileInfo is valid */
|
DirInfo->Padding[0] = 1; /* HACK: remember that the FileInfo is valid */
|
||||||
@ -1920,7 +2038,9 @@ static NTSTATUS fsp_fuse_intf_GetReparsePoint(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
fi.flags = filedesc->OpenFlags;
|
fi.flags = filedesc->OpenFlags;
|
||||||
fi.fh = filedesc->FileHandle;
|
fi.fh = filedesc->FileHandle;
|
||||||
|
|
||||||
return fsp_fuse_intf_GetReparsePointEx(FileSystem, filedesc->PosixPath, &fi, Buffer, PSize);
|
return fsp_fuse_intf_GetReparsePointEx(FileSystem, filedesc->PosixPath,
|
||||||
|
FUSE_FILE_INFO(filedesc->IsDirectory, &fi),
|
||||||
|
Buffer, PSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_SetReparsePoint(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_SetReparsePoint(FSP_FILE_SYSTEM *FileSystem,
|
||||||
@ -1991,7 +2111,8 @@ static NTSTATUS fsp_fuse_intf_SetReparsePoint(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
fi.flags = filedesc->OpenFlags;
|
fi.flags = filedesc->OpenFlags;
|
||||||
fi.fh = filedesc->FileHandle;
|
fi.fh = filedesc->FileHandle;
|
||||||
|
|
||||||
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath, &fi,
|
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath,
|
||||||
|
FUSE_FILE_INFO(filedesc->IsDirectory, &fi),
|
||||||
&Uid, &Gid, &Mode, &FileInfo);
|
&Uid, &Gid, &Mode, &FileInfo);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return Result;
|
return Result;
|
||||||
@ -2164,18 +2285,119 @@ static NTSTATUS fsp_fuse_intf_Control(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
memcpy(OutputBuffer, InputBuffer, InputBufferLength);
|
memcpy(OutputBuffer, InputBuffer, InputBufferLength);
|
||||||
err = f->ops.ioctl(filedesc->PosixPath, cmd, 0, &fi, 0, OutputBuffer);
|
err = f->ops.ioctl(filedesc->PosixPath, cmd, 0, &fi, 0, OutputBuffer);
|
||||||
}
|
}
|
||||||
|
*PBytesTransferred = OutputBufferLength;
|
||||||
|
|
||||||
return fsp_fuse_ntstatus_from_errno(f->env, err);
|
return fsp_fuse_ntstatus_from_errno(f->env, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NTSTATUS fsp_fuse_intf_GetEa(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
PVOID FileDesc,
|
||||||
|
PFILE_FULL_EA_INFORMATION Ea0, ULONG EaLength, PULONG PBytesTransferred)
|
||||||
|
{
|
||||||
|
struct fuse *f = FileSystem->UserContext;
|
||||||
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
|
char names[3 * 1024];
|
||||||
|
int namesize, valuesize;
|
||||||
|
PFILE_FULL_EA_INFORMATION Ea = Ea0, PrevEa = 0;
|
||||||
|
PUINT8 EaEnd = (PUINT8)Ea + EaLength, EaValue;
|
||||||
|
|
||||||
|
if (0 == f->ops.listxattr || 0 == f->ops.getxattr)
|
||||||
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
||||||
|
namesize = f->ops.listxattr(filedesc->PosixPath, names, sizeof names);
|
||||||
|
if (0 >= namesize)
|
||||||
|
{
|
||||||
|
*PBytesTransferred = 0;
|
||||||
|
return fsp_fuse_ntstatus_from_errno(f->env, namesize);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (char *p = names, *endp = p + namesize; endp > p; p += namesize)
|
||||||
|
{
|
||||||
|
namesize = lstrlenA(p) + 1;
|
||||||
|
|
||||||
|
EaValue = (PUINT8)Ea + FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + namesize;
|
||||||
|
if (EaValue >= EaEnd)
|
||||||
|
/* if there is no space (at least 1 byte) for a value bail out */
|
||||||
|
break;
|
||||||
|
|
||||||
|
valuesize = f->ops.getxattr(filedesc->PosixPath, p, EaValue, EaEnd - EaValue);
|
||||||
|
if (0 >= valuesize)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Ea->NextEntryOffset = 0;
|
||||||
|
Ea->Flags = 0;
|
||||||
|
Ea->EaNameLength = namesize - 1;
|
||||||
|
Ea->EaValueLength = valuesize;
|
||||||
|
memcpy(Ea->EaName, p, namesize);
|
||||||
|
|
||||||
|
if (0 != PrevEa)
|
||||||
|
PrevEa->NextEntryOffset = (ULONG)((PUINT8)Ea - (PUINT8)PrevEa);
|
||||||
|
PrevEa = Ea;
|
||||||
|
|
||||||
|
*PBytesTransferred = (ULONG)((PUINT8)EaValue - (PUINT8)Ea0 + valuesize);
|
||||||
|
Ea = (PVOID)((PUINT8)Ea +
|
||||||
|
FSP_FSCTL_ALIGN_UP(
|
||||||
|
FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + namesize + valuesize,
|
||||||
|
sizeof(ULONG)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS fsp_fuse_intf_SetEaEntry(
|
||||||
|
FSP_FILE_SYSTEM *FileSystem, PVOID Context,
|
||||||
|
PFILE_FULL_EA_INFORMATION SingleEa)
|
||||||
|
{
|
||||||
|
struct fuse *f = FileSystem->UserContext;
|
||||||
|
const char *PosixPath = Context;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (0 != SingleEa->EaValueLength)
|
||||||
|
err = f->ops.setxattr(PosixPath,
|
||||||
|
SingleEa->EaName, SingleEa->EaName + SingleEa->EaNameLength + 1, SingleEa->EaValueLength, 0);
|
||||||
|
else
|
||||||
|
err = f->ops.removexattr(PosixPath,
|
||||||
|
SingleEa->EaName);
|
||||||
|
|
||||||
|
return fsp_fuse_ntstatus_from_errno(f->env, err);
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS fsp_fuse_intf_SetEa(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
PVOID FileDesc,
|
||||||
|
PFILE_FULL_EA_INFORMATION Ea, ULONG EaLength,
|
||||||
|
FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
|
{
|
||||||
|
struct fuse *f = FileSystem->UserContext;
|
||||||
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
|
UINT32 Uid, Gid, Mode;
|
||||||
|
struct fuse_file_info fi;
|
||||||
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
if (0 == f->ops.setxattr || 0 == f->ops.removexattr)
|
||||||
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
||||||
|
Result = FspFileSystemEnumerateEa(FileSystem,
|
||||||
|
fsp_fuse_intf_SetEaEntry, filedesc->PosixPath, Ea, EaLength);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
return Result;
|
||||||
|
|
||||||
|
memset(&fi, 0, sizeof fi);
|
||||||
|
fi.flags = filedesc->OpenFlags;
|
||||||
|
fi.fh = filedesc->FileHandle;
|
||||||
|
|
||||||
|
return fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath,
|
||||||
|
FUSE_FILE_INFO(filedesc->IsDirectory, &fi),
|
||||||
|
&Uid, &Gid, &Mode, FileInfo);
|
||||||
|
}
|
||||||
|
|
||||||
FSP_FILE_SYSTEM_INTERFACE fsp_fuse_intf =
|
FSP_FILE_SYSTEM_INTERFACE fsp_fuse_intf =
|
||||||
{
|
{
|
||||||
fsp_fuse_intf_GetVolumeInfo,
|
fsp_fuse_intf_GetVolumeInfo,
|
||||||
fsp_fuse_intf_SetVolumeLabel,
|
fsp_fuse_intf_SetVolumeLabel,
|
||||||
fsp_fuse_intf_GetSecurityByName,
|
fsp_fuse_intf_GetSecurityByName,
|
||||||
fsp_fuse_intf_Create,
|
0,
|
||||||
fsp_fuse_intf_Open,
|
fsp_fuse_intf_Open,
|
||||||
fsp_fuse_intf_Overwrite,
|
0,
|
||||||
fsp_fuse_intf_Cleanup,
|
fsp_fuse_intf_Cleanup,
|
||||||
fsp_fuse_intf_Close,
|
fsp_fuse_intf_Close,
|
||||||
fsp_fuse_intf_Read,
|
fsp_fuse_intf_Read,
|
||||||
@ -2196,6 +2418,11 @@ FSP_FILE_SYSTEM_INTERFACE fsp_fuse_intf =
|
|||||||
0,
|
0,
|
||||||
fsp_fuse_intf_GetDirInfoByName,
|
fsp_fuse_intf_GetDirInfoByName,
|
||||||
fsp_fuse_intf_Control,
|
fsp_fuse_intf_Control,
|
||||||
|
0,
|
||||||
|
fsp_fuse_intf_Create,
|
||||||
|
fsp_fuse_intf_Overwrite,
|
||||||
|
fsp_fuse_intf_GetEa,
|
||||||
|
fsp_fuse_intf_SetEa,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fuse/fuse_loop.c
|
* @file dll/fuse/fuse_loop.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/fuse/library.h>
|
#include <dll/fuse/library.h>
|
||||||
@ -53,6 +57,10 @@ static NTSTATUS fsp_fuse_loop_start(struct fuse *f)
|
|||||||
struct fuse_conn_info conn;
|
struct fuse_conn_info conn;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
f->LoopEvent = CreateEventW(0, TRUE, FALSE, 0);
|
||||||
|
if (0 == f->LoopEvent)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
context = fsp_fuse_get_context(f->env);
|
context = fsp_fuse_get_context(f->env);
|
||||||
if (0 == context)
|
if (0 == context)
|
||||||
{
|
{
|
||||||
@ -152,6 +160,9 @@ static NTSTATUS fsp_fuse_loop_start(struct fuse *f)
|
|||||||
err = f->ops.readlink("/", buf, sizeof buf);
|
err = f->ops.readlink("/", buf, sizeof buf);
|
||||||
f->has_symlinks = -ENOSYS_(f->env) != err;
|
f->has_symlinks = -ENOSYS_(f->env) != err;
|
||||||
}
|
}
|
||||||
|
if (0 != f->ops.listxattr && 0 != f->ops.getxattr &&
|
||||||
|
0 != f->ops.setxattr && 0 != f->ops.removexattr)
|
||||||
|
f->VolumeParams.ExtendedAttributes = 1;
|
||||||
|
|
||||||
/* the FSD does not currently limit these VolumeParams fields; do so here! */
|
/* the FSD does not currently limit these VolumeParams fields; do so here! */
|
||||||
if (f->VolumeParams.SectorSize < FSP_FUSE_SECTORSIZE_MIN ||
|
if (f->VolumeParams.SectorSize < FSP_FUSE_SECTORSIZE_MIN ||
|
||||||
@ -239,6 +250,12 @@ static void fsp_fuse_loop_cleanup(struct fuse *f)
|
|||||||
f->ops.destroy(f->data);
|
f->ops.destroy(f->data);
|
||||||
f->fsinit = FALSE;
|
f->fsinit = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (0 != f->LoopEvent)
|
||||||
|
{
|
||||||
|
CloseHandle(f->LoopEvent);
|
||||||
|
f->LoopEvent = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_loop_internal(struct fuse *f)
|
static NTSTATUS fsp_fuse_loop_internal(struct fuse *f)
|
||||||
@ -264,11 +281,15 @@ static NTSTATUS fsp_fuse_loop_internal(struct fuse *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* if either the service thread dies or our event gets signaled, stop the loop */
|
/* if either the service thread dies or our event gets signaled, stop the loop */
|
||||||
WaitObjects[0] = fsp_fuse_svcthread;
|
Result = STATUS_SUCCESS;
|
||||||
WaitObjects[1] = f->LoopEvent;
|
if (!f->exited)
|
||||||
WaitResult = WaitForMultipleObjects(2, WaitObjects, FALSE, INFINITE);
|
{
|
||||||
if (WAIT_OBJECT_0 != WaitResult && WAIT_OBJECT_0 + 1 != WaitResult)
|
WaitObjects[0] = fsp_fuse_svcthread;
|
||||||
Result = FspNtStatusFromWin32(GetLastError());
|
WaitObjects[1] = f->LoopEvent;
|
||||||
|
WaitResult = WaitForMultipleObjects(2, WaitObjects, FALSE, INFINITE);
|
||||||
|
if (WAIT_OBJECT_0 != WaitResult && WAIT_OBJECT_0 + 1 != WaitResult)
|
||||||
|
Result = FspNtStatusFromWin32(GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
fsp_fuse_loop_stop(f);
|
fsp_fuse_loop_stop(f);
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fuse/fuse_main.c
|
* @file dll/fuse/fuse_main.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/fuse/library.h>
|
#include <dll/fuse/library.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fuse/fuse_opt.c
|
* @file dll/fuse/fuse_opt.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/fuse/library.h>
|
#include <dll/fuse/library.h>
|
||||||
@ -212,11 +216,13 @@ static int fsp_fuse_opt_call_proc(struct fsp_fuse_env *env,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
if (0 != fullarg)
|
if (0 != fullarg)
|
||||||
env->memfree(fullarg);
|
env->memfree(fullarg);
|
||||||
|
|
||||||
return 0;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fsp_fuse_opt_process_arg(struct fsp_fuse_env *env,
|
static int fsp_fuse_opt_process_arg(struct fsp_fuse_env *env,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fuse/library.h
|
* @file dll/fuse/library.h
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef WINFSP_DLL_FUSE_LIBRARY_H_INCLUDED
|
#ifndef WINFSP_DLL_FUSE_LIBRARY_H_INCLUDED
|
||||||
@ -46,9 +50,12 @@ struct fuse
|
|||||||
struct fsp_fuse_env *env;
|
struct fsp_fuse_env *env;
|
||||||
int set_umask, umask;
|
int set_umask, umask;
|
||||||
int set_create_umask, create_umask;
|
int set_create_umask, create_umask;
|
||||||
|
int set_create_file_umask, create_file_umask;
|
||||||
|
int set_create_dir_umask, create_dir_umask;
|
||||||
int set_uid, uid;
|
int set_uid, uid;
|
||||||
int set_gid, gid;
|
int set_gid, gid;
|
||||||
int rellinks;
|
int rellinks;
|
||||||
|
int dothidden;
|
||||||
unsigned ThreadCount;
|
unsigned ThreadCount;
|
||||||
struct fuse_operations ops;
|
struct fuse_operations ops;
|
||||||
void *data;
|
void *data;
|
||||||
@ -133,12 +140,16 @@ struct fsp_fuse_core_opt_data
|
|||||||
HANDLE DebugLogHandle;
|
HANDLE DebugLogHandle;
|
||||||
int set_umask, umask,
|
int set_umask, umask,
|
||||||
set_create_umask, create_umask,
|
set_create_umask, create_umask,
|
||||||
set_uid, uid,
|
set_create_file_umask, create_file_umask,
|
||||||
|
set_create_dir_umask, create_dir_umask,
|
||||||
|
set_uid, uid, username_to_uid_result,
|
||||||
set_gid, gid,
|
set_gid, gid,
|
||||||
set_attr_timeout, attr_timeout,
|
set_attr_timeout, attr_timeout,
|
||||||
rellinks;
|
rellinks,
|
||||||
|
dothidden;
|
||||||
int set_FileInfoTimeout,
|
int set_FileInfoTimeout,
|
||||||
set_DirInfoTimeout,
|
set_DirInfoTimeout,
|
||||||
|
set_EaTimeout,
|
||||||
set_VolumeInfoTimeout,
|
set_VolumeInfoTimeout,
|
||||||
set_KeepFileCache;
|
set_KeepFileCache;
|
||||||
unsigned ThreadCount;
|
unsigned ThreadCount;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fuse3/fuse2to3.c
|
* @file dll/fuse3/fuse2to3.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/fuse3/library.h>
|
#include <dll/fuse3/library.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fuse3/fuse3.c
|
* @file dll/fuse3/fuse3.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/fuse3/library.h>
|
#include <dll/fuse3/library.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fuse/fuse3_compat.c
|
* @file dll/fuse/fuse3_compat.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fuse3/library.h
|
* @file dll/fuse3/library.h
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef WINFSP_DLL_FUSE3_LIBRARY_H_INCLUDED
|
#ifndef WINFSP_DLL_FUSE3_LIBRARY_H_INCLUDED
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/launch.c
|
* @file dll/launch.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,16 +10,31 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
|
|
||||||
FSP_API NTSTATUS FspLaunchCallLauncherPipe(
|
FSP_API NTSTATUS FspLaunchCallLauncherPipe(
|
||||||
WCHAR Command, ULONG Argc, PWSTR *Argv, ULONG *Argl,
|
WCHAR Command, ULONG Argc, PWSTR *Argv, ULONG *Argl,
|
||||||
PWSTR Buffer, PULONG PSize, PULONG PLauncherError)
|
PWSTR Buffer, PULONG PSize,
|
||||||
|
PULONG PLauncherError)
|
||||||
|
{
|
||||||
|
return FspLaunchCallLauncherPipeEx(
|
||||||
|
Command, Argc, Argv, Argl, Buffer, PSize, FALSE, PLauncherError);
|
||||||
|
}
|
||||||
|
|
||||||
|
FSP_API NTSTATUS FspLaunchCallLauncherPipeEx(
|
||||||
|
WCHAR Command, ULONG Argc, PWSTR *Argv, ULONG *Argl,
|
||||||
|
PWSTR Buffer, PULONG PSize,
|
||||||
|
BOOLEAN AllowImpersonation,
|
||||||
|
PULONG PLauncherError)
|
||||||
{
|
{
|
||||||
PWSTR PipeBuf = 0, P;
|
PWSTR PipeBuf = 0, P;
|
||||||
ULONG Length, BytesTransferred;
|
ULONG Length, BytesTransferred;
|
||||||
@ -49,9 +64,9 @@ FSP_API NTSTATUS FspLaunchCallLauncherPipe(
|
|||||||
memcpy(P, Argv[I], Length * sizeof(WCHAR)); P += Length; *P++ = L'\0';
|
memcpy(P, Argv[I], Length * sizeof(WCHAR)); P += Length; *P++ = L'\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
Result = FspCallNamedPipeSecurely(L"" FSP_LAUNCH_PIPE_NAME,
|
Result = FspCallNamedPipeSecurelyEx(L"" FSP_LAUNCH_PIPE_NAME,
|
||||||
PipeBuf, (ULONG)(P - PipeBuf) * sizeof(WCHAR), PipeBuf, FSP_LAUNCH_PIPE_BUFFER_SIZE,
|
PipeBuf, (ULONG)(P - PipeBuf) * sizeof(WCHAR), PipeBuf, FSP_LAUNCH_PIPE_BUFFER_SIZE,
|
||||||
&BytesTransferred, NMPWAIT_USE_DEFAULT_WAIT, FSP_LAUNCH_PIPE_OWNER);
|
&BytesTransferred, NMPWAIT_USE_DEFAULT_WAIT, AllowImpersonation, FSP_LAUNCH_PIPE_OWNER);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
@ -98,8 +113,17 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
FSP_API NTSTATUS FspLaunchStart(
|
FSP_API NTSTATUS FspLaunchStart(
|
||||||
|
PWSTR ClassName, PWSTR InstanceName, ULONG Argc, PWSTR *Argv,
|
||||||
|
BOOLEAN HasSecret,
|
||||||
|
PULONG PLauncherError)
|
||||||
|
{
|
||||||
|
return FspLaunchStartEx(ClassName, InstanceName, Argc, Argv, HasSecret, FALSE, PLauncherError);
|
||||||
|
}
|
||||||
|
|
||||||
|
FSP_API NTSTATUS FspLaunchStartEx(
|
||||||
PWSTR ClassName, PWSTR InstanceName, ULONG Argc, PWSTR *Argv0,
|
PWSTR ClassName, PWSTR InstanceName, ULONG Argc, PWSTR *Argv0,
|
||||||
BOOLEAN HasSecret,
|
BOOLEAN HasSecret,
|
||||||
|
BOOLEAN AllowImpersonation,
|
||||||
PULONG PLauncherError)
|
PULONG PLauncherError)
|
||||||
{
|
{
|
||||||
PWSTR Argv[9 + 2];
|
PWSTR Argv[9 + 2];
|
||||||
@ -111,9 +135,9 @@ FSP_API NTSTATUS FspLaunchStart(
|
|||||||
Argv[1] = InstanceName;
|
Argv[1] = InstanceName;
|
||||||
memcpy(Argv + 2, Argv0, Argc * sizeof(PWSTR));
|
memcpy(Argv + 2, Argv0, Argc * sizeof(PWSTR));
|
||||||
|
|
||||||
return FspLaunchCallLauncherPipe(
|
return FspLaunchCallLauncherPipeEx(
|
||||||
HasSecret ? FspLaunchCmdStartWithSecret : FspLaunchCmdStart,
|
HasSecret ? FspLaunchCmdStartWithSecret : FspLaunchCmdStart,
|
||||||
Argc + 2, Argv, 0, 0, 0, PLauncherError);
|
Argc + 2, Argv, 0, 0, 0, AllowImpersonation, PLauncherError);
|
||||||
}
|
}
|
||||||
|
|
||||||
FSP_API NTSTATUS FspLaunchStop(
|
FSP_API NTSTATUS FspLaunchStop(
|
||||||
@ -246,8 +270,10 @@ FSP_API NTSTATUS FspLaunchRegSetRecord(
|
|||||||
SETFIELD(WorkDirectory);
|
SETFIELD(WorkDirectory);
|
||||||
SETFIELD(RunAs);
|
SETFIELD(RunAs);
|
||||||
SETFIELD(Security);
|
SETFIELD(Security);
|
||||||
|
SETFIELD(AuthPackage);
|
||||||
SETFIELDI(JobControl, ~0); /* JobControl default is 1; but we treat as without default */
|
SETFIELDI(JobControl, ~0); /* JobControl default is 1; but we treat as without default */
|
||||||
SETFIELDI(Credentials, 0);
|
SETFIELDI(Credentials, 0);
|
||||||
|
SETFIELDI(AuthPackageId, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -396,8 +422,10 @@ FSP_API NTSTATUS FspLaunchRegGetRecord(
|
|||||||
GETFIELD(WorkDirectory);
|
GETFIELD(WorkDirectory);
|
||||||
GETFIELD(RunAs);
|
GETFIELD(RunAs);
|
||||||
GETFIELD(Security);
|
GETFIELD(Security);
|
||||||
|
GETFIELD(AuthPackage);
|
||||||
GETFIELDI(JobControl);
|
GETFIELDI(JobControl);
|
||||||
GETFIELDI(Credentials);
|
GETFIELDI(Credentials);
|
||||||
|
GETFIELDI(AuthPackageId);
|
||||||
|
|
||||||
if (0 == Record->Executable)
|
if (0 == Record->Executable)
|
||||||
{
|
{
|
||||||
@ -426,8 +454,11 @@ FSP_API NTSTATUS FspLaunchRegGetRecord(
|
|||||||
(PVOID)(Record->Buffer + ((PUINT8)RecordBuf.RunAs - RegBuf)) : 0;
|
(PVOID)(Record->Buffer + ((PUINT8)RecordBuf.RunAs - RegBuf)) : 0;
|
||||||
Record->Security = 0 != RecordBuf.Security ?
|
Record->Security = 0 != RecordBuf.Security ?
|
||||||
(PVOID)(Record->Buffer + ((PUINT8)RecordBuf.Security - RegBuf)) : 0;
|
(PVOID)(Record->Buffer + ((PUINT8)RecordBuf.Security - RegBuf)) : 0;
|
||||||
|
Record->AuthPackage = 0 != RecordBuf.AuthPackage ?
|
||||||
|
(PVOID)(Record->Buffer + ((PUINT8)RecordBuf.AuthPackage - RegBuf)) : 0;
|
||||||
Record->JobControl = RecordBuf.JobControl;
|
Record->JobControl = RecordBuf.JobControl;
|
||||||
Record->Credentials = RecordBuf.Credentials;
|
Record->Credentials = RecordBuf.Credentials;
|
||||||
|
Record->AuthPackageId = RecordBuf.AuthPackageId;
|
||||||
|
|
||||||
*PRecord = Record;
|
*PRecord = Record;
|
||||||
Result = STATUS_SUCCESS;
|
Result = STATUS_SUCCESS;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/library.c
|
* @file dll/library.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
@ -42,6 +46,7 @@ BOOL WINAPI DllMain(HINSTANCE Instance, DWORD Reason, PVOID Reserved)
|
|||||||
Dynamic = 0 == Reserved;
|
Dynamic = 0 == Reserved;
|
||||||
fsp_fuse_finalize(Dynamic);
|
fsp_fuse_finalize(Dynamic);
|
||||||
FspServiceFinalize(Dynamic);
|
FspServiceFinalize(Dynamic);
|
||||||
|
FspFileSystemFinalize(Dynamic);
|
||||||
FspEventLogFinalize(Dynamic);
|
FspEventLogFinalize(Dynamic);
|
||||||
FspPosixFinalize(Dynamic);
|
FspPosixFinalize(Dynamic);
|
||||||
FspWksidFinalize(Dynamic);
|
FspWksidFinalize(Dynamic);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/library.h
|
* @file dll/library.h
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef WINFSP_DLL_LIBRARY_H_INCLUDED
|
#ifndef WINFSP_DLL_LIBRARY_H_INCLUDED
|
||||||
@ -43,6 +47,7 @@
|
|||||||
VOID FspWksidFinalize(BOOLEAN Dynamic);
|
VOID FspWksidFinalize(BOOLEAN Dynamic);
|
||||||
VOID FspPosixFinalize(BOOLEAN Dynamic);
|
VOID FspPosixFinalize(BOOLEAN Dynamic);
|
||||||
VOID FspEventLogFinalize(BOOLEAN Dynamic);
|
VOID FspEventLogFinalize(BOOLEAN Dynamic);
|
||||||
|
VOID FspFileSystemFinalize(BOOLEAN Dynamic);
|
||||||
VOID FspServiceFinalize(BOOLEAN Dynamic);
|
VOID FspServiceFinalize(BOOLEAN Dynamic);
|
||||||
VOID fsp_fuse_finalize(BOOLEAN Dynamic);
|
VOID fsp_fuse_finalize(BOOLEAN Dynamic);
|
||||||
VOID fsp_fuse_finalize_thread(VOID);
|
VOID fsp_fuse_finalize_thread(VOID);
|
||||||
@ -86,5 +91,23 @@ static inline BOOLEAN FspPathIsDrive(PWSTR FileName)
|
|||||||
) &&
|
) &&
|
||||||
L':' == FileName[1] && L'\0' == FileName[2];
|
L':' == FileName[1] && L'\0' == FileName[2];
|
||||||
}
|
}
|
||||||
|
static inline BOOLEAN FspPathIsMountmgrMountPoint(PWSTR FileName)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(
|
||||||
|
L'\\' == FileName[0] &&
|
||||||
|
L'\\' == FileName[1] &&
|
||||||
|
(L'?' == FileName[2] || L'.' == FileName[2]) &&
|
||||||
|
L'\\' == FileName[3]
|
||||||
|
) &&
|
||||||
|
(
|
||||||
|
(L'A' <= FileName[4] && FileName[4] <= L'Z') ||
|
||||||
|
(L'a' <= FileName[4] && FileName[4] <= L'z')
|
||||||
|
) &&
|
||||||
|
L':' == FileName[5];
|
||||||
|
}
|
||||||
|
|
||||||
|
#define FSP_NEXT_EA(Ea, EaEnd) \
|
||||||
|
(0 != (Ea)->NextEntryOffset ? (PVOID)((PUINT8)(Ea) + (Ea)->NextEntryOffset) : (EaEnd))
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
612
src/dll/mount.c
Normal file
612
src/dll/mount.c
Normal file
@ -0,0 +1,612 @@
|
|||||||
|
/**
|
||||||
|
* @file dll/mount.c
|
||||||
|
*
|
||||||
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* This file is part of WinFsp.
|
||||||
|
*
|
||||||
|
* You can redistribute it and/or modify it under the terms of the GNU
|
||||||
|
* General Public License version 3 as published by the Free Software
|
||||||
|
* Foundation.
|
||||||
|
*
|
||||||
|
* Licensees holding a valid commercial license may use this software
|
||||||
|
* in accordance with the commercial license agreement provided in
|
||||||
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <dll/library.h>
|
||||||
|
|
||||||
|
static INIT_ONCE FspMountInitOnce = INIT_ONCE_STATIC_INIT;
|
||||||
|
static NTSTATUS (NTAPI *FspNtOpenSymbolicLinkObject)(
|
||||||
|
PHANDLE LinkHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes);
|
||||||
|
static NTSTATUS (NTAPI *FspNtMakeTemporaryObject)(
|
||||||
|
HANDLE Handle);
|
||||||
|
static NTSTATUS (NTAPI *FspNtClose)(
|
||||||
|
HANDLE Handle);
|
||||||
|
|
||||||
|
static BOOL WINAPI FspMountInitialize(
|
||||||
|
PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context)
|
||||||
|
{
|
||||||
|
HANDLE Handle;
|
||||||
|
|
||||||
|
Handle = GetModuleHandleW(L"ntdll.dll");
|
||||||
|
if (0 != Handle)
|
||||||
|
{
|
||||||
|
FspNtOpenSymbolicLinkObject = (PVOID)GetProcAddress(Handle, "NtOpenSymbolicLinkObject");
|
||||||
|
FspNtMakeTemporaryObject = (PVOID)GetProcAddress(Handle, "NtMakeTemporaryObject");
|
||||||
|
FspNtClose = (PVOID)GetProcAddress(Handle, "NtClose");
|
||||||
|
|
||||||
|
if (0 == FspNtOpenSymbolicLinkObject || 0 == FspNtMakeTemporaryObject || 0 == FspNtClose)
|
||||||
|
{
|
||||||
|
FspNtOpenSymbolicLinkObject = 0;
|
||||||
|
FspNtMakeTemporaryObject = 0;
|
||||||
|
FspNtClose = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS FspMountmgrControl(ULONG IoControlCode,
|
||||||
|
PVOID InputBuffer, ULONG InputBufferLength, PVOID OutputBuffer, PULONG POutputBufferLength)
|
||||||
|
{
|
||||||
|
HANDLE MgrHandle = INVALID_HANDLE_VALUE;
|
||||||
|
DWORD Bytes = 0;
|
||||||
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
if (0 == POutputBufferLength)
|
||||||
|
POutputBufferLength = &Bytes;
|
||||||
|
|
||||||
|
MgrHandle = CreateFileW(L"\\\\.\\MountPointManager",
|
||||||
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
|
0,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
0,
|
||||||
|
0);
|
||||||
|
if (INVALID_HANDLE_VALUE == MgrHandle)
|
||||||
|
{
|
||||||
|
Result = FspNtStatusFromWin32(GetLastError());
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!DeviceIoControl(MgrHandle,
|
||||||
|
IoControlCode,
|
||||||
|
InputBuffer, InputBufferLength, OutputBuffer, *POutputBufferLength,
|
||||||
|
&Bytes, 0))
|
||||||
|
{
|
||||||
|
Result = FspNtStatusFromWin32(GetLastError());
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
*POutputBufferLength = Bytes;
|
||||||
|
Result = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
if (INVALID_HANDLE_VALUE != MgrHandle)
|
||||||
|
CloseHandle(MgrHandle);
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS FspMountSet_Mountmgr(HANDLE VolumeHandle, PWSTR VolumeName, PWSTR MountPoint)
|
||||||
|
{
|
||||||
|
/* only support drives for now! (format: \\.\X:) */
|
||||||
|
if (L'\0' != MountPoint[6])
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
/* mountmgr.h */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
Disabled = 0,
|
||||||
|
Enabled,
|
||||||
|
} MOUNTMGR_AUTO_MOUNT_STATE;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
MOUNTMGR_AUTO_MOUNT_STATE CurrentState;
|
||||||
|
} MOUNTMGR_QUERY_AUTO_MOUNT;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
MOUNTMGR_AUTO_MOUNT_STATE NewState;
|
||||||
|
} MOUNTMGR_SET_AUTO_MOUNT;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
USHORT DeviceNameLength;
|
||||||
|
WCHAR DeviceName[1];
|
||||||
|
} MOUNTMGR_TARGET_NAME;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
USHORT SymbolicLinkNameOffset;
|
||||||
|
USHORT SymbolicLinkNameLength;
|
||||||
|
USHORT DeviceNameOffset;
|
||||||
|
USHORT DeviceNameLength;
|
||||||
|
} MOUNTMGR_CREATE_POINT_INPUT;
|
||||||
|
|
||||||
|
GUID UniqueId;
|
||||||
|
MOUNTMGR_QUERY_AUTO_MOUNT QueryAutoMount;
|
||||||
|
MOUNTMGR_SET_AUTO_MOUNT SetAutoMount;
|
||||||
|
MOUNTMGR_TARGET_NAME *TargetName = 0;
|
||||||
|
MOUNTMGR_CREATE_POINT_INPUT *CreatePointInput = 0;
|
||||||
|
ULONG VolumeNameSize, QueryAutoMountSize, TargetNameSize, CreatePointInputSize;
|
||||||
|
HKEY RegKey;
|
||||||
|
LONG RegResult;
|
||||||
|
WCHAR RegValueName[MAX_PATH];
|
||||||
|
UINT8 RegValueData[sizeof UniqueId];
|
||||||
|
DWORD RegValueNameSize, RegValueDataSize;
|
||||||
|
DWORD RegType;
|
||||||
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
/* transform our volume into one that can be used by the MountManager */
|
||||||
|
Result = FspFsctlMakeMountdev(VolumeHandle, FALSE, &UniqueId);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
VolumeNameSize = lstrlenW(VolumeName) * sizeof(WCHAR);
|
||||||
|
QueryAutoMountSize = sizeof QueryAutoMount;
|
||||||
|
TargetNameSize = FIELD_OFFSET(MOUNTMGR_TARGET_NAME, DeviceName) + VolumeNameSize;
|
||||||
|
CreatePointInputSize = sizeof *CreatePointInput +
|
||||||
|
sizeof L"\\DosDevices\\X:" - sizeof(WCHAR) + VolumeNameSize;
|
||||||
|
|
||||||
|
TargetName = MemAlloc(TargetNameSize);
|
||||||
|
if (0 == TargetName)
|
||||||
|
{
|
||||||
|
Result = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
CreatePointInput = MemAlloc(CreatePointInputSize);
|
||||||
|
if (0 == CreatePointInput)
|
||||||
|
{
|
||||||
|
Result = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* query the current AutoMount value and save it */
|
||||||
|
Result = FspMountmgrControl(
|
||||||
|
CTL_CODE('m', 15, METHOD_BUFFERED, FILE_ANY_ACCESS),
|
||||||
|
/* IOCTL_MOUNTMGR_QUERY_AUTO_MOUNT */
|
||||||
|
0, 0, &QueryAutoMount, &QueryAutoMountSize);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
/* disable AutoMount */
|
||||||
|
SetAutoMount.NewState = 0;
|
||||||
|
Result = FspMountmgrControl(
|
||||||
|
CTL_CODE('m', 16, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||||
|
/* IOCTL_MOUNTMGR_SET_AUTO_MOUNT */
|
||||||
|
&SetAutoMount, sizeof SetAutoMount, 0, 0);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
/* announce volume arrival */
|
||||||
|
memset(TargetName, 0, sizeof *TargetName);
|
||||||
|
TargetName->DeviceNameLength = (USHORT)VolumeNameSize;
|
||||||
|
memcpy(TargetName->DeviceName,
|
||||||
|
VolumeName, TargetName->DeviceNameLength);
|
||||||
|
Result = FspMountmgrControl(
|
||||||
|
CTL_CODE('m', 11, METHOD_BUFFERED, FILE_READ_ACCESS),
|
||||||
|
/* IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION */
|
||||||
|
TargetName, TargetNameSize, 0, 0);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
/* reset the AutoMount value to the saved one */
|
||||||
|
SetAutoMount.NewState = QueryAutoMount.CurrentState;
|
||||||
|
FspMountmgrControl(
|
||||||
|
CTL_CODE('m', 16, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||||
|
/* IOCTL_MOUNTMGR_SET_AUTO_MOUNT */
|
||||||
|
&SetAutoMount, sizeof SetAutoMount, 0, 0);
|
||||||
|
#if 0
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* create mount point */
|
||||||
|
memset(CreatePointInput, 0, sizeof *CreatePointInput);
|
||||||
|
CreatePointInput->SymbolicLinkNameOffset = sizeof *CreatePointInput;
|
||||||
|
CreatePointInput->SymbolicLinkNameLength = sizeof L"\\DosDevices\\X:" - sizeof(WCHAR);
|
||||||
|
CreatePointInput->DeviceNameOffset =
|
||||||
|
CreatePointInput->SymbolicLinkNameOffset + CreatePointInput->SymbolicLinkNameLength;
|
||||||
|
CreatePointInput->DeviceNameLength = (USHORT)VolumeNameSize;
|
||||||
|
memcpy((PUINT8)CreatePointInput + CreatePointInput->SymbolicLinkNameOffset,
|
||||||
|
L"\\DosDevices\\X:", CreatePointInput->SymbolicLinkNameLength);
|
||||||
|
((PWCHAR)((PUINT8)CreatePointInput + CreatePointInput->SymbolicLinkNameOffset))[12] =
|
||||||
|
MountPoint[4] & ~0x20;
|
||||||
|
/* convert to uppercase */
|
||||||
|
memcpy((PUINT8)CreatePointInput + CreatePointInput->DeviceNameOffset,
|
||||||
|
VolumeName, CreatePointInput->DeviceNameLength);
|
||||||
|
Result = FspMountmgrControl(
|
||||||
|
CTL_CODE('m', 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||||
|
/* IOCTL_MOUNTMGR_CREATE_POINT */
|
||||||
|
CreatePointInput, CreatePointInputSize, 0, 0);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
/* HACK: delete the MountManager registry entries */
|
||||||
|
RegResult = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"System\\MountedDevices",
|
||||||
|
0, KEY_READ | KEY_WRITE, &RegKey);
|
||||||
|
if (ERROR_SUCCESS == RegResult)
|
||||||
|
{
|
||||||
|
for (DWORD I = 0;; I++)
|
||||||
|
{
|
||||||
|
RegValueNameSize = MAX_PATH;
|
||||||
|
RegValueDataSize = sizeof RegValueData;
|
||||||
|
RegResult = RegEnumValueW(RegKey,
|
||||||
|
I, RegValueName, &RegValueNameSize, 0, &RegType, RegValueData, &RegValueDataSize);
|
||||||
|
if (ERROR_NO_MORE_ITEMS == RegResult)
|
||||||
|
break;
|
||||||
|
else if (ERROR_SUCCESS != RegResult)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (REG_BINARY == RegType &&
|
||||||
|
sizeof RegValueData == RegValueDataSize &&
|
||||||
|
InlineIsEqualGUID((GUID *)&RegValueData, &UniqueId))
|
||||||
|
{
|
||||||
|
RegResult = RegDeleteValueW(RegKey, RegValueName);
|
||||||
|
if (ERROR_SUCCESS == RegResult)
|
||||||
|
/* reset index after modifying key; only safe way to use RegEnumValueW with modifications */
|
||||||
|
I = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(RegKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
MemFree(CreatePointInput);
|
||||||
|
MemFree(TargetName);
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS FspMountRemove_Mountmgr(PWSTR MountPoint)
|
||||||
|
{
|
||||||
|
/* mountmgr.h */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ULONG SymbolicLinkNameOffset;
|
||||||
|
USHORT SymbolicLinkNameLength;
|
||||||
|
USHORT Reserved1;
|
||||||
|
ULONG UniqueIdOffset;
|
||||||
|
USHORT UniqueIdLength;
|
||||||
|
USHORT Reserved2;
|
||||||
|
ULONG DeviceNameOffset;
|
||||||
|
USHORT DeviceNameLength;
|
||||||
|
USHORT Reserved3;
|
||||||
|
} MOUNTMGR_MOUNT_POINT;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ULONG Size;
|
||||||
|
ULONG NumberOfMountPoints;
|
||||||
|
MOUNTMGR_MOUNT_POINT MountPoints[1];
|
||||||
|
} MOUNTMGR_MOUNT_POINTS;
|
||||||
|
|
||||||
|
MOUNTMGR_MOUNT_POINT *Input = 0;
|
||||||
|
MOUNTMGR_MOUNT_POINTS *Output = 0;
|
||||||
|
ULONG InputSize, OutputSize;
|
||||||
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
InputSize = sizeof *Input + sizeof L"\\DosDevices\\X:" - sizeof(WCHAR);
|
||||||
|
OutputSize = 4096;
|
||||||
|
|
||||||
|
Input = MemAlloc(InputSize);
|
||||||
|
if (0 == Input)
|
||||||
|
{
|
||||||
|
Result = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
Output = MemAlloc(OutputSize);
|
||||||
|
if (0 == Output)
|
||||||
|
{
|
||||||
|
Result = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(Input, 0, sizeof *Input);
|
||||||
|
Input->SymbolicLinkNameOffset = sizeof *Input;
|
||||||
|
Input->SymbolicLinkNameLength = sizeof L"\\DosDevices\\X:" - sizeof(WCHAR);
|
||||||
|
memcpy((PUINT8)Input + Input->SymbolicLinkNameOffset,
|
||||||
|
L"\\DosDevices\\X:", Input->SymbolicLinkNameLength);
|
||||||
|
((PWCHAR)((PUINT8)Input + Input->SymbolicLinkNameOffset))[12] = MountPoint[4] & ~0x20;
|
||||||
|
/* convert to uppercase */
|
||||||
|
Result = FspMountmgrControl(
|
||||||
|
CTL_CODE('m', 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
|
||||||
|
/* IOCTL_MOUNTMGR_DELETE_POINTS */
|
||||||
|
Input, InputSize, Output, &OutputSize);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
Result = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
MemFree(Output);
|
||||||
|
MemFree(Input);
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS FspLauncherDefineDosDevice(
|
||||||
|
WCHAR Sign, PWSTR MountPoint, PWSTR VolumeName)
|
||||||
|
{
|
||||||
|
if (2 != lstrlenW(MountPoint) ||
|
||||||
|
FSP_FSCTL_VOLUME_NAME_SIZEMAX / sizeof(WCHAR) <= lstrlenW(VolumeName))
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
WCHAR Argv0[4];
|
||||||
|
PWSTR Argv[2];
|
||||||
|
NTSTATUS Result;
|
||||||
|
ULONG ErrorCode;
|
||||||
|
|
||||||
|
Argv0[0] = Sign;
|
||||||
|
Argv0[1] = MountPoint[0];
|
||||||
|
Argv0[2] = MountPoint[1];
|
||||||
|
Argv0[3] = L'\0';
|
||||||
|
|
||||||
|
Argv[0] = Argv0;
|
||||||
|
Argv[1] = VolumeName;
|
||||||
|
|
||||||
|
Result = FspLaunchCallLauncherPipe(FspLaunchCmdDefineDosDevice, 2, Argv, 0, 0, 0, &ErrorCode);
|
||||||
|
return !NT_SUCCESS(Result) ? Result : FspNtStatusFromWin32(ErrorCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS FspMountSet_Drive(PWSTR VolumeName, PWSTR MountPoint, PHANDLE PMountHandle)
|
||||||
|
{
|
||||||
|
NTSTATUS Result;
|
||||||
|
BOOLEAN IsLocalSystem, IsServiceContext;
|
||||||
|
|
||||||
|
*PMountHandle = 0;
|
||||||
|
|
||||||
|
Result = FspServiceContextCheck(0, &IsLocalSystem);
|
||||||
|
IsServiceContext = NT_SUCCESS(Result) && !IsLocalSystem;
|
||||||
|
if (IsServiceContext)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* If the current process is in the service context but not LocalSystem,
|
||||||
|
* ask the launcher to DefineDosDevice for us. This is because the launcher
|
||||||
|
* runs in the LocalSystem context and can create global drives.
|
||||||
|
*
|
||||||
|
* In this case the launcher will also add DELETE access to the drive symlink
|
||||||
|
* for us, so that we can make it temporary below.
|
||||||
|
*/
|
||||||
|
Result = FspLauncherDefineDosDevice(L'+', MountPoint, VolumeName);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!DefineDosDeviceW(DDD_RAW_TARGET_PATH, MountPoint, VolumeName))
|
||||||
|
return FspNtStatusFromWin32(GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 != FspNtOpenSymbolicLinkObject)
|
||||||
|
{
|
||||||
|
WCHAR SymlinkBuf[6];
|
||||||
|
UNICODE_STRING Symlink;
|
||||||
|
OBJECT_ATTRIBUTES Obja;
|
||||||
|
|
||||||
|
memcpy(SymlinkBuf, L"\\??\\X:", sizeof SymlinkBuf);
|
||||||
|
SymlinkBuf[4] = MountPoint[0];
|
||||||
|
Symlink.Length = Symlink.MaximumLength = sizeof SymlinkBuf;
|
||||||
|
Symlink.Buffer = SymlinkBuf;
|
||||||
|
|
||||||
|
memset(&Obja, 0, sizeof Obja);
|
||||||
|
Obja.Length = sizeof Obja;
|
||||||
|
Obja.ObjectName = &Symlink;
|
||||||
|
Obja.Attributes = OBJ_CASE_INSENSITIVE;
|
||||||
|
|
||||||
|
Result = FspNtOpenSymbolicLinkObject(PMountHandle, DELETE, &Obja);
|
||||||
|
if (NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
Result = FspNtMakeTemporaryObject(*PMountHandle);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
FspNtClose(*PMountHandle);
|
||||||
|
*PMountHandle = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* HACK:
|
||||||
|
*
|
||||||
|
* Handles do not use the low 2 bits (unless they are console handles).
|
||||||
|
* Abuse this fact to remember that we are running in the service context.
|
||||||
|
*/
|
||||||
|
*PMountHandle = (HANDLE)(UINT_PTR)((DWORD)(UINT_PTR)*PMountHandle | IsServiceContext);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS FspMountRemove_Drive(PWSTR VolumeName, PWSTR MountPoint, HANDLE MountHandle)
|
||||||
|
{
|
||||||
|
NTSTATUS Result;
|
||||||
|
BOOLEAN IsServiceContext;
|
||||||
|
|
||||||
|
IsServiceContext = 0 != ((DWORD)(UINT_PTR)MountHandle & 1);
|
||||||
|
MountHandle = (HANDLE)(UINT_PTR)((DWORD)(UINT_PTR)MountHandle & ~1);
|
||||||
|
if (IsServiceContext)
|
||||||
|
/*
|
||||||
|
* If the current process is in the service context but not LocalSystem,
|
||||||
|
* ask the launcher to DefineDosDevice for us. This is because the launcher
|
||||||
|
* runs in the LocalSystem context and can remove global drives.
|
||||||
|
*/
|
||||||
|
Result = FspLauncherDefineDosDevice(L'-', MountPoint, VolumeName);
|
||||||
|
else
|
||||||
|
Result = DefineDosDeviceW(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE,
|
||||||
|
MountPoint, VolumeName) ? STATUS_SUCCESS : FspNtStatusFromWin32(GetLastError());
|
||||||
|
|
||||||
|
if (0 != MountHandle)
|
||||||
|
FspNtClose(MountHandle);
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS FspMountSet_Directory(PWSTR VolumeName, PWSTR MountPoint,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor, PHANDLE PMountHandle)
|
||||||
|
{
|
||||||
|
NTSTATUS Result;
|
||||||
|
SECURITY_ATTRIBUTES SecurityAttributes;
|
||||||
|
HANDLE MountHandle = INVALID_HANDLE_VALUE;
|
||||||
|
DWORD Backslashes, Bytes;
|
||||||
|
USHORT VolumeNameLength, BackslashLength, ReparseDataLength;
|
||||||
|
PREPARSE_DATA_BUFFER ReparseData = 0;
|
||||||
|
PWSTR P, PathBuffer;
|
||||||
|
|
||||||
|
*PMountHandle = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Windows does not allow mount points (junctions) to point to network file systems.
|
||||||
|
*
|
||||||
|
* Count how many backslashes our VolumeName has. If it is 3 or more this is a network
|
||||||
|
* file system. Preemptively return STATUS_NETWORK_ACCESS_DENIED.
|
||||||
|
*/
|
||||||
|
for (P = VolumeName, Backslashes = 0; *P; P++)
|
||||||
|
if (L'\\' == *P)
|
||||||
|
if (3 == ++Backslashes)
|
||||||
|
{
|
||||||
|
Result = STATUS_NETWORK_ACCESS_DENIED;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&SecurityAttributes, 0, sizeof SecurityAttributes);
|
||||||
|
SecurityAttributes.nLength = sizeof SecurityAttributes;
|
||||||
|
SecurityAttributes.lpSecurityDescriptor = SecurityDescriptor;
|
||||||
|
|
||||||
|
MountHandle = CreateFileW(MountPoint,
|
||||||
|
FILE_WRITE_ATTRIBUTES,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
||||||
|
&SecurityAttributes,
|
||||||
|
CREATE_NEW,
|
||||||
|
FILE_ATTRIBUTE_DIRECTORY |
|
||||||
|
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS | FILE_FLAG_DELETE_ON_CLOSE,
|
||||||
|
0);
|
||||||
|
if (INVALID_HANDLE_VALUE == MountHandle)
|
||||||
|
{
|
||||||
|
Result = FspNtStatusFromWin32(GetLastError());
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
VolumeNameLength = (USHORT)lstrlenW(VolumeName);
|
||||||
|
BackslashLength = 0 == VolumeNameLength || L'\\' != VolumeName[VolumeNameLength - 1];
|
||||||
|
VolumeNameLength *= sizeof(WCHAR);
|
||||||
|
BackslashLength *= sizeof(WCHAR);
|
||||||
|
|
||||||
|
ReparseDataLength = (USHORT)(
|
||||||
|
FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer) -
|
||||||
|
FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer)) +
|
||||||
|
2 * (VolumeNameLength + BackslashLength + sizeof(WCHAR));
|
||||||
|
ReparseData = MemAlloc(REPARSE_DATA_BUFFER_HEADER_SIZE + ReparseDataLength);
|
||||||
|
if (0 == ReparseData)
|
||||||
|
{
|
||||||
|
Result = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReparseData->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
|
||||||
|
ReparseData->ReparseDataLength = ReparseDataLength;
|
||||||
|
ReparseData->Reserved = 0;
|
||||||
|
ReparseData->MountPointReparseBuffer.SubstituteNameOffset = 0;
|
||||||
|
ReparseData->MountPointReparseBuffer.SubstituteNameLength =
|
||||||
|
VolumeNameLength + BackslashLength;
|
||||||
|
ReparseData->MountPointReparseBuffer.PrintNameOffset =
|
||||||
|
ReparseData->MountPointReparseBuffer.SubstituteNameLength + sizeof(WCHAR);
|
||||||
|
ReparseData->MountPointReparseBuffer.PrintNameLength =
|
||||||
|
VolumeNameLength + BackslashLength;
|
||||||
|
|
||||||
|
PathBuffer = ReparseData->MountPointReparseBuffer.PathBuffer;
|
||||||
|
memcpy(PathBuffer, VolumeName, VolumeNameLength);
|
||||||
|
if (BackslashLength)
|
||||||
|
PathBuffer[VolumeNameLength / sizeof(WCHAR)] = L'\\';
|
||||||
|
PathBuffer[(VolumeNameLength + BackslashLength) / sizeof(WCHAR)] = L'\0';
|
||||||
|
|
||||||
|
PathBuffer = ReparseData->MountPointReparseBuffer.PathBuffer +
|
||||||
|
(ReparseData->MountPointReparseBuffer.PrintNameOffset) / sizeof(WCHAR);
|
||||||
|
memcpy(PathBuffer, VolumeName, VolumeNameLength);
|
||||||
|
if (BackslashLength)
|
||||||
|
PathBuffer[VolumeNameLength / sizeof(WCHAR)] = L'\\';
|
||||||
|
PathBuffer[(VolumeNameLength + BackslashLength) / sizeof(WCHAR)] = L'\0';
|
||||||
|
|
||||||
|
if (!DeviceIoControl(MountHandle, FSCTL_SET_REPARSE_POINT,
|
||||||
|
ReparseData, REPARSE_DATA_BUFFER_HEADER_SIZE + ReparseData->ReparseDataLength,
|
||||||
|
0, 0,
|
||||||
|
&Bytes, 0))
|
||||||
|
{
|
||||||
|
Result = FspNtStatusFromWin32(GetLastError());
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
*PMountHandle = MountHandle;
|
||||||
|
|
||||||
|
Result = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
if (!NT_SUCCESS(Result) && INVALID_HANDLE_VALUE != MountHandle)
|
||||||
|
CloseHandle(MountHandle);
|
||||||
|
|
||||||
|
MemFree(ReparseData);
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS FspMountRemove_Directory(HANDLE MountHandle)
|
||||||
|
{
|
||||||
|
/* directory is marked DELETE_ON_CLOSE */
|
||||||
|
return CloseHandle(MountHandle) ? STATUS_SUCCESS : FspNtStatusFromWin32(GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
|
FSP_API NTSTATUS FspMountSet(FSP_MOUNT_DESC *Desc)
|
||||||
|
{
|
||||||
|
InitOnceExecuteOnce(&FspMountInitOnce, FspMountInitialize, 0, 0);
|
||||||
|
|
||||||
|
Desc->MountHandle = 0;
|
||||||
|
|
||||||
|
if (L'*' == Desc->MountPoint[0] && ':' == Desc->MountPoint[1] && L'\0' == Desc->MountPoint[2])
|
||||||
|
{
|
||||||
|
NTSTATUS Result;
|
||||||
|
DWORD Drives;
|
||||||
|
WCHAR Drive;
|
||||||
|
|
||||||
|
Drives = GetLogicalDrives();
|
||||||
|
if (0 == Drives)
|
||||||
|
return FspNtStatusFromWin32(GetLastError());
|
||||||
|
|
||||||
|
for (Drive = 'Z'; 'D' <= Drive; Drive--)
|
||||||
|
if (0 == (Drives & (1 << (Drive - 'A'))))
|
||||||
|
{
|
||||||
|
Desc->MountPoint[0] = Drive;
|
||||||
|
Result = FspMountSet_Drive(Desc->VolumeName, Desc->MountPoint,
|
||||||
|
&Desc->MountHandle);
|
||||||
|
if (NT_SUCCESS(Result))
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
Desc->MountPoint[0] = L'*';
|
||||||
|
return STATUS_NO_SUCH_DEVICE;
|
||||||
|
}
|
||||||
|
else if (FspPathIsMountmgrMountPoint(Desc->MountPoint))
|
||||||
|
return FspMountSet_Mountmgr(Desc->VolumeHandle, Desc->VolumeName, Desc->MountPoint);
|
||||||
|
else if (FspPathIsDrive(Desc->MountPoint))
|
||||||
|
return FspMountSet_Drive(Desc->VolumeName, Desc->MountPoint,
|
||||||
|
&Desc->MountHandle);
|
||||||
|
else
|
||||||
|
return FspMountSet_Directory(Desc->VolumeName, Desc->MountPoint, Desc->Security,
|
||||||
|
&Desc->MountHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
FSP_API NTSTATUS FspMountRemove(FSP_MOUNT_DESC *Desc)
|
||||||
|
{
|
||||||
|
InitOnceExecuteOnce(&FspMountInitOnce, FspMountInitialize, 0, 0);
|
||||||
|
|
||||||
|
if (FspPathIsMountmgrMountPoint(Desc->MountPoint))
|
||||||
|
return FspMountRemove_Mountmgr(Desc->MountPoint);
|
||||||
|
else if (FspPathIsDrive(Desc->MountPoint))
|
||||||
|
return FspMountRemove_Drive(Desc->VolumeName, Desc->MountPoint, Desc->MountHandle);
|
||||||
|
else
|
||||||
|
return FspMountRemove_Directory(Desc->MountHandle);
|
||||||
|
}
|
133
src/dll/np.c
133
src/dll/np.c
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/np.c
|
* @file dll/np.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,15 +10,22 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
#include <npapi.h>
|
#include <npapi.h>
|
||||||
#include <wincred.h>
|
#include <wincred.h>
|
||||||
|
|
||||||
|
#define _NTDEF_
|
||||||
|
#include <ntsecapi.h>
|
||||||
|
|
||||||
#define FSP_NP_NAME LIBRARY_NAME ".Np"
|
#define FSP_NP_NAME LIBRARY_NAME ".Np"
|
||||||
#define FSP_NP_TYPE ' spF' /* pick a value hopefully not in use */
|
#define FSP_NP_TYPE ' spF' /* pick a value hopefully not in use */
|
||||||
#define FSP_NP_ADDCONNECTION_TIMEOUT 15000
|
#define FSP_NP_ADDCONNECTION_TIMEOUT 15000
|
||||||
@ -175,12 +182,14 @@ static inline BOOLEAN FspNpParseRemoteUserName(PWSTR RemoteName,
|
|||||||
|
|
||||||
static inline DWORD FspNpCallLauncherPipe(
|
static inline DWORD FspNpCallLauncherPipe(
|
||||||
WCHAR Command, ULONG Argc, PWSTR *Argv, ULONG *Argl,
|
WCHAR Command, ULONG Argc, PWSTR *Argv, ULONG *Argl,
|
||||||
PWSTR Buffer, PULONG PSize)
|
PWSTR Buffer, PULONG PSize,
|
||||||
|
BOOLEAN AllowImpersonation)
|
||||||
{
|
{
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
ULONG ErrorCode;
|
ULONG ErrorCode;
|
||||||
|
|
||||||
Result = FspLaunchCallLauncherPipe(Command, Argc, Argv, Argl, Buffer, PSize, &ErrorCode);
|
Result = FspLaunchCallLauncherPipeEx(Command, Argc, Argv, Argl, Buffer, PSize, AllowImpersonation,
|
||||||
|
&ErrorCode);
|
||||||
return !NT_SUCCESS(Result) ?
|
return !NT_SUCCESS(Result) ?
|
||||||
WN_NO_NETWORK :
|
WN_NO_NETWORK :
|
||||||
(ERROR_BROKEN_PIPE == ErrorCode ? WN_NO_NETWORK : ErrorCode);
|
(ERROR_BROKEN_PIPE == ErrorCode ? WN_NO_NETWORK : ErrorCode);
|
||||||
@ -247,7 +256,50 @@ static WCHAR FspNpGetDriveLetter(PDWORD PLogicalDrives, PWSTR VolumeName)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DWORD FspNpGetRemoteInfo(PWSTR RemoteName, PDWORD PCredentialsKind)
|
static NTSTATUS FspNpGetAuthPackage(PWSTR AuthPackageName, PULONG PAuthPackage)
|
||||||
|
{
|
||||||
|
HANDLE LsaHandle;
|
||||||
|
BOOLEAN LsaHandleValid = FALSE;
|
||||||
|
CHAR LsaAuthPackageNameBuf[127]; /* "The package name must not exceed 127 bytes in length." */
|
||||||
|
LSA_STRING LsaAuthPackageName;
|
||||||
|
ULONG AuthPackage;
|
||||||
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
*PAuthPackage = 0;
|
||||||
|
|
||||||
|
Result = LsaConnectUntrusted(&LsaHandle);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
LsaHandleValid = TRUE;
|
||||||
|
|
||||||
|
LsaAuthPackageName.MaximumLength = sizeof LsaAuthPackageNameBuf;
|
||||||
|
LsaAuthPackageName.Buffer = LsaAuthPackageNameBuf;
|
||||||
|
LsaAuthPackageName.Length = WideCharToMultiByte(CP_UTF8, 0,
|
||||||
|
AuthPackageName, lstrlenW(AuthPackageName),
|
||||||
|
LsaAuthPackageNameBuf, sizeof LsaAuthPackageNameBuf,
|
||||||
|
0, 0);
|
||||||
|
if (0 == LsaAuthPackageName.Length)
|
||||||
|
{
|
||||||
|
Result = FspNtStatusFromWin32(GetLastError());
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result = LsaLookupAuthenticationPackage(LsaHandle, &LsaAuthPackageName, &AuthPackage);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
*PAuthPackage = AuthPackage;
|
||||||
|
Result = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
if (LsaHandleValid)
|
||||||
|
LsaDeregisterLogonProcess(LsaHandle);
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD FspNpGetRemoteInfo(PWSTR RemoteName,
|
||||||
|
PDWORD PAuthPackage, PDWORD PCredentialsKind, PBOOLEAN PAllowImpersonation)
|
||||||
{
|
{
|
||||||
PWSTR ClassName, InstanceName;
|
PWSTR ClassName, InstanceName;
|
||||||
ULONG ClassNameLen, InstanceNameLen;
|
ULONG ClassNameLen, InstanceNameLen;
|
||||||
@ -255,7 +307,14 @@ static DWORD FspNpGetRemoteInfo(PWSTR RemoteName, PDWORD PCredentialsKind)
|
|||||||
FSP_LAUNCH_REG_RECORD *Record;
|
FSP_LAUNCH_REG_RECORD *Record;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
*PCredentialsKind = FSP_NP_CREDENTIALS_NONE;
|
if (0 != PAuthPackage)
|
||||||
|
*PAuthPackage = 0;
|
||||||
|
|
||||||
|
if (0 != PCredentialsKind)
|
||||||
|
*PCredentialsKind = FSP_NP_CREDENTIALS_NONE;
|
||||||
|
|
||||||
|
if (0 != PAllowImpersonation)
|
||||||
|
*PAllowImpersonation = FALSE;
|
||||||
|
|
||||||
if (!FspNpParseRemoteName(RemoteName,
|
if (!FspNpParseRemoteName(RemoteName,
|
||||||
&ClassName, &ClassNameLen, &InstanceName, &InstanceNameLen))
|
&ClassName, &ClassNameLen, &InstanceName, &InstanceNameLen))
|
||||||
@ -270,15 +329,36 @@ static DWORD FspNpGetRemoteInfo(PWSTR RemoteName, PDWORD PCredentialsKind)
|
|||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
return WN_NO_NETWORK;
|
return WN_NO_NETWORK;
|
||||||
|
|
||||||
switch (Record->Credentials)
|
if (0 != PAuthPackage)
|
||||||
{
|
{
|
||||||
case FSP_NP_CREDENTIALS_NONE:
|
if (0 != Record->AuthPackage)
|
||||||
case FSP_NP_CREDENTIALS_PASSWORD:
|
{
|
||||||
case FSP_NP_CREDENTIALS_USERPASS:
|
ULONG AuthPackage = 0;
|
||||||
*PCredentialsKind = Record->Credentials;
|
|
||||||
break;
|
Result = FspNpGetAuthPackage(Record->AuthPackage, &AuthPackage);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
return WN_NO_NETWORK;
|
||||||
|
|
||||||
|
*PAuthPackage = AuthPackage + 1; /* ensure non-0 (Negotiate AuthPackage == 0) */
|
||||||
|
}
|
||||||
|
else if (0 != Record->AuthPackageId)
|
||||||
|
*PAuthPackage = Record->AuthPackageId + 1; /* ensure non-0 (Negotiate AuthPackage == 0) */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (0 != PCredentialsKind)
|
||||||
|
switch (Record->Credentials)
|
||||||
|
{
|
||||||
|
case FSP_NP_CREDENTIALS_NONE:
|
||||||
|
case FSP_NP_CREDENTIALS_PASSWORD:
|
||||||
|
case FSP_NP_CREDENTIALS_USERPASS:
|
||||||
|
*PCredentialsKind = Record->Credentials;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 != PAllowImpersonation)
|
||||||
|
*PAllowImpersonation = 0 != Record->RunAs &&
|
||||||
|
L'.' == Record->RunAs[0] && L'\0' == Record->RunAs[1];
|
||||||
|
|
||||||
FspLaunchRegFreeRecord(Record);
|
FspLaunchRegFreeRecord(Record);
|
||||||
|
|
||||||
return WN_SUCCESS;
|
return WN_SUCCESS;
|
||||||
@ -286,7 +366,7 @@ static DWORD FspNpGetRemoteInfo(PWSTR RemoteName, PDWORD PCredentialsKind)
|
|||||||
|
|
||||||
static DWORD FspNpGetCredentials(
|
static DWORD FspNpGetCredentials(
|
||||||
HWND hwndOwner, PWSTR Caption, DWORD PrevNpResult,
|
HWND hwndOwner, PWSTR Caption, DWORD PrevNpResult,
|
||||||
DWORD CredentialsKind,
|
DWORD AuthPackage0, DWORD CredentialsKind,
|
||||||
PBOOL PSave,
|
PBOOL PSave,
|
||||||
PWSTR UserName, ULONG UserNameSize/* in chars */,
|
PWSTR UserName, ULONG UserNameSize/* in chars */,
|
||||||
PWSTR Password, ULONG PasswordSize/* in chars */)
|
PWSTR Password, ULONG PasswordSize/* in chars */)
|
||||||
@ -313,7 +393,7 @@ static DWORD FspNpGetCredentials(
|
|||||||
(FSP_NP_CREDENTIALS_PASSWORD == CredentialsKind ? 0/*CREDUI_FLAGS_KEEP_USERNAME*/ : 0));
|
(FSP_NP_CREDENTIALS_PASSWORD == CredentialsKind ? 0/*CREDUI_FLAGS_KEEP_USERNAME*/ : 0));
|
||||||
#else
|
#else
|
||||||
WCHAR Domain[CREDUI_MAX_DOMAIN_TARGET_LENGTH + 1];
|
WCHAR Domain[CREDUI_MAX_DOMAIN_TARGET_LENGTH + 1];
|
||||||
ULONG AuthPackage = 0;
|
ULONG AuthPackage = 0 != AuthPackage0 ? AuthPackage0 - 1 : 0;
|
||||||
PVOID InAuthBuf = 0, OutAuthBuf = 0;
|
PVOID InAuthBuf = 0, OutAuthBuf = 0;
|
||||||
ULONG InAuthSize, OutAuthSize, DomainSize;
|
ULONG InAuthSize, OutAuthSize, DomainSize;
|
||||||
|
|
||||||
@ -342,7 +422,8 @@ static DWORD FspNpGetCredentials(
|
|||||||
|
|
||||||
NpResult = CredUIPromptForWindowsCredentialsW(&UiInfo, PrevNpResult,
|
NpResult = CredUIPromptForWindowsCredentialsW(&UiInfo, PrevNpResult,
|
||||||
&AuthPackage, InAuthBuf, InAuthSize, &OutAuthBuf, &OutAuthSize, PSave,
|
&AuthPackage, InAuthBuf, InAuthSize, &OutAuthBuf, &OutAuthSize, PSave,
|
||||||
CREDUIWIN_GENERIC | (0 != PSave ? CREDUIWIN_CHECKBOX : 0));
|
(0 != AuthPackage0 ? CREDUIWIN_AUTHPACKAGE_ONLY : CREDUIWIN_GENERIC) |
|
||||||
|
(0 != PSave ? CREDUIWIN_CHECKBOX : 0));
|
||||||
if (ERROR_SUCCESS != NpResult)
|
if (ERROR_SUCCESS != NpResult)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
@ -460,6 +541,7 @@ DWORD APIENTRY NPAddConnection(LPNETRESOURCEW lpNetResource, LPWSTR lpPassword,
|
|||||||
PWSTR ClassName, InstanceName, RemoteName, P;
|
PWSTR ClassName, InstanceName, RemoteName, P;
|
||||||
ULONG ClassNameLen, InstanceNameLen;
|
ULONG ClassNameLen, InstanceNameLen;
|
||||||
DWORD CredentialsKind;
|
DWORD CredentialsKind;
|
||||||
|
BOOLEAN AllowImpersonation;
|
||||||
ULONG Argc;
|
ULONG Argc;
|
||||||
PWSTR Argv[6];
|
PWSTR Argv[6];
|
||||||
ULONG Argl[6];
|
ULONG Argl[6];
|
||||||
@ -489,7 +571,7 @@ DWORD APIENTRY NPAddConnection(LPNETRESOURCEW lpNetResource, LPWSTR lpPassword,
|
|||||||
return WN_ALREADY_CONNECTED;
|
return WN_ALREADY_CONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
NpResult = FspNpGetRemoteInfo(lpRemoteName, &CredentialsKind);
|
NpResult = FspNpGetRemoteInfo(lpRemoteName, 0, &CredentialsKind, &AllowImpersonation);
|
||||||
if (WN_SUCCESS != NpResult)
|
if (WN_SUCCESS != NpResult)
|
||||||
return NpResult;
|
return NpResult;
|
||||||
|
|
||||||
@ -546,7 +628,8 @@ DWORD APIENTRY NPAddConnection(LPNETRESOURCEW lpNetResource, LPWSTR lpPassword,
|
|||||||
|
|
||||||
NpResult = FspNpCallLauncherPipe(
|
NpResult = FspNpCallLauncherPipe(
|
||||||
FSP_NP_CREDENTIALS_NONE != CredentialsKind ? FspLaunchCmdStartWithSecret : FspLaunchCmdStart,
|
FSP_NP_CREDENTIALS_NONE != CredentialsKind ? FspLaunchCmdStartWithSecret : FspLaunchCmdStart,
|
||||||
Argc, Argv, Argl, 0, 0);
|
Argc, Argv, Argl, 0, 0,
|
||||||
|
AllowImpersonation);
|
||||||
switch (NpResult)
|
switch (NpResult)
|
||||||
{
|
{
|
||||||
case WN_SUCCESS:
|
case WN_SUCCESS:
|
||||||
@ -598,7 +681,8 @@ DWORD APIENTRY NPAddConnection(LPNETRESOURCEW lpNetResource, LPWSTR lpPassword,
|
|||||||
|
|
||||||
if (WN_SUCCESS != FspNpCallLauncherPipe(
|
if (WN_SUCCESS != FspNpCallLauncherPipe(
|
||||||
FspLaunchCmdGetInfo,
|
FspLaunchCmdGetInfo,
|
||||||
Argc, Argv, Argl, 0, 0))
|
Argc, Argv, Argl, 0, 0,
|
||||||
|
FALSE))
|
||||||
{
|
{
|
||||||
/* looks like the file system is gone! */
|
/* looks like the file system is gone! */
|
||||||
NpResult = WN_NO_NETWORK;
|
NpResult = WN_NO_NETWORK;
|
||||||
@ -655,7 +739,7 @@ DWORD APIENTRY NPAddConnection3(HWND hwndOwner,
|
|||||||
{
|
{
|
||||||
DWORD NpResult;
|
DWORD NpResult;
|
||||||
PWSTR RemoteName = lpNetResource->lpRemoteName;
|
PWSTR RemoteName = lpNetResource->lpRemoteName;
|
||||||
DWORD CredentialsKind;
|
DWORD AuthPackage, CredentialsKind;
|
||||||
WCHAR UserName[CREDUI_MAX_USERNAME_LENGTH + 1], Password[CREDUI_MAX_PASSWORD_LENGTH + 1];
|
WCHAR UserName[CREDUI_MAX_USERNAME_LENGTH + 1], Password[CREDUI_MAX_PASSWORD_LENGTH + 1];
|
||||||
#if defined(FSP_NP_CREDENTIAL_MANAGER)
|
#if defined(FSP_NP_CREDENTIAL_MANAGER)
|
||||||
BOOL Save = TRUE;
|
BOOL Save = TRUE;
|
||||||
@ -675,7 +759,7 @@ DWORD APIENTRY NPAddConnection3(HWND hwndOwner,
|
|||||||
return NpResult;
|
return NpResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
NpResult = FspNpGetRemoteInfo(RemoteName, &CredentialsKind);
|
NpResult = FspNpGetRemoteInfo(RemoteName, &AuthPackage, &CredentialsKind, 0);
|
||||||
if (WN_SUCCESS != NpResult)
|
if (WN_SUCCESS != NpResult)
|
||||||
return NpResult;
|
return NpResult;
|
||||||
if (FSP_NP_CREDENTIALS_NONE == CredentialsKind)
|
if (FSP_NP_CREDENTIALS_NONE == CredentialsKind)
|
||||||
@ -691,7 +775,7 @@ DWORD APIENTRY NPAddConnection3(HWND hwndOwner,
|
|||||||
{
|
{
|
||||||
NpResult = FspNpGetCredentials(
|
NpResult = FspNpGetCredentials(
|
||||||
hwndOwner, RemoteName, NpResult,
|
hwndOwner, RemoteName, NpResult,
|
||||||
CredentialsKind,
|
AuthPackage, CredentialsKind,
|
||||||
#if defined(FSP_NP_CREDENTIAL_MANAGER)
|
#if defined(FSP_NP_CREDENTIAL_MANAGER)
|
||||||
&Save,
|
&Save,
|
||||||
#else
|
#else
|
||||||
@ -762,7 +846,8 @@ DWORD APIENTRY NPCancelConnection(LPWSTR lpName, BOOL fForce)
|
|||||||
|
|
||||||
NpResult = FspNpCallLauncherPipe(
|
NpResult = FspNpCallLauncherPipe(
|
||||||
FspLaunchCmdStop,
|
FspLaunchCmdStop,
|
||||||
Argc, Argv, Argl, 0, 0);
|
Argc, Argv, Argl, 0, 0,
|
||||||
|
FALSE);
|
||||||
switch (NpResult)
|
switch (NpResult)
|
||||||
{
|
{
|
||||||
case WN_SUCCESS:
|
case WN_SUCCESS:
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/ntstatus.c
|
* @file dll/ntstatus.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/path.c
|
* @file dll/path.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/security.c
|
* @file dll/security.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
@ -337,26 +341,25 @@ FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
|
|
||||||
if (Request->Req.Create.UserMode)
|
if (Request->Req.Create.UserMode)
|
||||||
{
|
{
|
||||||
if (0 != (FileAttributes & FILE_ATTRIBUTE_READONLY))
|
if (FILE_ATTRIBUTE_READONLY == (FileAttributes & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_DIRECTORY)) &&
|
||||||
|
(DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_ADD_SUBDIRECTORY | FILE_DELETE_CHILD)))
|
||||||
{
|
{
|
||||||
if (DesiredAccess &
|
Result = STATUS_ACCESS_DENIED;
|
||||||
(FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_ADD_SUBDIRECTORY | FILE_DELETE_CHILD))
|
goto exit;
|
||||||
{
|
}
|
||||||
Result = STATUS_ACCESS_DENIED;
|
|
||||||
goto exit;
|
if (FILE_ATTRIBUTE_READONLY == (FileAttributes & FILE_ATTRIBUTE_READONLY) &&
|
||||||
}
|
(Request->Req.Create.CreateOptions & FILE_DELETE_ON_CLOSE))
|
||||||
if (Request->Req.Create.CreateOptions & FILE_DELETE_ON_CLOSE)
|
{
|
||||||
{
|
Result = STATUS_CANNOT_DELETE;
|
||||||
Result = STATUS_CANNOT_DELETE;
|
goto exit;
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 == SecurityDescriptorSize)
|
if (0 == SecurityDescriptorSize)
|
||||||
*PGrantedAccess = (MAXIMUM_ALLOWED & DesiredAccess) ?
|
*PGrantedAccess = (MAXIMUM_ALLOWED & DesiredAccess) ?
|
||||||
FspFileGenericMapping.GenericAll : DesiredAccess;
|
FspFileGenericMapping.GenericAll : DesiredAccess;
|
||||||
|
|
||||||
if (0 != (FileAttributes & FILE_ATTRIBUTE_READONLY) &&
|
if (FILE_ATTRIBUTE_READONLY == (FileAttributes & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_DIRECTORY)) &&
|
||||||
0 != (MAXIMUM_ALLOWED & DesiredAccess))
|
0 != (MAXIMUM_ALLOWED & DesiredAccess))
|
||||||
*PGrantedAccess &= ~(FILE_WRITE_DATA | FILE_APPEND_DATA |
|
*PGrantedAccess &= ~(FILE_WRITE_DATA | FILE_APPEND_DATA |
|
||||||
FILE_ADD_SUBDIRECTORY | FILE_DELETE_CHILD);
|
FILE_ADD_SUBDIRECTORY | FILE_DELETE_CHILD);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/service.c
|
* @file dll/service.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/util.c
|
* @file dll/util.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
@ -63,6 +67,16 @@ FSP_API NTSTATUS FspCallNamedPipeSecurely(PWSTR PipeName,
|
|||||||
PVOID InBuffer, ULONG InBufferSize, PVOID OutBuffer, ULONG OutBufferSize,
|
PVOID InBuffer, ULONG InBufferSize, PVOID OutBuffer, ULONG OutBufferSize,
|
||||||
PULONG PBytesTransferred, ULONG Timeout,
|
PULONG PBytesTransferred, ULONG Timeout,
|
||||||
PSID Sid)
|
PSID Sid)
|
||||||
|
{
|
||||||
|
return FspCallNamedPipeSecurelyEx(PipeName,
|
||||||
|
InBuffer, InBufferSize, OutBuffer, OutBufferSize, PBytesTransferred, Timeout,
|
||||||
|
FALSE, Sid);
|
||||||
|
}
|
||||||
|
|
||||||
|
FSP_API NTSTATUS FspCallNamedPipeSecurelyEx(PWSTR PipeName,
|
||||||
|
PVOID InBuffer, ULONG InBufferSize, PVOID OutBuffer, ULONG OutBufferSize,
|
||||||
|
PULONG PBytesTransferred, ULONG Timeout, BOOLEAN AllowImpersonation,
|
||||||
|
PSID Sid)
|
||||||
{
|
{
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
HANDLE Pipe = INVALID_HANDLE_VALUE;
|
HANDLE Pipe = INVALID_HANDLE_VALUE;
|
||||||
@ -71,7 +85,8 @@ FSP_API NTSTATUS FspCallNamedPipeSecurely(PWSTR PipeName,
|
|||||||
Pipe = CreateFileW(PipeName,
|
Pipe = CreateFileW(PipeName,
|
||||||
GENERIC_READ | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES,
|
GENERIC_READ | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES,
|
||||||
FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING,
|
FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING,
|
||||||
SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION, 0);
|
SECURITY_SQOS_PRESENT | (AllowImpersonation ? SECURITY_IMPERSONATION : SECURITY_IDENTIFICATION),
|
||||||
|
0);
|
||||||
if (INVALID_HANDLE_VALUE == Pipe)
|
if (INVALID_HANDLE_VALUE == Pipe)
|
||||||
{
|
{
|
||||||
if (ERROR_PIPE_BUSY != GetLastError())
|
if (ERROR_PIPE_BUSY != GetLastError())
|
||||||
@ -85,7 +100,8 @@ FSP_API NTSTATUS FspCallNamedPipeSecurely(PWSTR PipeName,
|
|||||||
Pipe = CreateFileW(PipeName,
|
Pipe = CreateFileW(PipeName,
|
||||||
GENERIC_READ | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES,
|
GENERIC_READ | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES,
|
||||||
FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING,
|
FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING,
|
||||||
SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION, 0);
|
SECURITY_SQOS_PRESENT | (AllowImpersonation ? SECURITY_IMPERSONATION : SECURITY_IDENTIFICATION),
|
||||||
|
0);
|
||||||
if (INVALID_HANDLE_VALUE == Pipe)
|
if (INVALID_HANDLE_VALUE == Pipe)
|
||||||
{
|
{
|
||||||
Result = FspNtStatusFromWin32(GetLastError());
|
Result = FspNtStatusFromWin32(GetLastError());
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/wksid.c
|
* @file dll/wksid.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dll/library.h>
|
#include <dll/library.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* dotnet/FileSystemBase+Const.cs
|
* dotnet/FileSystemBase+Const.cs
|
||||||
*
|
*
|
||||||
* Copyright 2015-2018 Bill Zissimopoulos
|
* Copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* dotnet/FileSystemBase.cs
|
* dotnet/FileSystemBase.cs
|
||||||
*
|
*
|
||||||
* Copyright 2015-2018 Bill Zissimopoulos
|
* Copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
@ -337,6 +341,7 @@ namespace Fsp
|
|||||||
/// These flags determine whether the file was modified and whether to delete the file.
|
/// These flags determine whether the file was modified and whether to delete the file.
|
||||||
/// </param>
|
/// </param>
|
||||||
/// <seealso cref="CanDelete"/>
|
/// <seealso cref="CanDelete"/>
|
||||||
|
/// <seealso cref="SetDelete"/>
|
||||||
/// <seealso cref="Close"/>
|
/// <seealso cref="Close"/>
|
||||||
public virtual void Cleanup(
|
public virtual void Cleanup(
|
||||||
Object FileNode,
|
Object FileNode,
|
||||||
@ -591,6 +596,22 @@ namespace Fsp
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Determines whether a file or directory can be deleted.
|
/// Determines whether a file or directory can be deleted.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// <para>
|
||||||
|
/// This function tests whether a file or directory can be safely deleted. This function does
|
||||||
|
/// not need to perform access checks, but may performs tasks such as check for empty
|
||||||
|
/// directories, etc.
|
||||||
|
/// </para><para>
|
||||||
|
/// This function should <b>NEVER</b> delete the file or directory in question. Deletion should
|
||||||
|
/// happen during Cleanup with the FspCleanupDelete flag set.
|
||||||
|
/// </para><para>
|
||||||
|
/// This function gets called when Win32 API's such as DeleteFile or RemoveDirectory are used.
|
||||||
|
/// It does not get called when a file or directory is opened with FILE_DELETE_ON_CLOSE.
|
||||||
|
/// </para><para>
|
||||||
|
/// NOTE: If both CanDelete and SetDelete are defined, SetDelete takes precedence. However
|
||||||
|
/// most file systems need only implement the CanDelete operation.
|
||||||
|
/// </para>
|
||||||
|
/// </remarks>
|
||||||
/// <param name="FileNode">
|
/// <param name="FileNode">
|
||||||
/// The file node of the file or directory to test for deletion.
|
/// The file node of the file or directory to test for deletion.
|
||||||
/// </param>
|
/// </param>
|
||||||
@ -602,6 +623,7 @@ namespace Fsp
|
|||||||
/// </param>
|
/// </param>
|
||||||
/// <returns>STATUS_SUCCESS or error code.</returns>
|
/// <returns>STATUS_SUCCESS or error code.</returns>
|
||||||
/// <seealso cref="Cleanup"/>
|
/// <seealso cref="Cleanup"/>
|
||||||
|
/// <seealso cref="SetDelete"/>
|
||||||
public virtual Int32 CanDelete(
|
public virtual Int32 CanDelete(
|
||||||
Object FileNode,
|
Object FileNode,
|
||||||
Object FileDesc,
|
Object FileDesc,
|
||||||
@ -685,7 +707,7 @@ namespace Fsp
|
|||||||
/// Describes the modifications to apply to the file or directory security descriptor.
|
/// Describes the modifications to apply to the file or directory security descriptor.
|
||||||
/// </param>
|
/// </param>
|
||||||
/// <returns>STATUS_SUCCESS or error code.</returns>
|
/// <returns>STATUS_SUCCESS or error code.</returns>
|
||||||
/// <seealso cref="ModifySecurityDescriptor"/>
|
/// <seealso cref="ModifySecurityDescriptorEx"/>
|
||||||
public virtual Int32 SetSecurity(
|
public virtual Int32 SetSecurity(
|
||||||
Object FileNode,
|
Object FileNode,
|
||||||
Object FileDesc,
|
Object FileDesc,
|
||||||
@ -1009,6 +1031,163 @@ namespace Fsp
|
|||||||
BytesTransferred = default(UInt32);
|
BytesTransferred = default(UInt32);
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Sets the file delete flag.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// <para>
|
||||||
|
/// This function sets a flag to indicates whether the FSD file should delete a file
|
||||||
|
/// when it is closed. This function does not need to perform access checks, but may
|
||||||
|
/// performs tasks such as check for empty directories, etc.
|
||||||
|
/// </para><para>
|
||||||
|
/// This function should <b>NEVER</b> delete the file or directory in question. Deletion should
|
||||||
|
/// happen during Cleanup with the FspCleanupDelete flag set.
|
||||||
|
/// </para><para>
|
||||||
|
/// This function gets called when Win32 API's such as DeleteFile or RemoveDirectory are used.
|
||||||
|
/// It does not get called when a file or directory is opened with FILE_DELETE_ON_CLOSE.
|
||||||
|
/// </para><para>
|
||||||
|
/// NOTE: If both CanDelete and SetDelete are defined, SetDelete takes precedence. However
|
||||||
|
/// most file systems need only implement the CanDelete operation.
|
||||||
|
/// </para>
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="FileNode">
|
||||||
|
/// The file node of the file or directory to set the delete flag for.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="FileDesc">
|
||||||
|
/// The file descriptor of the file or directory to set the delete flag for.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="FileName">
|
||||||
|
/// The name of the file or directory to set the delete flag for.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="DeleteFile">
|
||||||
|
/// If set to TRUE the FSD indicates that the file will be deleted on Cleanup; otherwise
|
||||||
|
/// it will not be deleted. It is legal to receive multiple SetDelete calls for the same
|
||||||
|
/// file with different DeleteFile parameters.
|
||||||
|
/// </param>
|
||||||
|
/// <returns>STATUS_SUCCESS or error code.</returns>
|
||||||
|
/// <seealso cref="Cleanup"/>
|
||||||
|
/// <seealso cref="CanDelete"/>
|
||||||
|
public virtual Int32 SetDelete(
|
||||||
|
Object FileNode,
|
||||||
|
Object FileDesc,
|
||||||
|
String FileName,
|
||||||
|
Boolean DeleteFile)
|
||||||
|
{
|
||||||
|
if (DeleteFile)
|
||||||
|
return CanDelete(FileNode, FileDesc, FileName);
|
||||||
|
else
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
public virtual Int32 CreateEx(
|
||||||
|
String FileName,
|
||||||
|
UInt32 CreateOptions,
|
||||||
|
UInt32 GrantedAccess,
|
||||||
|
UInt32 FileAttributes,
|
||||||
|
Byte[] SecurityDescriptor,
|
||||||
|
UInt64 AllocationSize,
|
||||||
|
IntPtr ExtraBuffer,
|
||||||
|
UInt32 ExtraLength,
|
||||||
|
Boolean ExtraBufferIsReparsePoint,
|
||||||
|
out Object FileNode,
|
||||||
|
out Object FileDesc,
|
||||||
|
out FileInfo FileInfo,
|
||||||
|
out String NormalizedName)
|
||||||
|
{
|
||||||
|
return Create(
|
||||||
|
FileName,
|
||||||
|
CreateOptions,
|
||||||
|
GrantedAccess,
|
||||||
|
FileAttributes,
|
||||||
|
SecurityDescriptor,
|
||||||
|
AllocationSize,
|
||||||
|
out FileNode,
|
||||||
|
out FileDesc,
|
||||||
|
out FileInfo,
|
||||||
|
out NormalizedName);
|
||||||
|
}
|
||||||
|
public virtual Int32 OverwriteEx(
|
||||||
|
Object FileNode,
|
||||||
|
Object FileDesc,
|
||||||
|
UInt32 FileAttributes,
|
||||||
|
Boolean ReplaceFileAttributes,
|
||||||
|
UInt64 AllocationSize,
|
||||||
|
IntPtr Ea,
|
||||||
|
UInt32 EaLength,
|
||||||
|
out FileInfo FileInfo)
|
||||||
|
{
|
||||||
|
return Overwrite(
|
||||||
|
FileNode,
|
||||||
|
FileDesc,
|
||||||
|
FileAttributes,
|
||||||
|
ReplaceFileAttributes,
|
||||||
|
AllocationSize,
|
||||||
|
out FileInfo);
|
||||||
|
}
|
||||||
|
public virtual Int32 GetEa(
|
||||||
|
Object FileNode,
|
||||||
|
Object FileDesc,
|
||||||
|
IntPtr Ea,
|
||||||
|
UInt32 EaLength,
|
||||||
|
out UInt32 BytesTransferred)
|
||||||
|
{
|
||||||
|
Object Context = null;
|
||||||
|
String EaName;
|
||||||
|
Byte[] EaValue;
|
||||||
|
Boolean NeedEa;
|
||||||
|
FullEaInformation EaInfo = new FullEaInformation();
|
||||||
|
BytesTransferred = default(UInt32);
|
||||||
|
while (GetEaEntry(FileNode, FileDesc, ref Context, out EaName, out EaValue, out NeedEa))
|
||||||
|
{
|
||||||
|
EaInfo.Set(EaName, EaValue, NeedEa);
|
||||||
|
if (!Api.FspFileSystemAddEa(ref EaInfo, Ea, EaLength, out BytesTransferred))
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
Api.FspFileSystemEndEa(Ea, EaLength, out BytesTransferred);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
public virtual Boolean GetEaEntry(
|
||||||
|
Object FileNode,
|
||||||
|
Object FileDesc,
|
||||||
|
ref Object Context,
|
||||||
|
out String EaName,
|
||||||
|
out Byte[] EaValue,
|
||||||
|
out Boolean NeedEa)
|
||||||
|
{
|
||||||
|
EaName = default(String);
|
||||||
|
EaValue = default(Byte[]);
|
||||||
|
NeedEa = default(Boolean);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
public virtual Int32 SetEa(
|
||||||
|
Object FileNode,
|
||||||
|
Object FileDesc,
|
||||||
|
IntPtr Ea,
|
||||||
|
UInt32 EaLength,
|
||||||
|
out FileInfo FileInfo)
|
||||||
|
{
|
||||||
|
Int32 Result;
|
||||||
|
Result = SetEaEntries(
|
||||||
|
FileNode,
|
||||||
|
FileDesc,
|
||||||
|
Ea,
|
||||||
|
EaLength);
|
||||||
|
if (0 > Result)
|
||||||
|
{
|
||||||
|
FileInfo = default(FileInfo);
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
return GetFileInfo(FileNode, FileDesc, out FileInfo);
|
||||||
|
}
|
||||||
|
public virtual Int32 SetEaEntry(
|
||||||
|
Object FileNode,
|
||||||
|
Object FileDesc,
|
||||||
|
ref Object Context,
|
||||||
|
String EaName,
|
||||||
|
Byte[] EaValue,
|
||||||
|
Boolean NeedEa)
|
||||||
|
{
|
||||||
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
}
|
||||||
|
|
||||||
/* helpers */
|
/* helpers */
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -1036,7 +1215,7 @@ namespace Fsp
|
|||||||
return (int)Api.FspFileSystemOperationProcessId();
|
return (int)Api.FspFileSystemOperationProcessId();
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Modifies a security descriptor.
|
/// Modifies a security descriptor. [OBSOLETE]
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// This is a helper for implementing the SetSecurity operation.
|
/// This is a helper for implementing the SetSecurity operation.
|
||||||
@ -1052,6 +1231,7 @@ namespace Fsp
|
|||||||
/// </param>
|
/// </param>
|
||||||
/// <returns>The modified security descriptor.</returns>
|
/// <returns>The modified security descriptor.</returns>
|
||||||
/// <seealso cref="SetSecurity"/>
|
/// <seealso cref="SetSecurity"/>
|
||||||
|
[Obsolete("use ModifySecurityDescriptorEx")]
|
||||||
public static byte[] ModifySecurityDescriptor(
|
public static byte[] ModifySecurityDescriptor(
|
||||||
Byte[] SecurityDescriptor,
|
Byte[] SecurityDescriptor,
|
||||||
AccessControlSections Sections,
|
AccessControlSections Sections,
|
||||||
@ -1071,6 +1251,47 @@ namespace Fsp
|
|||||||
SecurityInformation,
|
SecurityInformation,
|
||||||
ModificationDescriptor);
|
ModificationDescriptor);
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Modifies a security descriptor.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This is a helper for implementing the SetSecurity operation.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="SecurityDescriptor">
|
||||||
|
/// The original security descriptor.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="Sections">
|
||||||
|
/// Describes what parts of the file or directory security descriptor should be modified.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="ModificationDescriptor">
|
||||||
|
/// Describes the modifications to apply to the file or directory security descriptor.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="ModifiedDescriptor">
|
||||||
|
/// The modified security descriptor. This parameter is modified only on success.
|
||||||
|
/// </param>
|
||||||
|
/// <returns>STATUS_SUCCESS or error code.</returns>
|
||||||
|
/// <seealso cref="SetSecurity"/>
|
||||||
|
public static Int32 ModifySecurityDescriptorEx(
|
||||||
|
Byte[] SecurityDescriptor,
|
||||||
|
AccessControlSections Sections,
|
||||||
|
Byte[] ModificationDescriptor,
|
||||||
|
ref Byte[] ModifiedDescriptor)
|
||||||
|
{
|
||||||
|
UInt32 SecurityInformation = 0;
|
||||||
|
if (0 != (Sections & AccessControlSections.Owner))
|
||||||
|
SecurityInformation |= 1/*OWNER_SECURITY_INFORMATION*/;
|
||||||
|
if (0 != (Sections & AccessControlSections.Group))
|
||||||
|
SecurityInformation |= 2/*GROUP_SECURITY_INFORMATION*/;
|
||||||
|
if (0 != (Sections & AccessControlSections.Access))
|
||||||
|
SecurityInformation |= 4/*DACL_SECURITY_INFORMATION*/;
|
||||||
|
if (0 != (Sections & AccessControlSections.Audit))
|
||||||
|
SecurityInformation |= 8/*SACL_SECURITY_INFORMATION*/;
|
||||||
|
return Api.ModifySecurityDescriptorEx(
|
||||||
|
SecurityDescriptor,
|
||||||
|
SecurityInformation,
|
||||||
|
ModificationDescriptor,
|
||||||
|
ref ModifiedDescriptor);
|
||||||
|
}
|
||||||
public Int32 SeekableReadDirectory(
|
public Int32 SeekableReadDirectory(
|
||||||
Object FileNode,
|
Object FileNode,
|
||||||
Object FileDesc,
|
Object FileDesc,
|
||||||
@ -1171,6 +1392,16 @@ namespace Fsp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
/// Makes a byte array that contains a reparse point.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The reparse point byte array.</returns>
|
||||||
|
public static Byte[] MakeReparsePoint(
|
||||||
|
IntPtr Buffer,
|
||||||
|
UInt32 Size)
|
||||||
|
{
|
||||||
|
return Api.MakeReparsePoint(Buffer, (UIntPtr)Size);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
/// Gets the reparse tag from reparse data.
|
/// Gets the reparse tag from reparse data.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="ReparseData">
|
/// <param name="ReparseData">
|
||||||
@ -1232,6 +1463,26 @@ namespace Fsp
|
|||||||
return self.ExceptionHandler(ex);
|
return self.ExceptionHandler(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public Int32 SetEaEntries(
|
||||||
|
Object FileNode,
|
||||||
|
Object FileDesc,
|
||||||
|
IntPtr Ea,
|
||||||
|
UInt32 EaLength)
|
||||||
|
{
|
||||||
|
return Api.FspFileSystemEnumerateEa(
|
||||||
|
FileNode,
|
||||||
|
FileDesc,
|
||||||
|
this.SetEaEntry,
|
||||||
|
Ea,
|
||||||
|
EaLength);
|
||||||
|
}
|
||||||
|
public static UInt32 GetEaEntrySize(
|
||||||
|
String EaName,
|
||||||
|
Byte[] EaValue,
|
||||||
|
Boolean NeedEa)
|
||||||
|
{
|
||||||
|
return FullEaInformation.PackedSize(EaName, EaValue, NeedEa);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* dotnet/FileSystemHost.cs
|
* dotnet/FileSystemHost.cs
|
||||||
*
|
*
|
||||||
* Copyright 2015-2018 Bill Zissimopoulos
|
* Copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
@ -36,6 +40,7 @@ namespace Fsp
|
|||||||
/// <param name="FileSystem">The file system to host.</param>
|
/// <param name="FileSystem">The file system to host.</param>
|
||||||
public FileSystemHost(FileSystemBase FileSystem)
|
public FileSystemHost(FileSystemBase FileSystem)
|
||||||
{
|
{
|
||||||
|
_VolumeParams.Version = (UInt16)Marshal.SizeOf(_VolumeParams);
|
||||||
_VolumeParams.Flags = VolumeParams.UmFileContextIsFullContext;
|
_VolumeParams.Flags = VolumeParams.UmFileContextIsFullContext;
|
||||||
_FileSystem = FileSystem;
|
_FileSystem = FileSystem;
|
||||||
}
|
}
|
||||||
@ -122,6 +127,86 @@ namespace Fsp
|
|||||||
set { _VolumeParams.FileInfoTimeout = value; }
|
set { _VolumeParams.FileInfoTimeout = value; }
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
/// Gets or sets the volume information timeout.
|
||||||
|
/// </summary>
|
||||||
|
public UInt32 VolumeInfoTimeout
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return 0 != (_VolumeParams.AdditionalFlags & VolumeParams.VolumeInfoTimeoutValid) ?
|
||||||
|
_VolumeParams.VolumeInfoTimeout : _VolumeParams.FileInfoTimeout;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_VolumeParams.AdditionalFlags |= VolumeParams.VolumeInfoTimeoutValid;
|
||||||
|
_VolumeParams.VolumeInfoTimeout = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the directory information timeout.
|
||||||
|
/// </summary>
|
||||||
|
public UInt32 DirInfoTimeout
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return 0 != (_VolumeParams.AdditionalFlags & VolumeParams.DirInfoTimeoutValid) ?
|
||||||
|
_VolumeParams.DirInfoTimeout : _VolumeParams.FileInfoTimeout;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_VolumeParams.AdditionalFlags |= VolumeParams.DirInfoTimeoutValid;
|
||||||
|
_VolumeParams.DirInfoTimeout = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the security information timeout.
|
||||||
|
/// </summary>
|
||||||
|
public UInt32 SecurityTimeout
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return 0 != (_VolumeParams.AdditionalFlags & VolumeParams.SecurityTimeoutValid) ?
|
||||||
|
_VolumeParams.SecurityTimeout : _VolumeParams.FileInfoTimeout;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_VolumeParams.AdditionalFlags |= VolumeParams.SecurityTimeoutValid;
|
||||||
|
_VolumeParams.SecurityTimeout = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the stream information timeout.
|
||||||
|
/// </summary>
|
||||||
|
public UInt32 StreamInfoTimeout
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return 0 != (_VolumeParams.AdditionalFlags & VolumeParams.StreamInfoTimeoutValid) ?
|
||||||
|
_VolumeParams.StreamInfoTimeout : _VolumeParams.FileInfoTimeout;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_VolumeParams.AdditionalFlags |= VolumeParams.StreamInfoTimeoutValid;
|
||||||
|
_VolumeParams.StreamInfoTimeout = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the EA information timeout.
|
||||||
|
/// </summary>
|
||||||
|
public UInt32 EaTimeout
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return 0 != (_VolumeParams.AdditionalFlags & VolumeParams.EaTimeoutValid) ?
|
||||||
|
_VolumeParams.EaTimeout : _VolumeParams.FileInfoTimeout;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_VolumeParams.AdditionalFlags |= VolumeParams.EaTimeoutValid;
|
||||||
|
_VolumeParams.EaTimeout = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
/// Gets or sets a value that determines whether the file system is case sensitive.
|
/// Gets or sets a value that determines whether the file system is case sensitive.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Boolean CaseSensitiveSearch
|
public Boolean CaseSensitiveSearch
|
||||||
@ -179,6 +264,14 @@ namespace Fsp
|
|||||||
get { return 0 != (_VolumeParams.Flags & VolumeParams.NamedStreams); }
|
get { return 0 != (_VolumeParams.Flags & VolumeParams.NamedStreams); }
|
||||||
set { _VolumeParams.Flags |= (value ? VolumeParams.NamedStreams : 0); }
|
set { _VolumeParams.Flags |= (value ? VolumeParams.NamedStreams : 0); }
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value that determines whether the file system supports extended attributes.
|
||||||
|
/// </summary>
|
||||||
|
public Boolean ExtendedAttributes
|
||||||
|
{
|
||||||
|
get { return 0 != (_VolumeParams.Flags & VolumeParams.ExtendedAttributes); }
|
||||||
|
set { _VolumeParams.Flags |= (value ? VolumeParams.ExtendedAttributes : 0); }
|
||||||
|
}
|
||||||
public Boolean PostCleanupWhenModifiedOnly
|
public Boolean PostCleanupWhenModifiedOnly
|
||||||
{
|
{
|
||||||
get { return 0 != (_VolumeParams.Flags & VolumeParams.PostCleanupWhenModifiedOnly); }
|
get { return 0 != (_VolumeParams.Flags & VolumeParams.PostCleanupWhenModifiedOnly); }
|
||||||
@ -199,6 +292,21 @@ namespace Fsp
|
|||||||
get { return 0 != (_VolumeParams.Flags & VolumeParams.FlushAndPurgeOnCleanup); }
|
get { return 0 != (_VolumeParams.Flags & VolumeParams.FlushAndPurgeOnCleanup); }
|
||||||
set { _VolumeParams.Flags |= (value ? VolumeParams.FlushAndPurgeOnCleanup : 0); }
|
set { _VolumeParams.Flags |= (value ? VolumeParams.FlushAndPurgeOnCleanup : 0); }
|
||||||
}
|
}
|
||||||
|
public Boolean DeviceControl
|
||||||
|
{
|
||||||
|
get { return 0 != (_VolumeParams.Flags & VolumeParams.DeviceControl); }
|
||||||
|
set { _VolumeParams.Flags |= (value ? VolumeParams.DeviceControl : 0); }
|
||||||
|
}
|
||||||
|
public Boolean AllowOpenInKernelMode
|
||||||
|
{
|
||||||
|
get { return 0 != (_VolumeParams.Flags & VolumeParams.AllowOpenInKernelMode); }
|
||||||
|
set { _VolumeParams.Flags |= (value ? VolumeParams.AllowOpenInKernelMode : 0); }
|
||||||
|
}
|
||||||
|
public Boolean WslFeatures
|
||||||
|
{
|
||||||
|
get { return 0 != (_VolumeParams.Flags & VolumeParams.WslFeatures); }
|
||||||
|
set { _VolumeParams.Flags |= (value ? VolumeParams.WslFeatures : 0); }
|
||||||
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the prefix for a network file system.
|
/// Gets or sets the prefix for a network file system.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -252,11 +360,44 @@ namespace Fsp
|
|||||||
/// A value of 0 disables all debug logging.
|
/// A value of 0 disables all debug logging.
|
||||||
/// A value of -1 enables all debug logging.
|
/// A value of -1 enables all debug logging.
|
||||||
/// </param>
|
/// </param>
|
||||||
/// <returns></returns>
|
/// <returns>STATUS_SUCCESS or error code.</returns>
|
||||||
public Int32 Mount(String MountPoint,
|
public Int32 Mount(String MountPoint,
|
||||||
Byte[] SecurityDescriptor = null,
|
Byte[] SecurityDescriptor = null,
|
||||||
Boolean Synchronized = false,
|
Boolean Synchronized = false,
|
||||||
UInt32 DebugLog = 0)
|
UInt32 DebugLog = 0)
|
||||||
|
{
|
||||||
|
return MountEx(MountPoint, 0, SecurityDescriptor, Synchronized, DebugLog);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Mounts a file system.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="MountPoint">
|
||||||
|
/// The mount point for the new file system. A value of null means that
|
||||||
|
/// the file system should use the next available drive letter counting
|
||||||
|
/// downwards from Z: as its mount point.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="ThreadCount">
|
||||||
|
/// Number of threads to use to service file system requests. A value
|
||||||
|
/// of 0 means that the default number of threads should be used.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="SecurityDescriptor">
|
||||||
|
/// Security descriptor to use if mounting on (newly created) directory.
|
||||||
|
/// A value of null means the directory should be created with default
|
||||||
|
/// security.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="Synchronized">
|
||||||
|
/// If true file system operations are synchronized using an exclusive lock.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="DebugLog">
|
||||||
|
/// A value of 0 disables all debug logging.
|
||||||
|
/// A value of -1 enables all debug logging.
|
||||||
|
/// </param>
|
||||||
|
/// <returns>STATUS_SUCCESS or error code.</returns>
|
||||||
|
public Int32 MountEx(String MountPoint,
|
||||||
|
UInt32 ThreadCount,
|
||||||
|
Byte[] SecurityDescriptor = null,
|
||||||
|
Boolean Synchronized = false,
|
||||||
|
UInt32 DebugLog = 0)
|
||||||
{
|
{
|
||||||
Int32 Result;
|
Int32 Result;
|
||||||
try
|
try
|
||||||
@ -293,7 +434,7 @@ namespace Fsp
|
|||||||
}
|
}
|
||||||
if (0 <= Result)
|
if (0 <= Result)
|
||||||
{
|
{
|
||||||
Result = Api.FspFileSystemStartDispatcher(_FileSystemPtr, 0);
|
Result = Api.FspFileSystemStartDispatcher(_FileSystemPtr, ThreadCount);
|
||||||
if (0 > Result)
|
if (0 > Result)
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -359,6 +500,83 @@ namespace Fsp
|
|||||||
{
|
{
|
||||||
return Api.GetVersion();
|
return Api.GetVersion();
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a RequestHint to reference the current operation asynchronously.
|
||||||
|
/// </summary>
|
||||||
|
public UInt64 GetOperationRequestHint()
|
||||||
|
{
|
||||||
|
return Api.FspFileSystemGetOperationRequestHint();
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Asynchronously complete a Read operation.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="RequestHint">
|
||||||
|
/// A reference to the operation to complete.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="Status">
|
||||||
|
/// STATUS_SUCCESS or error code.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="BytesTransferred">
|
||||||
|
/// Number of bytes read.
|
||||||
|
/// </param>
|
||||||
|
public void SendReadResponse(UInt64 RequestHint, Int32 Status, UInt32 BytesTransferred)
|
||||||
|
{
|
||||||
|
FspFsctlTransactRsp Response = default(FspFsctlTransactRsp);
|
||||||
|
Response.Size = 128;
|
||||||
|
Response.Kind = (UInt32)FspFsctlTransact.ReadKind;
|
||||||
|
Response.Hint = RequestHint;
|
||||||
|
Response.IoStatus.Information = BytesTransferred;
|
||||||
|
Response.IoStatus.Status = (UInt32)Status;
|
||||||
|
Api.FspFileSystemSendResponse(_FileSystemPtr, ref Response);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Asynchronously complete a Write operation.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="RequestHint">
|
||||||
|
/// A reference to the operation to complete.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="Status">
|
||||||
|
/// STATUS_SUCCESS or error code.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="BytesTransferred">
|
||||||
|
/// The number of bytes written.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="FileInfo">
|
||||||
|
/// Updated file information.
|
||||||
|
/// </param>
|
||||||
|
public void SendWriteResponse(UInt64 RequestHint, Int32 Status, UInt32 BytesTransferred, ref FileInfo FileInfo)
|
||||||
|
{
|
||||||
|
FspFsctlTransactRsp Response = default(FspFsctlTransactRsp);
|
||||||
|
Response.Size = 128;
|
||||||
|
Response.Kind = (UInt32)FspFsctlTransact.WriteKind;
|
||||||
|
Response.Hint = RequestHint;
|
||||||
|
Response.IoStatus.Information = BytesTransferred;
|
||||||
|
Response.IoStatus.Status = (UInt32)Status;
|
||||||
|
Response.WriteFileInfo = FileInfo;
|
||||||
|
Api.FspFileSystemSendResponse(_FileSystemPtr, ref Response);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Asynchronously complete a ReadDirectory operation.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="RequestHint">
|
||||||
|
/// A reference to the operation to complete.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="Status">
|
||||||
|
/// STATUS_SUCCESS or error code.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="BytesTransferred">
|
||||||
|
/// Number of bytes read.
|
||||||
|
/// </param>
|
||||||
|
public void SendReadDirectoryResponse(UInt64 RequestHint, Int32 Status, UInt32 BytesTransferred)
|
||||||
|
{
|
||||||
|
FspFsctlTransactRsp Response = default(FspFsctlTransactRsp);
|
||||||
|
Response.Size = 128;
|
||||||
|
Response.Kind = (UInt32)FspFsctlTransact.QueryDirectoryKind;
|
||||||
|
Response.Hint = RequestHint;
|
||||||
|
Response.IoStatus.Information = BytesTransferred;
|
||||||
|
Response.IoStatus.Status = (UInt32)Status;
|
||||||
|
Api.FspFileSystemSendResponse(_FileSystemPtr, ref Response);
|
||||||
|
}
|
||||||
|
|
||||||
/* FSP_FILE_SYSTEM_INTERFACE */
|
/* FSP_FILE_SYSTEM_INTERFACE */
|
||||||
private static Byte[] ByteBufferNotNull = new Byte[0];
|
private static Byte[] ByteBufferNotNull = new Byte[0];
|
||||||
@ -450,6 +668,9 @@ namespace Fsp
|
|||||||
UInt32 FileAttributes,
|
UInt32 FileAttributes,
|
||||||
IntPtr SecurityDescriptor,
|
IntPtr SecurityDescriptor,
|
||||||
UInt64 AllocationSize,
|
UInt64 AllocationSize,
|
||||||
|
IntPtr ExtraBuffer,
|
||||||
|
UInt32 ExtraLength,
|
||||||
|
Boolean ExtraBufferIsReparsePoint,
|
||||||
ref FullContext FullContext,
|
ref FullContext FullContext,
|
||||||
ref OpenFileInfo OpenFileInfo)
|
ref OpenFileInfo OpenFileInfo)
|
||||||
{
|
{
|
||||||
@ -459,13 +680,16 @@ namespace Fsp
|
|||||||
Object FileNode, FileDesc;
|
Object FileNode, FileDesc;
|
||||||
String NormalizedName;
|
String NormalizedName;
|
||||||
Int32 Result;
|
Int32 Result;
|
||||||
Result = FileSystem.Create(
|
Result = FileSystem.CreateEx(
|
||||||
FileName,
|
FileName,
|
||||||
CreateOptions,
|
CreateOptions,
|
||||||
GrantedAccess,
|
GrantedAccess,
|
||||||
FileAttributes,
|
FileAttributes,
|
||||||
Api.MakeSecurityDescriptor(SecurityDescriptor),
|
Api.MakeSecurityDescriptor(SecurityDescriptor),
|
||||||
AllocationSize,
|
AllocationSize,
|
||||||
|
ExtraBuffer,
|
||||||
|
ExtraLength,
|
||||||
|
ExtraBufferIsReparsePoint,
|
||||||
out FileNode,
|
out FileNode,
|
||||||
out FileDesc,
|
out FileDesc,
|
||||||
out OpenFileInfo.FileInfo,
|
out OpenFileInfo.FileInfo,
|
||||||
@ -524,6 +748,8 @@ namespace Fsp
|
|||||||
UInt32 FileAttributes,
|
UInt32 FileAttributes,
|
||||||
Boolean ReplaceFileAttributes,
|
Boolean ReplaceFileAttributes,
|
||||||
UInt64 AllocationSize,
|
UInt64 AllocationSize,
|
||||||
|
IntPtr Ea,
|
||||||
|
UInt32 EaLength,
|
||||||
out FileInfo FileInfo)
|
out FileInfo FileInfo)
|
||||||
{
|
{
|
||||||
FileSystemBase FileSystem = (FileSystemBase)Api.GetUserContext(FileSystemPtr);
|
FileSystemBase FileSystem = (FileSystemBase)Api.GetUserContext(FileSystemPtr);
|
||||||
@ -531,12 +757,14 @@ namespace Fsp
|
|||||||
{
|
{
|
||||||
Object FileNode, FileDesc;
|
Object FileNode, FileDesc;
|
||||||
Api.GetFullContext(ref FullContext, out FileNode, out FileDesc);
|
Api.GetFullContext(ref FullContext, out FileNode, out FileDesc);
|
||||||
return FileSystem.Overwrite(
|
return FileSystem.OverwriteEx(
|
||||||
FileNode,
|
FileNode,
|
||||||
FileDesc,
|
FileDesc,
|
||||||
FileAttributes,
|
FileAttributes,
|
||||||
ReplaceFileAttributes,
|
ReplaceFileAttributes,
|
||||||
AllocationSize,
|
AllocationSize,
|
||||||
|
Ea,
|
||||||
|
EaLength,
|
||||||
out FileInfo);
|
out FileInfo);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -745,26 +973,6 @@ namespace Fsp
|
|||||||
return ExceptionHandler(FileSystem, ex);
|
return ExceptionHandler(FileSystem, ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private static Int32 CanDelete(
|
|
||||||
IntPtr FileSystemPtr,
|
|
||||||
ref FullContext FullContext,
|
|
||||||
String FileName)
|
|
||||||
{
|
|
||||||
FileSystemBase FileSystem = (FileSystemBase)Api.GetUserContext(FileSystemPtr);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Object FileNode, FileDesc;
|
|
||||||
Api.GetFullContext(ref FullContext, out FileNode, out FileDesc);
|
|
||||||
return FileSystem.CanDelete(
|
|
||||||
FileNode,
|
|
||||||
FileDesc,
|
|
||||||
FileName);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
return ExceptionHandler(FileSystem, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private static Int32 Rename(
|
private static Int32 Rename(
|
||||||
IntPtr FileSystemPtr,
|
IntPtr FileSystemPtr,
|
||||||
ref FullContext FullContext,
|
ref FullContext FullContext,
|
||||||
@ -1061,15 +1269,87 @@ namespace Fsp
|
|||||||
return ExceptionHandler(FileSystem, ex);
|
return ExceptionHandler(FileSystem, ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private static Int32 SetDelete(
|
||||||
|
IntPtr FileSystemPtr,
|
||||||
|
ref FullContext FullContext,
|
||||||
|
String FileName,
|
||||||
|
Boolean DeleteFile)
|
||||||
|
{
|
||||||
|
FileSystemBase FileSystem = (FileSystemBase)Api.GetUserContext(FileSystemPtr);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Object FileNode, FileDesc;
|
||||||
|
Api.GetFullContext(ref FullContext, out FileNode, out FileDesc);
|
||||||
|
return FileSystem.SetDelete(
|
||||||
|
FileNode,
|
||||||
|
FileDesc,
|
||||||
|
FileName,
|
||||||
|
DeleteFile);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return ExceptionHandler(FileSystem, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private static Int32 GetEa(
|
||||||
|
IntPtr FileSystemPtr,
|
||||||
|
ref FullContext FullContext,
|
||||||
|
IntPtr Ea,
|
||||||
|
UInt32 EaLength,
|
||||||
|
out UInt32 PBytesTransferred)
|
||||||
|
{
|
||||||
|
FileSystemBase FileSystem = (FileSystemBase)Api.GetUserContext(FileSystemPtr);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Object FileNode, FileDesc;
|
||||||
|
Api.GetFullContext(ref FullContext, out FileNode, out FileDesc);
|
||||||
|
return FileSystem.GetEa(
|
||||||
|
FileNode,
|
||||||
|
FileDesc,
|
||||||
|
Ea,
|
||||||
|
EaLength,
|
||||||
|
out PBytesTransferred);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
PBytesTransferred = default(UInt32);
|
||||||
|
return ExceptionHandler(FileSystem, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private static Int32 SetEa(
|
||||||
|
IntPtr FileSystemPtr,
|
||||||
|
ref FullContext FullContext,
|
||||||
|
IntPtr Ea,
|
||||||
|
UInt32 EaLength,
|
||||||
|
out FileInfo FileInfo)
|
||||||
|
{
|
||||||
|
FileSystemBase FileSystem = (FileSystemBase)Api.GetUserContext(FileSystemPtr);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Object FileNode, FileDesc;
|
||||||
|
Api.GetFullContext(ref FullContext, out FileNode, out FileDesc);
|
||||||
|
return FileSystem.SetEa(
|
||||||
|
FileNode,
|
||||||
|
FileDesc,
|
||||||
|
Ea,
|
||||||
|
EaLength,
|
||||||
|
out FileInfo);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
FileInfo = default(FileInfo);
|
||||||
|
return ExceptionHandler(FileSystem, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static FileSystemHost()
|
static FileSystemHost()
|
||||||
{
|
{
|
||||||
_FileSystemInterface.GetVolumeInfo = GetVolumeInfo;
|
_FileSystemInterface.GetVolumeInfo = GetVolumeInfo;
|
||||||
_FileSystemInterface.SetVolumeLabel = SetVolumeLabel;
|
_FileSystemInterface.SetVolumeLabel = SetVolumeLabel;
|
||||||
_FileSystemInterface.GetSecurityByName = GetSecurityByName;
|
_FileSystemInterface.GetSecurityByName = GetSecurityByName;
|
||||||
_FileSystemInterface.Create = Create;
|
_FileSystemInterface.CreateEx = Create;
|
||||||
_FileSystemInterface.Open = Open;
|
_FileSystemInterface.Open = Open;
|
||||||
_FileSystemInterface.Overwrite = Overwrite;
|
_FileSystemInterface.OverwriteEx = Overwrite;
|
||||||
_FileSystemInterface.Cleanup = Cleanup;
|
_FileSystemInterface.Cleanup = Cleanup;
|
||||||
_FileSystemInterface.Close = Close;
|
_FileSystemInterface.Close = Close;
|
||||||
_FileSystemInterface.Read = Read;
|
_FileSystemInterface.Read = Read;
|
||||||
@ -1078,7 +1358,6 @@ namespace Fsp
|
|||||||
_FileSystemInterface.GetFileInfo = GetFileInfo;
|
_FileSystemInterface.GetFileInfo = GetFileInfo;
|
||||||
_FileSystemInterface.SetBasicInfo = SetBasicInfo;
|
_FileSystemInterface.SetBasicInfo = SetBasicInfo;
|
||||||
_FileSystemInterface.SetFileSize = SetFileSize;
|
_FileSystemInterface.SetFileSize = SetFileSize;
|
||||||
_FileSystemInterface.CanDelete = CanDelete;
|
|
||||||
_FileSystemInterface.Rename = Rename;
|
_FileSystemInterface.Rename = Rename;
|
||||||
_FileSystemInterface.GetSecurity = GetSecurity;
|
_FileSystemInterface.GetSecurity = GetSecurity;
|
||||||
_FileSystemInterface.SetSecurity = SetSecurity;
|
_FileSystemInterface.SetSecurity = SetSecurity;
|
||||||
@ -1090,6 +1369,9 @@ namespace Fsp
|
|||||||
_FileSystemInterface.GetStreamInfo = GetStreamInfo;
|
_FileSystemInterface.GetStreamInfo = GetStreamInfo;
|
||||||
_FileSystemInterface.GetDirInfoByName = GetDirInfoByName;
|
_FileSystemInterface.GetDirInfoByName = GetDirInfoByName;
|
||||||
_FileSystemInterface.Control = Control;
|
_FileSystemInterface.Control = Control;
|
||||||
|
_FileSystemInterface.SetDelete = SetDelete;
|
||||||
|
_FileSystemInterface.GetEa = GetEa;
|
||||||
|
_FileSystemInterface.SetEa = SetEa;
|
||||||
|
|
||||||
_FileSystemInterfacePtr = Marshal.AllocHGlobal(FileSystemInterface.Size);
|
_FileSystemInterfacePtr = Marshal.AllocHGlobal(FileSystemInterface.Size);
|
||||||
Marshal.StructureToPtr(_FileSystemInterface, _FileSystemInterfacePtr, false);
|
Marshal.StructureToPtr(_FileSystemInterface, _FileSystemInterfacePtr, false);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* dotnet/Interop.cs
|
* dotnet/Interop.cs
|
||||||
*
|
*
|
||||||
* Copyright 2015-2018 Bill Zissimopoulos
|
* Copyright 2015-2019 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,9 +10,13 @@
|
|||||||
* General Public License version 3 as published by the Free Software
|
* General Public License version 3 as published by the Free Software
|
||||||
* Foundation.
|
* Foundation.
|
||||||
*
|
*
|
||||||
* Licensees holding a valid commercial license may use this file in
|
* Licensees holding a valid commercial license may use this software
|
||||||
* accordance with the commercial license agreement provided with the
|
* in accordance with the commercial license agreement provided in
|
||||||
* software.
|
* conjunction with the software. The terms and conditions of any such
|
||||||
|
* commercial license agreement shall govern, supersede, and render
|
||||||
|
* ineffective any application of the GPLv3 license to this software,
|
||||||
|
* notwithstanding of any reference thereto in the software or
|
||||||
|
* associated repository.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
@ -44,11 +48,21 @@ namespace Fsp.Interop
|
|||||||
internal const UInt32 AlwaysUseDoubleBuffering = 0x00001000;
|
internal const UInt32 AlwaysUseDoubleBuffering = 0x00001000;
|
||||||
internal const UInt32 PassQueryDirectoryFileName = 0x00002000;
|
internal const UInt32 PassQueryDirectoryFileName = 0x00002000;
|
||||||
internal const UInt32 FlushAndPurgeOnCleanup = 0x00004000;
|
internal const UInt32 FlushAndPurgeOnCleanup = 0x00004000;
|
||||||
|
internal const UInt32 DeviceControl = 0x00008000;
|
||||||
internal const UInt32 UmFileContextIsUserContext2 = 0x00010000;
|
internal const UInt32 UmFileContextIsUserContext2 = 0x00010000;
|
||||||
internal const UInt32 UmFileContextIsFullContext = 0x00020000;
|
internal const UInt32 UmFileContextIsFullContext = 0x00020000;
|
||||||
|
internal const UInt32 AllowOpenInKernelMode = 0x01000000;
|
||||||
|
internal const UInt32 CasePreservedExtendedAttributes = 0x02000000;
|
||||||
|
internal const UInt32 WslFeatures = 0x04000000;
|
||||||
internal const int PrefixSize = 192;
|
internal const int PrefixSize = 192;
|
||||||
internal const int FileSystemNameSize = 16;
|
internal const int FileSystemNameSize = 16;
|
||||||
|
|
||||||
|
internal const UInt32 VolumeInfoTimeoutValid = 0x00000001;
|
||||||
|
internal const UInt32 DirInfoTimeoutValid = 0x00000002;
|
||||||
|
internal const UInt32 SecurityTimeoutValid = 0x00000004;
|
||||||
|
internal const UInt32 StreamInfoTimeoutValid = 0x00000008;
|
||||||
|
internal const UInt32 EaTimeoutValid = 0x00000010;
|
||||||
|
|
||||||
internal UInt16 Version;
|
internal UInt16 Version;
|
||||||
internal UInt16 SectorSize;
|
internal UInt16 SectorSize;
|
||||||
internal UInt16 SectorsPerAllocationUnit;
|
internal UInt16 SectorsPerAllocationUnit;
|
||||||
@ -62,6 +76,15 @@ namespace Fsp.Interop
|
|||||||
internal UInt32 Flags;
|
internal UInt32 Flags;
|
||||||
internal unsafe fixed UInt16 Prefix[PrefixSize];
|
internal unsafe fixed UInt16 Prefix[PrefixSize];
|
||||||
internal unsafe fixed UInt16 FileSystemName[FileSystemNameSize];
|
internal unsafe fixed UInt16 FileSystemName[FileSystemNameSize];
|
||||||
|
internal UInt32 AdditionalFlags;
|
||||||
|
internal UInt32 VolumeInfoTimeout;
|
||||||
|
internal UInt32 DirInfoTimeout;
|
||||||
|
internal UInt32 SecurityTimeout;
|
||||||
|
internal UInt32 StreamInfoTimeout;
|
||||||
|
internal UInt32 EaTimeout;
|
||||||
|
internal UInt32 FsextControlCode;
|
||||||
|
internal unsafe fixed UInt32 Reserved32[1];
|
||||||
|
internal unsafe fixed UInt64 Reserved64[2];
|
||||||
|
|
||||||
internal unsafe String GetPrefix()
|
internal unsafe String GetPrefix()
|
||||||
{
|
{
|
||||||
@ -189,6 +212,28 @@ namespace Fsp.Interop
|
|||||||
/// Not currently implemented. Set to 0.
|
/// Not currently implemented. Set to 0.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public UInt32 HardLinks;
|
public UInt32 HardLinks;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The extended attribute size of the file.
|
||||||
|
/// </summary>
|
||||||
|
public UInt32 EaSize
|
||||||
|
{
|
||||||
|
get { return GetEaSize(); }
|
||||||
|
set { SetEaSize(value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static int EaSizeOffset =
|
||||||
|
(int)Marshal.OffsetOf(typeof(FileInfo), "HardLinks") + 4;
|
||||||
|
internal unsafe UInt32 GetEaSize()
|
||||||
|
{
|
||||||
|
fixed (FileInfo *P = &this)
|
||||||
|
return *(UInt32 *)((Int64)(IntPtr)P + EaSizeOffset);
|
||||||
|
}
|
||||||
|
internal unsafe void SetEaSize(UInt32 value)
|
||||||
|
{
|
||||||
|
fixed (FileInfo *P = &this)
|
||||||
|
*(UInt32 *)((Int64)(IntPtr)P + EaSizeOffset) = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
@ -264,6 +309,53 @@ namespace Fsp.Interop
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
internal struct FullEaInformation
|
||||||
|
{
|
||||||
|
internal const int EaNameSize = 15 * 1024;
|
||||||
|
/* Set this to a value smaller than 16384 with sufficient space for additional data.
|
||||||
|
* This should really be:
|
||||||
|
* FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX - FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName)
|
||||||
|
*/
|
||||||
|
|
||||||
|
internal UInt32 NextEntryOffset;
|
||||||
|
internal Byte Flags;
|
||||||
|
internal Byte EaNameLength;
|
||||||
|
internal UInt16 EaValueLength;
|
||||||
|
internal unsafe fixed Byte EaName[EaNameSize];
|
||||||
|
|
||||||
|
internal unsafe void Set(String Name, Byte[] Value, Boolean NeedEa)
|
||||||
|
{
|
||||||
|
int NameLength = 254 < Name.Length ? 254 : Name.Length;
|
||||||
|
int ValueLength = EaNameSize - Name.Length - 1 < Value.Length ?
|
||||||
|
EaNameSize - Name.Length - 1 : Value.Length;
|
||||||
|
|
||||||
|
NextEntryOffset = 0;
|
||||||
|
Flags = NeedEa ? (Byte)0x80/*FILE_NEED_EA*/ : (Byte)0;
|
||||||
|
EaNameLength = (Byte)NameLength;
|
||||||
|
EaValueLength = (UInt16)ValueLength;
|
||||||
|
|
||||||
|
fixed (Byte *P = EaName)
|
||||||
|
{
|
||||||
|
int I = 0, J = 0;
|
||||||
|
for (; NameLength > I; I++)
|
||||||
|
P[I] = (Byte)Name[I];
|
||||||
|
P[I++] = 0;
|
||||||
|
for (; ValueLength > J; J++)
|
||||||
|
P[I + J] = Value[J];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
internal static UInt32 PackedSize(String Name, Byte[] Value, Boolean NeedEa)
|
||||||
|
{
|
||||||
|
int NameLength = 254 < Name.Length ? 254 : Name.Length;
|
||||||
|
int ValueLength = EaNameSize - Name.Length - 1 < Value.Length ?
|
||||||
|
EaNameSize - Name.Length - 1 : Value.Length;
|
||||||
|
|
||||||
|
/* magic computations are courtesy of NTFS */
|
||||||
|
return (UInt32)(5 + NameLength + ValueLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
internal struct FullContext
|
internal struct FullContext
|
||||||
{
|
{
|
||||||
@ -278,6 +370,65 @@ namespace Fsp.Interop
|
|||||||
public IntPtr Information;
|
public IntPtr Information;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
internal struct IoStatus
|
||||||
|
{
|
||||||
|
internal UInt32 Information;
|
||||||
|
internal UInt32 Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal enum FspFsctlTransact
|
||||||
|
{
|
||||||
|
ReadKind = 5,
|
||||||
|
WriteKind = 6,
|
||||||
|
QueryDirectoryKind = 14
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
internal struct FspFsctlTransactReq
|
||||||
|
{
|
||||||
|
[FieldOffset(0)]
|
||||||
|
internal UInt16 Version;
|
||||||
|
[FieldOffset(2)]
|
||||||
|
internal UInt16 Size;
|
||||||
|
[FieldOffset(4)]
|
||||||
|
internal UInt32 Kind;
|
||||||
|
[FieldOffset(8)]
|
||||||
|
internal UInt64 Hint;
|
||||||
|
|
||||||
|
[FieldOffset(0)]
|
||||||
|
internal unsafe fixed Byte Padding[88];
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
internal struct FspFsctlTransactRsp
|
||||||
|
{
|
||||||
|
[FieldOffset(0)]
|
||||||
|
internal UInt16 Version;
|
||||||
|
[FieldOffset(2)]
|
||||||
|
internal UInt16 Size;
|
||||||
|
[FieldOffset(4)]
|
||||||
|
internal UInt32 Kind;
|
||||||
|
[FieldOffset(8)]
|
||||||
|
internal UInt64 Hint;
|
||||||
|
|
||||||
|
[FieldOffset(16)]
|
||||||
|
internal IoStatus IoStatus;
|
||||||
|
|
||||||
|
[FieldOffset(24)]
|
||||||
|
internal FileInfo WriteFileInfo;
|
||||||
|
|
||||||
|
[FieldOffset(0)]
|
||||||
|
internal unsafe fixed Byte Padding[128];
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
internal unsafe struct FspFileSystemOperationContext
|
||||||
|
{
|
||||||
|
internal FspFsctlTransactReq *Request;
|
||||||
|
internal FspFsctlTransactRsp *Response;
|
||||||
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
internal struct FileSystemInterface
|
internal struct FileSystemInterface
|
||||||
{
|
{
|
||||||
@ -466,6 +617,50 @@ namespace Fsp.Interop
|
|||||||
IntPtr InputBuffer, UInt32 InputBufferLength,
|
IntPtr InputBuffer, UInt32 InputBufferLength,
|
||||||
IntPtr OutputBuffer, UInt32 OutputBufferLength,
|
IntPtr OutputBuffer, UInt32 OutputBufferLength,
|
||||||
out UInt32 PBytesTransferred);
|
out UInt32 PBytesTransferred);
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
|
internal delegate Int32 SetDelete(
|
||||||
|
IntPtr FileSystem,
|
||||||
|
ref FullContext FullContext,
|
||||||
|
[MarshalAs(UnmanagedType.LPWStr)] String FileName,
|
||||||
|
[MarshalAs(UnmanagedType.U1)] Boolean DeleteFile);
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
|
internal delegate Int32 CreateEx(
|
||||||
|
IntPtr FileSystem,
|
||||||
|
[MarshalAs(UnmanagedType.LPWStr)] String FileName,
|
||||||
|
UInt32 CreateOptions,
|
||||||
|
UInt32 GrantedAccess,
|
||||||
|
UInt32 FileAttributes,
|
||||||
|
IntPtr SecurityDescriptor,
|
||||||
|
UInt64 AllocationSize,
|
||||||
|
IntPtr ExtraBuffer,
|
||||||
|
UInt32 ExtraLength,
|
||||||
|
[MarshalAs(UnmanagedType.U1)] Boolean ExtraBufferIsReparsePoint,
|
||||||
|
ref FullContext FullContext,
|
||||||
|
ref OpenFileInfo OpenFileInfo);
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
|
internal delegate Int32 OverwriteEx(
|
||||||
|
IntPtr FileSystem,
|
||||||
|
ref FullContext FullContext,
|
||||||
|
UInt32 FileAttributes,
|
||||||
|
[MarshalAs(UnmanagedType.U1)] Boolean ReplaceFileAttributes,
|
||||||
|
UInt64 AllocationSize,
|
||||||
|
IntPtr Ea,
|
||||||
|
UInt32 EaLength,
|
||||||
|
out FileInfo FileInfo);
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
|
internal delegate Int32 GetEa(
|
||||||
|
IntPtr FileSystem,
|
||||||
|
ref FullContext FullContext,
|
||||||
|
IntPtr Ea,
|
||||||
|
UInt32 EaLength,
|
||||||
|
out UInt32 PBytesTransferred);
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
|
internal delegate Int32 SetEa(
|
||||||
|
IntPtr FileSystem,
|
||||||
|
ref FullContext FullContext,
|
||||||
|
IntPtr Ea,
|
||||||
|
UInt32 EaLength,
|
||||||
|
out FileInfo FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static int Size = IntPtr.Size * 64;
|
internal static int Size = IntPtr.Size * 64;
|
||||||
@ -496,7 +691,12 @@ namespace Fsp.Interop
|
|||||||
internal Proto.GetStreamInfo GetStreamInfo;
|
internal Proto.GetStreamInfo GetStreamInfo;
|
||||||
internal Proto.GetDirInfoByName GetDirInfoByName;
|
internal Proto.GetDirInfoByName GetDirInfoByName;
|
||||||
internal Proto.Control Control;
|
internal Proto.Control Control;
|
||||||
/* NTSTATUS (*Reserved[38])(); */
|
internal Proto.SetDelete SetDelete;
|
||||||
|
internal Proto.CreateEx CreateEx;
|
||||||
|
internal Proto.OverwriteEx OverwriteEx;
|
||||||
|
internal Proto.GetEa GetEa;
|
||||||
|
internal Proto.SetEa SetEa;
|
||||||
|
/* NTSTATUS (*Reserved[33])(); */
|
||||||
}
|
}
|
||||||
|
|
||||||
[SuppressUnmanagedCodeSecurity]
|
[SuppressUnmanagedCodeSecurity]
|
||||||
@ -538,6 +738,12 @@ namespace Fsp.Interop
|
|||||||
internal delegate Int32 FspFileSystemStopDispatcher(
|
internal delegate Int32 FspFileSystemStopDispatcher(
|
||||||
IntPtr FileSystem);
|
IntPtr FileSystem);
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
|
internal delegate void FspFileSystemSendResponse(
|
||||||
|
IntPtr FileSystem,
|
||||||
|
ref FspFsctlTransactRsp Response);
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
|
internal unsafe delegate FspFileSystemOperationContext *FspFileSystemGetOperationContext();
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
internal delegate IntPtr FspFileSystemMountPointF(
|
internal delegate IntPtr FspFileSystemMountPointF(
|
||||||
IntPtr FileSystem);
|
IntPtr FileSystem);
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
@ -591,6 +797,13 @@ namespace Fsp.Interop
|
|||||||
out UInt32 PBytesTransferred);
|
out UInt32 PBytesTransferred);
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
[return: MarshalAs(UnmanagedType.U1)]
|
[return: MarshalAs(UnmanagedType.U1)]
|
||||||
|
internal delegate Boolean FspFileSystemAddEa(
|
||||||
|
IntPtr SingleEa,
|
||||||
|
IntPtr Ea,
|
||||||
|
UInt32 EaLength,
|
||||||
|
out UInt32 PBytesTransferred);
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
|
[return: MarshalAs(UnmanagedType.U1)]
|
||||||
internal delegate Boolean FspFileSystemAcquireDirectoryBuffer(
|
internal delegate Boolean FspFileSystemAcquireDirectoryBuffer(
|
||||||
ref IntPtr PDirBuffer,
|
ref IntPtr PDirBuffer,
|
||||||
[MarshalAs(UnmanagedType.U1)] Boolean Reset,
|
[MarshalAs(UnmanagedType.U1)] Boolean Reset,
|
||||||
@ -715,6 +928,8 @@ namespace Fsp.Interop
|
|||||||
internal static Proto.FspFileSystemRemoveMountPoint FspFileSystemRemoveMountPoint;
|
internal static Proto.FspFileSystemRemoveMountPoint FspFileSystemRemoveMountPoint;
|
||||||
internal static Proto.FspFileSystemStartDispatcher FspFileSystemStartDispatcher;
|
internal static Proto.FspFileSystemStartDispatcher FspFileSystemStartDispatcher;
|
||||||
internal static Proto.FspFileSystemStopDispatcher FspFileSystemStopDispatcher;
|
internal static Proto.FspFileSystemStopDispatcher FspFileSystemStopDispatcher;
|
||||||
|
internal static Proto.FspFileSystemSendResponse FspFileSystemSendResponse;
|
||||||
|
internal static Proto.FspFileSystemGetOperationContext FspFileSystemGetOperationContext;
|
||||||
internal static Proto.FspFileSystemMountPointF FspFileSystemMountPoint;
|
internal static Proto.FspFileSystemMountPointF FspFileSystemMountPoint;
|
||||||
internal static Proto.FspFileSystemSetOperationGuardStrategyF FspFileSystemSetOperationGuardStrategy;
|
internal static Proto.FspFileSystemSetOperationGuardStrategyF FspFileSystemSetOperationGuardStrategy;
|
||||||
internal static Proto.FspFileSystemSetDebugLogF FspFileSystemSetDebugLog;
|
internal static Proto.FspFileSystemSetDebugLogF FspFileSystemSetDebugLog;
|
||||||
@ -724,6 +939,7 @@ namespace Fsp.Interop
|
|||||||
internal static Proto.FspFileSystemResolveReparsePoints FspFileSystemResolveReparsePoints;
|
internal static Proto.FspFileSystemResolveReparsePoints FspFileSystemResolveReparsePoints;
|
||||||
internal static Proto.FspFileSystemCanReplaceReparsePoint _FspFileSystemCanReplaceReparsePoint;
|
internal static Proto.FspFileSystemCanReplaceReparsePoint _FspFileSystemCanReplaceReparsePoint;
|
||||||
internal static Proto.FspFileSystemAddStreamInfo _FspFileSystemAddStreamInfo;
|
internal static Proto.FspFileSystemAddStreamInfo _FspFileSystemAddStreamInfo;
|
||||||
|
internal static Proto.FspFileSystemAddEa _FspFileSystemAddEa;
|
||||||
internal static Proto.FspFileSystemAcquireDirectoryBuffer FspFileSystemAcquireDirectoryBuffer;
|
internal static Proto.FspFileSystemAcquireDirectoryBuffer FspFileSystemAcquireDirectoryBuffer;
|
||||||
internal static Proto.FspFileSystemFillDirectoryBuffer FspFileSystemFillDirectoryBuffer;
|
internal static Proto.FspFileSystemFillDirectoryBuffer FspFileSystemFillDirectoryBuffer;
|
||||||
internal static Proto.FspFileSystemReleaseDirectoryBuffer FspFileSystemReleaseDirectoryBuffer;
|
internal static Proto.FspFileSystemReleaseDirectoryBuffer FspFileSystemReleaseDirectoryBuffer;
|
||||||
@ -760,6 +976,10 @@ namespace Fsp.Interop
|
|||||||
else
|
else
|
||||||
return _FspFileSystemSetMountPointEx(FileSystem, MountPoint, IntPtr.Zero);
|
return _FspFileSystemSetMountPointEx(FileSystem, MountPoint, IntPtr.Zero);
|
||||||
}
|
}
|
||||||
|
internal static unsafe UInt64 FspFileSystemGetOperationRequestHint()
|
||||||
|
{
|
||||||
|
return FspFileSystemGetOperationContext()->Request->Hint;
|
||||||
|
}
|
||||||
internal static unsafe Boolean FspFileSystemAddDirInfo(
|
internal static unsafe Boolean FspFileSystemAddDirInfo(
|
||||||
ref DirInfo DirInfo,
|
ref DirInfo DirInfo,
|
||||||
IntPtr Buffer,
|
IntPtr Buffer,
|
||||||
@ -793,6 +1013,62 @@ namespace Fsp.Interop
|
|||||||
return _FspFileSystemAddStreamInfo(IntPtr.Zero, Buffer, Length, out PBytesTransferred);
|
return _FspFileSystemAddStreamInfo(IntPtr.Zero, Buffer, Length, out PBytesTransferred);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal delegate Int32 EnumerateEa(
|
||||||
|
Object FileNode,
|
||||||
|
Object FileDesc,
|
||||||
|
ref Object Context,
|
||||||
|
String EaName,
|
||||||
|
Byte[] EaValue,
|
||||||
|
Boolean NeedEa);
|
||||||
|
internal static unsafe Int32 FspFileSystemEnumerateEa(
|
||||||
|
Object FileNode,
|
||||||
|
Object FileDesc,
|
||||||
|
EnumerateEa EnumerateEa,
|
||||||
|
IntPtr Ea,
|
||||||
|
UInt32 EaLength)
|
||||||
|
{
|
||||||
|
Object Context = null;
|
||||||
|
FullEaInformation *P = (FullEaInformation *)Ea;
|
||||||
|
FullEaInformation *EndP = (FullEaInformation *)(Ea.ToInt64() + EaLength);
|
||||||
|
Int32 Result;
|
||||||
|
Result = 0/*STATUS_SUCCESS*/;
|
||||||
|
for (; EndP > P;
|
||||||
|
P = 0 != P->NextEntryOffset ?
|
||||||
|
(FullEaInformation *)(((IntPtr)P).ToInt64() + P->NextEntryOffset) :
|
||||||
|
EndP)
|
||||||
|
{
|
||||||
|
String EaName = Marshal.PtrToStringAnsi((IntPtr)P->EaName, P->EaNameLength);
|
||||||
|
Byte[] EaValue = null;
|
||||||
|
if (0 != P->EaValueLength)
|
||||||
|
{
|
||||||
|
EaValue = new Byte[P->EaValueLength];
|
||||||
|
Marshal.Copy((IntPtr)(((IntPtr)P->EaName).ToInt64() + P->EaNameLength + 1),
|
||||||
|
EaValue, 0, P->EaValueLength);
|
||||||
|
}
|
||||||
|
Boolean NeedEa = 0 != (0x80/*FILE_NEED_EA*/ & P->Flags);
|
||||||
|
Result = EnumerateEa(FileNode, FileDesc, ref Context, EaName, EaValue, NeedEa);
|
||||||
|
if (0 > Result)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
internal static unsafe Boolean FspFileSystemAddEa(
|
||||||
|
ref FullEaInformation EaInfo,
|
||||||
|
IntPtr Buffer,
|
||||||
|
UInt32 Length,
|
||||||
|
out UInt32 PBytesTransferred)
|
||||||
|
{
|
||||||
|
fixed (FullEaInformation *P = &EaInfo)
|
||||||
|
return _FspFileSystemAddEa((IntPtr)P, Buffer, Length, out PBytesTransferred);
|
||||||
|
}
|
||||||
|
internal static unsafe Boolean FspFileSystemEndEa(
|
||||||
|
IntPtr Buffer,
|
||||||
|
UInt32 Length,
|
||||||
|
out UInt32 PBytesTransferred)
|
||||||
|
{
|
||||||
|
return _FspFileSystemAddEa(IntPtr.Zero, Buffer, Length, out PBytesTransferred);
|
||||||
|
}
|
||||||
|
|
||||||
internal unsafe static Object GetUserContext(
|
internal unsafe static Object GetUserContext(
|
||||||
IntPtr NativePtr)
|
IntPtr NativePtr)
|
||||||
{
|
{
|
||||||
@ -916,6 +1192,26 @@ namespace Fsp.Interop
|
|||||||
return SecurityDescriptorBytes;
|
return SecurityDescriptorBytes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
internal unsafe static Int32 ModifySecurityDescriptorEx(
|
||||||
|
Byte[] SecurityDescriptorBytes,
|
||||||
|
UInt32 SecurityInformation,
|
||||||
|
Byte[] ModificationDescriptorBytes,
|
||||||
|
ref Byte[] ModifiedDescriptorBytes)
|
||||||
|
{
|
||||||
|
fixed (Byte *S = SecurityDescriptorBytes)
|
||||||
|
fixed (Byte *M = ModificationDescriptorBytes)
|
||||||
|
{
|
||||||
|
IntPtr SecurityDescriptor;
|
||||||
|
Int32 Result = FspSetSecurityDescriptor(
|
||||||
|
(IntPtr)S, SecurityInformation, (IntPtr)M, out SecurityDescriptor);
|
||||||
|
if (0 > Result)
|
||||||
|
return Result;
|
||||||
|
SecurityDescriptorBytes = MakeSecurityDescriptor(SecurityDescriptor);
|
||||||
|
FspDeleteSecurityDescriptor(SecurityDescriptor, _FspSetSecurityDescriptorPtr);
|
||||||
|
ModifiedDescriptorBytes = SecurityDescriptorBytes;
|
||||||
|
return 0/*STATUS_SUCCESS*/;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal unsafe static Int32 CopyReparsePoint(
|
internal unsafe static Int32 CopyReparsePoint(
|
||||||
Byte[] ReparseData,
|
Byte[] ReparseData,
|
||||||
@ -1032,6 +1328,8 @@ namespace Fsp.Interop
|
|||||||
FspFileSystemRemoveMountPoint = GetEntryPoint<Proto.FspFileSystemRemoveMountPoint>(Module);
|
FspFileSystemRemoveMountPoint = GetEntryPoint<Proto.FspFileSystemRemoveMountPoint>(Module);
|
||||||
FspFileSystemStartDispatcher = GetEntryPoint<Proto.FspFileSystemStartDispatcher>(Module);
|
FspFileSystemStartDispatcher = GetEntryPoint<Proto.FspFileSystemStartDispatcher>(Module);
|
||||||
FspFileSystemStopDispatcher = GetEntryPoint<Proto.FspFileSystemStopDispatcher>(Module);
|
FspFileSystemStopDispatcher = GetEntryPoint<Proto.FspFileSystemStopDispatcher>(Module);
|
||||||
|
FspFileSystemSendResponse = GetEntryPoint<Proto.FspFileSystemSendResponse>(Module);
|
||||||
|
FspFileSystemGetOperationContext = GetEntryPoint<Proto.FspFileSystemGetOperationContext>(Module);
|
||||||
FspFileSystemMountPoint = GetEntryPoint<Proto.FspFileSystemMountPointF>(Module);
|
FspFileSystemMountPoint = GetEntryPoint<Proto.FspFileSystemMountPointF>(Module);
|
||||||
FspFileSystemSetOperationGuardStrategy = GetEntryPoint<Proto.FspFileSystemSetOperationGuardStrategyF>(Module);
|
FspFileSystemSetOperationGuardStrategy = GetEntryPoint<Proto.FspFileSystemSetOperationGuardStrategyF>(Module);
|
||||||
FspFileSystemSetDebugLog = GetEntryPoint<Proto.FspFileSystemSetDebugLogF>(Module);
|
FspFileSystemSetDebugLog = GetEntryPoint<Proto.FspFileSystemSetDebugLogF>(Module);
|
||||||
@ -1041,6 +1339,7 @@ namespace Fsp.Interop
|
|||||||
FspFileSystemResolveReparsePoints = GetEntryPoint<Proto.FspFileSystemResolveReparsePoints>(Module);
|
FspFileSystemResolveReparsePoints = GetEntryPoint<Proto.FspFileSystemResolveReparsePoints>(Module);
|
||||||
_FspFileSystemCanReplaceReparsePoint = GetEntryPoint<Proto.FspFileSystemCanReplaceReparsePoint>(Module);
|
_FspFileSystemCanReplaceReparsePoint = GetEntryPoint<Proto.FspFileSystemCanReplaceReparsePoint>(Module);
|
||||||
_FspFileSystemAddStreamInfo = GetEntryPoint<Proto.FspFileSystemAddStreamInfo>(Module);
|
_FspFileSystemAddStreamInfo = GetEntryPoint<Proto.FspFileSystemAddStreamInfo>(Module);
|
||||||
|
_FspFileSystemAddEa = GetEntryPoint<Proto.FspFileSystemAddEa>(Module);
|
||||||
FspFileSystemAcquireDirectoryBuffer = GetEntryPoint<Proto.FspFileSystemAcquireDirectoryBuffer>(Module);
|
FspFileSystemAcquireDirectoryBuffer = GetEntryPoint<Proto.FspFileSystemAcquireDirectoryBuffer>(Module);
|
||||||
FspFileSystemFillDirectoryBuffer = GetEntryPoint<Proto.FspFileSystemFillDirectoryBuffer>(Module);
|
FspFileSystemFillDirectoryBuffer = GetEntryPoint<Proto.FspFileSystemFillDirectoryBuffer>(Module);
|
||||||
FspFileSystemReleaseDirectoryBuffer = GetEntryPoint<Proto.FspFileSystemReleaseDirectoryBuffer>(Module);
|
FspFileSystemReleaseDirectoryBuffer = GetEntryPoint<Proto.FspFileSystemReleaseDirectoryBuffer>(Module);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user