mirror of
https://github.com/winfsp/winfsp.git
synced 2025-07-03 01:12:58 -05:00
Compare commits
506 Commits
Author | SHA1 | Date | |
---|---|---|---|
c77690e59d | |||
32a5b2bc64 | |||
5045403d85 | |||
13a52c4ab4 | |||
c18d4f1508 | |||
fcfebb968f | |||
10053bc759 | |||
7985827c73 | |||
13146e4854 | |||
84e0744c28 | |||
20e19cb0fc | |||
2326521ef8 | |||
0296502f24 | |||
5d0b10d0b6 | |||
5fac25d200 | |||
b82aeeadbd | |||
dcaa24bc52 | |||
7e37fc57f9 | |||
8efe1f3a1f | |||
aa3beba928 | |||
899cd5595d | |||
6bcbfd5380 | |||
a197b99960 | |||
2ffb8a1c97 | |||
fc18b70a00 | |||
191c98bd41 | |||
5360f5ca6e | |||
89aaf33b62 | |||
675ecf2e51 | |||
b663cfdca5 | |||
dcf83b6d64 | |||
af52ac3df0 | |||
33cab186ca | |||
fd4c5326ed | |||
7c06ead34c | |||
768b596a76 | |||
26630ad7aa | |||
01744e8193 | |||
3eb115eb22 | |||
a0801674c4 | |||
98f809345d | |||
0268e51099 | |||
924d1f9a3e | |||
dc3f73bd2f | |||
e71aea8ad7 | |||
9066338220 | |||
ca12b5a19d | |||
94d8c0452f | |||
b4c39f656c | |||
42fd57904a | |||
9d69ae7503 | |||
f93cdbfa91 | |||
b7553925fb | |||
4b5b562307 | |||
ad68b36de7 | |||
0e8babf69c | |||
0e12212838 | |||
19b86972d8 | |||
403e234895 | |||
76ec0420d1 | |||
2a6beb2739 | |||
1933443e8d | |||
279b00e195 | |||
9b6542ab80 | |||
dfbab387ab | |||
10f4df519c | |||
24b5d48fed | |||
0650cabc47 | |||
71995a1fcd | |||
91c36b8f09 | |||
e3c19afb72 | |||
799025e8c2 | |||
896c00a08c | |||
8497855d80 | |||
52663ec676 | |||
0901fb6477 | |||
bf6d56ceac | |||
51350d5a42 | |||
9e32fed598 | |||
8301642e6b | |||
0002655782 | |||
e0e8d74d01 | |||
e608920679 | |||
dbfbcb547d | |||
b3dfea8303 | |||
3ab0e5a3d3 | |||
d687ef3a67 | |||
6df5ff980f | |||
14ac0f8db9 | |||
ac306c2ce1 | |||
aedf01a384 | |||
0ce8b1c254 | |||
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 | |||
04cf0e04ba | |||
f51af55fb3 | |||
f9a2780311 | |||
43101dfe06 | |||
ac5ed1c238 | |||
03f0d2bd1a | |||
77c18fc59e | |||
77cf7f7398 | |||
c61da81475 | |||
a1b92d9095 | |||
ae8e4e61f7 | |||
e5c424dba1 | |||
554f07a50e | |||
bd53b452b2 | |||
82cea37036 | |||
2fcc065421 | |||
bf53c00f38 | |||
ec4197d8b7 | |||
897a08700b | |||
1ace7ffb41 | |||
d7c0657c3d | |||
5d73687de8 | |||
a5bfdcf416 | |||
b609435dad | |||
523ccbea02 | |||
cf699ba441 | |||
0d819eb800 | |||
4a653a8bc0 | |||
6932d42039 | |||
77fb2cc1c1 | |||
500dfe1958 | |||
1b40d8db80 | |||
307e18fb0d | |||
461266382a | |||
a809b0787e | |||
ea5e031af2 | |||
558487cd22 | |||
2ff21529d5 | |||
d43c0c2c85 | |||
eb0f03b17b | |||
575fe55eb8 | |||
b537c61f3b | |||
5cd40ff7ff | |||
753440e837 | |||
9b79bb24ca | |||
931d201527 | |||
ab3f3d2827 | |||
3dc09b2496 | |||
27d03d4323 | |||
ad1b53e5a4 | |||
e4077c92e9 | |||
e3290a30bc | |||
09309f858c | |||
12baaa6d50 | |||
c584782bc7 | |||
9c4a361c48 | |||
c1f4606683 | |||
f79db6a3db | |||
9a9a73d4d8 | |||
a56caf3f94 | |||
9b8b3e9cb8 | |||
5a8aad60b3 | |||
1906772aa2 | |||
ce924d737c | |||
aa50d5a8b9 | |||
6ffddf36b5 | |||
ee4145e947 | |||
fd817e37c9 | |||
2056766b4f | |||
c73f7099b7 | |||
3513f0da5f | |||
c9c62b1831 | |||
8422e8121c | |||
88516f371a | |||
916b4f5c3d | |||
a7424c911b | |||
fb8cb8aca9 | |||
d0f5ea69a2 | |||
fbb81b0463 | |||
14a2004437 | |||
d491031fda | |||
75a3d97c62 | |||
5f325304d3 | |||
8727497662 | |||
a2ed9f2b1a | |||
fdaf1da778 | |||
1123e7b0ef | |||
06ee833740 | |||
fbcefe6339 | |||
637a1dac7e | |||
05f622f2de | |||
ef5c947168 | |||
894ae7b8f3 | |||
7aadf259d9 | |||
d54e9a3049 | |||
7d56b9c23d | |||
deb237f7b0 | |||
5ae0804bd2 | |||
382599e38f | |||
498ab91123 | |||
c2f87029d7 | |||
157c4bc09a | |||
4fcaa99d63 | |||
d6c3849120 | |||
ec39d4b888 | |||
ebc8c268e5 | |||
9501b5771d | |||
5d34a3bd8c | |||
5b72b4ad4a | |||
740411d604 | |||
5c3549c6eb | |||
9f56a21c7f | |||
2e7e95df76 | |||
b2e6c16ba0 | |||
bd32f54904 | |||
7908ba09ac | |||
5713605030 | |||
994e232fb3 | |||
9553bd52c4 | |||
1cab0f3975 | |||
499a3d1138 | |||
d29218ba69 | |||
5564a9efae | |||
750e72e601 | |||
9f13c6e915 | |||
5005dd6f5b | |||
f9b6fb8817 | |||
6b0b4c8b8e | |||
abb504053b | |||
fb507fc0bc | |||
d38afe8d16 | |||
a4629b8f8b | |||
670a38d549 | |||
b939f6bd2b | |||
3df27f5b28 | |||
7581cece81 | |||
b4f5707e4e | |||
309827860f | |||
2b6b049f86 | |||
77f3e064a2 | |||
f691a7a3c7 | |||
cc58668ce5 | |||
064d0b94f2 | |||
a48668149b |
12
.github/ISSUE_TEMPLATE.md
vendored
12
.github/ISSUE_TEMPLATE.md
vendored
@ -1,12 +0,0 @@
|
|||||||
(Enter your issue here.)
|
|
||||||
|
|
||||||
----
|
|
||||||
|
|
||||||
Before submitting this issue please review this checklist. Ideally all checkmarks should be checked upon submitting. (Use an x inside square brackets like so: [x])
|
|
||||||
|
|
||||||
- [ ] **Issue type**: Please consider posting only bug reports or enhancement requests. Questions are better in the [WinFsp Google Group](https://groups.google.com/forum/#!forum/winfsp).
|
|
||||||
- [ ] **No Duplicate**: Ensure that your issue has not been filed before. (Check open and closed issues.)
|
|
||||||
- [ ] **Description**: Provide a descriptive title and a detailed explanation of the problem you are experiencing (for a bug report) or you are trying to solve (for an enhancement request).
|
|
||||||
- [ ] **Reproduce**: For bug reports provide detailed information on how to reproduce the problem. For enhancement requests you do not need to provide this information, unless you find it relevant.
|
|
||||||
- [ ] **Behaviors**: Provide information on the expected and actual behaviors.
|
|
||||||
- [ ] **Environment**: For bug reports provide information about your OS version and build (e.g. 10.0.14393) and WinFsp version and build (e.g. 2017.2 or 1.2.17341). For enhancement requests you do not need to provide this information, unless you find it relevant.
|
|
21
.github/ISSUE_TEMPLATE/bug.md
vendored
Normal file
21
.github/ISSUE_TEMPLATE/bug.md
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: Bug Report
|
||||||
|
about: File a bug report.
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bug Report
|
||||||
|
|
||||||
|
_Provide a descriptive title and a detailed explanation of the problem you are experiencing. Ensure that your issue has not been filed before._
|
||||||
|
|
||||||
|
### How to Reproduce
|
||||||
|
|
||||||
|
_Provide detailed information on how to reproduce the problem._
|
||||||
|
|
||||||
|
### Behaviors
|
||||||
|
|
||||||
|
_Provide information on the expected and actual behaviors._
|
||||||
|
|
||||||
|
### Environment
|
||||||
|
|
||||||
|
- OS version and build: _e.g. 10.0.14393_
|
||||||
|
- WinFsp version and build: _e.g. 2017.2 or 1.2.17341_
|
8
.github/ISSUE_TEMPLATE/enhancement.md
vendored
Normal file
8
.github/ISSUE_TEMPLATE/enhancement.md
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
name: Enhancement Request
|
||||||
|
about: File an enhancement request.
|
||||||
|
---
|
||||||
|
|
||||||
|
## Enhancement Request
|
||||||
|
|
||||||
|
_Provide a descriptive title and a detailed explanation of the problem the requested enhancement would solve. Ensure that your issue has not been filed before._
|
8
.github/ISSUE_TEMPLATE/question.md
vendored
Normal file
8
.github/ISSUE_TEMPLATE/question.md
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
name: Question
|
||||||
|
about: Questions are better asked in the WinFsp Google Group. However you may ask a question here.
|
||||||
|
---
|
||||||
|
|
||||||
|
## Question
|
||||||
|
|
||||||
|
_Please consider asking questions in the [WinFsp Google Group](https://groups.google.com/forum/#!forum/winfsp) instead. Before asking a question please also consult the [WinFsp Frequently Asked Questions](https://github.com/billziss-gh/winfsp/wiki/Frequently-Asked-Questions)._
|
15
.github/workflows/avm.yml
vendored
Normal file
15
.github/workflows/avm.yml
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
name: avm
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 2,8,14,20 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
scan:
|
||||||
|
runs-on: [windows-latest]
|
||||||
|
steps:
|
||||||
|
- uses: billziss-gh/avm@v1
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
https://github.com/billziss-gh/winfsp/releases/download/v1.6/winfsp-1.6.20027.msi
|
||||||
|
https://github.com/billziss-gh/winfsp/releases/download/v1.7B1/winfsp-1.7.20038.msi
|
@ -1,6 +1,386 @@
|
|||||||
= Changelog
|
= Changelog
|
||||||
|
|
||||||
|
|
||||||
|
v1.8B3 (2020.2 B2)::
|
||||||
|
|
||||||
|
Changes since v1.7:
|
||||||
|
|
||||||
|
* [FSD] WinFsp now supports Windows containers. See the link:doc/WinFsp-Container-Support.asciidoc[WinFsp Container Support] document for details.
|
||||||
|
|
||||||
|
* [FSD] The `FSP_FSCTL_QUERY_WINFSP` code provides a simple method to determine if
|
||||||
|
the file system backing a file is a WinFsp file system. To use issue a
|
||||||
|
+
|
||||||
|
----
|
||||||
|
DeviceIoControl(Handle, FSP_FSCTL_QUERY_WINFSP, 0, 0, 0, 0, &Bytes, 0)
|
||||||
|
----
|
||||||
|
+
|
||||||
|
If the return value is TRUE this is a WinFsp file system.
|
||||||
|
|
||||||
|
* [FSD] A fix regarding concurrency of READs on the same file: WinFsp was supposed to allow concurrent READ requests on the same file (e.g. two concurrent overlapped `ReadFile` requests on the same `HANDLE`) to be handled concurrently by the file system; unfortunately due to a problem in recent versions of WinFsp READ requests on the same file were serialized. This problem has now been fixed. See GitHub issue #291 for more details.
|
||||||
|
** *NOTE*: It may be that some file system was inadvertently relying on WinFsp's implicit serialization of READs in this case. Please test your file system thoroughly against this version, especially with regard to READ serialization. Related XKCD: https://imgs.xkcd.com/comics/workflow.png
|
||||||
|
|
||||||
|
* [FSD] When renaming files or directories NTFS allows the target name to contain a backslash at the end (even for files!) whereas WinFsp did not. This problem has been fixed and a test has been added in `winfsp-tests`.
|
||||||
|
|
||||||
|
|
||||||
|
v1.8B2 (2020.2 B2)::
|
||||||
|
|
||||||
|
Changes since v1.7:
|
||||||
|
|
||||||
|
* [FSD] WinFsp now supports Windows containers. See the link:doc/WinFsp-Container-Support.asciidoc[WinFsp Container Support] document for details.
|
||||||
|
|
||||||
|
* [FSD] The `FSP_FSCTL_QUERY_WINFSP` code provides a simple method to determine if
|
||||||
|
the file system backing a file is a WinFsp file system. To use issue a
|
||||||
|
+
|
||||||
|
----
|
||||||
|
DeviceIoControl(Handle, FSP_FSCTL_QUERY_WINFSP, 0, 0, 0, 0, &Bytes, 0)
|
||||||
|
----
|
||||||
|
+
|
||||||
|
If the return value is TRUE this is a WinFsp file system.
|
||||||
|
|
||||||
|
* [FSD] A fix regarding concurrency of READs on the same file: WinFsp was supposed to allow concurrent READ requests on the same file (e.g. two concurrent overlapped `ReadFile` requests on the same `HANDLE`) to be handled concurrently by the file system; unfortunately due to a problem in recent versions of WinFsp READ requests on the same file were serialized. This problem has now been fixed. See GitHub issue #291 for more details.
|
||||||
|
** *NOTE*: It may be that some file system was inadvertently relying on WinFsp's implicit serialization of READs in this case. Please test your file system thoroughly against this version, especially with regard to READ serialization. Related XKCD: https://imgs.xkcd.com/comics/workflow.png
|
||||||
|
|
||||||
|
|
||||||
|
v1.8B1 (2020.2 B1)::
|
||||||
|
|
||||||
|
Changes since v1.7:
|
||||||
|
|
||||||
|
* [FSD] WinFsp now supports Windows containers. See the link:doc/WinFsp-Container-Support.asciidoc[WinFsp Container Support] document for details.
|
||||||
|
* [FSD] The `FSP_FSCTL_QUERY_WINFSP` code provides a simple method to determine if
|
||||||
|
the file system backing a file is a WinFsp file system. To use issue a
|
||||||
|
+
|
||||||
|
----
|
||||||
|
DeviceIoControl(Handle, FSP_FSCTL_QUERY_WINFSP, 0, 0, 0, 0, &Bytes, 0)
|
||||||
|
----
|
||||||
|
+
|
||||||
|
If the return value is TRUE this is a WinFsp file system.
|
||||||
|
|
||||||
|
|
||||||
|
v1.7 (2020.1)::
|
||||||
|
|
||||||
|
Changes since v1.6:
|
||||||
|
|
||||||
|
* [FUSE] FUSE invalid directory entries no longer break the entire directory listing. Such invalid directory entries are logged. (GitHub PR #292.)
|
||||||
|
* [LAUNCH] The Launcher can now restart file systems that have crashed. Set `Recovery=1` in the file system's registry entry.
|
||||||
|
* [LAUNCH] The Launcher can now redirect file system standard error output. Set `Stderr=PATH` in the file system's registry entry.
|
||||||
|
* [FIX] Work around a problem in CreateProcess/CreateSection that allowed a faulty or malicious file system to bugcheck Windows.
|
||||||
|
* [FIX] Work around an incompatibility with Avast Antivirus.
|
||||||
|
** Native and .NET file systems that experience this problem should set the flag `RejectIrpPriorToTransact0` in `FSP_FSCTL_VOLUME_PARAMS` to `1`. This is only required when mounting on a directory with Avast Antivirus present.
|
||||||
|
** FUSE file systems do not need to do anything special as this flag is always enabled.
|
||||||
|
* [FIX] Fix junction (mount point reparse point) handling. (GitHub issue #269.)
|
||||||
|
|
||||||
|
|
||||||
|
v1.7B2 (2020.1 B2)::
|
||||||
|
|
||||||
|
Changes since v1.6:
|
||||||
|
|
||||||
|
* [FUSE] FUSE invalid directory entries no longer break the entire directory listing. Such invalid directory entries are logged. (GitHub PR #292.)
|
||||||
|
* [LAUNCH] The Launcher can now restart file systems that have crashed. Set `Recovery=1` in the file system's registry entry.
|
||||||
|
* [LAUNCH] The Launcher can now redirect file system standard error output. Set `Stderr=PATH` in the file system's registry entry.
|
||||||
|
* [FIX] Work around a problem in CreateProcess/CreateSection that allowed a faulty or malicious file system to bugcheck Windows.
|
||||||
|
* [FIX] Work around an incompatibility with Avast Antivirus.
|
||||||
|
** Native and .NET file systems that experience this problem should set the flag `RejectIrpPriorToTransact0` in `FSP_FSCTL_VOLUME_PARAMS` to `1`. This is only required when mounting on a directory with Avast Antivirus present.
|
||||||
|
** FUSE file systems do not need to do anything special as this flag is always enabled.
|
||||||
|
* [FIX] Fix junction (mount point reparse point) handling. (GitHub issue #269.)
|
||||||
|
|
||||||
|
|
||||||
|
v1.7B1 (2020.1 B1)::
|
||||||
|
|
||||||
|
Changes since v1.6:
|
||||||
|
|
||||||
|
* [FIX] Workaround an incompatibility with Avast Antivirus. (GitHub issue #221.)
|
||||||
|
* [FIX] Fix junction (mount point reparse point) handling. (GitHub issue #269.)
|
||||||
|
|
||||||
|
|
||||||
|
v1.6 (2020)::
|
||||||
|
|
||||||
|
Changes since v1.5:
|
||||||
|
|
||||||
|
* [FIX] Do no pass `O_APPEND` flag to FUSE file systems, which would result in data corruption under some circumstances. (See PR #272. Thanks @pfrejo.)
|
||||||
|
* [FIX] Fix how rename target directories are opened (use `FILE_DIRECTORY_FILE`). (See PR #270. Thanks @hammerg.)
|
||||||
|
|
||||||
|
|
||||||
|
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)::
|
||||||
|
|
||||||
|
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.
|
||||||
|
* `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.)
|
||||||
|
|
||||||
|
|
||||||
|
v1.4B1 (2018.2 B1)::
|
||||||
|
|
||||||
|
Changes since v1.3:
|
||||||
|
|
||||||
|
* New `Control` file system operation allows sending custom control codes to the file system using the Windows `DeviceIoControl` API.
|
||||||
|
|
||||||
|
|
||||||
|
v1.3 (2018.1)::
|
||||||
|
|
||||||
|
Changes since v1.2POST1:
|
||||||
|
|
||||||
|
* Multiple Launcher changes:
|
||||||
|
** New `FspLaunch` API. File systems can be started, stopped, queried and listed using `FspLaunchStart`, `FspLaunchStop`, `FspLaunchGetInfo` and `FspLaunchGetNameList`. The API is available in <winfsp/launch.h>
|
||||||
|
** New Launcher registry settings `RunAs` and `WorkDirectory`. `RunAs` allows the laucher to launch a file system process under the service accounts LocalService and NetworkService. `WorkDirectory` can be used to specify the work directory for a newly launched file system process.
|
||||||
|
* `FSP_FSCTL_VOLUME_PARAMS::FlushAndPurgeOnCleanup` limits the time that Windows keeps files open after an application has closed them. This purges the cache on the last `CloseHandle`, which is a performance drawback.
|
||||||
|
** This is now the default behavior on FUSE. To revert to the previous behavior of keeping files open indefinitely use `-o KeepFileCache`.
|
||||||
|
* `FSP_FSCTL_VOLUME_PARAMS` has been extended with fine-grained timeouts: `VolumeInfoTimeout`, `DirInfoTimeout`, `SecurityTimeout`, `StreamInfoTimeout`. Set `FSP_FSCTL_VOLUME_PARAMS::Version == sizeof(FSP_FSCTL_VOLUME_PARAMS)` to access the new fields.
|
||||||
|
** New FUSE optons `VolumeInfoTimeout`, `DirInfoTimeout` complement the existing `FileInfoTimeout`.
|
||||||
|
* The FSD (File System Driver) and its interaction with the Windows MUP (Multiple UNC Provider) has been changed. In practice this eliminates the delays experienced when right-clicking on a WinFsp-backed network drive in the Windows Explorer. (GitHub issue #87.)
|
||||||
|
* The WinFsp network provider is now added first in the provider order list. Previously it was added last. (GitHub PR #131; thanks @felfert.)
|
||||||
|
* The WinFsp installer now uses the Wix `Provides` dependency extension to provide a `WinFsp` dependency key. (GitHub PR #129; thanks @felfert.)
|
||||||
|
* New FUSE `create_umask` option. (GitHub issue #138.)
|
||||||
|
* Fix C++ compilation error for WinFsp-FUSE. (GitHub PR #154; thanks @benrubson.)
|
||||||
|
|
||||||
|
|
||||||
|
v1.3B3 (2018.1 B3)::
|
||||||
|
|
||||||
|
Changes since v1.2POST1:
|
||||||
|
|
||||||
|
* Multiple Launcher changes:
|
||||||
|
** New `FspLaunch` API. File systems can be started, stopped, queried and listed using `FspLaunchStart`, `FspLaunchStop`, `FspLaunchGetInfo` and `FspLaunchGetNameList`. The API is available in <winfsp/launch.h>
|
||||||
|
** New Launcher registry settings `RunAs` and `WorkDirectory`. `RunAs` allows the laucher to launch a file system process under the service accounts LocalService and NetworkService. `WorkDirectory` can be used to specify the work directory for a newly launched file system process.
|
||||||
|
* `FSP_FSCTL_VOLUME_PARAMS::FlushAndPurgeOnCleanup` limits the time that Windows keeps files open after an application has closed them. This purges the cache on the last `CloseHandle`, which is a performance drawback.
|
||||||
|
** This is now the default behavior on FUSE. To revert to the previous behavior of keeping files open indefinitely use `-o KeepFileCache`.
|
||||||
|
* `FSP_FSCTL_VOLUME_PARAMS` has been extended with fine-grained timeouts: `VolumeInfoTimeout`, `DirInfoTimeout`, `SecurityTimeout`, `StreamInfoTimeout`. Set `FSP_FSCTL_VOLUME_PARAMS::Version == sizeof(FSP_FSCTL_VOLUME_PARAMS)` to access the new fields.
|
||||||
|
** New FUSE optons `VolumeInfoTimeout`, `DirInfoTimeout` complement the existing `FileInfoTimeout`.
|
||||||
|
* The FSD (File System Driver) and its interaction with the Windows MUP (Multiple UNC Provider) has been changed. In practice this eliminates the delays experienced when right-clicking on a WinFsp-backed network drive in the Windows Explorer. (GitHub issue #87.)
|
||||||
|
* The WinFsp network provider is now added first in the provider order list. Previously it was added last. (GitHub PR #131; thanks @felfert.)
|
||||||
|
* The WinFsp installer now uses the Wix `Provides` dependency extension to provide a `WinFsp` dependency key. (GitHub PR #129; thanks @felfert.)
|
||||||
|
* New FUSE `create_umask` option. (GitHub issue #138.)
|
||||||
|
* Fix C++ compilation error for WinFsp-FUSE. (GitHub PR #154; thanks @benrubson.)
|
||||||
|
* *NOTE*: Prior v1.3 betas run the MEMFS sample file systems under the LocalService account. This is no longer the case: going forward the MEMFS file systems will be running under the LocalSystem account (as in v1.2POST1).
|
||||||
|
|
||||||
|
|
||||||
|
v1.3B2 (2018.1 B2)::
|
||||||
|
|
||||||
|
Changes since v1.2POST1:
|
||||||
|
|
||||||
|
* Multiple Launcher changes:
|
||||||
|
** New `FspLaunch` API. File systems can be started, stopped, queried and listed using `FspLaunchStart`, `FspLaunchStop`, `FspLaunchGetInfo` and `FspLaunchGetNameList`.
|
||||||
|
** New Launcher registry settings `RunAs` and `WorkDirectory`. `RunAs` allows the laucher to launch a file system process under the service accounts LocalService and NetworkService. `WorkDirectory` can be used to specify the work directory for a newly launched file system process.
|
||||||
|
* The MEMFS sample file systems are now launched under the LocalService account.
|
||||||
|
* The FSD (File System Driver) and its interaction with the Windows MUP (Multiple UNC Provider) has been changed. In practice this eliminates the delays experienced when right-clicking on a WinFsp-backed network drive in the Windows Explorer. (GitHub issue #87.)
|
||||||
|
* The WinFsp network provider is now added first in the provider order list. Previously it was added last. (GitHub PR #131; thanks @felfert.)
|
||||||
|
* The WinFsp installer now uses the Wix `Provides` dependency extension to provide a `WinFsp` dependency key. (GitHub PR #129; thanks @felfert.)
|
||||||
|
|
||||||
|
|
||||||
v1.3B1 (2018.1 B1)::
|
v1.3B1 (2018.1 B1)::
|
||||||
|
|
||||||
Changes since v1.2POST1:
|
Changes since v1.2POST1:
|
||||||
|
@ -54,9 +54,18 @@ This CONTRIBUTOR AGREEMENT applies to any contribution that you make to the WinF
|
|||||||
CONTRIBUTOR LIST
|
CONTRIBUTOR LIST
|
||||||
----------------
|
----------------
|
||||||
|===
|
|===
|
||||||
|
|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
|
||||||
|Fritz Elfert |fritz-github at fritz-elfert.de
|
|Fritz Elfert |fritz-github at fritz-elfert.de
|
||||||
|
|Gal Hammer (Red Hat, https://www.redhat.com) |ghammer at redhat.com
|
||||||
|John Oberschelp |john at oberschelp.net
|
|John Oberschelp |john at oberschelp.net
|
||||||
|
|John Tyner |jtyner at gmail.com
|
||||||
|
|Pedro Frejo (Arpa System, https://arpasystem.com) |pedro.frejo at arpasystem.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
|
||||||
|===
|
|===
|
||||||
|
128
README.md
128
README.md
@ -1,24 +1,77 @@
|
|||||||
# WinFsp - Windows File System Proxy
|
<h1 align="center">
|
||||||
|
WinFsp · Windows File System Proxy
|
||||||
|
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fgithub.com%2Fbillziss-gh%2Fwinfsp&text=Do%20you%20want%20to%20write%20a%20file%20system%20on%20Windows%3F%20WinFsp%20is%20well%20tested%2C%20very%20fast%20and%20easy%20to%20use%21&hashtags=windows%2Cfilesystem">
|
||||||
|
<img src="https://img.shields.io/twitter/url/http/shields.io.svg?style=social&label=Share"/>
|
||||||
|
</a>
|
||||||
|
</h1>
|
||||||
|
|
||||||

|
<p align="center">
|
||||||
|
<b>Download</b><br>
|
||||||
|
<a href="https://github.com/billziss-gh/winfsp/releases/latest">
|
||||||
|
<img src="https://img.shields.io/github/release/billziss-gh/winfsp.svg?label=stable&style=for-the-badge"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/billziss-gh/winfsp/releases">
|
||||||
|
<img src="https://img.shields.io/github/release/billziss-gh/winfsp/all.svg?label=latest&colorB=e52e4b&style=for-the-badge"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://chocolatey.org/packages/winfsp">
|
||||||
|
<img src="https://img.shields.io/badge/choco-install%20winfsp-black.svg?style=for-the-badge"/>
|
||||||
|
</a>
|
||||||
|
<br/>
|
||||||
|
<b>Quick Links</b><br/>
|
||||||
|
<a href="#benefits">Benefits</a> |
|
||||||
|
<a href="https://github.com/billziss-gh/winfsp/wiki">Wiki</a> |
|
||||||
|
<a href="https://groups.google.com/forum/#!forum/winfsp">Questions</a> |
|
||||||
|
<a href="https://twitter.com/BZissimopoulos">Author's Twitter</a>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
<a href="https://ci.appveyor.com/project/billziss-gh/winfsp">
|
||||||
|
<img src="https://img.shields.io/appveyor/ci/billziss-gh/winfsp.svg"/>
|
||||||
|
</a>
|
||||||
|
<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 align="center">
|
||||||
|
WinFsp is a set of software components for Windows computers that allows the creation of user mode file systems. In this sense it is similar to FUSE (Filesystem in Userspace), which provides the same functionality on UNIX-like computers.
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
<img src="doc/cap.gif" height="450"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
<a href="https://github.com/billziss-gh/winfsp/releases/latest"><img src="http://www.secfs.net/winfsp/resources/Download-WinFsp.png" alt="Download WinFsp Installer" width="244" height="34"></a>
|
## Benefits
|
||||||
 
|
|
||||||
<a href="https://chocolatey.org/packages/winfsp"><img src="http://www.secfs.net/winfsp/resources/Choco-WinFsp.png" alt="choco install winfsp" width="244" height="34"></a>
|
|
||||||
|
|
||||||
|
### Stability
|
||||||
|
|
||||||
|
WinFsp is very stable. There are no known kernel mode crashes and it does not suffer from resource leaks or similar problems. WinFsp owes this stability to its [Design](doc/WinFsp-Design.asciidoc) and its rigorous [Testing Regime](doc/WinFsp-Testing.asciidoc).
|
||||||
|
|
||||||
WinFsp is a set of software components for Windows computers that allows the creation of user mode file systems. In this sense it is similar to FUSE (Filesystem in Userspace), which provides the same functionality on UNIX-like computers.
|
### Performance
|
||||||
|
|
||||||
Some of the benefits of using WinFsp are listed below:
|
WinFsp outperforms its competition and in many scenarios performs as well as NTFS. Read more about its [Performance](doc/WinFsp-Performance-Testing.asciidoc).
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="doc/WinFsp-Performance-Testing/file_tests.png" height="300"/>
|
||||||
|
<img src="doc/WinFsp-Performance-Testing/rdwr_tests.png" height="300"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
### Compatibility
|
||||||
|
|
||||||
|
WinFsp strives for compatibility with NTFS and file system correctness. For the full details see the [Compatibility](doc/NTFS-Compatibility.asciidoc) document.
|
||||||
|
|
||||||
|
### Easy to Use
|
||||||
|
|
||||||
|
WinFsp has an easy to use but comprehensive API.
|
||||||
|
|
||||||
|
* This simple [Tutorial](doc/WinFsp-Tutorial.asciidoc) explains how to build a file system.
|
||||||
|
* Consult the [API Reference](http://www.secfs.net/winfsp/apiref/) for native development.
|
||||||
|
* Includes .NET layer for managed development. See [src/dotnet](src/dotnet).
|
||||||
|
* Includes FUSE 2.8 compatibility layer: [fuse/fuse.h](inc/fuse/fuse.h)
|
||||||
|
* Includes FUSE 3.2 compatibility layer: [fuse3/fuse.h](inc/fuse3/fuse.h)
|
||||||
|
|
||||||
|
### Other Benefits
|
||||||
|
|
||||||
* Very well-tested and stable. Read about its [Testing Strategy](doc/WinFsp-Testing.asciidoc).
|
|
||||||
* Very fast. Read about its [Performance](doc/WinFsp-Performance-Testing.asciidoc).
|
|
||||||
* Strives for compatibility with NTFS. Read about its [Compatibility](doc/NTFS-Compatibility.asciidoc ).
|
|
||||||
* Easy to understand but comprehensive API. Consult the [API Reference](http://www.secfs.net/winfsp/apiref/). There is also a simple [Tutorial](doc/WinFsp-Tutorial.asciidoc).
|
|
||||||
* FUSE compatibility layer for native Windows and Cygwin. See [fuse.h](inc/fuse/fuse.h).
|
|
||||||
* .NET layer for managed development. See [src/dotnet](src/dotnet).
|
|
||||||
* Signed drivers provided on every release.
|
* Signed drivers provided on every release.
|
||||||
* Available under the [GPLv3](License.txt) license with a special exception for Free/Libre and Open Source Software.
|
* Available under the [GPLv3](License.txt) license with a special exception for Free/Libre and Open Source Software.
|
||||||
|
|
||||||
@ -26,41 +79,48 @@ To learn more about WinFsp, please visit its website: http://www.secfs.net/winfs
|
|||||||
|
|
||||||
## Project Organization
|
## Project Organization
|
||||||
|
|
||||||
WinFsp consists of a kernel mode FSD (File System Driver) and a user mode DLL (Dynamic Link Library). The FSD interfaces with NTOS (the Windows kernel) and handles all interactions necessary to present itself as a file system driver to NTOS. The DLL interfaces with the FSD and presents an easy to use API for creating user mode file systems.
|
|
||||||
|
|
||||||
The project source code is organized as follows:
|
The project source code is organized as follows:
|
||||||
|
|
||||||
* `build/VStudio`: WinFsp solution and project files.
|
* :file_folder: [build/VStudio](build/VStudio): WinFsp solution and project files.
|
||||||
* `doc`: The WinFsp design documents and additional documentation can be found here.
|
* :file_folder: [doc](doc): The WinFsp design documents and additional documentation can be found here.
|
||||||
* `ext/tlib`: A small test library originally from the secfs (Secure Cloud File System) project.
|
* :file_folder: [ext](ext): External dependencies.
|
||||||
* `ext/test`: Submodule pointing to the secfs.test project, which contains a number of tools for testing Windows and POSIX file systems.
|
* :file_folder: [ext/tlib](ext/tlib): A small test library originally from the secfs (Secure Cloud File System) project.
|
||||||
* `inc/fuse`: Public headers for the FUSE compatibility layer.
|
* :file_folder: ext/test: Submodule pointing to the secfs.test project, which contains a number of tools for testing Windows and POSIX file systems.
|
||||||
* `inc/winfsp`: Public headers for the WinFsp API.
|
* :file_folder: [inc](inc): Public headers.
|
||||||
* `src/dll`: Source code to the WinFsp DLL.
|
* :file_folder: [inc/fuse](inc/fuse): Public headers for the FUSE compatibility layer.
|
||||||
* `src/dll/fuse`: Source code to the FUSE compatibility layer.
|
* :file_folder: [inc/fuse3](inc/fuse3): Public headers for the FUSE3 compatibility layer.
|
||||||
* `src/dotnet`: Source code to the .NET layer.
|
* :file_folder: [inc/winfsp](inc/winfsp): Public headers for the WinFsp API.
|
||||||
* `src/fsptool`: Source code to fsptool command line utility.
|
* :file_folder: [src](src): WinFsp source code.
|
||||||
* `src/launcher`: Source code to the launcher service and the launchctl utility.
|
* :file_folder: [src/dll](src/dll): Source code to the WinFsp DLL.
|
||||||
* `src/sys`: Source code to the WinFsp FSD.
|
* :file_folder: [src/dll/fuse](src/dll/fuse): Source code to the FUSE compatibility layer.
|
||||||
* `opt/cygfuse`: Source code for the Cygwin FUSE package.
|
* :file_folder: [src/dll/fuse3](src/dll/fuse3): Source code to the FUSE3 compatibility layer.
|
||||||
* `tst/memfs*`: Source code to an example file system written in C/C++ (memfs) or C# (memfs-dotnet).
|
* :file_folder: [src/dotnet](src/dotnet): Source code to the .NET layer.
|
||||||
* `tst/passthrough*`: Source code to additional example file systems.
|
* :file_folder: [src/fsptool](src/fsptool): Source code to fsptool command line utility.
|
||||||
* `tst/winfsp-tests`: WinFsp test suite.
|
* :file_folder: [src/ku](src/ku): Source code that can be used from kernel or user mode.
|
||||||
* `tools`: Various tools for building and testing WinFsp.
|
* :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: [opt/cygfuse](opt/cygfuse): Source code to the FUSE for Cygwin package.
|
||||||
|
* :file_folder: [tst](tst): Source code to example file systems and test suites.
|
||||||
|
* :file_folder: [tst/winfsp-tests](tst/winfsp-tests): WinFsp test suite.
|
||||||
|
* :file_folder: [tools](tools): Various tools for building and testing WinFsp.
|
||||||
|
|
||||||
## Building and Running
|
## Building and Running
|
||||||
|
|
||||||
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:
|
||||||
|
|
||||||
tools\build.bat CONFIGURATION
|
tools\build.bat CONFIGURATION
|
||||||
|
|
||||||
If you build the driver yourself it will not be signed and Windows will refuse to load it unless you enable "testsigning". You can enable "testsigning" using the command `bcdedit.exe -set testsigning on`. For more information see this [document](http://www.secfs.net/winfsp/develop/debug/).
|
If you build the driver yourself it will not be signed and Windows will refuse to load it unless you enable "testsigning". You can enable "testsigning" using the command `bcdedit.exe -set testsigning on`. For more information see this [document](doc/WinFsp-Debugging-Setup.asciidoc).
|
||||||
|
|
||||||
WinFsp is designed to run on Windows 7 and above. It has been tested on the following platforms:
|
WinFsp is designed to run on Windows 7 and above. It has been tested on the following platforms:
|
||||||
|
|
||||||
|
21
appveyor.yml
21
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
|
||||||
@ -22,11 +32,17 @@ install:
|
|||||||
|
|
||||||
build_script:
|
build_script:
|
||||||
- appveyor AddMessage "Reboot complete" -Category Information
|
- appveyor AddMessage "Reboot complete" -Category Information
|
||||||
|
# build cygfuse
|
||||||
|
- C:\cygwin64\setup-x86_64.exe -qnNd -P cygport
|
||||||
|
- C:\cygwin64\bin\bash --login -c "make -C '%CD%\opt\cygfuse' dist"
|
||||||
|
#- C:\cygwin\setup-x86.exe -qnNd -P cygport
|
||||||
|
#- C:\cygwin\bin\bash --login -c "make -C '%CD%\opt\cygfuse' dist"
|
||||||
|
# build winfsp
|
||||||
- tools\build.bat %CONFIGURATION%
|
- tools\build.bat %CONFIGURATION%
|
||||||
|
|
||||||
test_script:
|
test_script:
|
||||||
- choco install winfsp -s build\VStudio\build\%CONFIGURATION% -y
|
- choco install winfsp -s build\VStudio\build\%CONFIGURATION% -y --pre
|
||||||
- if %TESTING%==Func appveyor DownloadFile http://www.secfs.net/winfsp/resources/Test.Filter.Driver.zip && 7z x Test.Filter.Driver.zip
|
- if %TESTING%==Func appveyor DownloadFile http://www.secfs.net/Test.Filter.Driver.zip && 7z x Test.Filter.Driver.zip
|
||||||
- if %TESTING%==Func start /wait msiexec /i "Test.Filter.Driver\HCK Filter.Driver Content-x86_en-us.msi" /qn
|
- if %TESTING%==Func start /wait msiexec /i "Test.Filter.Driver\HCK Filter.Driver Content-x86_en-us.msi" /qn
|
||||||
- if %TESTING%==Func tools\nmake-ext-test.bat %CONFIGURATION%
|
- if %TESTING%==Func tools\nmake-ext-test.bat %CONFIGURATION%
|
||||||
- if %TESTING%==Func tools\run-tests.bat %CONFIGURATION%
|
- if %TESTING%==Func tools\run-tests.bat %CONFIGURATION%
|
||||||
@ -42,3 +58,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-2020 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>
|
||||||
|
@ -188,10 +188,6 @@
|
|||||||
Type="string"
|
Type="string"
|
||||||
Name="CommandLine"
|
Name="CommandLine"
|
||||||
Value="-i -F NTFS -n 65536 -s 67108864 -u %1 -m %2" />
|
Value="-i -F NTFS -n 65536 -s 67108864 -u %1 -m %2" />
|
||||||
<RegistryValue
|
|
||||||
Type="string"
|
|
||||||
Name="RunAs"
|
|
||||||
Value="LocalService" />
|
|
||||||
<RegistryValue
|
<RegistryValue
|
||||||
Type="string"
|
Type="string"
|
||||||
Name="Security"
|
Name="Security"
|
||||||
@ -218,10 +214,6 @@
|
|||||||
Type="string"
|
Type="string"
|
||||||
Name="CommandLine"
|
Name="CommandLine"
|
||||||
Value="-i -F NTFS -n 65536 -s 67108864 -u %1 -m %2" />
|
Value="-i -F NTFS -n 65536 -s 67108864 -u %1 -m %2" />
|
||||||
<RegistryValue
|
|
||||||
Type="string"
|
|
||||||
Name="RunAs"
|
|
||||||
Value="LocalService" />
|
|
||||||
<RegistryValue
|
<RegistryValue
|
||||||
Type="string"
|
Type="string"
|
||||||
Name="Security"
|
Name="Security"
|
||||||
@ -248,10 +240,6 @@
|
|||||||
Type="string"
|
Type="string"
|
||||||
Name="CommandLine"
|
Name="CommandLine"
|
||||||
Value="-i -F NTFS -n 65536 -s 67108864 -u %1 -m %2" />
|
Value="-i -F NTFS -n 65536 -s 67108864 -u %1 -m %2" />
|
||||||
<RegistryValue
|
|
||||||
Type="string"
|
|
||||||
Name="RunAs"
|
|
||||||
Value="LocalService" />
|
|
||||||
<RegistryValue
|
<RegistryValue
|
||||||
Type="string"
|
Type="string"
|
||||||
Name="Security"
|
Name="Security"
|
||||||
@ -272,6 +260,9 @@
|
|||||||
<Component Id="C.winfsp.h">
|
<Component Id="C.winfsp.h">
|
||||||
<File Name="winfsp.h" KeyPath="yes" />
|
<File Name="winfsp.h" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
|
<Component Id="C.launch.h">
|
||||||
|
<File Name="launch.h" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
<!--Component Id="C.winfsp.hpp">
|
<!--Component Id="C.winfsp.hpp">
|
||||||
<File Name="winfsp.hpp" KeyPath="yes" />
|
<File Name="winfsp.hpp" KeyPath="yes" />
|
||||||
</Component-->
|
</Component-->
|
||||||
@ -290,6 +281,20 @@
|
|||||||
<File Name="winfsp_fuse.h" KeyPath="yes" />
|
<File Name="winfsp_fuse.h" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
</Directory>
|
</Directory>
|
||||||
|
<Directory Id="INCDIR.fuse3" Name="fuse3">
|
||||||
|
<Component Id="C.fuse3.h">
|
||||||
|
<File Id="fuse3.h" Name="fuse.h" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.fuse3_common.h">
|
||||||
|
<File Id="fuse3_common.h" Name="fuse_common.h" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.fuse3_opt.h">
|
||||||
|
<File Id="fuse3_opt.h" Name="fuse_opt.h" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.winfsp_fuse3.h">
|
||||||
|
<File Id="winfsp_fuse3.h" Name="winfsp_fuse.h" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
</Directory>
|
||||||
</DirectoryRef>
|
</DirectoryRef>
|
||||||
<DirectoryRef Id="LIBDIR" FileSource="..\build\$(var.Configuration)">
|
<DirectoryRef Id="LIBDIR" FileSource="..\build\$(var.Configuration)">
|
||||||
<Component Id="C.winfsp_x64.lib">
|
<Component Id="C.winfsp_x64.lib">
|
||||||
@ -318,17 +323,43 @@
|
|||||||
KeyPath="yes" />
|
KeyPath="yes" />
|
||||||
<Condition>NOT VersionNT64</Condition>
|
<Condition>NOT VersionNT64</Condition>
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
|
<!-- On Win64 copy fuse3-x64.pc -->
|
||||||
|
<Component Id="C.fuse3_x64.pc" Guid="FE59E3BA-E5EA-4822-80B1-19A1DE6B62C7">
|
||||||
|
<File
|
||||||
|
Id="FILE.fuse3_x64.pc"
|
||||||
|
Name="fuse3.pc"
|
||||||
|
Source="..\build\$(var.Configuration)\fuse3-x64.pc"
|
||||||
|
KeyPath="yes" />
|
||||||
|
<Condition>VersionNT64</Condition>
|
||||||
|
</Component>
|
||||||
|
|
||||||
|
<!-- On Win32 copy fuse3-x86.pc -->
|
||||||
|
<Component Id="C.fuse3_x86.pc" Guid="176205D0-07EA-4DFC-947F-18E89ABDAFAB">
|
||||||
|
<File
|
||||||
|
Id="FILE.fuse3_x86.pc"
|
||||||
|
Name="fuse3.pc"
|
||||||
|
Source="..\build\$(var.Configuration)\fuse3-x86.pc"
|
||||||
|
KeyPath="yes" />
|
||||||
|
<Condition>NOT VersionNT64</Condition>
|
||||||
|
</Component>
|
||||||
</DirectoryRef>
|
</DirectoryRef>
|
||||||
<DirectoryRef Id="OPTDIR">
|
<DirectoryRef Id="OPTDIR">
|
||||||
<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-7.tar.xz" KeyPath="yes" />
|
<File Id="FILE.fuse.tar.xz.x64" Name="fuse-2.8-10.tar.xz" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.fuse3.tar.xz.x64">
|
||||||
|
<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-7.tar.xz" KeyPath="yes" />
|
<File Id="FILE.fuse.tar.xz.x86" Name="fuse-2.8-10.tar.xz" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.fuse3.tar.xz.x86">
|
||||||
|
<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">
|
||||||
@ -338,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">
|
||||||
@ -351,11 +399,54 @@
|
|||||||
<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" />
|
||||||
</Component>
|
</Component>
|
||||||
</Directory>
|
</Directory>
|
||||||
|
<Directory Id="SMPDIR.airfs" Name="airfs">
|
||||||
|
<Component Id="C.airfs.cpp">
|
||||||
|
<File Name="airfs.cpp" KeyPath="yes" />
|
||||||
|
</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">
|
||||||
|
<File Name="airfs.sln" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.airfs.vcxproj">
|
||||||
|
<File Name="airfs.vcxproj" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.airfs.vcxproj.filters">
|
||||||
|
<File Name="airfs.vcxproj.filters" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
</Directory>
|
||||||
<Directory Id="SMPDIR.passthrough" Name="passthrough">
|
<Directory Id="SMPDIR.passthrough" Name="passthrough">
|
||||||
<Component Id="C.passthrough.c">
|
<Component Id="C.passthrough.c">
|
||||||
<File Name="passthrough.c" KeyPath="yes" />
|
<File Name="passthrough.c" KeyPath="yes" />
|
||||||
@ -410,6 +501,32 @@
|
|||||||
<File Name="README.md" KeyPath="yes" />
|
<File Name="README.md" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
</Directory>
|
</Directory>
|
||||||
|
<Directory Id="SMPDIR.passthrough_fuse3" Name="passthrough-fuse3">
|
||||||
|
<Component Id="C.passthrough_fuse3.c">
|
||||||
|
<File Name="passthrough-fuse3.c" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.passthrough_fuse3.winposix.c">
|
||||||
|
<File Id="F.passthrough_fuse3.winposix.c" Name="winposix.c" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.passthrough_fuse3.winposix.h">
|
||||||
|
<File Id="F.passthrough_fuse3.winposix.h" Name="winposix.h" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.passthrough_fuse3.sln">
|
||||||
|
<File Name="passthrough-fuse3.sln" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.passthrough_fuse3.vcxproj">
|
||||||
|
<File Name="passthrough-fuse3.vcxproj" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.passthrough_fuse3.vcxproj.filters">
|
||||||
|
<File Name="passthrough-fuse3.vcxproj.filters" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.passthrough_fuse3.Makefile">
|
||||||
|
<File Id="F.passthrough_fuse3.Makefile" Name="Makefile" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.passthrough_fuse3.README.md">
|
||||||
|
<File Id="F.passthrough_fuse3.README.md" Name="README.md" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
</Directory>
|
||||||
<Directory Id="SMPDIR.passthrough_dotnet" Name="passthrough-dotnet">
|
<Directory Id="SMPDIR.passthrough_dotnet" Name="passthrough-dotnet">
|
||||||
<Component Id="C.passthrough_dotnet.Program.cs">
|
<Component Id="C.passthrough_dotnet.Program.cs">
|
||||||
<File Id="FILE.passthrough_dotnet.Program.cs" Name="Program.cs" KeyPath="yes" />
|
<File Id="FILE.passthrough_dotnet.Program.cs" Name="Program.cs" KeyPath="yes" />
|
||||||
@ -482,30 +599,57 @@
|
|||||||
<ComponentGroup Id="C.WinFsp.inc">
|
<ComponentGroup Id="C.WinFsp.inc">
|
||||||
<ComponentRef Id="C.fsctl.h" />
|
<ComponentRef Id="C.fsctl.h" />
|
||||||
<ComponentRef Id="C.winfsp.h" />
|
<ComponentRef Id="C.winfsp.h" />
|
||||||
|
<ComponentRef Id="C.launch.h" />
|
||||||
<!--ComponentRef Id="C.winfsp.hpp" /-->
|
<!--ComponentRef Id="C.winfsp.hpp" /-->
|
||||||
<ComponentRef Id="C.fuse.h" />
|
<ComponentRef Id="C.fuse.h" />
|
||||||
<ComponentRef Id="C.fuse_common.h" />
|
<ComponentRef Id="C.fuse_common.h" />
|
||||||
<ComponentRef Id="C.fuse_opt.h" />
|
<ComponentRef Id="C.fuse_opt.h" />
|
||||||
<ComponentRef Id="C.winfsp_fuse.h" />
|
<ComponentRef Id="C.winfsp_fuse.h" />
|
||||||
|
<ComponentRef Id="C.fuse3.h" />
|
||||||
|
<ComponentRef Id="C.fuse3_common.h" />
|
||||||
|
<ComponentRef Id="C.fuse3_opt.h" />
|
||||||
|
<ComponentRef Id="C.winfsp_fuse3.h" />
|
||||||
</ComponentGroup>
|
</ComponentGroup>
|
||||||
<ComponentGroup Id="C.WinFsp.lib">
|
<ComponentGroup Id="C.WinFsp.lib">
|
||||||
<ComponentRef Id="C.winfsp_x64.lib" />
|
<ComponentRef Id="C.winfsp_x64.lib" />
|
||||||
<ComponentRef Id="C.winfsp_x86.lib" />
|
<ComponentRef Id="C.winfsp_x86.lib" />
|
||||||
<ComponentRef Id="C.fuse_x64.pc" />
|
<ComponentRef Id="C.fuse_x64.pc" />
|
||||||
<ComponentRef Id="C.fuse_x86.pc" />
|
<ComponentRef Id="C.fuse_x86.pc" />
|
||||||
|
<ComponentRef Id="C.fuse3_x64.pc" />
|
||||||
|
<ComponentRef Id="C.fuse3_x86.pc" />
|
||||||
</ComponentGroup>
|
</ComponentGroup>
|
||||||
<ComponentGroup Id="C.WinFsp.opt.fuse">
|
<ComponentGroup Id="C.WinFsp.opt.fuse">
|
||||||
<ComponentRef Id="C.fuse.tar.xz.x64" />
|
<ComponentRef Id="C.fuse.tar.xz.x64" />
|
||||||
<ComponentRef Id="C.fuse.tar.xz.x86" />
|
<ComponentRef Id="C.fuse.tar.xz.x86" />
|
||||||
|
<ComponentRef Id="C.fuse3.tar.xz.x64" />
|
||||||
|
<ComponentRef Id="C.fuse3.tar.xz.x86" />
|
||||||
<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.persistence.cpp" />
|
||||||
|
<ComponentRef Id="C.common.h" />
|
||||||
|
<ComponentRef Id="C.airfs.sln" />
|
||||||
|
<ComponentRef Id="C.airfs.vcxproj" />
|
||||||
|
<ComponentRef Id="C.airfs.vcxproj.filters" />
|
||||||
<ComponentRef Id="C.passthrough.c" />
|
<ComponentRef Id="C.passthrough.c" />
|
||||||
<ComponentRef Id="C.passthrough.sln" />
|
<ComponentRef Id="C.passthrough.sln" />
|
||||||
<ComponentRef Id="C.passthrough.vcxproj" />
|
<ComponentRef Id="C.passthrough.vcxproj" />
|
||||||
@ -522,6 +666,14 @@
|
|||||||
<ComponentRef Id="C.passthrough_fuse.vcxproj.filters" />
|
<ComponentRef Id="C.passthrough_fuse.vcxproj.filters" />
|
||||||
<ComponentRef Id="C.passthrough_fuse.Makefile" />
|
<ComponentRef Id="C.passthrough_fuse.Makefile" />
|
||||||
<ComponentRef Id="C.passthrough_fuse.README.md" />
|
<ComponentRef Id="C.passthrough_fuse.README.md" />
|
||||||
|
<ComponentRef Id="C.passthrough_fuse3.c" />
|
||||||
|
<ComponentRef Id="C.passthrough_fuse3.winposix.c" />
|
||||||
|
<ComponentRef Id="C.passthrough_fuse3.winposix.h" />
|
||||||
|
<ComponentRef Id="C.passthrough_fuse3.sln" />
|
||||||
|
<ComponentRef Id="C.passthrough_fuse3.vcxproj" />
|
||||||
|
<ComponentRef Id="C.passthrough_fuse3.vcxproj.filters" />
|
||||||
|
<ComponentRef Id="C.passthrough_fuse3.Makefile" />
|
||||||
|
<ComponentRef Id="C.passthrough_fuse3.README.md" />
|
||||||
</ComponentGroup>
|
</ComponentGroup>
|
||||||
<ComponentGroup Id="C.WinFsp.sym">
|
<ComponentGroup Id="C.WinFsp.sym">
|
||||||
<ComponentRef Id="C.winfsp_x64.sys.pdb" />
|
<ComponentRef Id="C.winfsp_x64.sys.pdb" />
|
||||||
@ -602,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"
|
||||||
@ -658,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>
|
||||||
@ -100,14 +101,13 @@
|
|||||||
</PrecompiledHeader>
|
</PrecompiledHeader>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>MEMFS_STANDALONE;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
</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>
|
||||||
@ -117,14 +117,13 @@
|
|||||||
</PrecompiledHeader>
|
</PrecompiledHeader>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>MEMFS_STANDALONE;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
</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>
|
||||||
@ -136,17 +135,17 @@
|
|||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>MEMFS_STANDALONE;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
</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>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
@ -157,17 +156,17 @@
|
|||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>MEMFS_STANDALONE;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
</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>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</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>{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>
|
||||||
@ -182,14 +179,19 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\..\tst\memfs\memfs.cpp" />
|
<ClCompile Include="..\..\..\tst\memfs\memfs.cpp" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\create-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\create-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" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\fuse-opt-test.c" />
|
<ClCompile Include="..\..\..\tst\winfsp-tests\fuse-opt-test.c" />
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\fuse-test.c" />
|
||||||
<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\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" />
|
||||||
@ -202,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" />
|
||||||
|
@ -85,6 +85,30 @@
|
|||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\version-test.c">
|
<ClCompile Include="..\..\..\tst\winfsp-tests\version-test.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\launch-test.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\devctl-test.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\fuse-test.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</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,9 +147,9 @@
|
|||||||
<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>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
@ -171,9 +169,9 @@
|
|||||||
<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>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -187,6 +185,9 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="..\..\..\src\fsptool\fsptool-version.rc" />
|
<ResourceCompile Include="..\..\..\src\fsptool\fsptool-version.rc" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\src\shared\um\minimal.h" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
@ -5,9 +5,11 @@
|
|||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Include">
|
<Filter Include="Source\shared">
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
<UniqueIdentifier>{bd82112e-6494-4345-b35b-25eae56d5127}</UniqueIdentifier>
|
||||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
</Filter>
|
||||||
|
<Filter Include="Source\shared\um">
|
||||||
|
<UniqueIdentifier>{dd21736e-dbea-4f24-8178-1903412e01f2}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -20,4 +22,9 @@
|
|||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\src\shared\um\minimal.h">
|
||||||
|
<Filter>Source\shared\um</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@ -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,9 +153,9 @@
|
|||||||
<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>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
@ -179,15 +177,11 @@
|
|||||||
<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>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\..\..\src\launcher\launcher.h" />
|
|
||||||
<ClInclude Include="..\..\..\src\shared\minimal.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\..\src\launcher\launchctl.c" />
|
<ClCompile Include="..\..\..\src\launcher\launchctl.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@ -204,6 +198,9 @@
|
|||||||
<Project>{4a7c0b21-9e10-4c81-92de-1493efcf24eb}</Project>
|
<Project>{4a7c0b21-9e10-4c81-92de-1493efcf24eb}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\src\shared\um\minimal.h" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
@ -5,21 +5,13 @@
|
|||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Include">
|
<Filter Include="Source\shared">
|
||||||
<UniqueIdentifier>{e650819b-355e-455c-81c9-10dc7debe109}</UniqueIdentifier>
|
<UniqueIdentifier>{9f7e57a6-7696-4de2-a9eb-cba60e24d02a}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Include\shared">
|
<Filter Include="Source\shared\um">
|
||||||
<UniqueIdentifier>{744edf89-567a-40b7-b6f2-ee2bc7b9f0d9}</UniqueIdentifier>
|
<UniqueIdentifier>{89fa307f-09d4-4373-a07f-49f23c698474}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\..\..\src\shared\minimal.h">
|
|
||||||
<Filter>Include\shared</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\..\src\launcher\launcher.h">
|
|
||||||
<Filter>Source</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\..\src\launcher\launchctl.c">
|
<ClCompile Include="..\..\..\src\launcher\launchctl.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
@ -30,4 +22,9 @@
|
|||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\src\shared\um\minimal.h">
|
||||||
|
<Filter>Source\shared\um</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@ -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,10 +155,10 @@
|
|||||||
<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>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
@ -182,24 +180,21 @@
|
|||||||
<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>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</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">
|
||||||
<Project>{4a7c0b21-9e10-4c81-92de-1493efcf24eb}</Project>
|
<Project>{4a7c0b21-9e10-4c81-92de-1493efcf24eb}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\..\..\src\launcher\launcher.h" />
|
|
||||||
<ClInclude Include="..\..\..\src\shared\minimal.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="..\..\..\src\launcher\launcher-version.rc">
|
<ResourceCompile Include="..\..\..\src\launcher\launcher-version.rc">
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
@ -208,6 +203,9 @@
|
|||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\src\shared\um\minimal.h" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
@ -5,29 +5,29 @@
|
|||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Include">
|
<Filter Include="Source\shared">
|
||||||
<UniqueIdentifier>{11e7c0f2-7782-43ee-84fa-9e56efbe39de}</UniqueIdentifier>
|
<UniqueIdentifier>{ebc5d08c-dcc6-4889-a482-84cefda188cd}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Include\shared">
|
<Filter Include="Source\shared\um">
|
||||||
<UniqueIdentifier>{d83ea433-d9f7-494c-90b9-3a8997483cd9}</UniqueIdentifier>
|
<UniqueIdentifier>{574d211e-3e2c-4551-bc78-4786f33c4093}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\..\src\launcher\launcher.c">
|
<ClCompile Include="..\..\..\src\launcher\launcher.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
<ClCompile Include="..\..\..\src\launcher\ptrans.c">
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\..\..\src\shared\minimal.h">
|
|
||||||
<Filter>Include\shared</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\..\src\launcher\launcher.h">
|
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClInclude>
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="..\..\..\src\launcher\launcher-version.rc">
|
<ResourceCompile Include="..\..\..\src\launcher\launcher-version.rc">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\..\src\shared\um\minimal.h">
|
||||||
|
<Filter>Source\shared\um</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@ -13,12 +13,12 @@
|
|||||||
|
|
||||||
<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.3</MyCanonicalVersion>
|
<MyCanonicalVersion>1.8</MyCanonicalVersion>
|
||||||
|
|
||||||
<MyProductVersion>2018.1 B1</MyProductVersion>
|
<MyProductVersion>2020.2 Beta3</MyProductVersion>
|
||||||
<MyProductStage>Beta</MyProductStage>
|
<MyProductStage>Beta</MyProductStage>
|
||||||
|
|
||||||
<MyVersion>$(MyCanonicalVersion).$(MyBuildNumber)</MyVersion>
|
<MyVersion>$(MyCanonicalVersion).$(MyBuildNumber)</MyVersion>
|
||||||
@ -37,4 +37,22 @@
|
|||||||
<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="'$(IsKernelModeToolset)'=='true'">
|
||||||
|
<ClCompile>
|
||||||
|
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
|
||||||
|
</ClCompile>
|
||||||
|
</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
|
||||||
|
@ -20,28 +20,40 @@
|
|||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\inc\fuse3\fuse.h" />
|
||||||
|
<ClInclude Include="..\..\inc\fuse3\fuse_common.h" />
|
||||||
|
<ClInclude Include="..\..\inc\fuse3\fuse_opt.h" />
|
||||||
|
<ClInclude Include="..\..\inc\fuse3\winfsp_fuse.h" />
|
||||||
<ClInclude Include="..\..\inc\fuse\fuse.h" />
|
<ClInclude Include="..\..\inc\fuse\fuse.h" />
|
||||||
<ClInclude Include="..\..\inc\fuse\fuse_common.h" />
|
<ClInclude Include="..\..\inc\fuse\fuse_common.h" />
|
||||||
<ClInclude Include="..\..\inc\fuse\fuse_opt.h" />
|
<ClInclude Include="..\..\inc\fuse\fuse_opt.h" />
|
||||||
<ClInclude Include="..\..\inc\fuse\winfsp_fuse.h" />
|
<ClInclude Include="..\..\inc\fuse\winfsp_fuse.h" />
|
||||||
<ClInclude Include="..\..\inc\winfsp\fsctl.h" />
|
<ClInclude Include="..\..\inc\winfsp\fsctl.h" />
|
||||||
|
<ClInclude Include="..\..\inc\winfsp\launch.h" />
|
||||||
<ClInclude Include="..\..\inc\winfsp\winfsp.h" />
|
<ClInclude Include="..\..\inc\winfsp\winfsp.h" />
|
||||||
<ClInclude Include="..\..\inc\winfsp\winfsp.hpp" />
|
<ClInclude Include="..\..\inc\winfsp\winfsp.hpp" />
|
||||||
|
<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\shared\minimal.h" />
|
<ClInclude Include="..\..\src\shared\ku\config.h" />
|
||||||
|
<ClInclude Include="..\..\src\shared\ku\library.h" />
|
||||||
|
<ClInclude Include="..\..\src\shared\um\minimal.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\src\dll\dirbuf.c" />
|
<ClCompile Include="..\..\src\dll\dirbuf.c" />
|
||||||
<ClCompile Include="..\..\src\dll\eventlog.c" />
|
<ClCompile Include="..\..\src\dll\eventlog.c" />
|
||||||
|
<ClCompile Include="..\..\src\dll\fuse3\fuse2to3.c" />
|
||||||
|
<ClCompile Include="..\..\src\dll\fuse3\fuse3.c" />
|
||||||
|
<ClCompile Include="..\..\src\dll\fuse3\fuse3_compat.c" />
|
||||||
<ClCompile Include="..\..\src\dll\fuse\fuse.c" />
|
<ClCompile Include="..\..\src\dll\fuse\fuse.c" />
|
||||||
<ClCompile Include="..\..\src\dll\fuse\fuse_compat.c" />
|
<ClCompile Include="..\..\src\dll\fuse\fuse_compat.c" />
|
||||||
<ClCompile Include="..\..\src\dll\fuse\fuse_intf.c" />
|
<ClCompile Include="..\..\src\dll\fuse\fuse_intf.c" />
|
||||||
|
<ClCompile Include="..\..\src\dll\fuse\fuse_loop.c" />
|
||||||
<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" />
|
||||||
@ -53,6 +65,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\shared\ku\posix.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<CustomBuild Include="..\..\src\dll\fuse\fuse.pc.in">
|
<CustomBuild Include="..\..\src\dll\fuse\fuse.pc.in">
|
||||||
@ -78,6 +91,29 @@ copy /b $(OutDir)fuse-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse-$(Platfor
|
|||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)fuse-$(PlatformTarget).pc</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)fuse-$(PlatformTarget).pc</Outputs>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkObjects>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\src\dll\fuse3\fuse3.pc.in">
|
||||||
|
<FileType>Document</FileType>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">echo arch=$(PlatformTarget) >$(OutDir)fuse3-$(PlatformTarget).pc
|
||||||
|
copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(PlatformTarget).pc >nul</Command>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">echo arch=$(PlatformTarget) >$(OutDir)fuse3-$(PlatformTarget).pc
|
||||||
|
copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(PlatformTarget).pc >nul</Command>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">echo arch=$(PlatformTarget) >$(OutDir)fuse3-$(PlatformTarget).pc
|
||||||
|
copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(PlatformTarget).pc >nul</Command>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">echo arch=$(PlatformTarget) >$(OutDir)fuse3-$(PlatformTarget).pc
|
||||||
|
copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(PlatformTarget).pc >nul</Command>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Writing fuse3-$(PlatformTarget).pc</Message>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Writing fuse3-$(PlatformTarget).pc</Message>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Writing fuse3-$(PlatformTarget).pc</Message>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Writing fuse3-$(PlatformTarget).pc</Message>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)fuse3-$(PlatformTarget).pc</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)fuse3-$(PlatformTarget).pc</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)fuse3-$(PlatformTarget).pc</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)fuse3-$(PlatformTarget).pc</Outputs>
|
||||||
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
|
||||||
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
|
||||||
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkObjects>
|
||||||
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkObjects>
|
||||||
|
</CustomBuild>
|
||||||
<None Include="..\..\src\dll\library.def" />
|
<None Include="..\..\src\dll\library.def" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -93,33 +129,33 @@ copy /b $(OutDir)fuse-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse-$(Platfor
|
|||||||
<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>
|
||||||
@ -183,13 +219,12 @@ copy /b $(OutDir)fuse-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse-$(Platfor
|
|||||||
</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>
|
||||||
@ -211,13 +246,12 @@ copy /b $(OutDir)fuse-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse-$(Platfor
|
|||||||
</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>
|
||||||
@ -240,7 +274,6 @@ copy /b $(OutDir)fuse-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse-$(Platfor
|
|||||||
</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>
|
||||||
@ -248,8 +281,9 @@ copy /b $(OutDir)fuse-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse-$(Platfor
|
|||||||
<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>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
@ -271,7 +305,6 @@ copy /b $(OutDir)fuse-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse-$(Platfor
|
|||||||
</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>
|
||||||
@ -279,8 +312,9 @@ copy /b $(OutDir)fuse-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse-$(Platfor
|
|||||||
<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>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
@ -12,15 +12,27 @@
|
|||||||
<Filter Include="Include\winfsp">
|
<Filter Include="Include\winfsp">
|
||||||
<UniqueIdentifier>{1d6501f4-cebd-4a00-a774-deb782b59fb5}</UniqueIdentifier>
|
<UniqueIdentifier>{1d6501f4-cebd-4a00-a774-deb782b59fb5}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Include\shared">
|
|
||||||
<UniqueIdentifier>{c7b83307-0aa0-4593-b2d4-26ff2f1edfc6}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Include\fuse">
|
<Filter Include="Include\fuse">
|
||||||
<UniqueIdentifier>{0e7ab1b1-bfca-4439-accb-45a909be9cad}</UniqueIdentifier>
|
<UniqueIdentifier>{0e7ab1b1-bfca-4439-accb-45a909be9cad}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Source\fuse">
|
<Filter Include="Source\fuse">
|
||||||
<UniqueIdentifier>{518cce17-85cd-489c-b4be-920a84c1d73c}</UniqueIdentifier>
|
<UniqueIdentifier>{518cce17-85cd-489c-b4be-920a84c1d73c}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="Include\fuse3">
|
||||||
|
<UniqueIdentifier>{12afd2f1-f5ec-4008-b6ef-89cc626019ea}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Source\fuse3">
|
||||||
|
<UniqueIdentifier>{96091a7b-3923-4a74-9491-3ee230c688f9}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Source\shared">
|
||||||
|
<UniqueIdentifier>{a099cca5-e40c-4f99-baff-b5399dac5406}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Source\shared\um">
|
||||||
|
<UniqueIdentifier>{c2e11b62-74a0-41af-9f5b-0846fe81563c}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Source\shared\ku">
|
||||||
|
<UniqueIdentifier>{7963f853-656a-4fd7-b8df-e586c3fe3dab}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\inc\winfsp\fsctl.h">
|
<ClInclude Include="..\..\inc\winfsp\fsctl.h">
|
||||||
@ -32,9 +44,6 @@
|
|||||||
<ClInclude Include="..\..\src\dll\library.h">
|
<ClInclude Include="..\..\src\dll\library.h">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\shared\minimal.h">
|
|
||||||
<Filter>Include\shared</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\inc\fuse\fuse.h">
|
<ClInclude Include="..\..\inc\fuse\fuse.h">
|
||||||
<Filter>Include\fuse</Filter>
|
<Filter>Include\fuse</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@ -53,6 +62,33 @@
|
|||||||
<ClInclude Include="..\..\inc\winfsp\winfsp.hpp">
|
<ClInclude Include="..\..\inc\winfsp\winfsp.hpp">
|
||||||
<Filter>Include\winfsp</Filter>
|
<Filter>Include\winfsp</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\inc\winfsp\launch.h">
|
||||||
|
<Filter>Include\winfsp</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\inc\fuse3\fuse.h">
|
||||||
|
<Filter>Include\fuse3</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\inc\fuse3\fuse_common.h">
|
||||||
|
<Filter>Include\fuse3</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\inc\fuse3\fuse_opt.h">
|
||||||
|
<Filter>Include\fuse3</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\inc\fuse3\winfsp_fuse.h">
|
||||||
|
<Filter>Include\fuse3</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\dll\fuse3\library.h">
|
||||||
|
<Filter>Source\fuse3</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\shared\um\minimal.h">
|
||||||
|
<Filter>Source\shared\um</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\shared\ku\library.h">
|
||||||
|
<Filter>Source\shared\ku</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\shared\ku\config.h">
|
||||||
|
<Filter>Source\shared\ku</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\src\dll\library.c">
|
<ClCompile Include="..\..\src\dll\library.c">
|
||||||
@ -100,9 +136,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>
|
||||||
@ -118,6 +151,24 @@
|
|||||||
<ClCompile Include="..\..\src\dll\launch.c">
|
<ClCompile Include="..\..\src\dll\launch.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\dll\fuse3\fuse3.c">
|
||||||
|
<Filter>Source\fuse3</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\dll\fuse3\fuse2to3.c">
|
||||||
|
<Filter>Source\fuse3</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\dll\fuse\fuse_loop.c">
|
||||||
|
<Filter>Source\fuse</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\dll\fuse3\fuse3_compat.c">
|
||||||
|
<Filter>Source\fuse3</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\dll\mount.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\shared\ku\posix.c">
|
||||||
|
<Filter>Source\shared\ku</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="..\..\src\dll\library.def">
|
<None Include="..\..\src\dll\library.def">
|
||||||
@ -136,5 +187,8 @@
|
|||||||
<CustomBuild Include="..\..\src\dll\fuse\fuse.pc.in">
|
<CustomBuild Include="..\..\src\dll\fuse\fuse.pc.in">
|
||||||
<Filter>Source\fuse</Filter>
|
<Filter>Source\fuse</Filter>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\src\dll\fuse3\fuse3.pc.in">
|
||||||
|
<Filter>Source\fuse3</Filter>
|
||||||
|
</CustomBuild>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@ -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,24 +114,25 @@
|
|||||||
</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>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</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,21 +141,24 @@
|
|||||||
</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>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<FilesToPackage Include="$(TargetPath)" />
|
<FilesToPackage Include="$(TargetPath)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\src\shared\ku\posix.c" />
|
||||||
|
<ClCompile Include="..\..\src\shared\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,15 +173,19 @@
|
|||||||
<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\name.c" />
|
<ClCompile Include="..\..\src\sys\name.c" />
|
||||||
<ClCompile Include="..\..\src\sys\psbuffer.c" />
|
<ClCompile Include="..\..\src\sys\psbuffer.c" />
|
||||||
<ClCompile Include="..\..\src\sys\read.c" />
|
<ClCompile Include="..\..\src\sys\read.c" />
|
||||||
<ClCompile Include="..\..\src\sys\security.c" />
|
<ClCompile Include="..\..\src\sys\security.c" />
|
||||||
<ClCompile Include="..\..\src\sys\shutdown.c" />
|
<ClCompile Include="..\..\src\sys\shutdown.c" />
|
||||||
|
<ClCompile Include="..\..\src\sys\silo.c" />
|
||||||
<ClCompile Include="..\..\src\sys\statistics.c" />
|
<ClCompile Include="..\..\src\sys\statistics.c" />
|
||||||
<ClCompile Include="..\..\src\sys\util.c" />
|
<ClCompile Include="..\..\src\sys\util.c" />
|
||||||
<ClCompile Include="..\..\src\sys\volinfo.c" />
|
<ClCompile Include="..\..\src\sys\volinfo.c" />
|
||||||
@ -187,6 +195,9 @@
|
|||||||
</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\shared\ku\config.h" />
|
||||||
|
<ClInclude Include="..\..\src\shared\ku\library.h" />
|
||||||
<ClInclude Include="..\..\src\sys\driver.h" />
|
<ClInclude Include="..\..\src\sys\driver.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -211,7 +222,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)"
|
||||||
@ -224,7 +235,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)"
|
||||||
@ -237,7 +248,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)"
|
||||||
@ -250,7 +261,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,12 @@
|
|||||||
<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\shared">
|
||||||
|
<UniqueIdentifier>{c4db9aa7-9474-4f0b-b38b-343a8a1e5686}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Source\shared\ku">
|
||||||
|
<UniqueIdentifier>{df147bf8-bbdf-4de7-95ce-1e281925725a}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\src\sys\driver.c">
|
<ClCompile Include="..\..\src\sys\driver.c">
|
||||||
@ -101,6 +107,24 @@
|
|||||||
<ClCompile Include="..\..\src\sys\psbuffer.c">
|
<ClCompile Include="..\..\src\sys\psbuffer.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\sys\mup.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\sys\fsext.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\sys\mountdev.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\shared\ku\posix.c">
|
||||||
|
<Filter>Source\shared\ku</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\shared\ku\uuid5.c">
|
||||||
|
<Filter>Source\shared\ku</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\sys\silo.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\src\sys\driver.h">
|
<ClInclude Include="..\..\src\sys\driver.h">
|
||||||
@ -109,6 +133,15 @@
|
|||||||
<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\shared\ku\library.h">
|
||||||
|
<Filter>Source\shared\ku</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\shared\ku\config.h">
|
||||||
|
<Filter>Source\shared\ku</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="..\..\src\sys\version.rc">
|
<ResourceCompile Include="..\..\src\sys\version.rc">
|
||||||
|
@ -52,6 +52,6 @@ To verify installation:
|
|||||||
<file src="chocolateyInstall.ps1" target="tools" />
|
<file src="chocolateyInstall.ps1" target="tools" />
|
||||||
<file src="chocolateyUninstall.ps1" target="tools" />
|
<file src="chocolateyUninstall.ps1" target="tools" />
|
||||||
<file src="chocolateyHelper.ps1" target="tools" />
|
<file src="chocolateyHelper.ps1" target="tools" />
|
||||||
<file src="winfsp-$version$.msi" target="tools" />
|
<file src="winfsp-$MsiVersion$.msi" target="tools" />
|
||||||
</files>
|
</files>
|
||||||
</package>
|
</package>
|
||||||
|
@ -4,30 +4,35 @@
|
|||||||
|
|
||||||
[qanda]
|
[qanda]
|
||||||
|
|
||||||
I am running Windows 7 and I am finding that the installed driver is not signed. [@efeat]::
|
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. [@carlreinke]::
|
Disconnecting (unmapping) a network drive does not work.::
|
||||||
|
|
||||||
You may have Dokany installed. Dokany installs its own Network Provider DLL that unfortunately interferes with the WinFsp handling of network drives. The solution is to change your system's Network Provider order and ensure that the WinFsp Network Provider runs before the Dokany one. Instructions on how to change the Network Provider order can be found in this http://blogs.interfacett.com/changing-the-network-provider-order-in-windows-10[article].
|
You may have Dokany installed. Dokany installs its own Network Provider DLL that unfortunately interferes with the WinFsp handling of network drives. The solution is to change your system's Network Provider order and ensure that the WinFsp Network Provider runs before the Dokany one. Instructions on how to change the Network Provider order can be found in this http://blogs.interfacett.com/changing-the-network-provider-order-in-windows-10[article].
|
||||||
|
|
||||||
|
|
||||||
Why is the DLL not installed in the Windows system directories? [@netheril96]::
|
Case-sensitive file systems do not work properly when mounted as a directory.::
|
||||||
|
|
||||||
|
This is fixed as of WinFsp 2018.2 B3.
|
||||||
|
|
||||||
|
|
||||||
|
Why is the DLL not installed in the Windows system directories?::
|
||||||
|
|
||||||
It is true that this would make it convenient to load the DLL, because the Windows loader looks into the Windows system directories when it loads DLL's. However, in the opinion of the WinFsp author, software that does not ship with the OS should not be installing components in the system directories.
|
It is true that this would make it convenient to load the DLL, because the Windows loader looks into the Windows system directories when it loads DLL's. However, in the opinion of the WinFsp author, software that does not ship with the OS should not be installing components in the system directories.
|
||||||
+
|
+
|
||||||
There are a few alternative methods to overcome this problem. WinFsp recommends marking the WinFsp DLL as "delay load" and then using `FspLoad` to dynamically load the DLL during process initialization. For more information see the WinFsp Tutorial.
|
There are a few alternative methods to overcome this problem. WinFsp recommends marking the WinFsp DLL as "delay load" and then using `FspLoad` to dynamically load the DLL during process initialization. For more information see the WinFsp Tutorial.
|
||||||
|
|
||||||
|
|
||||||
Does WinFsp provide debugging symbols? [@netheril96]::
|
Does WinFsp provide debugging symbols?::
|
||||||
|
|
||||||
Public debugging symbols are already included in the installer. You need to install the "Developer" feature; the symbols can be found in the `sym` directory under the WinFsp installation directory.
|
Public debugging symbols are already included in the installer. You need to install the "Developer" feature; the symbols can be found in the `sym` directory under the WinFsp installation directory.
|
||||||
|
|
||||||
|
|
||||||
Is there a maximum number of concurrent file systems? [@efeat]::
|
Is there a maximum number of concurrent file systems?::
|
||||||
|
|
||||||
WinFsp does not have a hard limit of how many file systems can be created or how many processes can create file systems.
|
WinFsp does not have a hard limit of how many file systems can be created or how many processes can create file systems.
|
||||||
+
|
+
|
||||||
@ -40,10 +45,10 @@ As of the commits required to fix issue #55, there is however a hash table insid
|
|||||||
|
|
||||||
Which version of FUSE does WinFsp-FUSE support?::
|
Which version of FUSE does WinFsp-FUSE support?::
|
||||||
|
|
||||||
Currently it supports FUSE 2.8.
|
It supports both the FUSE 2.8 and FUSE 3.2 API's. For the FUSE 2.8 API include `<fuse/fuse.h>`. For the FUSE 3.2 API include `<fuse3/fuse.h>`.
|
||||||
|
|
||||||
|
|
||||||
FUSE on UNIX systems mounts file systems over an existing directory. When mounting a WinFsp-FUSE file system on a directory, the directory is created and later deleted when the file system goes away. What is the reason for this incompatibility? [@efeat]::
|
FUSE on UNIX systems mounts file systems over an existing directory. When mounting a WinFsp-FUSE file system on a directory, the directory is created and later deleted when the file system goes away. What is the reason for this incompatibility?::
|
||||||
|
|
||||||
It would be preferrable if WinFsp-FUSE behaved like FUSE on UNIX in this instance. However there are a number of reasons that this is not the case.
|
It would be preferrable if WinFsp-FUSE behaved like FUSE on UNIX in this instance. However there are a number of reasons that this is not the case.
|
||||||
+
|
+
|
||||||
@ -54,3 +59,15 @@ With this in mind here are the reasons for the current WinFsp-FUSE behavior:
|
|||||||
- Symmetry with mounting on a drive. On Windows drives are created when the file system comes into existence and deleted when it is gone.
|
- Symmetry with mounting on a drive. On Windows drives are created when the file system comes into existence and deleted when it is gone.
|
||||||
- Inability to mount over a non-empty directory on Windows. On FUSE/UNIX this is possible, but not on Windows because NTFS disallows the creation of (mountpoint) reparse points on non-empty directories.
|
- Inability to mount over a non-empty directory on Windows. On FUSE/UNIX this is possible, but not on Windows because NTFS disallows the creation of (mountpoint) reparse points on non-empty directories.
|
||||||
- Most importantly: inability to guarantee that the mount point will cease to exist if the file system crashes. WinFsp attempts to guarantee that all resources used by a file system will get cleaned up. This is certainly true for the kernel-mode FSD, but an attempt is made to do so also in user mode. For this reason, drive symbolic links are marked as temporary and (importantly for our discussion) mount directories are opened with `FILE_FLAG_DELETE_ON_CLOSE`. There is no way to guarantee the removal of a reparse point in the same way.
|
- Most importantly: inability to guarantee that the mount point will cease to exist if the file system crashes. WinFsp attempts to guarantee that all resources used by a file system will get cleaned up. This is certainly true for the kernel-mode FSD, but an attempt is made to do so also in user mode. For this reason, drive symbolic links are marked as temporary and (importantly for our discussion) mount directories are opened with `FILE_FLAG_DELETE_ON_CLOSE`. There is no way to guarantee the removal of a reparse point in the same way.
|
||||||
|
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
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.
|
||||||
|
+
|
||||||
|
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.)
|
||||||
|
@ -9,9 +9,10 @@ The documentation available here discusses various aspects of WinFsp.
|
|||||||
## Programming
|
## Programming
|
||||||
|
|
||||||
- The [[Tutorial|WinFsp-Tutorial]] describes how to create a simple, but complete file system in C/C++.
|
- The [[Tutorial|WinFsp-Tutorial]] describes how to create a simple, but complete file system in C/C++.
|
||||||
- The [[API Reference|winfsp.h]] describes the native WinFsp API. This external [[link|http://www.secfs.net/winfsp/apiref/]] may be easier to browse for some people.
|
- The [[API Reference|WinFsp-API-winfsp.h]] describes the native WinFsp API.
|
||||||
- There is also a FUSE compatibility layer for native Windows and Cygwin. See fuse.h in the source repository.
|
- There is also a FUSE compatibility layer for native Windows and Cygwin. See fuse.h in the source repository.
|
||||||
- This [[document|Native-API-vs-FUSE]] discusses the need for both a native API and FUSE and gives some pointers on which one to choose.
|
- This [[document|Native-API-vs-FUSE]] discusses the need for both a native API and FUSE and gives some pointers on which one to choose.
|
||||||
|
- Since release 2019.3 WinFsp supports development of file systems in kernel mode. This [[document|WinFsp-Kernel-Mode-File-Systems]] discusses how to write such file systems.
|
||||||
|
|
||||||
## Design
|
## Design
|
||||||
|
|
||||||
@ -29,5 +30,3 @@ The documentation available here discusses various aspects of WinFsp.
|
|||||||
## Compatibility
|
## Compatibility
|
||||||
|
|
||||||
- The [[Compatibility|NTFS-Compatibility]] document discusses current WinFsp compatibility with NTFS.
|
- The [[Compatibility|NTFS-Compatibility]] document discusses current WinFsp compatibility with NTFS.
|
||||||
|
|
||||||
WinFsp is available under the GPLv3 license with a special exception for Free/Libre and Open Source Software.
|
|
||||||
|
@ -4,7 +4,11 @@ This document contains a list of known file systems and file system libraries th
|
|||||||
|
|
||||||
== File Systems
|
== File Systems
|
||||||
|
|
||||||
|
- https://github.com/wesley1975/blobfs-win[blobfs-win] - The native porting of the blobfs on the windows platform, blobfs can help you mount the Azure Blob storage as the local disk driver, no matter it is a Linux system or a Windows system.
|
||||||
|
- 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/sganis/golddrive[golddrive] - Windows ssh network drive
|
||||||
- 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
|
||||||
- https://github.com/ncw/rclone[rclone] - rsync for cloud storage
|
- https://github.com/ncw/rclone[rclone] - rsync for cloud storage
|
||||||
@ -12,6 +16,8 @@ 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/emoose/xbox-winfsp[xbox-winfsp] - Adds native support to Windows for the FATX, STFS & GDFX (aka XGD/XDVDFS) Xbox filesystems.
|
||||||
|
- https://github.com/UtrechtUniversity/YodaDrive[YodaDrive] - Mount a Yoda drive as a local drive
|
||||||
|
|
||||||
== File System Libraries
|
== File System Libraries
|
||||||
|
|
||||||
@ -19,3 +25,5 @@ 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/pleiszenburg/refuse[Python: refuse] - Simple cross-plattform ctypes bindings for libfuse / FUSE for macOS / WinFsp
|
||||||
|
- https://github.com/Scille/winfspy[Python: winfspy] - WinFSP binding for Python
|
||||||
|
421
doc/WinFsp-API-launch.h.md
Normal file
421
doc/WinFsp-API-launch.h.md
Normal file
@ -0,0 +1,421 @@
|
|||||||
|
# winfsp/launch.h
|
||||||
|
|
||||||
|
WinFsp Launch API.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
## LAUNCH CONTROL
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspLaunchCallLauncherPipe</b> - Call launcher pipe.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API NTSTATUS FspLaunchCallLauncherPipe(
|
||||||
|
WCHAR Command,
|
||||||
|
ULONG Argc,
|
||||||
|
PWSTR *Argv,
|
||||||
|
ULONG *Argl,
|
||||||
|
PWSTR Buffer,
|
||||||
|
PULONG PSize,
|
||||||
|
PULONG PLauncherError);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _Command_ \- Launcher command to send. For example, the 'L' launcher command instructs
|
||||||
|
the launcher to list all running service instances.
|
||||||
|
- _Argc_ \- Command argument count. May be 0.
|
||||||
|
- _Argv_ \- Command argument array. May be NULL.
|
||||||
|
- _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.
|
||||||
|
- _Buffer_ \- Buffer that receives the command response. May be NULL.
|
||||||
|
- _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.
|
||||||
|
- _PLauncherError_ \- Receives the launcher error if any. This is always a Win32 error code. May not be NULL.
|
||||||
|
|
||||||
|
**Return Value**
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
**Discussion**
|
||||||
|
|
||||||
|
This function is used to send a command to the launcher and receive a response.
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspLaunchCallLauncherPipeEx</b> - Call launcher pipe.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API NTSTATUS FspLaunchCallLauncherPipeEx(
|
||||||
|
WCHAR Command,
|
||||||
|
ULONG Argc,
|
||||||
|
PWSTR *Argv,
|
||||||
|
ULONG *Argl,
|
||||||
|
PWSTR Buffer,
|
||||||
|
PULONG PSize,
|
||||||
|
BOOLEAN AllowImpersonation,
|
||||||
|
PULONG PLauncherError);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _Command_ \- Launcher command to send. For example, the 'L' launcher command instructs
|
||||||
|
the launcher to list all running service instances.
|
||||||
|
- _Argc_ \- Command argument count. May be 0.
|
||||||
|
- _Argv_ \- Command argument array. May be NULL.
|
||||||
|
- _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.
|
||||||
|
- _Buffer_ \- Buffer that receives the command response. May be NULL.
|
||||||
|
- _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.
|
||||||
|
- _AllowImpersonation_ \- Allow caller to be impersonated by launcher.
|
||||||
|
- _PLauncherError_ \- Receives the launcher error if any. This is always a Win32 error code. May not be NULL.
|
||||||
|
|
||||||
|
**Return Value**
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
**Discussion**
|
||||||
|
|
||||||
|
This function is used to send a command to the launcher and receive a response.
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspLaunchGetInfo</b> - Get information about a service instance.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API NTSTATUS FspLaunchGetInfo(
|
||||||
|
PWSTR ClassName,
|
||||||
|
PWSTR InstanceName,
|
||||||
|
PWSTR Buffer,
|
||||||
|
PULONG PSize,
|
||||||
|
PULONG PLauncherError);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _ClassName_ \- Class name of the service instance to stop.
|
||||||
|
- _InstanceName_ \- Instance name of the service instance to stop.
|
||||||
|
- _Buffer_ \- Buffer that receives the command response. May be NULL.
|
||||||
|
- _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.
|
||||||
|
- _PLauncherError_ \- Receives the launcher error if any. This is always a Win32 error code. May not be NULL.
|
||||||
|
|
||||||
|
**Return Value**
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
**Discussion**
|
||||||
|
|
||||||
|
The information is a list of NULL-terminated strings: the class name of the service instance,
|
||||||
|
the instance name of the service instance and the full command line used to start the service
|
||||||
|
instance.
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspLaunchGetNameList</b> - List service instances.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API NTSTATUS FspLaunchGetNameList(
|
||||||
|
PWSTR Buffer,
|
||||||
|
PULONG PSize,
|
||||||
|
PULONG PLauncherError);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _Buffer_ \- Buffer that receives the command response. May be NULL.
|
||||||
|
- _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.
|
||||||
|
- _PLauncherError_ \- Receives the launcher error if any. This is always a Win32 error code. May not be NULL.
|
||||||
|
|
||||||
|
**Return Value**
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
**Discussion**
|
||||||
|
|
||||||
|
The information is a list of pairs of NULL-terminated strings. Each pair contains the class
|
||||||
|
name and instance name of a service instance. All currently running service instances are
|
||||||
|
listed.
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspLaunchStart</b> - Start a service instance.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API NTSTATUS FspLaunchStart(
|
||||||
|
PWSTR ClassName,
|
||||||
|
PWSTR InstanceName,
|
||||||
|
ULONG Argc,
|
||||||
|
PWSTR *Argv,
|
||||||
|
BOOLEAN HasSecret,
|
||||||
|
PULONG PLauncherError);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _ClassName_ \- Class name of the service instance to start.
|
||||||
|
- _InstanceName_ \- Instance name of the service instance to start.
|
||||||
|
- _Argc_ \- Service instance argument count. May be 0.
|
||||||
|
- _Argv_ \- Service instance argument array. May be NULL.
|
||||||
|
- _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.
|
||||||
|
- _PLauncherError_ \- Receives the launcher error if any. This is always a Win32 error code. May not be NULL.
|
||||||
|
|
||||||
|
**Return Value**
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspLaunchStartEx</b> - Start a service instance.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API NTSTATUS FspLaunchStartEx(
|
||||||
|
PWSTR ClassName,
|
||||||
|
PWSTR InstanceName,
|
||||||
|
ULONG Argc,
|
||||||
|
PWSTR *Argv,
|
||||||
|
BOOLEAN HasSecret,
|
||||||
|
BOOLEAN AllowImpersonation,
|
||||||
|
PULONG PLauncherError);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _ClassName_ \- Class name of the service instance to start.
|
||||||
|
- _InstanceName_ \- Instance name of the service instance to start.
|
||||||
|
- _Argc_ \- Service instance argument count. May be 0.
|
||||||
|
- _Argv_ \- Service instance argument array. May be NULL.
|
||||||
|
- _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.
|
||||||
|
- _AllowImpersonation_ \- Allow caller to be impersonated by launcher.
|
||||||
|
- _PLauncherError_ \- Receives the launcher error if any. This is always a Win32 error code. May not be NULL.
|
||||||
|
|
||||||
|
**Return Value**
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspLaunchStop</b> - Stop a service instance.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API NTSTATUS FspLaunchStop(
|
||||||
|
PWSTR ClassName,
|
||||||
|
PWSTR InstanceName,
|
||||||
|
PULONG PLauncherError);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _ClassName_ \- Class name of the service instance to stop.
|
||||||
|
- _InstanceName_ \- Instance name of the service instance to stop.
|
||||||
|
- _PLauncherError_ \- Receives the launcher error if any. This is always a Win32 error code. May not be NULL.
|
||||||
|
|
||||||
|
**Return Value**
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## SERVICE REGISTRY
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspLaunchRegFreeRecord</b> - Free a service registry record.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API VOID FspLaunchRegFreeRecord(
|
||||||
|
FSP_LAUNCH_REG_RECORD *Record);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _Record_ \- The service record to free.
|
||||||
|
|
||||||
|
**See Also**
|
||||||
|
|
||||||
|
- FspLaunchRegGetRecord
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspLaunchRegGetRecord</b> - Get a service registry record.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API NTSTATUS FspLaunchRegGetRecord(
|
||||||
|
PWSTR ClassName,
|
||||||
|
PWSTR Agent,
|
||||||
|
FSP_LAUNCH_REG_RECORD **PRecord);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _ClassName_ \- The service class name.
|
||||||
|
- _Agent_ \- The name of the agent that is retrieving the service record. This API matches
|
||||||
|
the supplied Agent against the Agent in the service record and it only returns
|
||||||
|
the record if they match. Pass NULL to match any Agent.
|
||||||
|
- _PRecord_ \- Pointer to a record pointer. Memory for the service record will be allocated
|
||||||
|
and a pointer to it will be stored at this address. This memory must be later
|
||||||
|
freed using FspLaunchRegFreeRecord.
|
||||||
|
|
||||||
|
**Return Value**
|
||||||
|
|
||||||
|
STATUS\_SUCCESS or error code.
|
||||||
|
|
||||||
|
**See Also**
|
||||||
|
|
||||||
|
- FspLaunchRegFreeRecord
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspLaunchRegSetRecord</b> - Add/change/delete a service registry record.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API NTSTATUS FspLaunchRegSetRecord(
|
||||||
|
PWSTR ClassName,
|
||||||
|
const FSP_LAUNCH_REG_RECORD *Record);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _ClassName_ \- The service class name.
|
||||||
|
- _Record_ \- The record to set in the registry. If NULL, the registry record is deleted.
|
||||||
|
|
||||||
|
**Return Value**
|
||||||
|
|
||||||
|
STATUS\_SUCCESS or error code.
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### Typedefs
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FSP_LAUNCH_REG_RECORD</b> - Service registry record.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
typedef struct _FSP_LAUNCH_REG_RECORD {
|
||||||
|
PWSTR Agent;
|
||||||
|
PWSTR Executable;
|
||||||
|
PWSTR CommandLine;
|
||||||
|
PWSTR WorkDirectory;
|
||||||
|
PWSTR RunAs;
|
||||||
|
PWSTR Security;
|
||||||
|
PWSTR AuthPackage;
|
||||||
|
PVOID Reserved0[5];
|
||||||
|
ULONG JobControl;
|
||||||
|
ULONG Credentials;
|
||||||
|
ULONG AuthPackageId;
|
||||||
|
ULONG Reserved1[5];
|
||||||
|
UINT8 Buffer[];
|
||||||
|
} FSP_LAUNCH_REG_RECORD;
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<p align="center">
|
||||||
|
<sub>
|
||||||
|
Copyright © 2015-2020 Bill Zissimopoulos
|
||||||
|
<br/>
|
||||||
|
Generated with <a href="https://github.com/billziss-gh/prettydoc">prettydoc</a>
|
||||||
|
</sub>
|
||||||
|
</p>
|
2620
doc/WinFsp-API-winfsp.h.md
Normal file
2620
doc/WinFsp-API-winfsp.h.md
Normal file
File diff suppressed because it is too large
Load Diff
73
doc/WinFsp-Container-Support.asciidoc
Normal file
73
doc/WinFsp-Container-Support.asciidoc
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
= WinFsp Container Support
|
||||||
|
|
||||||
|
WinFsp gained support for Windows Containers in release 2020.2 B1. This document discusses this new functionality and explains how user mode file systems can take advantage of it.
|
||||||
|
|
||||||
|
NOTE: WinFsp support for Windows Containers is at this time highly experimental. It may change substantially in the future or eliminated altogether.
|
||||||
|
|
||||||
|
== Windows Containers
|
||||||
|
|
||||||
|
Containers are a technology for deployment and execution of applications in an isolated environment. Applications deployed inside a container cannot be affected by or affect applications in other containers or in the host operating system.
|
||||||
|
|
||||||
|
Containers on Windows provide isolation via one of two modes:
|
||||||
|
|
||||||
|
- The _Hyper-V_ isolation mode where a container runs in its own virtual machine and has its own kernel.
|
||||||
|
|
||||||
|
- The _process_ isolation mode where a container runs in a "silo" inside the host operating system's kernel. This is the same model used in containers for Linux.
|
||||||
|
|
||||||
|
WinFsp supports containers that use the process isolation mode in versions of Windows 10 1809 and later.
|
||||||
|
|
||||||
|
=== Server Silos
|
||||||
|
|
||||||
|
Containers using the process isolation mode are called _server silos_. Server silos are built on top of kernel job objects that have been extended with additional capabities useful for containers. Most importantly each server silo has its own object namespace root directory that is distinct from the host's object namespace root directory. This allows for all named kernel objects inside a server silo to be isolated from named objects in other server silos or the host.
|
||||||
|
|
||||||
|
The Windows kernel provides a number of DDI's (Device Driver Interfaces) to enable kernel drivers to work with server silos. The WinFsp FSD uses these DDI's to monitor silo creation and termination and manage its own devices within the silo's object namespace.
|
||||||
|
|
||||||
|
=== Docker
|
||||||
|
|
||||||
|
In order to manage containers on Windows a version of Docker for Windows is needed. In order to use server silos and process isolation with Docker the switch `--isolation=process` must be used when creating a container:
|
||||||
|
|
||||||
|
----
|
||||||
|
docker run --isolation=process ...
|
||||||
|
----
|
||||||
|
|
||||||
|
== Containerized User Mode File Systems
|
||||||
|
|
||||||
|
The WinFsp 2020.2 B1 release gained the ability for user mode file systems to run inside a server silo container and expose a file system either within the container or to the host operating system. This allows for user mode file systems to be containerized.
|
||||||
|
|
||||||
|
There are a few considerations that must be taken into account when deploying a user mode file system in a container:
|
||||||
|
|
||||||
|
* When using WinFsp with containers the process isolation mode must be used.
|
||||||
|
|
||||||
|
* WinFsp currently supports the Windows Server Core and Windows base images. Work is underway for Nano Server compatibility.
|
||||||
|
|
||||||
|
* User mode file systems that run in a container cannot start the FSD, because containers disallow driver loading. (Usually the WinFsp DLL automatically starts the WinFsp FSD when it is not already running, but this is not possible within a container.)
|
||||||
|
+
|
||||||
|
To work around this problem start the FSD outside the container. For example, the FSD can be started in the host using the `sc.exe` utility.
|
||||||
|
+
|
||||||
|
----
|
||||||
|
sc.exe start winfsp
|
||||||
|
----
|
||||||
|
+
|
||||||
|
Once the FSD has been started it will monitor server silo creation and termination and will set things up so that containerized user mode file systems will be able to interface with it.
|
||||||
|
|
||||||
|
* WinFsp file systems typically use the registry to locate and load the WinFsp DLL (see `FspLoad` in `winfsp/winfsp.h`). However the registry inside a container does not contain any WinFsp entries. The easiest workaround is to hardcode the location of the WinFsp installation within the container, which will also hardcode the location of the WinFsp DLL.
|
||||||
|
|
||||||
|
* During development it is sometimes useful to bind mount the WinFsp installation directory into the container. For example:
|
||||||
|
+
|
||||||
|
----
|
||||||
|
docker run -it --rm --isolation=process "-vC:\Program Files (x86)\WinFsp:C:\Program Files (x86)\WinFsp:RO" mcr.microsoft.com/windows/servercore:2004 cmd.exe
|
||||||
|
----
|
||||||
|
|
||||||
|
* When a WinFsp based file system is mounted as a disk file system within a container, it is only visible within that container. For example, the drive `Z:` below and associated file system volume will be accessible only within the container:
|
||||||
|
+
|
||||||
|
----
|
||||||
|
memfs-x64 -i -F NTFS -m Z:
|
||||||
|
----
|
||||||
|
|
||||||
|
* When a WinFsp based file system is mounted as a network file system within a container, the file system becomes accessible **outside** the container via its UNC prefix. For example, while the drive `Y:` below will be accessible only within the container, the file system volume will be accessible from both the container and the host via the UNC prefix `\\memfs\share`.
|
||||||
|
+
|
||||||
|
----
|
||||||
|
memfs-x64 -i -F NTFS -m Y: -u \memfs\share
|
||||||
|
----
|
||||||
|
+
|
||||||
|
The reason that this happens is that server silo containers share the same MUP device object with the host. The MUP (Multiple UNC Provider) is the Windows kernel component responsible for resolving UNC prefixes. It is unclear at this time whether this "leak" from the container to the host via the shared MUP is intentional or whether it is an unintended consequence. I note that the server silo MUP entry in the object namespace is a symbolic link, which suggests that the shared MUP device object was a conscious decision by Microsoft.
|
81
doc/WinFsp-Debugging-Setup.asciidoc
Normal file
81
doc/WinFsp-Debugging-Setup.asciidoc
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
= WinFsp Debugging Setup
|
||||||
|
|
||||||
|
In this article I will describe the debugging setup used for WinFsp. Note that my debugging setup is somewhat peculiar, because all development and debugging is done on a Mac computer using two Windows virtual machines: one for development and one for debugging! However my description below should work for a one or two virtual machine setup.
|
||||||
|
|
||||||
|
WinFsp is being developed on Windows 10 and debugged and tested on Windows 8 (although it should run correctly on Windows Vista and higher). You will need some virtualization software (I use VirtualBox 5), you will also need a fresh installation of Windows and to configure it properly for kernel debugging and running test signed drivers:
|
||||||
|
|
||||||
|
* Create a Windows VM with a descriptive name (e.g. Win8DBG). Mine has a single CPU and just 2GB of memory.
|
||||||
|
* Configure your VM for Host Only Networking. This will be used for WinDbg debugging and for deploying WinFsp.
|
||||||
|
* Install Windows 8 on Win8DBG. Windows 8 is the minimum version of Windows that supports kernel network debugging.
|
||||||
|
* I would recommend not to install your virtualization software guest additions to minimize issues with your debugging VM.
|
||||||
|
* Configure Win8DBG for running test signed drivers:
|
||||||
|
+
|
||||||
|
----
|
||||||
|
bcdedit.exe -set testsigning on
|
||||||
|
----
|
||||||
|
* Configure Win8DBG for debugging over the network:
|
||||||
|
+
|
||||||
|
----
|
||||||
|
bcdedit /debug on
|
||||||
|
bcdedit /dbgsettings net hostip:W.X.Y.Z port:NNNN key:KKKK
|
||||||
|
----
|
||||||
|
** Note that if you configure your VM with multiple network adapters you must also specify the correct `busparams` argument. You can find the correct `busparams` from the Windows Device Manager. For example, here are the settings on one of my VM's:
|
||||||
|
+
|
||||||
|
----
|
||||||
|
>bcdedit /dbgsettings
|
||||||
|
busparams 0.8.0
|
||||||
|
key 1.1.1.1
|
||||||
|
debugtype NET
|
||||||
|
hostip 192.168.56.11
|
||||||
|
port 50000
|
||||||
|
dhcp Yes
|
||||||
|
The operation completed successfully.
|
||||||
|
----
|
||||||
|
* Enable DbgPrint on Win8DBG. Create the following key/value in the registry:
|
||||||
|
+
|
||||||
|
----
|
||||||
|
Windows Registry Editor Version 5.00
|
||||||
|
|
||||||
|
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
|
||||||
|
"DEFAULT"=dword:0000000f
|
||||||
|
----
|
||||||
|
* Create a directory on Win8DBG where you will be deploying WinFsp. I use a subdirectory of the Downloads directory:
|
||||||
|
+
|
||||||
|
----
|
||||||
|
C:\Users\USERNAME\Downloads\winfsp
|
||||||
|
----
|
||||||
|
* Make the directory available outside the VM using Windows networking. You can use this new Windows share as an easy means to deploy WinFsp.
|
||||||
|
+
|
||||||
|
----
|
||||||
|
copy build\VStudio\build\Debug\winfsp-x64.sys \\Win8DBG\Users\USERNAME\Downloads\winfsp
|
||||||
|
----
|
||||||
|
* Enable Driver Verifier for WinFsp on Win8DBG. The easiest way to do so is to run `verifier` from the command line.
|
||||||
|
* For faster edit-compile-test cycles I strongly recommend to use your virtualization software snapshot feature. For example, in my Win8DBG VM after I set it up exactly how I wanted it, I took a snapshot while the VM was running. Now whenever I want to test WinFsp, I restart that same snapshot and within 3-4 seconds I have a new VM ready for use. Even more importantly whenever there is a hard crash on the VM (happens a lot when developing Windows drivers) I can simply close the crashed VM and restart a new one.
|
||||||
|
* On your development machine configure WinDbg to use the Microsoft public symbol servers. From the main menu select File > Symbol File Path and enter:
|
||||||
|
+
|
||||||
|
----
|
||||||
|
SRV*C:\Users\USERNAME\AppData\Local\Temp\SymbolCache*http://msdl.microsoft.com/download/symbols
|
||||||
|
----
|
||||||
|
* You can now run WinDbg and from the main menu select File > Kernel Debug, then enter the appropriate port number and key. Alternatively you can use the following windbg command line:
|
||||||
|
+
|
||||||
|
----
|
||||||
|
windbg -k net:port=NNNN,key=KKKK
|
||||||
|
----
|
||||||
|
* Checkout the `tools/deploy.bat` and `tools/debug.bat` batch files in the source distribution to see how I deploy and debug WinFsp.
|
||||||
|
|
||||||
|
== Debugging a user mode process from kernel mode WinDbg
|
||||||
|
|
||||||
|
In order to debug a user mode process from a kernel mode WinDbg session, break into the debugger and issue the following commands:
|
||||||
|
|
||||||
|
----
|
||||||
|
kd> !gflag +ksl
|
||||||
|
kd> sxe ld MODULE-NAME.exe
|
||||||
|
----
|
||||||
|
|
||||||
|
Restart the debugger and it will break within process creation. You can now set a breakpoint at your process wmain (or main, etc.):
|
||||||
|
|
||||||
|
----
|
||||||
|
kd> bp MODULE_NAME!wmain
|
||||||
|
----
|
||||||
|
|
||||||
|
Restart the debugger and it will stop at your program's entry point.
|
117
doc/WinFsp-Kernel-Mode-File-Systems.asciidoc
Normal file
117
doc/WinFsp-Kernel-Mode-File-Systems.asciidoc
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
= Developing File Systems in Kernel Mode
|
||||||
|
|
||||||
|
Since release 2019.3 WinFsp supports development of file systems in kernel mode. Such file systems are implemented as kernel drivers that use WinFsp as the primary FSD (File System Driver) as well as the software library that they interface with to retrieve and service file system requests. This document discusses how to write such file systems.
|
||||||
|
|
||||||
|
== Motivation
|
||||||
|
|
||||||
|
The primary goal of WinFsp is to enable the easy creation of *user mode* file systems using an easy to use API. There are however legitimate reasons for wanting to develop a file system as a *kernel mode* driver, but the difficulty of doing so often deters people because Windows kernel file system development is notoriously difficult and has many pitfalls.
|
||||||
|
|
||||||
|
Some of the reasons that a kernel mode file system may be preferrable to a user mode one:
|
||||||
|
|
||||||
|
* A kernel driver may be able to achieve better performance than user mode processes.
|
||||||
|
* A kernel driver may be able to access advanced OS features that are not easily available to user mode processes.
|
||||||
|
* A kernel driver may be able to present an alternative interface than the one presented by WinFsp to user mode processes.
|
||||||
|
|
||||||
|
Since release 2019.3 WinFsp supports development of file systems as kernel mode drivers. The primary motivation for this work was to support the https://github.com/billziss-gh/winfuse[WinFuse] project, which exposes the FUSE protocol from the Windows kernel in a way that allows FUSE file systems to interface with it, either directly or via https://github.com/libfuse/libfuse[libfuse]. The support was added in such a way that it is generic enough to be used by other kernel mode file systems.
|
||||||
|
|
||||||
|
== Overview
|
||||||
|
|
||||||
|
A WinFsp "volume" (file system) is typically created using the `FspFsctlCreateVolume` API. This is simply a wrapper around a `CreateFileW` call on one of the WinFsp control devices, either `WinFsp.Disk` or `WinFsp.Net`. The `CreateFileW` call returns a `HANDLE` to the newly created volume, which acts either as a "disk" or a "network" file system, depending on which control device was used to create it.
|
||||||
|
|
||||||
|
User mode file systems interact with the WinFsp FSD via `DeviceIoControl/FSP_FSCTL_TRANSACT` messages on the volume `HANDLE`. (This is usually done indirectly via the WinFsp DLL, which hides this detail behind an easy to use API.)
|
||||||
|
|
||||||
|
Since release 2019.3 (v1.5) WinFsp supports the following:
|
||||||
|
|
||||||
|
* Registration and on-demand loading of a third party driver when a volume that is destined to be handled by the third party driver is created.
|
||||||
|
* Forwarding of custom `DeviceIoControl` messages to a third party driver. This allows the third party driver to handle custom `FSCTL` requests directed to a WinFsp volume `HANDLE`.
|
||||||
|
* Kernel-mode API's (called DDI's) that allow a third party driver to register itself with the FSD and interact with its I/O queues.
|
||||||
|
|
||||||
|
Such drivers are called within the WinFsp sources and header/library files by the name of "Fsext Providers" (File System Extension Providers). In the text below we will usually refer to them as simply "Providers".
|
||||||
|
|
||||||
|
A Provider is a kernel mode driver that uses the FSD as a frontend file system driver to interface with Windows and implement all the complex details that this entails. The Provider fetches I/O requests from the WinFsp I/O queues and may filter them, transform them into a different protocol (as is the case with WinFuse) or use them to fully implement a file system in kernel mode.
|
||||||
|
|
||||||
|
== Provider Development
|
||||||
|
|
||||||
|
The WinFsp installer includes a "Kernel Developer" feature. When installed this feature adds header and library files in the `opt\fsext` installation subdirectory.
|
||||||
|
|
||||||
|
The primary header file used for Provider development is `<winfsp/fsext.h>` and can be found in `opt\fsext\inc`. Additionally the file `<winfsp/fsctl.h>` found in the `inc` installation subdirectory must be in the compiler's include path.
|
||||||
|
|
||||||
|
Providers must also be linked with one of the import libraries that can be found in `opt\fsext\lib`. Use the `winfsp-x64.lib` import library when linking the 64-bit version of a Provider and the `winfsp-x86.lib` import library when linking the 32-bit version of a Provider.
|
||||||
|
|
||||||
|
=== Provider DDI's
|
||||||
|
|
||||||
|
The `<winfsp/fsext.h>` header file includes definitions for the following important DDI's:
|
||||||
|
|
||||||
|
* `FspFsextProviderRegister`: This DDI is used by a Provider to register itself with the FSD. Typically the Provider prepares an `FSP_FSEXT_PROVIDER` structure and calls `FspFsextProviderRegister` in its `DriverEntry` routine. The structure's fields are as follows:
|
||||||
|
** `Version`: Set to `sizeof(FSP_FSEXT_PROVIDER)`.
|
||||||
|
** `DeviceTransactCode`: The `DeviceIoControl` code that should be forwarded to the Provider.
|
||||||
|
*** The code must be defined as follows: `CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0xC00 + ProviderSpecific, METHOD_BUFFERED, FILE_ANY_ACCESS)`.
|
||||||
|
*** Please note that this scheme allows for up to 1024 codes. If you want to define a new Provider code I will appreciate it if you email me at `<billziss at navimatics.com>` so that we can keep track of Provider codes, avoid conflicts and see when we need to extend this scheme.
|
||||||
|
** `DeviceExtensionSize`: The size of private data that the Provider wants for itself in the `DeviceExtension` of the FSD volume's device object.
|
||||||
|
** `DeviceInit`: Called when a new volume is created. The `DeviceObject` parameter is the volume's device object. The `VolumeParams` are the initial parameters passed to `FspFsctlCreateVolume` and can be modified by the Provider.
|
||||||
|
** `DeviceFini`: Called when a volume is going away. This usually happens when the volume `HANDLE` is closed.
|
||||||
|
** `DeviceExpirationRoutine`: Called once a second as part of the FSD's expiration timer. The FSD uses this timer to expire caches, long-pending IRP's, etc. A Provider can use this call for a similar purpose. The `ExpirationTime` parameter contains the current interrupt time as determined by the FSD.
|
||||||
|
** `DeviceTransact`: Called whenever the FSD receives a `DeviceIoControl` request with the `DeviceTransactCode`. The `Irp` parameter contains the relevant `IRP_MJ_FILE_SYSTEM_CONTROL`.
|
||||||
|
** `DeviceExtensionOffset`: Set to `0` on input. On successful return from `FspFsextProviderRegister` it will contain the offset to use for accessing the Provider's private data in the `DeviceExtension` of the FSD volume's device object. Given a `DeviceObject`, the data can be accessed as `(PVOID)((PUINT8)DeviceObject->DeviceExtension + Provider.DeviceExtensionOffset)`.
|
||||||
|
* `FspFsextProviderTransact`: This DDI is used by a Provider to interact with the FSD I/O queues. The `DeviceObject` is the FSD volume's device object. The `FileObject` is the `FILE_OBJECT` that corresponds to the volume `HANDLE` (created by `FspFsctlCreateVolume`). The `Response` is the response to send and can be `NULL`. The `Request` is a pointer that receives a pointer to a new request from the WinFsp I/O queue and can be `NULL`; if the received pointer is not `NULL` it must be freed with `ExFreePool`.
|
||||||
|
|
||||||
|
=== Provider I/O
|
||||||
|
|
||||||
|
When the FSD receives a file system IRP it is often able to handle and complete it without help from an external user mode or kernel mode file system. However in most cases the IRP has to be seen and acted upon by an external file system. For this reason the FSD preprocesses the IRP and places it in an I/O queue in the form of a "request". At a later time the external file system retrieves the request, processes it and sends back a "response". The FSD uses the response to locate the original IRP, perform any necessary postprocessing and finally complete the IRP.
|
||||||
|
|
||||||
|
Providers typically use the `FspFsextProviderTransact` DDI to receive requests and send back responses. Requests are of type `FSP_FSCTL_TRANSACT_REQ` and responses are of type `FSP_FSCTL_TRANSACT_RSP`. Requests have a `Kind` field which describes what kind of file system operation is being requested. The following request kinds are currently defined in `<winfsp/fsctl.h>`:
|
||||||
|
|
||||||
|
```
|
||||||
|
FspFsctlTransactCreateKind,
|
||||||
|
FspFsctlTransactOverwriteKind,
|
||||||
|
FspFsctlTransactCleanupKind,
|
||||||
|
FspFsctlTransactCloseKind,
|
||||||
|
FspFsctlTransactReadKind,
|
||||||
|
FspFsctlTransactWriteKind,
|
||||||
|
FspFsctlTransactQueryInformationKind,
|
||||||
|
FspFsctlTransactSetInformationKind,
|
||||||
|
FspFsctlTransactQueryEaKind,
|
||||||
|
FspFsctlTransactSetEaKind,
|
||||||
|
FspFsctlTransactFlushBuffersKind,
|
||||||
|
FspFsctlTransactQueryVolumeInformationKind,
|
||||||
|
FspFsctlTransactSetVolumeInformationKind,
|
||||||
|
FspFsctlTransactQueryDirectoryKind,
|
||||||
|
FspFsctlTransactFileSystemControlKind,
|
||||||
|
FspFsctlTransactDeviceControlKind,
|
||||||
|
FspFsctlTransactShutdownKind,
|
||||||
|
FspFsctlTransactLockControlKind,
|
||||||
|
FspFsctlTransactQuerySecurityKind,
|
||||||
|
FspFsctlTransactSetSecurityKind,
|
||||||
|
FspFsctlTransactQueryStreamInformationKind,
|
||||||
|
```
|
||||||
|
|
||||||
|
When request processing is complete the Provider must prepare a response and send it to the FSD using `FspFsextProviderTransact` as mentioned above. It is particularly important that the Provider initializes the `Kind` and `Hint` fields by copying the values from the corresponding request.
|
||||||
|
|
||||||
|
This document does not describe in detail how each request kind is supposed to be handled. For the full details refer to the implementation for the WinFsp DLL in the WinFsp sources: `src/dll/fsop.c`. Although this implementation is for user mode file systems, similar logic and techniques should be used for Providers.
|
||||||
|
|
||||||
|
== Provider Registration
|
||||||
|
|
||||||
|
Providers are loaded on demand and must be properly registered:
|
||||||
|
|
||||||
|
* A provider must be registered as a kernel driver. This can be achieved by using the command `sc create PROVIDER type=kernel binPath=X:\PATH\TO\PROVIDER.SYS` or by using the Service Control Manager API's (`OpenServiceW`, `CreateServiceW`, etc.). You do not need an INF file or to use the Setup API in order to register a Provider driver.
|
||||||
|
* A provider must be registered under the registry key `HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\WinFsp\Fsext`. Create a string value with name the textual representation of the Provider's transact code (see `DeviceTransactCode`) in `"%08lx"` format and value the Provider's driver name.
|
||||||
|
|
||||||
|
For example the WinFuse Provider registers its driver under the name `WinFuse` and adds a registry value of `00093118` -> `WinFuse`.
|
||||||
|
|
||||||
|
== Provider Lifetime
|
||||||
|
|
||||||
|
Providers are loaded on demand by the FSD during volume creation. This process works as follows:
|
||||||
|
|
||||||
|
* During volume creation (e.g. by using `FspFsctlCreateVolume`) a non-zero `FsextControlCode` must be specified in `VolumeParams`.
|
||||||
|
* If the FSD sees the `FsextControlCode` as non-zero it attempts to find a corresponding Provider driver.
|
||||||
|
** It first checks an internal mapping of codes to Provider drivers. If the code is found, the FSD proceeds to the `DeviceInit` step below.
|
||||||
|
** If the code is not found in the internal mapping, the FSD checks the registry under the registry key `HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\WinFsp\Fsext`. If the code is not found the volume creation fails.
|
||||||
|
** If the code is found the FSD loads the Provider driver using `ZwLoadDriver`. The Provider is supposed to register itself with the FSD during `DriverEntry` by calling `FspFsextProviderRegister`.
|
||||||
|
** Finally the internal mapping of codes to Providers is rechecked. Assuming that everything worked as intended, the corresponding Provider driver is now loaded and we can proceed to the `DeviceInit` step.
|
||||||
|
* The FSD proceeds to call the `DeviceInit` callback of the Provider. The Provider can use this call to initialize itself in relation to the new volume device object.
|
||||||
|
* Assuming that the volume device object is created successfully, the FSD will do the following:
|
||||||
|
** Forward any `FsextControlCode==DeviceTransactCode` requests that it gets in its `IRP_MJ_FILE_SYSTEM_CONTROL` to the Provider via `DeviceTransact`.
|
||||||
|
** Call the Provider's `DeviceExpirationRoutine` once a second as part of the FSD's expiration process.
|
||||||
|
* Eventually the volume device object will be torn down (e.g. because the corresponding `HANDLE` is closed). In this case the FSD will call the Provider's `DeviceFini` callback.
|
||||||
|
|
||||||
|
Finally note that once loaded a Provider driver cannot be unloaded (without a reboot).
|
BIN
doc/cap.gif
Normal file
BIN
doc/cap.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 MiB |
File diff suppressed because it is too large
Load Diff
@ -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-2020 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-2020 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-2020 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-2020 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-2020 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-2020 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-2020 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-2020 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-2020 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-2020 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-2020 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-2020 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);
|
||||||
@ -87,7 +91,7 @@ struct fuse_operations
|
|||||||
/* _ */ unsigned int flag_nopath:1;
|
/* _ */ unsigned int flag_nopath:1;
|
||||||
/* _ */ unsigned int flag_utime_omit_ok:1;
|
/* _ */ unsigned int flag_utime_omit_ok:1;
|
||||||
/* _ */ unsigned int flag_reserved:29;
|
/* _ */ unsigned int flag_reserved:29;
|
||||||
/* _ */ int (*ioctl)(const char *path, int cmd, void *arg, struct fuse_file_info *fi,
|
/* S */ int (*ioctl)(const char *path, int cmd, void *arg, struct fuse_file_info *fi,
|
||||||
unsigned int flags, void *data);
|
unsigned int flags, void *data);
|
||||||
/* _ */ int (*poll)(const char *path, struct fuse_file_info *fi,
|
/* _ */ int (*poll)(const char *path, struct fuse_file_info *fi,
|
||||||
struct fuse_pollhandle *ph, unsigned *reventsp);
|
struct fuse_pollhandle *ph, unsigned *reventsp);
|
||||||
|
@ -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-2020 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-2020 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-2020 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
|
||||||
@ -53,6 +57,17 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define FSP_FUSE_DEVICE_TYPE (0x8000 | 'W' | 'F' * 0x100) /* DeviceIoControl -> ioctl */
|
||||||
|
#define FSP_FUSE_CTLCODE_FROM_IOCTL(cmd)\
|
||||||
|
(FSP_FUSE_DEVICE_TYPE << 16) | (((cmd) & 0x0fff) << 2)
|
||||||
|
#define FSP_FUSE_IOCTL(cmd, isiz, osiz) \
|
||||||
|
( \
|
||||||
|
(((osiz) != 0) << 31) | \
|
||||||
|
(((isiz) != 0) << 30) | \
|
||||||
|
(((isiz) | (osiz)) << 16) | \
|
||||||
|
(cmd) \
|
||||||
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUSE uses a number of types (notably: struct stat) that are OS specific.
|
* FUSE uses a number of types (notably: struct stat) that are OS specific.
|
||||||
* Furthermore there are sometimes multiple definitions of the same type even
|
* Furthermore there are sometimes multiple definitions of the same type even
|
||||||
@ -345,7 +360,10 @@ static inline int fsp_fuse_set_signal_handlers(void *se)
|
|||||||
|
|
||||||
static sigset_t sigmask;
|
static sigset_t sigmask;
|
||||||
static pthread_t sigthr;
|
static pthread_t sigthr;
|
||||||
struct sigaction oldsa, newsa = { 0 };
|
struct sigaction oldsa, newsa;
|
||||||
|
|
||||||
|
// memset instead of initializer to avoid GCC -Wmissing-field-initializers warning
|
||||||
|
memset(&newsa, 0, sizeof newsa);
|
||||||
|
|
||||||
if (0 != se)
|
if (0 != se)
|
||||||
{
|
{
|
||||||
@ -389,7 +407,7 @@ static inline int fsp_fuse_set_signal_handlers(void *se)
|
|||||||
static inline char *fsp_fuse_conv_to_win_path(const char *path)
|
static inline char *fsp_fuse_conv_to_win_path(const char *path)
|
||||||
{
|
{
|
||||||
void *cygwin_create_path(unsigned, const void *);
|
void *cygwin_create_path(unsigned, const void *);
|
||||||
return cygwin_create_path(
|
return (char *)cygwin_create_path(
|
||||||
0/*CCP_POSIX_TO_WIN_A*/ | 0x100/*CCP_RELATIVE*/,
|
0/*CCP_POSIX_TO_WIN_A*/ | 0x100/*CCP_RELATIVE*/,
|
||||||
path);
|
path);
|
||||||
}
|
}
|
||||||
|
338
inc/fuse3/fuse.h
Normal file
338
inc/fuse3/fuse.h
Normal file
@ -0,0 +1,338 @@
|
|||||||
|
/**
|
||||||
|
* @file fuse3/fuse.h
|
||||||
|
* WinFsp FUSE3 compatible API.
|
||||||
|
*
|
||||||
|
* This file is derived from libfuse/include/fuse.h:
|
||||||
|
* FUSE: Filesystem in Userspace
|
||||||
|
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
||||||
|
*
|
||||||
|
* @copyright 2015-2020 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 FUSE_H_
|
||||||
|
#define FUSE_H_
|
||||||
|
|
||||||
|
#include "fuse_common.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct fuse3;
|
||||||
|
|
||||||
|
enum fuse3_readdir_flags
|
||||||
|
{
|
||||||
|
FUSE_READDIR_PLUS = (1 << 0),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fuse3_fill_dir_flags
|
||||||
|
{
|
||||||
|
FUSE_FILL_DIR_PLUS = (1 << 1),
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef int (*fuse3_fill_dir_t)(void *buf, const char *name,
|
||||||
|
const struct fuse_stat *stbuf, fuse_off_t off,
|
||||||
|
enum fuse3_fill_dir_flags flags);
|
||||||
|
|
||||||
|
struct fuse3_config
|
||||||
|
{
|
||||||
|
int set_gid;
|
||||||
|
unsigned int gid;
|
||||||
|
int set_uid;
|
||||||
|
unsigned int uid;
|
||||||
|
int set_mode;
|
||||||
|
unsigned int umask;
|
||||||
|
double entry_timeout;
|
||||||
|
double negative_timeout;
|
||||||
|
double attr_timeout;
|
||||||
|
int intr;
|
||||||
|
int intr_signal;
|
||||||
|
int remember;
|
||||||
|
int hard_remove;
|
||||||
|
int use_ino;
|
||||||
|
int readdir_ino;
|
||||||
|
int direct_io;
|
||||||
|
int kernel_cache;
|
||||||
|
int auto_cache;
|
||||||
|
int ac_attr_timeout_set;
|
||||||
|
double ac_attr_timeout;
|
||||||
|
int nullpath_ok;
|
||||||
|
/* private */
|
||||||
|
int show_help;
|
||||||
|
char *modules;
|
||||||
|
int debug;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fuse3_operations
|
||||||
|
{
|
||||||
|
/* S - supported by WinFsp */
|
||||||
|
/* S */ int (*getattr)(const char *path, struct fuse_stat *stbuf,
|
||||||
|
struct fuse3_file_info *fi);
|
||||||
|
/* S */ int (*readlink)(const char *path, char *buf, size_t size);
|
||||||
|
/* S */ int (*mknod)(const char *path, fuse_mode_t mode, fuse_dev_t dev);
|
||||||
|
/* S */ int (*mkdir)(const char *path, fuse_mode_t mode);
|
||||||
|
/* S */ int (*unlink)(const char *path);
|
||||||
|
/* S */ int (*rmdir)(const char *path);
|
||||||
|
/* S */ int (*symlink)(const char *dstpath, const char *srcpath);
|
||||||
|
/* S */ int (*rename)(const char *oldpath, const char *newpath, unsigned int flags);
|
||||||
|
/* _ */ int (*link)(const char *srcpath, const char *dstpath);
|
||||||
|
/* S */ int (*chmod)(const char *path, fuse_mode_t mode,
|
||||||
|
struct fuse3_file_info *fi);
|
||||||
|
/* S */ int (*chown)(const char *path, fuse_uid_t uid, fuse_gid_t gid,
|
||||||
|
struct fuse3_file_info *fi);
|
||||||
|
/* S */ int (*truncate)(const char *path, fuse_off_t size,
|
||||||
|
struct fuse3_file_info *fi);
|
||||||
|
/* S */ int (*open)(const char *path, struct fuse3_file_info *fi);
|
||||||
|
/* S */ int (*read)(const char *path, char *buf, size_t size, fuse_off_t off,
|
||||||
|
struct fuse3_file_info *fi);
|
||||||
|
/* S */ int (*write)(const char *path, const char *buf, size_t size, fuse_off_t off,
|
||||||
|
struct fuse3_file_info *fi);
|
||||||
|
/* S */ int (*statfs)(const char *path, struct fuse_statvfs *stbuf);
|
||||||
|
/* S */ int (*flush)(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 (*setxattr)(const char *path, const char *name, const char *value, size_t size,
|
||||||
|
int flags);
|
||||||
|
/* S */ int (*getxattr)(const char *path, const char *name, char *value, size_t size);
|
||||||
|
/* S */ int (*listxattr)(const char *path, char *namebuf, size_t size);
|
||||||
|
/* S */ int (*removexattr)(const char *path, const char *name);
|
||||||
|
/* 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,
|
||||||
|
struct fuse3_file_info *fi, enum fuse3_readdir_flags);
|
||||||
|
/* S */ int (*releasedir)(const char *path, struct fuse3_file_info *fi);
|
||||||
|
/* S */ int (*fsyncdir)(const char *path, int datasync, struct fuse3_file_info *fi);
|
||||||
|
/* S */ void *(*init)(struct fuse3_conn_info *conn,
|
||||||
|
struct fuse3_config *conf);
|
||||||
|
/* S */ void (*destroy)(void *data);
|
||||||
|
/* _ */ int (*access)(const char *path, int mask);
|
||||||
|
/* S */ int (*create)(const char *path, fuse_mode_t mode, struct fuse3_file_info *fi);
|
||||||
|
/* _ */ int (*lock)(const char *path,
|
||||||
|
struct fuse3_file_info *fi, int cmd, struct fuse_flock *lock);
|
||||||
|
/* S */ int (*utimens)(const char *path, const struct fuse_timespec tv[2],
|
||||||
|
struct fuse3_file_info *fi);
|
||||||
|
/* _ */ int (*bmap)(const char *path, size_t blocksize, uint64_t *idx);
|
||||||
|
/* S */ int (*ioctl)(const char *path, int cmd, void *arg, struct fuse3_file_info *fi,
|
||||||
|
unsigned int flags, void *data);
|
||||||
|
/* _ */ int (*poll)(const char *path, struct fuse3_file_info *fi,
|
||||||
|
struct fuse3_pollhandle *ph, unsigned *reventsp);
|
||||||
|
/* _ */ int (*write_buf)(const char *path,
|
||||||
|
struct fuse3_bufvec *buf, fuse_off_t off, struct fuse3_file_info *fi);
|
||||||
|
/* _ */ int (*read_buf)(const char *path,
|
||||||
|
struct fuse3_bufvec **bufp, size_t size, fuse_off_t off, struct fuse3_file_info *fi);
|
||||||
|
/* _ */ int (*flock)(const char *path, struct fuse3_file_info *, int op);
|
||||||
|
/* _ */ int (*fallocate)(const char *path, int mode, fuse_off_t off, fuse_off_t len,
|
||||||
|
struct fuse3_file_info *fi);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fuse3_context
|
||||||
|
{
|
||||||
|
struct fuse3 *fuse;
|
||||||
|
fuse_uid_t uid;
|
||||||
|
fuse_gid_t gid;
|
||||||
|
fuse_pid_t pid;
|
||||||
|
void *private_data;
|
||||||
|
fuse_mode_t umask;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define fuse_main(argc, argv, ops, data)\
|
||||||
|
fuse3_main_real(argc, argv, ops, sizeof *(ops), data)
|
||||||
|
|
||||||
|
FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse3_main_real)(struct fsp_fuse_env *env,
|
||||||
|
int argc, char *argv[],
|
||||||
|
const struct fuse3_operations *ops, size_t opsize, void *data);
|
||||||
|
FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse3_lib_help)(struct fsp_fuse_env *env,
|
||||||
|
struct fuse_args *args);
|
||||||
|
FSP_FUSE_API struct fuse3 *FSP_FUSE_API_NAME(fsp_fuse3_new_30)(struct fsp_fuse_env *env,
|
||||||
|
struct fuse_args *args,
|
||||||
|
const struct fuse3_operations *ops, size_t opsize, void *data);
|
||||||
|
FSP_FUSE_API struct fuse3 *FSP_FUSE_API_NAME(fsp_fuse3_new)(struct fsp_fuse_env *env,
|
||||||
|
struct fuse_args *args,
|
||||||
|
const struct fuse3_operations *ops, size_t opsize, void *data);
|
||||||
|
FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse3_destroy)(struct fsp_fuse_env *env,
|
||||||
|
struct fuse3 *f);
|
||||||
|
FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse3_mount)(struct fsp_fuse_env *env,
|
||||||
|
struct fuse3 *f, const char *mountpoint);
|
||||||
|
FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse3_unmount)(struct fsp_fuse_env *env,
|
||||||
|
struct fuse3 *f);
|
||||||
|
FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse3_loop)(struct fsp_fuse_env *env,
|
||||||
|
struct fuse3 *f);
|
||||||
|
FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse3_loop_mt_31)(struct fsp_fuse_env *env,
|
||||||
|
struct fuse3 *f, int clone_fd);
|
||||||
|
FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse3_loop_mt)(struct fsp_fuse_env *env,
|
||||||
|
struct fuse3 *f, struct fuse3_loop_config *config);
|
||||||
|
FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse3_exit)(struct fsp_fuse_env *env,
|
||||||
|
struct fuse3 *f);
|
||||||
|
FSP_FUSE_API struct fuse3_context *FSP_FUSE_API_NAME(fsp_fuse3_get_context)(struct fsp_fuse_env *env);
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_main_real(int argc, char *argv[],
|
||||||
|
const struct fuse3_operations *ops, size_t opsize, void *data),
|
||||||
|
{
|
||||||
|
return FSP_FUSE_API_CALL(fsp_fuse3_main_real)
|
||||||
|
(fsp_fuse_env(), argc, argv, ops, opsize, data);
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
void fuse3_lib_help(struct fuse_args *args),
|
||||||
|
{
|
||||||
|
FSP_FUSE_API_CALL(fsp_fuse3_lib_help)
|
||||||
|
(fsp_fuse_env(), args);
|
||||||
|
})
|
||||||
|
|
||||||
|
#if FUSE_USE_VERSION == 30
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
struct fuse3 *fuse3_new_30(struct fuse_args *args,
|
||||||
|
const struct fuse3_operations *ops, size_t opsize, void *data),
|
||||||
|
{
|
||||||
|
return FSP_FUSE_API_CALL(fsp_fuse3_new_30)
|
||||||
|
(fsp_fuse_env(), args, ops, opsize, data);
|
||||||
|
})
|
||||||
|
#define fuse_new(args, op, size, data)\
|
||||||
|
fuse3_new_30(args, op, size, data)
|
||||||
|
|
||||||
|
#else
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
struct fuse3 *fuse3_new(struct fuse_args *args,
|
||||||
|
const struct fuse3_operations *ops, size_t opsize, void *data),
|
||||||
|
{
|
||||||
|
return FSP_FUSE_API_CALL(fsp_fuse3_new)
|
||||||
|
(fsp_fuse_env(), args, ops, opsize, data);
|
||||||
|
})
|
||||||
|
#endif
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
void fuse3_destroy(struct fuse3 *f),
|
||||||
|
{
|
||||||
|
FSP_FUSE_API_CALL(fsp_fuse3_destroy)
|
||||||
|
(fsp_fuse_env(), f);
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_mount(struct fuse3 *f, const char *mountpoint),
|
||||||
|
{
|
||||||
|
return FSP_FUSE_API_CALL(fsp_fuse3_mount)
|
||||||
|
(fsp_fuse_env(), f, mountpoint);
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
void fuse3_unmount(struct fuse3 *f),
|
||||||
|
{
|
||||||
|
FSP_FUSE_API_CALL(fsp_fuse3_unmount)
|
||||||
|
(fsp_fuse_env(), f);
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_loop(struct fuse3 *f),
|
||||||
|
{
|
||||||
|
return FSP_FUSE_API_CALL(fsp_fuse3_loop)
|
||||||
|
(fsp_fuse_env(), f);
|
||||||
|
})
|
||||||
|
|
||||||
|
#if FUSE_USE_VERSION < 32
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_loop_mt_31(struct fuse3 *f, int clone_fd),
|
||||||
|
{
|
||||||
|
return FSP_FUSE_API_CALL(fsp_fuse3_loop_mt_31)
|
||||||
|
(fsp_fuse_env(), f, clone_fd);
|
||||||
|
})
|
||||||
|
#define fuse_loop_mt(f, clone_fd)\
|
||||||
|
fuse3_loop_mt_31(f, clone_fd)
|
||||||
|
|
||||||
|
#else
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_loop_mt(struct fuse3 *f, struct fuse3_loop_config *config),
|
||||||
|
{
|
||||||
|
return FSP_FUSE_API_CALL(fsp_fuse3_loop_mt)
|
||||||
|
(fsp_fuse_env(), f, config);
|
||||||
|
})
|
||||||
|
#endif
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
void fuse3_exit(struct fuse3 *f),
|
||||||
|
{
|
||||||
|
FSP_FUSE_API_CALL(fsp_fuse3_exit)
|
||||||
|
(fsp_fuse_env(), f);
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
struct fuse3_context *fuse3_get_context(void),
|
||||||
|
{
|
||||||
|
return FSP_FUSE_API_CALL(fsp_fuse3_get_context)
|
||||||
|
(fsp_fuse_env());
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_getgroups(int size, fuse_gid_t list[]),
|
||||||
|
{
|
||||||
|
(void)size;
|
||||||
|
(void)list;
|
||||||
|
return -ENOSYS;
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_interrupted(void),
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_invalidate_path(struct fuse3 *f, const char *path),
|
||||||
|
{
|
||||||
|
(void)f;
|
||||||
|
(void)path;
|
||||||
|
return -ENOENT;
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_notify_poll(struct fuse3_pollhandle *ph),
|
||||||
|
{
|
||||||
|
(void)ph;
|
||||||
|
return 0;
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_start_cleanup_thread(struct fuse3 *f),
|
||||||
|
{
|
||||||
|
(void)f;
|
||||||
|
return 0;
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
void fuse3_stop_cleanup_thread(struct fuse3 *f),
|
||||||
|
{
|
||||||
|
(void)f;
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_clean_cache(struct fuse3 *f),
|
||||||
|
{
|
||||||
|
(void)f;
|
||||||
|
return 600;
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
struct fuse3_session *fuse3_get_session(struct fuse3 *f),
|
||||||
|
{
|
||||||
|
return (struct fuse3_session *)f;
|
||||||
|
})
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
238
inc/fuse3/fuse_common.h
Normal file
238
inc/fuse3/fuse_common.h
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
/**
|
||||||
|
* @file fuse3/fuse_common.h
|
||||||
|
* WinFsp FUSE3 compatible API.
|
||||||
|
*
|
||||||
|
* This file is derived from libfuse/include/fuse_common.h:
|
||||||
|
* FUSE: Filesystem in Userspace
|
||||||
|
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
||||||
|
*
|
||||||
|
* @copyright 2015-2020 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 FUSE_COMMON_H_
|
||||||
|
#define FUSE_COMMON_H_
|
||||||
|
|
||||||
|
#include "winfsp_fuse.h"
|
||||||
|
#if !defined(WINFSP_DLL_INTERNAL)
|
||||||
|
#include "fuse_opt.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FUSE_MAJOR_VERSION 3
|
||||||
|
#define FUSE_MINOR_VERSION 2
|
||||||
|
#define FUSE_MAKE_VERSION(maj, min) ((maj) * 10 + (min))
|
||||||
|
#define FUSE_VERSION FUSE_MAKE_VERSION(FUSE_MAJOR_VERSION, FUSE_MINOR_VERSION)
|
||||||
|
|
||||||
|
#define FUSE_CAP_ASYNC_READ (1 << 0)
|
||||||
|
#define FUSE_CAP_POSIX_LOCKS (1 << 1)
|
||||||
|
#define FUSE_CAP_ATOMIC_O_TRUNC (1 << 3)
|
||||||
|
#define FUSE_CAP_EXPORT_SUPPORT (1 << 4)
|
||||||
|
#define FUSE_CAP_DONT_MASK (1 << 6)
|
||||||
|
#define FUSE_CAP_SPLICE_WRITE (1 << 7)
|
||||||
|
#define FUSE_CAP_SPLICE_MOVE (1 << 8)
|
||||||
|
#define FUSE_CAP_SPLICE_READ (1 << 9)
|
||||||
|
#define FUSE_CAP_FLOCK_LOCKS (1 << 10)
|
||||||
|
#define FUSE_CAP_IOCTL_DIR (1 << 11)
|
||||||
|
#define FUSE_CAP_AUTO_INVAL_DATA (1 << 12)
|
||||||
|
#define FUSE_CAP_READDIRPLUS (1 << 13)
|
||||||
|
#define FUSE_CAP_READDIRPLUS_AUTO (1 << 14)
|
||||||
|
#define FUSE_CAP_ASYNC_DIO (1 << 15)
|
||||||
|
#define FUSE_CAP_WRITEBACK_CACHE (1 << 16)
|
||||||
|
#define FUSE_CAP_NO_OPEN_SUPPORT (1 << 17)
|
||||||
|
#define FUSE_CAP_PARALLEL_DIROPS (1 << 18)
|
||||||
|
#define FUSE_CAP_POSIX_ACL (1 << 19)
|
||||||
|
#define FUSE_CAP_HANDLE_KILLPRIV (1 << 20)
|
||||||
|
#define FUSE_CAP_ALLOCATE (1 << 27) /* reserved (OSXFUSE) */
|
||||||
|
#define FUSE_CAP_EXCHANGE_DATA (1 << 28) /* reserved (OSXFUSE) */
|
||||||
|
#define FUSE_CAP_CASE_INSENSITIVE (1 << 29) /* file system is case insensitive */
|
||||||
|
#define FUSE_CAP_VOL_RENAME (1 << 30) /* reserved (OSXFUSE) */
|
||||||
|
#define FUSE_CAP_XTIMES (1 << 31) /* reserved (OSXFUSE) */
|
||||||
|
|
||||||
|
#define FSP_FUSE_CAP_CASE_INSENSITIVE FUSE_CAP_CASE_INSENSITIVE
|
||||||
|
|
||||||
|
#define FUSE_IOCTL_COMPAT (1 << 0)
|
||||||
|
#define FUSE_IOCTL_UNRESTRICTED (1 << 1)
|
||||||
|
#define FUSE_IOCTL_RETRY (1 << 2)
|
||||||
|
#define FUSE_IOCTL_DIR (1 << 4)
|
||||||
|
#define FUSE_IOCTL_MAX_IOV 256
|
||||||
|
|
||||||
|
#define FUSE_BUFVEC_INIT(s) \
|
||||||
|
((struct fuse3_bufvec){ 1, 0, 0, { {s, (enum fuse3_buf_flags)0, 0, -1, 0} } })
|
||||||
|
|
||||||
|
struct fuse3_file_info
|
||||||
|
{
|
||||||
|
int flags;
|
||||||
|
unsigned int writepage:1;
|
||||||
|
unsigned int direct_io:1;
|
||||||
|
unsigned int keep_cache:1;
|
||||||
|
unsigned int flush:1;
|
||||||
|
unsigned int nonseekable:1;
|
||||||
|
unsigned int flock_release:1;
|
||||||
|
unsigned int padding:27;
|
||||||
|
uint64_t fh;
|
||||||
|
uint64_t lock_owner;
|
||||||
|
uint32_t poll_events;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fuse3_loop_config
|
||||||
|
{
|
||||||
|
int clone_fd;
|
||||||
|
unsigned int max_idle_threads;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fuse3_conn_info
|
||||||
|
{
|
||||||
|
unsigned proto_major;
|
||||||
|
unsigned proto_minor;
|
||||||
|
unsigned max_write;
|
||||||
|
unsigned max_read;
|
||||||
|
unsigned max_readahead;
|
||||||
|
unsigned capable;
|
||||||
|
unsigned want;
|
||||||
|
unsigned max_background;
|
||||||
|
unsigned congestion_threshold;
|
||||||
|
unsigned time_gran;
|
||||||
|
unsigned reserved[22];
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fuse3_buf_flags
|
||||||
|
{
|
||||||
|
FUSE_BUF_IS_FD = (1 << 1),
|
||||||
|
FUSE_BUF_FD_SEEK = (1 << 2),
|
||||||
|
FUSE_BUF_FD_RETRY = (1 << 3),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fuse3_buf_copy_flags
|
||||||
|
{
|
||||||
|
FUSE_BUF_NO_SPLICE = (1 << 1),
|
||||||
|
FUSE_BUF_FORCE_SPLICE = (1 << 2),
|
||||||
|
FUSE_BUF_SPLICE_MOVE = (1 << 3),
|
||||||
|
FUSE_BUF_SPLICE_NONBLOCK = (1 << 4),
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fuse3_buf
|
||||||
|
{
|
||||||
|
size_t size;
|
||||||
|
enum fuse3_buf_flags flags;
|
||||||
|
void *mem;
|
||||||
|
int fd;
|
||||||
|
fuse_off_t pos;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fuse3_bufvec
|
||||||
|
{
|
||||||
|
size_t count;
|
||||||
|
size_t idx;
|
||||||
|
size_t off;
|
||||||
|
struct fuse3_buf buf[1];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fuse3_session;
|
||||||
|
struct fuse3_pollhandle;
|
||||||
|
struct fuse3_conn_info_opts;
|
||||||
|
|
||||||
|
FSP_FUSE_API struct fuse3_conn_info_opts *FSP_FUSE_API_NAME(fsp_fuse3_parse_conn_info_opts)(
|
||||||
|
struct fsp_fuse_env *env,
|
||||||
|
struct fuse_args *args);
|
||||||
|
FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse3_apply_conn_info_opts)(struct fsp_fuse_env *env,
|
||||||
|
struct fuse3_conn_info_opts *opts, struct fuse3_conn_info *conn);
|
||||||
|
FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse3_version)(struct fsp_fuse_env *env);
|
||||||
|
FSP_FUSE_API const char *FSP_FUSE_API_NAME(fsp_fuse3_pkgversion)(struct fsp_fuse_env *env);
|
||||||
|
FSP_FUSE_API int32_t FSP_FUSE_API_NAME(fsp_fuse_ntstatus_from_errno)(struct fsp_fuse_env *env,
|
||||||
|
int err);
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
struct fuse3_conn_info_opts* fuse3_parse_conn_info_opts(
|
||||||
|
struct fuse_args *args),
|
||||||
|
{
|
||||||
|
return FSP_FUSE_API_CALL(fsp_fuse3_parse_conn_info_opts)
|
||||||
|
(fsp_fuse_env(), args);
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
void fuse3_apply_conn_info_opts(
|
||||||
|
struct fuse3_conn_info_opts *opts, struct fuse3_conn_info *conn),
|
||||||
|
{
|
||||||
|
FSP_FUSE_API_CALL(fsp_fuse3_apply_conn_info_opts)
|
||||||
|
(fsp_fuse_env(), opts, conn);
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_version(void),
|
||||||
|
{
|
||||||
|
return FSP_FUSE_API_CALL(fsp_fuse3_version)
|
||||||
|
(fsp_fuse_env());
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
const char *fuse3_pkgversion(void),
|
||||||
|
{
|
||||||
|
return FSP_FUSE_API_CALL(fsp_fuse3_pkgversion)
|
||||||
|
(fsp_fuse_env());
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
void fuse3_pollhandle_destroy(struct fuse3_pollhandle *ph),
|
||||||
|
{
|
||||||
|
(void)ph;
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
size_t fuse3_buf_size(const struct fuse3_bufvec *bufv),
|
||||||
|
{
|
||||||
|
(void)bufv;
|
||||||
|
return 0;
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
ssize_t fuse3_buf_copy(struct fuse3_bufvec *dst, struct fuse3_bufvec *src,
|
||||||
|
enum fuse3_buf_copy_flags flags),
|
||||||
|
{
|
||||||
|
(void)dst;
|
||||||
|
(void)src;
|
||||||
|
(void)flags;
|
||||||
|
return 0;
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_daemonize(int foreground),
|
||||||
|
{
|
||||||
|
return fsp_fuse_daemonize(foreground);
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
int fuse3_set_signal_handlers(struct fuse3_session *se),
|
||||||
|
{
|
||||||
|
return fsp_fuse_set_signal_handlers(se);
|
||||||
|
})
|
||||||
|
|
||||||
|
FSP_FUSE_SYM(
|
||||||
|
void fuse3_remove_signal_handlers(struct fuse3_session *se),
|
||||||
|
{
|
||||||
|
(void)se;
|
||||||
|
fsp_fuse_set_signal_handlers(0);
|
||||||
|
})
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
23
inc/fuse3/fuse_opt.h
Normal file
23
inc/fuse3/fuse_opt.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* @file fuse3/fuse_opt.h
|
||||||
|
* WinFsp FUSE3 compatible API.
|
||||||
|
*
|
||||||
|
* @copyright 2015-2020 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 "../fuse/fuse_opt.h"
|
82
inc/fuse3/winfsp_fuse.h
Normal file
82
inc/fuse3/winfsp_fuse.h
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/**
|
||||||
|
* @file fuse3/winfsp_fuse.h
|
||||||
|
* WinFsp FUSE3 compatible API.
|
||||||
|
*
|
||||||
|
* @copyright 2015-2020 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 FUSE3_WINFSP_FUSE_H_INCLUDED
|
||||||
|
#define FUSE3_WINFSP_FUSE_H_INCLUDED
|
||||||
|
|
||||||
|
#include "../fuse/winfsp_fuse.h"
|
||||||
|
|
||||||
|
#if defined(_WIN64) || defined(_WIN32)
|
||||||
|
typedef intptr_t ssize_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(WINFSP_DLL_INTERNAL)
|
||||||
|
#define fuse3 fuse
|
||||||
|
#define fuse3_apply_conn_info_opts fuse_apply_conn_info_opts
|
||||||
|
#define fuse3_buf fuse_buf
|
||||||
|
#define fuse3_buf_copy fuse_buf_copy
|
||||||
|
#define fuse3_buf_copy_flags fuse_buf_copy_flags
|
||||||
|
#define fuse3_buf_flags fuse_buf_flags
|
||||||
|
#define fuse3_buf_size fuse_buf_size
|
||||||
|
#define fuse3_bufvec fuse_bufvec
|
||||||
|
#define fuse3_clean_cache fuse_clean_cache
|
||||||
|
#define fuse3_config fuse_config
|
||||||
|
#define fuse3_conn_info fuse_conn_info
|
||||||
|
#define fuse3_conn_info_opts fuse_conn_info_opts
|
||||||
|
#define fuse3_context fuse_context
|
||||||
|
#define fuse3_daemonize fuse_daemonize
|
||||||
|
#define fuse3_destroy fuse_destroy
|
||||||
|
#define fuse3_exit fuse_exit
|
||||||
|
#define fuse3_file_info fuse_file_info
|
||||||
|
#define fuse3_fill_dir_flags fuse_fill_dir_flags
|
||||||
|
#define fuse3_fill_dir_t fuse_fill_dir_t
|
||||||
|
#define fuse3_get_context fuse_get_context
|
||||||
|
#define fuse3_get_session fuse_get_session
|
||||||
|
#define fuse3_getgroups fuse_getgroups
|
||||||
|
#define fuse3_interrupted fuse_interrupted
|
||||||
|
#define fuse3_invalidate_path fuse_invalidate_path
|
||||||
|
#define fuse3_lib_help fuse_lib_help
|
||||||
|
#define fuse3_loop fuse_loop
|
||||||
|
#define fuse3_loop_config fuse_loop_config
|
||||||
|
#define fuse3_loop_mt fuse_loop_mt
|
||||||
|
#define fuse3_loop_mt_31 fuse_loop_mt_31
|
||||||
|
#define fuse3_main_real fuse_main_real
|
||||||
|
#define fuse3_mount fuse_mount
|
||||||
|
#define fuse3_new fuse_new
|
||||||
|
#define fuse3_new_30 fuse_new_30
|
||||||
|
#define fuse3_notify_poll fuse_notify_poll
|
||||||
|
#define fuse3_operations fuse_operations
|
||||||
|
#define fuse3_parse_conn_info_opts fuse_parse_conn_info_opts
|
||||||
|
#define fuse3_pkgversion fuse_pkgversion
|
||||||
|
#define fuse3_pollhandle fuse_pollhandle
|
||||||
|
#define fuse3_pollhandle_destroy fuse_pollhandle_destroy
|
||||||
|
#define fuse3_readdir_flags fuse_readdir_flags
|
||||||
|
#define fuse3_remove_signal_handlers fuse_remove_signal_handlers
|
||||||
|
#define fuse3_session fuse_session
|
||||||
|
#define fuse3_set_signal_handlers fuse_set_signal_handlers
|
||||||
|
#define fuse3_start_cleanup_thread fuse_start_cleanup_thread
|
||||||
|
#define fuse3_stop_cleanup_thread fuse_stop_cleanup_thread
|
||||||
|
#define fuse3_unmount fuse_unmount
|
||||||
|
#define fuse3_version fuse_version
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file winfsp/fsctl.h
|
* @file winfsp/fsctl.h
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2020 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
|
||||||
@ -34,6 +38,7 @@ extern "C" {
|
|||||||
#define FSP_FSCTL_DRIVER_NAME "WinFsp"
|
#define FSP_FSCTL_DRIVER_NAME "WinFsp"
|
||||||
#define FSP_FSCTL_DISK_DEVICE_NAME "WinFsp.Disk"
|
#define FSP_FSCTL_DISK_DEVICE_NAME "WinFsp.Disk"
|
||||||
#define FSP_FSCTL_NET_DEVICE_NAME "WinFsp.Net"
|
#define FSP_FSCTL_NET_DEVICE_NAME "WinFsp.Net"
|
||||||
|
#define FSP_FSCTL_MUP_DEVICE_NAME "WinFsp.Mup"
|
||||||
|
|
||||||
// {6F9D25FA-6DEE-4A9D-80F5-E98E14F35E54}
|
// {6F9D25FA-6DEE-4A9D-80F5-E98E14F35E54}
|
||||||
extern const __declspec(selectany) GUID FspFsctlDeviceClassGuid =
|
extern const __declspec(selectany) GUID FspFsctlDeviceClassGuid =
|
||||||
@ -49,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 \
|
||||||
@ -60,6 +67,14 @@ 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)
|
||||||
|
|
||||||
|
/* fsvol device codes */
|
||||||
|
#define FSP_FSCTL_QUERY_WINFSP \
|
||||||
|
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + '?', METHOD_BUFFERED, 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))
|
||||||
@ -78,12 +93,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 */
|
||||||
|
|
||||||
/* 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,
|
||||||
@ -114,7 +131,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,
|
||||||
@ -123,44 +140,79 @@ enum
|
|||||||
FspFsctlIrpCapacityMaximum = 1000,
|
FspFsctlIrpCapacityMaximum = 1000,
|
||||||
FspFsctlIrpCapacityDefault = 1000,
|
FspFsctlIrpCapacityDefault = 1000,
|
||||||
};
|
};
|
||||||
|
#define FSP_FSCTL_VOLUME_PARAMS_V0_FIELD_DEFN\
|
||||||
|
UINT16 Version; /* set to 0 or sizeof(FSP_FSCTL_VOLUME_PARAMS) */\
|
||||||
|
/* volume information */\
|
||||||
|
UINT16 SectorSize;\
|
||||||
|
UINT16 SectorsPerAllocationUnit;\
|
||||||
|
UINT16 MaxComponentLength; /* maximum file name component length (bytes) */\
|
||||||
|
UINT64 VolumeCreationTime;\
|
||||||
|
UINT32 VolumeSerialNumber;\
|
||||||
|
/* I/O timeouts, capacity, etc. */\
|
||||||
|
UINT32 TransactTimeout; /* DEPRECATED: (millis; 1 sec - 10 sec) */\
|
||||||
|
UINT32 IrpTimeout; /* pending IRP timeout (millis; 1 min - 10 min) */\
|
||||||
|
UINT32 IrpCapacity; /* maximum number of pending IRP's (100 - 1000)*/\
|
||||||
|
UINT32 FileInfoTimeout; /* FileInfo/Security/VolumeInfo timeout (millis) */\
|
||||||
|
/* FILE_FS_ATTRIBUTE_INFORMATION::FileSystemAttributes */\
|
||||||
|
UINT32 CaseSensitiveSearch:1; /* file system supports case-sensitive file names */\
|
||||||
|
UINT32 CasePreservedNames:1; /* file system preserves the case of file names */\
|
||||||
|
UINT32 UnicodeOnDisk:1; /* file system supports Unicode in file names */\
|
||||||
|
UINT32 PersistentAcls:1; /* file system preserves and enforces access control lists */\
|
||||||
|
UINT32 ReparsePoints:1; /* file system supports reparse points */\
|
||||||
|
UINT32 ReparsePointsAccessCheck:1; /* file system performs reparse point access checks */\
|
||||||
|
UINT32 NamedStreams:1; /* file system supports named streams */\
|
||||||
|
UINT32 HardLinks:1; /* unimplemented; set to 0 */\
|
||||||
|
UINT32 ExtendedAttributes:1; /* file system supports extended attributes */\
|
||||||
|
UINT32 ReadOnlyVolume:1;\
|
||||||
|
/* kernel-mode flags */\
|
||||||
|
UINT32 PostCleanupWhenModifiedOnly:1; /* post Cleanup when a file was modified/deleted */\
|
||||||
|
UINT32 PassQueryDirectoryPattern:1; /* pass Pattern during QueryDirectory operations */\
|
||||||
|
UINT32 AlwaysUseDoubleBuffering:1;\
|
||||||
|
UINT32 PassQueryDirectoryFileName:1; /* pass FileName during QueryDirectory (GetDirInfoByName) */\
|
||||||
|
UINT32 FlushAndPurgeOnCleanup:1; /* keeps file off "standby" list */\
|
||||||
|
UINT32 DeviceControl:1; /* support user-mode ioctl handling */\
|
||||||
|
/* user-mode flags */\
|
||||||
|
UINT32 UmFileContextIsUserContext2:1; /* user mode: FileContext parameter is UserContext2 */\
|
||||||
|
UINT32 UmFileContextIsFullContext:1; /* user mode: FileContext parameter is FullContext */\
|
||||||
|
UINT32 UmReservedFlags:6;\
|
||||||
|
/* additional kernel-mode flags */\
|
||||||
|
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 RejectIrpPriorToTransact0:1; /* reject IRP's prior to FspFsctlTransact with 0 buffers */\
|
||||||
|
UINT32 KmReservedFlags:3;\
|
||||||
|
WCHAR Prefix[FSP_FSCTL_VOLUME_PREFIX_SIZE / sizeof(WCHAR)]; /* UNC prefix (\Server\Share) */\
|
||||||
|
WCHAR FileSystemName[FSP_FSCTL_VOLUME_FSNAME_SIZE / sizeof(WCHAR)];
|
||||||
|
#define FSP_FSCTL_VOLUME_PARAMS_V1_FIELD_DEFN\
|
||||||
|
/* additional fields; specify .Version == sizeof(FSP_FSCTL_VOLUME_PARAMS) */\
|
||||||
|
UINT32 VolumeInfoTimeoutValid:1; /* VolumeInfoTimeout field is valid */\
|
||||||
|
UINT32 DirInfoTimeoutValid:1; /* DirInfoTimeout field is valid */\
|
||||||
|
UINT32 SecurityTimeoutValid:1; /* SecurityTimeout field is valid*/\
|
||||||
|
UINT32 StreamInfoTimeoutValid:1; /* StreamInfoTimeout field is valid */\
|
||||||
|
UINT32 EaTimeoutValid:1; /* EaTimeout field is valid */\
|
||||||
|
UINT32 KmAdditionalReservedFlags:27;\
|
||||||
|
UINT32 VolumeInfoTimeout; /* volume info timeout (millis); overrides FileInfoTimeout */\
|
||||||
|
UINT32 DirInfoTimeout; /* dir info timeout (millis); overrides FileInfoTimeout */\
|
||||||
|
UINT32 SecurityTimeout; /* security info timeout (millis); overrides FileInfoTimeout */\
|
||||||
|
UINT32 StreamInfoTimeout; /* stream info timeout (millis); overrides FileInfoTimeout */\
|
||||||
|
UINT32 EaTimeout; /* EA timeout (millis); overrides FileInfoTimeout */\
|
||||||
|
UINT32 FsextControlCode;\
|
||||||
|
UINT32 Reserved32[1];\
|
||||||
|
UINT64 Reserved64[2];
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
UINT16 Version; /* set to 0 */
|
FSP_FSCTL_VOLUME_PARAMS_V0_FIELD_DEFN
|
||||||
/* volume information */
|
} FSP_FSCTL_VOLUME_PARAMS_V0;
|
||||||
UINT16 SectorSize;
|
FSP_FSCTL_STATIC_ASSERT(456 == sizeof(FSP_FSCTL_VOLUME_PARAMS_V0),
|
||||||
UINT16 SectorsPerAllocationUnit;
|
"sizeof(FSP_FSCTL_VOLUME_PARAMS_V0) must be exactly 456.");
|
||||||
UINT16 MaxComponentLength; /* maximum file name component length (bytes) */
|
typedef struct
|
||||||
UINT64 VolumeCreationTime;
|
{
|
||||||
UINT32 VolumeSerialNumber;
|
FSP_FSCTL_VOLUME_PARAMS_V0_FIELD_DEFN
|
||||||
/* I/O timeouts, capacity, etc. */
|
FSP_FSCTL_VOLUME_PARAMS_V1_FIELD_DEFN
|
||||||
UINT32 TransactTimeout; /* FSP_FSCTL_TRANSACT timeout (millis; 1 sec - 10 sec) */
|
|
||||||
UINT32 IrpTimeout; /* pending IRP timeout (millis; 1 min - 10 min) */
|
|
||||||
UINT32 IrpCapacity; /* maximum number of pending IRP's (100 - 1000)*/
|
|
||||||
UINT32 FileInfoTimeout; /* FileInfo/Security/VolumeInfo timeout (millis) */
|
|
||||||
/* FILE_FS_ATTRIBUTE_INFORMATION::FileSystemAttributes */
|
|
||||||
UINT32 CaseSensitiveSearch:1; /* file system supports case-sensitive file names */
|
|
||||||
UINT32 CasePreservedNames:1; /* file system preserves the case of file names */
|
|
||||||
UINT32 UnicodeOnDisk:1; /* file system supports Unicode in file names */
|
|
||||||
UINT32 PersistentAcls:1; /* file system preserves and enforces access control lists */
|
|
||||||
UINT32 ReparsePoints:1; /* file system supports reparse points */
|
|
||||||
UINT32 ReparsePointsAccessCheck:1; /* file system performs reparse point access checks */
|
|
||||||
UINT32 NamedStreams:1; /* file system supports named streams */
|
|
||||||
UINT32 HardLinks:1; /* unimplemented; set to 0 */
|
|
||||||
UINT32 ExtendedAttributes:1; /* unimplemented; set to 0 */
|
|
||||||
UINT32 ReadOnlyVolume:1;
|
|
||||||
/* kernel-mode flags */
|
|
||||||
UINT32 PostCleanupWhenModifiedOnly:1; /* post Cleanup when a file was modified/deleted */
|
|
||||||
UINT32 PassQueryDirectoryPattern:1; /* pass Pattern during QueryDirectory operations */
|
|
||||||
UINT32 AlwaysUseDoubleBuffering:1;
|
|
||||||
UINT32 PassQueryDirectoryFileName:1; /* pass FileName during QueryDirectory (GetDirInfoByName) */
|
|
||||||
UINT32 KmReservedFlags:2;
|
|
||||||
/* user-mode flags */
|
|
||||||
UINT32 UmFileContextIsUserContext2:1; /* user mode: FileContext parameter is UserContext2 */
|
|
||||||
UINT32 UmFileContextIsFullContext:1; /* user mode: FileContext parameter is FullContext */
|
|
||||||
UINT32 UmReservedFlags:14;
|
|
||||||
WCHAR Prefix[FSP_FSCTL_VOLUME_PREFIX_SIZE / sizeof(WCHAR)]; /* UNC prefix (\Server\Share) */
|
|
||||||
WCHAR FileSystemName[FSP_FSCTL_VOLUME_FSNAME_SIZE / sizeof(WCHAR)];
|
|
||||||
} 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;
|
||||||
@ -168,6 +220,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;
|
||||||
@ -180,7 +234,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;
|
||||||
@ -191,10 +248,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;
|
||||||
@ -202,6 +265,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;
|
||||||
@ -230,7 +295,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 */
|
||||||
@ -238,7 +303,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
|
||||||
@ -248,6 +315,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
|
||||||
{
|
{
|
||||||
@ -324,6 +392,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;
|
||||||
@ -359,6 +438,14 @@ typedef struct
|
|||||||
UINT16 TargetOnFileSystem; /* the target of the symbolic link is on this file system */
|
UINT16 TargetOnFileSystem; /* the target of the symbolic link is on this file system */
|
||||||
} FileSystemControl;
|
} FileSystemControl;
|
||||||
struct
|
struct
|
||||||
|
{
|
||||||
|
UINT64 UserContext;
|
||||||
|
UINT64 UserContext2;
|
||||||
|
UINT32 IoControlCode;
|
||||||
|
FSP_FSCTL_TRANSACT_BUF Buffer;
|
||||||
|
UINT32 OutputLength;
|
||||||
|
} DeviceControl;
|
||||||
|
struct
|
||||||
{
|
{
|
||||||
UINT64 UserContext;
|
UINT64 UserContext;
|
||||||
UINT64 UserContext2;
|
UINT64 UserContext2;
|
||||||
@ -401,9 +488,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
|
||||||
@ -428,6 +517,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;
|
||||||
@ -444,6 +542,10 @@ typedef struct
|
|||||||
FSP_FSCTL_TRANSACT_BUF Buffer;
|
FSP_FSCTL_TRANSACT_BUF Buffer;
|
||||||
} FileSystemControl;
|
} FileSystemControl;
|
||||||
struct
|
struct
|
||||||
|
{
|
||||||
|
FSP_FSCTL_TRANSACT_BUF Buffer;
|
||||||
|
} DeviceControl;
|
||||||
|
struct
|
||||||
{
|
{
|
||||||
FSP_FSCTL_TRANSACT_BUF SecurityDescriptor;
|
FSP_FSCTL_TRANSACT_BUF SecurityDescriptor;
|
||||||
} QuerySecurity;
|
} QuerySecurity;
|
||||||
@ -503,11 +605,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,
|
||||||
@ -516,6 +620,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
|
||||||
|
349
inc/winfsp/launch.h
Normal file
349
inc/winfsp/launch.h
Normal file
@ -0,0 +1,349 @@
|
|||||||
|
/**
|
||||||
|
* @file winfsp/launch.h
|
||||||
|
* WinFsp Launch API.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @copyright 2015-2020 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_LAUNCH_H_INCLUDED
|
||||||
|
#define WINFSP_LAUNCH_H_INCLUDED
|
||||||
|
|
||||||
|
#include <winfsp/winfsp.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FSP_LAUNCH_REGKEY "Software\\WinFsp\\Services"
|
||||||
|
#define FSP_LAUNCH_REGKEY_WOW64 KEY_WOW64_32KEY
|
||||||
|
|
||||||
|
#define FSP_LAUNCH_PIPE_NAME "\\\\.\\pipe\\WinFsp.{14E7137D-22B4-437A-B0C1-D21D1BDF3767}"
|
||||||
|
#define FSP_LAUNCH_PIPE_BUFFER_SIZE 4096
|
||||||
|
#define FSP_LAUNCH_PIPE_OWNER ((PSID)WinLocalSystemSid)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The launcher named pipe SDDL gives full access to LocalSystem and Administrators and
|
||||||
|
* GENERIC_READ and FILE_WRITE_DATA access to Everyone. We are careful not to give the
|
||||||
|
* FILE_CREATE_PIPE_INSTANCE right to Everyone to disallow the creation of additional
|
||||||
|
* pipe instances.
|
||||||
|
*/
|
||||||
|
#define FSP_LAUNCH_PIPE_SDDL "O:SYG:SYD:P(A;;GA;;;SY)(A;;GA;;;BA)(A;;GRDCCR;;;WD)"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The default service instance SDDL gives full access to LocalSystem and Administrators.
|
||||||
|
* The only possible service instance rights are as follows:
|
||||||
|
* RP SERVICE_START
|
||||||
|
* WP SERVICE_STOP
|
||||||
|
* LC SERVICE_QUERY_STATUS
|
||||||
|
*
|
||||||
|
* To create a service that can be started, stopped or queried by Everyone, you can set
|
||||||
|
* the following SDDL:
|
||||||
|
* D:P(A;;RPWPLC;;;WD)
|
||||||
|
*/
|
||||||
|
#define FSP_LAUNCH_SERVICE_DEFAULT_SDDL "D:P(A;;RPWPLC;;;SY)(A;;RPWPLC;;;BA)"
|
||||||
|
#define FSP_LAUNCH_SERVICE_WORLD_SDDL "D:P(A;;RPWPLC;;;WD)"
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
FspLaunchCmdStart = 'S', /* requires: SERVICE_START */
|
||||||
|
FspLaunchCmdStartWithSecret = 'X', /* requires: SERVICE_START */
|
||||||
|
FspLaunchCmdStop = 'T', /* requires: SERVICE_STOP */
|
||||||
|
FspLaunchCmdGetInfo = 'I', /* requires: SERVICE_QUERY_STATUS */
|
||||||
|
FspLaunchCmdGetNameList = 'L', /* requires: none*/
|
||||||
|
FspLaunchCmdDefineDosDevice = 'D', /* internal: do not use! */
|
||||||
|
FspLaunchCmdQuit = 'Q', /* DEBUG version only */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
FspLaunchCmdSuccess = '$',
|
||||||
|
FspLaunchCmdFailure = '!',
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group Launch Control
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* 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 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 FspLaunchCallLauncherPipe(
|
||||||
|
WCHAR Command, ULONG Argc, PWSTR *Argv, ULONG *Argl,
|
||||||
|
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.
|
||||||
|
*
|
||||||
|
* @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 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 FspLaunchStart(
|
||||||
|
PWSTR ClassName, PWSTR InstanceName, ULONG Argc, PWSTR *Argv,
|
||||||
|
BOOLEAN HasSecret,
|
||||||
|
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.
|
||||||
|
*
|
||||||
|
* @param ClassName
|
||||||
|
* Class name of the service instance to stop.
|
||||||
|
* @param InstanceName
|
||||||
|
* Instance name of the service instance to stop.
|
||||||
|
* @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 FspLaunchStop(
|
||||||
|
PWSTR ClassName, PWSTR InstanceName,
|
||||||
|
PULONG PLauncherError);
|
||||||
|
/**
|
||||||
|
* Get information about a service instance.
|
||||||
|
*
|
||||||
|
* The information is a list of NULL-terminated strings: the class name of the service instance,
|
||||||
|
* the instance name of the service instance and the full command line used to start the service
|
||||||
|
* instance.
|
||||||
|
*
|
||||||
|
* @param ClassName
|
||||||
|
* Class name of the service instance to stop.
|
||||||
|
* @param InstanceName
|
||||||
|
* Instance name of the service instance to stop.
|
||||||
|
* @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 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 FspLaunchGetInfo(
|
||||||
|
PWSTR ClassName, PWSTR InstanceName,
|
||||||
|
PWSTR Buffer, PULONG PSize,
|
||||||
|
PULONG PLauncherError);
|
||||||
|
/**
|
||||||
|
* List service instances.
|
||||||
|
*
|
||||||
|
* The information is a list of pairs of NULL-terminated strings. Each pair contains the class
|
||||||
|
* name and instance name of a service instance. All currently running service instances are
|
||||||
|
* listed.
|
||||||
|
*
|
||||||
|
* @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 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 FspLaunchGetNameList(
|
||||||
|
PWSTR Buffer, PULONG PSize,
|
||||||
|
PULONG PLauncherError);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group Service Registry
|
||||||
|
*/
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable:4200) /* zero-sized array in struct/union */
|
||||||
|
/**
|
||||||
|
* Service registry record.
|
||||||
|
*/
|
||||||
|
typedef struct _FSP_LAUNCH_REG_RECORD
|
||||||
|
{
|
||||||
|
PWSTR Agent;
|
||||||
|
PWSTR Executable;
|
||||||
|
PWSTR CommandLine;
|
||||||
|
PWSTR WorkDirectory;
|
||||||
|
PWSTR RunAs;
|
||||||
|
PWSTR Security;
|
||||||
|
PWSTR AuthPackage;
|
||||||
|
PWSTR Stderr;
|
||||||
|
PVOID Reserved0[4];
|
||||||
|
ULONG JobControl;
|
||||||
|
ULONG Credentials;
|
||||||
|
ULONG AuthPackageId;
|
||||||
|
ULONG Recovery;
|
||||||
|
ULONG Reserved1[4];
|
||||||
|
UINT8 Buffer[];
|
||||||
|
} FSP_LAUNCH_REG_RECORD;
|
||||||
|
#pragma warning(pop)
|
||||||
|
/**
|
||||||
|
* Add/change/delete a service registry record.
|
||||||
|
*
|
||||||
|
* @param ClassName
|
||||||
|
* The service class name.
|
||||||
|
* @param Record
|
||||||
|
* The record to set in the registry. If NULL, the registry record is deleted.
|
||||||
|
* @return
|
||||||
|
* STATUS_SUCCESS or error code.
|
||||||
|
*/
|
||||||
|
FSP_API NTSTATUS FspLaunchRegSetRecord(
|
||||||
|
PWSTR ClassName,
|
||||||
|
const FSP_LAUNCH_REG_RECORD *Record);
|
||||||
|
/**
|
||||||
|
* Get a service registry record.
|
||||||
|
*
|
||||||
|
* @param ClassName
|
||||||
|
* The service class name.
|
||||||
|
* @param Agent
|
||||||
|
* The name of the agent that is retrieving the service record. This API matches
|
||||||
|
* the supplied Agent against the Agent in the service record and it only returns
|
||||||
|
* the record if they match. Pass NULL to match any Agent.
|
||||||
|
* @param PRecord
|
||||||
|
* Pointer to a record pointer. Memory for the service record will be allocated
|
||||||
|
* and a pointer to it will be stored at this address. This memory must be later
|
||||||
|
* freed using FspLaunchRegFreeRecord.
|
||||||
|
* @return
|
||||||
|
* STATUS_SUCCESS or error code.
|
||||||
|
* @see
|
||||||
|
* FspLaunchRegFreeRecord
|
||||||
|
*/
|
||||||
|
FSP_API NTSTATUS FspLaunchRegGetRecord(
|
||||||
|
PWSTR ClassName, PWSTR Agent,
|
||||||
|
FSP_LAUNCH_REG_RECORD **PRecord);
|
||||||
|
/**
|
||||||
|
* Free a service registry record.
|
||||||
|
*
|
||||||
|
* @param Record
|
||||||
|
* The service record to free.
|
||||||
|
* @see
|
||||||
|
* FspLaunchRegGetRecord
|
||||||
|
*/
|
||||||
|
FSP_API VOID FspLaunchRegFreeRecord(
|
||||||
|
FSP_LAUNCH_REG_RECORD *Record);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
@ -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-2020 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);
|
||||||
@ -822,12 +846,204 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE
|
|||||||
NTSTATUS (*GetDirInfoByName)(FSP_FILE_SYSTEM *FileSystem,
|
NTSTATUS (*GetDirInfoByName)(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileContext, PWSTR FileName,
|
PVOID FileContext, PWSTR FileName,
|
||||||
FSP_FSCTL_DIR_INFO *DirInfo);
|
FSP_FSCTL_DIR_INFO *DirInfo);
|
||||||
|
/**
|
||||||
|
* Process control code.
|
||||||
|
*
|
||||||
|
* This function is called when a program uses the DeviceIoControl API.
|
||||||
|
*
|
||||||
|
* @param FileSystem
|
||||||
|
* The file system on which this request is posted.
|
||||||
|
* @param FileContext
|
||||||
|
* The file context of the file or directory to be controled.
|
||||||
|
* @param ControlCode
|
||||||
|
* The control code for the operation. This code must have a DeviceType with bit
|
||||||
|
* 0x8000 set and must have a TransferType of METHOD_BUFFERED.
|
||||||
|
* @param InputBuffer
|
||||||
|
* Pointer to a buffer that contains the input data.
|
||||||
|
* @param InputBufferLength
|
||||||
|
* Input data length.
|
||||||
|
* @param OutputBuffer
|
||||||
|
* Pointer to a buffer that will receive the output data.
|
||||||
|
* @param OutputBufferLength
|
||||||
|
* Output data length.
|
||||||
|
* @param PBytesTransferred [out]
|
||||||
|
* Pointer to a memory location that will receive the actual number of bytes transferred.
|
||||||
|
* @return
|
||||||
|
* STATUS_SUCCESS or error code.
|
||||||
|
*/
|
||||||
|
NTSTATUS (*Control)(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
PVOID FileContext, UINT32 ControlCode,
|
||||||
|
PVOID InputBuffer, ULONG InputBufferLength,
|
||||||
|
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[39])();
|
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.");
|
||||||
@ -1131,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,
|
||||||
@ -1141,6 +1361,8 @@ FSP_API NTSTATUS FspFileSystemOpQueryDirectory(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 FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpFileSystemControl(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 FspFileSystemOpDeviceControl(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||||
FSP_API NTSTATUS FspFileSystemOpQuerySecurity(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpQuerySecurity(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 FspFileSystemOpSetSecurity(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpSetSecurity(FSP_FILE_SYSTEM *FileSystem,
|
||||||
@ -1359,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
|
||||||
@ -1703,133 +1989,6 @@ FSP_API NTSTATUS FspServiceContextCheck(HANDLE Token, PBOOLEAN PIsLocalSystem);
|
|||||||
FSP_API VOID FspServiceLog(ULONG Type, PWSTR Format, ...);
|
FSP_API VOID FspServiceLog(ULONG Type, PWSTR Format, ...);
|
||||||
FSP_API VOID FspServiceLogV(ULONG Type, PWSTR Format, va_list ap);
|
FSP_API VOID FspServiceLogV(ULONG Type, PWSTR Format, va_list ap);
|
||||||
|
|
||||||
/**
|
|
||||||
* @group Launch Control
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* 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 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 FspLaunchCallLauncherPipe(
|
|
||||||
WCHAR Command, ULONG Argc, PWSTR *Argv, ULONG *Argl,
|
|
||||||
PWSTR Buffer, PULONG PSize, 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 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 FspLaunchStart(
|
|
||||||
PWSTR ClassName, PWSTR InstanceName, ULONG Argc, PWSTR *Argv0,
|
|
||||||
BOOLEAN HasSecret,
|
|
||||||
PULONG PLauncherError);
|
|
||||||
/**
|
|
||||||
* Stop a service instance.
|
|
||||||
*
|
|
||||||
* @param ClassName
|
|
||||||
* Class name of the service instance to stop.
|
|
||||||
* @param InstanceName
|
|
||||||
* Instance name of the service instance to stop.
|
|
||||||
* @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 FspLaunchStop(
|
|
||||||
PWSTR ClassName, PWSTR InstanceName,
|
|
||||||
PULONG PLauncherError);
|
|
||||||
/**
|
|
||||||
* Get information about a service instance.
|
|
||||||
*
|
|
||||||
* The information is a list of NULL-terminated strings: the class name of the service instance,
|
|
||||||
* the instance name of the service instance and the full command line used to start the service
|
|
||||||
* instance.
|
|
||||||
*
|
|
||||||
* @param ClassName
|
|
||||||
* Class name of the service instance to stop.
|
|
||||||
* @param InstanceName
|
|
||||||
* Instance name of the service instance to stop.
|
|
||||||
* @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 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 FspLaunchGetInfo(
|
|
||||||
PWSTR ClassName, PWSTR InstanceName,
|
|
||||||
PWSTR Buffer, PULONG PSize,
|
|
||||||
PULONG PLauncherError);
|
|
||||||
/**
|
|
||||||
* List service instances.
|
|
||||||
*
|
|
||||||
* The information is a list of pairs of NULL-terminated strings. Each pair contains the class
|
|
||||||
* name and instance name of a service instance. All currently running service instances are
|
|
||||||
* listed.
|
|
||||||
*
|
|
||||||
* @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 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 FspLaunchGetNameList(
|
|
||||||
PWSTR Buffer, PULONG PSize,
|
|
||||||
PULONG PLauncherError);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Utility
|
* Utility
|
||||||
*/
|
*/
|
||||||
@ -1848,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-2020 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;
|
||||||
|
1
opt/cygfuse/.gitignore
vendored
Normal file
1
opt/cygfuse/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
build
|
@ -1,30 +1,59 @@
|
|||||||
Version = $(shell sed -n '/^VERSION=/s/VERSION=\(.*\)/\1/p' fuse.cygport)
|
Arch = $(shell uname -m)
|
||||||
#Debug = -g
|
Build = build
|
||||||
|
|
||||||
cygfuse-$(Version).dll libfuse-$(Version).dll.a fuse.pc: cygfuse.c fuse.pc.in
|
.PHONY: usage
|
||||||
gcc $(Debug) -shared -o cygfuse-$(Version).dll -Wl,--out-implib=libfuse-$(Version).dll.a -I../../inc/fuse cygfuse.c
|
usage:
|
||||||
[ -n "$(Debug)" ] || strip cygfuse-$(Version).dll
|
@echo "make cygport|dist" 1>&2
|
||||||
sed "s/@Version@/$(Version)/g" fuse.pc.in > fuse.pc
|
@exit 2
|
||||||
|
|
||||||
cygfuse-test.exe: cygfuse-test.c cygfuse-$(Version).dll libfuse-$(Version).dll.a
|
.PHONY: cygport dist clean
|
||||||
gcc $(Debug) -o cygfuse-test.exe -I../../inc/fuse -DCYGFUSE cygfuse-test.c -L$(PWD) -lfuse-$(Version)
|
cygport: clean cygport2 cygport3
|
||||||
|
dist: cygport dist2 dist3
|
||||||
|
clean:
|
||||||
|
rm -rf $(Build)
|
||||||
|
|
||||||
cygport:
|
.PHONY: cygport2
|
||||||
git clean -dfx
|
cygport2: $(Build)/winfsp-work-$(Arch).tar.gz
|
||||||
(\
|
cp fuse/fuse.cygport $(Build)/fuse.cygport
|
||||||
cd `git rev-parse --show-toplevel` &&\
|
CYGPORT_SRC_URI=winfsp-work-$(Arch).tar.gz CYGPORT_SRC_DIR=winfsp-work-$(Arch) \
|
||||||
Stash=`git stash create` &&\
|
cygport $(Build)/fuse.cygport download prep compile install package
|
||||||
git archive --prefix=winfsp-work/ --format=tar.gz $${Stash:-HEAD}\
|
|
||||||
> opt/cygfuse/winfsp-work.tar.gz\
|
|
||||||
)
|
|
||||||
CYGPORT_SRC_URI=winfsp-work.tar.gz CYGPORT_SRC_DIR=winfsp-work cygport fuse.cygport download prep compile install package
|
|
||||||
|
|
||||||
dist: cygport
|
.PHONY: cygport3
|
||||||
case $(shell uname -m) in \
|
cygport3: $(Build)/winfsp-work-$(Arch).tar.gz
|
||||||
x86_64)\
|
cp fuse3/fuse3.cygport $(Build)/fuse3.cygport
|
||||||
|
CYGPORT_SRC_URI=winfsp-work-$(Arch).tar.gz CYGPORT_SRC_DIR=winfsp-work-$(Arch) \
|
||||||
|
cygport $(Build)/fuse3.cygport download prep compile install package
|
||||||
|
|
||||||
|
$(Build)/winfsp-work-$(Arch).tar.gz:
|
||||||
|
mkdir -p $(Build)
|
||||||
|
( \
|
||||||
|
cd `git rev-parse --show-toplevel` && \
|
||||||
|
Stash=`git stash create` && \
|
||||||
|
git archive --prefix=winfsp-work-$(Arch)/ --format=tar.gz $${Stash:-HEAD} \
|
||||||
|
) > $(Build)/winfsp-work-$(Arch).tar.gz
|
||||||
|
|
||||||
|
.PHONY: dist2
|
||||||
|
dist2: cygport2
|
||||||
|
case $(Arch) in \
|
||||||
|
x86_64) \
|
||||||
mkdir -p dist/x64 && \
|
mkdir -p dist/x64 && \
|
||||||
cp fuse-*/dist/fuse/fuse-*[0-9].tar.xz dist/x64 ;;\
|
rm -f dist/x64/fuse-*[0-9].tar.xz && \
|
||||||
*)\
|
cp build/fuse-*[0-9].$(Arch)/dist/fuse/fuse-*[0-9].tar.xz dist/x64 ;; \
|
||||||
|
i686) \
|
||||||
mkdir -p dist/x86 && \
|
mkdir -p dist/x86 && \
|
||||||
cp fuse-*/dist/fuse/fuse-*[0-9].tar.xz dist/x86 ;;\
|
rm -f dist/x86/fuse-*[0-9].tar.xz && \
|
||||||
|
cp build/fuse-*[0-9].$(Arch)/dist/fuse/fuse-*[0-9].tar.xz dist/x86 ;; \
|
||||||
|
esac
|
||||||
|
|
||||||
|
.PHONY: dist3
|
||||||
|
dist3: cygport3
|
||||||
|
case $(Arch) in \
|
||||||
|
x86_64) \
|
||||||
|
mkdir -p dist/x64 && \
|
||||||
|
rm -f dist/x64/fuse3-*[0-9].tar.xz && \
|
||||||
|
cp build/fuse3-*[0-9].$(Arch)/dist/fuse3/fuse3-*[0-9].tar.xz dist/x64 ;; \
|
||||||
|
i686) \
|
||||||
|
mkdir -p dist/x86 && \
|
||||||
|
rm -f dist/x86/fuse3-*[0-9].tar.xz && \
|
||||||
|
cp build/fuse3-*[0-9].$(Arch)/dist/fuse3/fuse3-*[0-9].tar.xz dist/x86 ;; \
|
||||||
esac
|
esac
|
||||||
|
12
opt/cygfuse/dist/install.sh
vendored
12
opt/cygfuse/dist/install.sh
vendored
@ -1,8 +1,16 @@
|
|||||||
cd "$(dirname "$0")"
|
cd "$(dirname "$0")"
|
||||||
case $(uname -m) in
|
case $(uname -m) in
|
||||||
x86_64)
|
x86_64)
|
||||||
tar -C/ -xaf x64/fuse-2.8-*.tar.xz ;;
|
tar -C/ -xaf x64/fuse-*.tar.xz
|
||||||
|
tar -C/ -xaf x64/fuse3-*.tar.xz
|
||||||
|
;;
|
||||||
|
i686)
|
||||||
|
tar -C/ -xaf x86/fuse-*.tar.xz
|
||||||
|
tar -C/ -xaf x86/fuse3-*.tar.xz
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
tar -C/ -xaf x86/fuse-2.8-*.tar.xz ;;
|
echo unsupported architecture 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
echo FUSE for Cygwin installed.
|
echo FUSE for Cygwin installed.
|
||||||
|
12
opt/cygfuse/dist/uninstall.sh
vendored
12
opt/cygfuse/dist/uninstall.sh
vendored
@ -1,8 +1,16 @@
|
|||||||
cd "$(dirname "$0")"
|
cd "$(dirname "$0")"
|
||||||
case $(uname -m) in
|
case $(uname -m) in
|
||||||
x86_64)
|
x86_64)
|
||||||
tar -taf x64/fuse-2.8-*.tar.xz | sed -e '/\/$/d' -e 's/.*/\/&/' | xargs rm -f ;;
|
tar -taf x64/fuse-*.tar.xz | sed -e '/\/$/d' -e 's/.*/\/&/' | xargs rm -f
|
||||||
|
tar -taf x64/fuse3-*.tar.xz | sed -e '/\/$/d' -e 's/.*/\/&/' | xargs rm -f
|
||||||
|
;;
|
||||||
|
i686)
|
||||||
|
tar -taf x86/fuse-*.tar.xz | sed -e '/\/$/d' -e 's/.*/\/&/' | xargs rm -f
|
||||||
|
tar -taf x86/fuse3-*.tar.xz | sed -e '/\/$/d' -e 's/.*/\/&/' | xargs rm -f
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
tar -taf x86/fuse-2.8-*.tar.xz | sed -e '/\/$/d' -e 's/.*/\/&/' | xargs rm -f ;;
|
echo unsupported architecture 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
echo FUSE for Cygwin uninstalled.
|
echo FUSE for Cygwin uninstalled.
|
||||||
|
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-7.tar.xz
vendored
BIN
opt/cygfuse/dist/x64/fuse-2.8-7.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-7.tar.xz
vendored
BIN
opt/cygfuse/dist/x86/fuse-2.8-7.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.
29
opt/cygfuse/fuse/Makefile
Normal file
29
opt/cygfuse/fuse/Makefile
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
Version = $(shell sed -n '/^VERSION=/s/VERSION=\(.*\)/\1/p' fuse.cygport)
|
||||||
|
Arch = $(shell uname -m)
|
||||||
|
Build = build/$(Arch)
|
||||||
|
#Debug = -g
|
||||||
|
|
||||||
|
.PHONY: build test
|
||||||
|
build: $(Build)/cygfuse-$(Version).dll $(Build)/fuse.pc
|
||||||
|
test: $(Build)/cygfuse-test.exe
|
||||||
|
|
||||||
|
$(Build)/cygfuse-$(Version).dll: cygfuse.c fuse.cygport
|
||||||
|
@mkdir -p $(Build)
|
||||||
|
gcc $(Debug) \
|
||||||
|
-shared -o $(Build)/cygfuse-$(Version).dll \
|
||||||
|
-Wl,--out-implib=$(Build)/libfuse-$(Version).dll.a \
|
||||||
|
-I../../../inc/fuse \
|
||||||
|
cygfuse.c
|
||||||
|
[ -n "$(Debug)" ] || strip $(Build)/cygfuse-$(Version).dll
|
||||||
|
|
||||||
|
$(Build)/fuse.pc: fuse.pc.in fuse.cygport
|
||||||
|
@mkdir -p $(Build)
|
||||||
|
sed "s/@Version@/$(Version)/g" fuse.pc.in > $(Build)/fuse.pc
|
||||||
|
|
||||||
|
$(Build)/cygfuse-test.exe: cygfuse-test.c $(Build)/cygfuse-$(Version).dll
|
||||||
|
@mkdir -p $(Build)
|
||||||
|
gcc $(Debug) \
|
||||||
|
-o $(Build)/cygfuse-test.exe \
|
||||||
|
-I../../../inc/fuse -DCYGFUSE \
|
||||||
|
cygfuse-test.c \
|
||||||
|
-L$(PWD)/$(Build) -lfuse-$(Version)
|
@ -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 cygfuse/cygfuse.c
|
* @file fuse/cygfuse.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2020 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,9 +1,9 @@
|
|||||||
NAME="fuse"
|
NAME="fuse"
|
||||||
VERSION=2.8
|
VERSION=2.8
|
||||||
RELEASE=7
|
RELEASE=10
|
||||||
CATEGORY="Utils"
|
CATEGORY="Utils"
|
||||||
SUMMARY="WinFsp-FUSE compatibility layer"
|
SUMMARY="WinFsp FUSE compatibility layer"
|
||||||
DESCRIPTION="WinFsp-FUSE enables FUSE file systems to be run on Cygwin."
|
DESCRIPTION="Enables FUSE file systems to be run on Cygwin."
|
||||||
HOMEPAGE="http://www.secfs.net/winfsp/"
|
HOMEPAGE="http://www.secfs.net/winfsp/"
|
||||||
|
|
||||||
SRC_URI=${CYGPORT_SRC_URI:-"https://github.com/billziss-gh/winfsp/archive/master.tar.gz"}
|
SRC_URI=${CYGPORT_SRC_URI:-"https://github.com/billziss-gh/winfsp/archive/master.tar.gz"}
|
||||||
@ -12,7 +12,7 @@ SRC_DIR=${CYGPORT_SRC_DIR:-winfsp-master}
|
|||||||
src_compile()
|
src_compile()
|
||||||
{
|
{
|
||||||
lndirs
|
lndirs
|
||||||
cd ${B}/opt/cygfuse
|
cd ${B}/opt/cygfuse/fuse
|
||||||
make
|
make
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ src_install()
|
|||||||
doinclude fuse_opt.h
|
doinclude fuse_opt.h
|
||||||
doinclude winfsp_fuse.h
|
doinclude winfsp_fuse.h
|
||||||
|
|
||||||
cd ${B}/opt/cygfuse
|
cd ${B}/opt/cygfuse/fuse/build/$(ARCH)
|
||||||
dobin cygfuse-${VERSION}.dll
|
dobin cygfuse-${VERSION}.dll
|
||||||
dolib libfuse-${VERSION}.dll.a
|
dolib libfuse-${VERSION}.dll.a
|
||||||
dosym libfuse-${VERSION}.dll.a /usr/lib/libfuse.dll.a
|
dosym libfuse-${VERSION}.dll.a /usr/lib/libfuse.dll.a
|
29
opt/cygfuse/fuse3/Makefile
Normal file
29
opt/cygfuse/fuse3/Makefile
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
Version = $(shell sed -n '/^VERSION=/s/VERSION=\(.*\)/\1/p' fuse3.cygport)
|
||||||
|
Arch = $(shell uname -m)
|
||||||
|
Build = build/$(Arch)
|
||||||
|
#Debug = -g
|
||||||
|
|
||||||
|
.PHONY: build test
|
||||||
|
build: $(Build)/cygfuse-$(Version).dll $(Build)/fuse3.pc
|
||||||
|
test: $(Build)/cygfuse-test.exe
|
||||||
|
|
||||||
|
$(Build)/cygfuse-$(Version).dll: cygfuse.c fuse3.cygport
|
||||||
|
@mkdir -p $(Build)
|
||||||
|
gcc $(Debug) \
|
||||||
|
-shared -o $(Build)/cygfuse-$(Version).dll \
|
||||||
|
-Wl,--out-implib=$(Build)/libfuse-$(Version).dll.a \
|
||||||
|
-I../../../inc/fuse3 \
|
||||||
|
cygfuse.c
|
||||||
|
[ -n "$(Debug)" ] || strip $(Build)/cygfuse-$(Version).dll
|
||||||
|
|
||||||
|
$(Build)/fuse3.pc: fuse3.pc.in fuse3.cygport
|
||||||
|
@mkdir -p $(Build)
|
||||||
|
sed "s/@Version@/$(Version)/g" fuse3.pc.in > $(Build)/fuse3.pc
|
||||||
|
|
||||||
|
$(Build)/cygfuse-test.exe: cygfuse-test.c $(Build)/cygfuse-$(Version).dll
|
||||||
|
@mkdir -p $(Build)
|
||||||
|
gcc $(Debug) \
|
||||||
|
-o $(Build)/cygfuse-test.exe \
|
||||||
|
-I../../../inc/fuse3 -DCYGFUSE \
|
||||||
|
cygfuse-test.c \
|
||||||
|
-L$(PWD)/$(Build) -lfuse-$(Version)
|
6
opt/cygfuse/fuse3/cygfuse-test.c
Normal file
6
opt/cygfuse/fuse3/cygfuse-test.c
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include <fuse.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
return !(FUSE_VERSION == fuse_version());
|
||||||
|
}
|
173
opt/cygfuse/fuse3/cygfuse.c
Normal file
173
opt/cygfuse/fuse3/cygfuse.c
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
/**
|
||||||
|
* @file fuse3/cygfuse.c
|
||||||
|
*
|
||||||
|
* @copyright 2015-2020 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 <dlfcn.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/cygwin.h>
|
||||||
|
|
||||||
|
static void *cygfuse_init_slow(int force);
|
||||||
|
static void *cygfuse_init_winfsp();
|
||||||
|
|
||||||
|
static pthread_mutex_t cygfuse_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
static void *cygfuse_handle = 0;
|
||||||
|
|
||||||
|
static inline void *cygfuse_init_fast(void)
|
||||||
|
{
|
||||||
|
void *handle = cygfuse_handle;
|
||||||
|
__sync_synchronize(); /* memory barrier */
|
||||||
|
if (0 == handle)
|
||||||
|
handle = cygfuse_init_slow(0);
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *cygfuse_init_slow(int force)
|
||||||
|
{
|
||||||
|
void *handle;
|
||||||
|
pthread_mutex_lock(&cygfuse_mutex);
|
||||||
|
handle = cygfuse_handle;
|
||||||
|
if (force || 0 == handle)
|
||||||
|
{
|
||||||
|
handle = cygfuse_init_winfsp();
|
||||||
|
__sync_synchronize(); /* memory barrier */
|
||||||
|
cygfuse_handle = handle;
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&cygfuse_mutex);
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unfortunately Cygwin fork is very fragile and cannot even correctly
|
||||||
|
* handle dlopen'ed DLL's if they are native (rather than Cygwin ones).
|
||||||
|
*
|
||||||
|
* So we have this very nasty hack where we reset the dlopen'ed handle
|
||||||
|
* immediately after daemonization. This will force cygfuse_init() to
|
||||||
|
* reload the WinFsp DLL and reset all API pointers in the daemonized
|
||||||
|
* process.
|
||||||
|
*/
|
||||||
|
static inline int cygfuse_daemon(int nochdir, int noclose)
|
||||||
|
{
|
||||||
|
if (-1 == daemon(nochdir, noclose))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* force reload of WinFsp DLL to workaround fork() problems */
|
||||||
|
cygfuse_init_slow(1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#define daemon cygfuse_daemon
|
||||||
|
|
||||||
|
#define FSP_FUSE_API static
|
||||||
|
#define FSP_FUSE_API_NAME(api) (* pfn_ ## api)
|
||||||
|
#define FSP_FUSE_API_CALL(api) (cygfuse_init_fast(), pfn_ ## api)
|
||||||
|
#define FSP_FUSE_SYM(proto, ...) __attribute__ ((visibility("default"))) proto { __VA_ARGS__ }
|
||||||
|
#include <fuse_common.h>
|
||||||
|
#include <fuse.h>
|
||||||
|
#include <fuse_opt.h>
|
||||||
|
|
||||||
|
#if defined(__LP64__)
|
||||||
|
#define CYGFUSE_WINFSP_NAME "winfsp-x64.dll"
|
||||||
|
#else
|
||||||
|
#define CYGFUSE_WINFSP_NAME "winfsp-x86.dll"
|
||||||
|
#endif
|
||||||
|
#define CYGFUSE_WINFSP_PATH "bin\\" CYGFUSE_WINFSP_NAME
|
||||||
|
#define CYGFUSE_GET_API(h, n) \
|
||||||
|
if (0 == (*(void **)&(pfn_ ## n) = dlsym(h, #n)))\
|
||||||
|
return cygfuse_init_fail();
|
||||||
|
|
||||||
|
static void *cygfuse_init_fail();
|
||||||
|
static void *cygfuse_init_winfsp()
|
||||||
|
{
|
||||||
|
void *h;
|
||||||
|
|
||||||
|
h = dlopen(CYGFUSE_WINFSP_NAME, RTLD_NOW);
|
||||||
|
if (0 == h)
|
||||||
|
{
|
||||||
|
char winpath[260], *psxpath;
|
||||||
|
int regfd, bytes;
|
||||||
|
|
||||||
|
regfd = open("/proc/registry32/HKEY_LOCAL_MACHINE/Software/WinFsp/InstallDir", O_RDONLY);
|
||||||
|
if (-1 == regfd)
|
||||||
|
return cygfuse_init_fail();
|
||||||
|
|
||||||
|
bytes = read(regfd, winpath, sizeof winpath - sizeof CYGFUSE_WINFSP_PATH);
|
||||||
|
close(regfd);
|
||||||
|
if (-1 == bytes || 0 == bytes)
|
||||||
|
return cygfuse_init_fail();
|
||||||
|
|
||||||
|
if ('\0' == winpath[bytes - 1])
|
||||||
|
bytes--;
|
||||||
|
memcpy(winpath + bytes, CYGFUSE_WINFSP_PATH, sizeof CYGFUSE_WINFSP_PATH);
|
||||||
|
|
||||||
|
psxpath = (char *)cygwin_create_path(CCP_WIN_A_TO_POSIX | CCP_PROC_CYGDRIVE, winpath);
|
||||||
|
if (0 == psxpath)
|
||||||
|
return cygfuse_init_fail();
|
||||||
|
|
||||||
|
h = dlopen(psxpath, RTLD_NOW);
|
||||||
|
free(psxpath);
|
||||||
|
if (0 == h)
|
||||||
|
return cygfuse_init_fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* winfsp_fuse.h */
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse_signal_handler);
|
||||||
|
|
||||||
|
/* fuse_common.h */
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_parse_conn_info_opts);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_apply_conn_info_opts);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_version);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_pkgversion);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse_ntstatus_from_errno);
|
||||||
|
|
||||||
|
/* fuse.h */
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_main_real);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_lib_help);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_new_30);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_new);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_destroy);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_mount);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_unmount);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_loop);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_loop_mt_31);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_loop_mt);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_exit);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse3_get_context);
|
||||||
|
|
||||||
|
/* fuse_opt.h */
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse_opt_parse);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse_opt_add_arg);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse_opt_insert_arg);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse_opt_free_args);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse_opt_add_opt);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse_opt_add_opt_escaped);
|
||||||
|
CYGFUSE_GET_API(h, fsp_fuse_opt_match);
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *cygfuse_init_fail()
|
||||||
|
{
|
||||||
|
fprintf(stderr, "cygfuse: initialization failed: " CYGFUSE_WINFSP_NAME " not found\n");
|
||||||
|
exit(1);
|
||||||
|
return 0;
|
||||||
|
}
|
37
opt/cygfuse/fuse3/fuse3.cygport
Normal file
37
opt/cygfuse/fuse3/fuse3.cygport
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
NAME="fuse3"
|
||||||
|
VERSION=3.2
|
||||||
|
RELEASE=2
|
||||||
|
CATEGORY="Utils"
|
||||||
|
SUMMARY="WinFsp FUSE3 compatibility layer"
|
||||||
|
DESCRIPTION="Enables FUSE3 file systems to be run on Cygwin."
|
||||||
|
HOMEPAGE="http://www.secfs.net/winfsp/"
|
||||||
|
|
||||||
|
SRC_URI=${CYGPORT_SRC_URI:-"https://github.com/billziss-gh/winfsp/archive/master.tar.gz"}
|
||||||
|
SRC_DIR=${CYGPORT_SRC_DIR:-winfsp-master}
|
||||||
|
|
||||||
|
REQUIRES="fuse"
|
||||||
|
|
||||||
|
src_compile()
|
||||||
|
{
|
||||||
|
lndirs
|
||||||
|
cd ${B}/opt/cygfuse/fuse3
|
||||||
|
make
|
||||||
|
}
|
||||||
|
|
||||||
|
src_install()
|
||||||
|
{
|
||||||
|
cd ${B}/inc/fuse3
|
||||||
|
includeinto fuse3
|
||||||
|
doinclude fuse.h
|
||||||
|
doinclude fuse_common.h
|
||||||
|
doinclude fuse_opt.h
|
||||||
|
doinclude winfsp_fuse.h
|
||||||
|
|
||||||
|
cd ${B}/opt/cygfuse/fuse3/build/$(ARCH)
|
||||||
|
dobin cygfuse-${VERSION}.dll
|
||||||
|
dolib libfuse-${VERSION}.dll.a
|
||||||
|
dosym libfuse-${VERSION}.dll.a /usr/lib/libfuse3.dll.a
|
||||||
|
dopkgconfig fuse3.pc
|
||||||
|
}
|
||||||
|
|
||||||
|
RESTRICT="strip postinst-doc"
|
9
opt/cygfuse/fuse3/fuse3.pc.in
Normal file
9
opt/cygfuse/fuse3/fuse3.pc.in
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
prefix=/usr
|
||||||
|
incdir=${prefix}/include/fuse3
|
||||||
|
|
||||||
|
Name: fuse
|
||||||
|
Description: WinFsp FUSE3 compatible API
|
||||||
|
Version: @Version@
|
||||||
|
URL: http://www.secfs.net/winfsp/
|
||||||
|
Libs: -lfuse-@Version@
|
||||||
|
Cflags: -I"${incdir}" -DCYGFUSE
|
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-2020 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-2020 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-2020 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>
|
||||||
@ -331,6 +335,18 @@ FSP_API VOID FspFileSystemReleaseDirectoryBuffer(PVOID *PDirBuffer)
|
|||||||
|
|
||||||
FSP_FILE_SYSTEM_DIRECTORY_BUFFER *DirBuffer = *PDirBuffer;
|
FSP_FILE_SYSTEM_DIRECTORY_BUFFER *DirBuffer = *PDirBuffer;
|
||||||
|
|
||||||
|
/* eliminate invalidated entries from the index */
|
||||||
|
PULONG Index = (PULONG)(DirBuffer->Buffer + DirBuffer->HiMark);
|
||||||
|
ULONG Count = (DirBuffer->Capacity - DirBuffer->HiMark) / sizeof(ULONG);
|
||||||
|
ULONG I, J;
|
||||||
|
for (I = Count - 1, J = Count; I < Count; I--)
|
||||||
|
{
|
||||||
|
if (FspFileSystemDirectoryBufferEntryInvalid == Index[I])
|
||||||
|
continue;
|
||||||
|
Index[--J] = Index[I];
|
||||||
|
}
|
||||||
|
DirBuffer->HiMark = (ULONG)((PUINT8)&Index[J] - DirBuffer->Buffer);
|
||||||
|
|
||||||
FspFileSystemSortDirectoryBuffer(DirBuffer);
|
FspFileSystemSortDirectoryBuffer(DirBuffer);
|
||||||
|
|
||||||
ReleaseSRWLockExclusive(&DirBuffer->Lock);
|
ReleaseSRWLockExclusive(&DirBuffer->Lock);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/eventlog.c
|
* @file dll/eventlog.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2020 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>
|
||||||
|
362
src/dll/fs.c
362
src/dll/fs.c
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fs.c
|
* @file dll/fs.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2020 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,11 +141,14 @@ 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;
|
||||||
FileSystem->Operations[FspFsctlTransactQueryDirectoryKind] = FspFileSystemOpQueryDirectory;
|
FileSystem->Operations[FspFsctlTransactQueryDirectoryKind] = FspFileSystemOpQueryDirectory;
|
||||||
FileSystem->Operations[FspFsctlTransactFileSystemControlKind] = FspFileSystemOpFileSystemControl;
|
FileSystem->Operations[FspFsctlTransactFileSystemControlKind] = FspFileSystemOpFileSystemControl;
|
||||||
|
FileSystem->Operations[FspFsctlTransactDeviceControlKind] = FspFileSystemOpDeviceControl;
|
||||||
FileSystem->Operations[FspFsctlTransactQuerySecurityKind] = FspFileSystemOpQuerySecurity;
|
FileSystem->Operations[FspFsctlTransactQuerySecurityKind] = FspFileSystemOpQuerySecurity;
|
||||||
FileSystem->Operations[FspFsctlTransactSetSecurityKind] = FspFileSystemOpSetSecurity;
|
FileSystem->Operations[FspFsctlTransactSetSecurityKind] = FspFileSystemOpSetSecurity;
|
||||||
FileSystem->Operations[FspFsctlTransactQueryStreamInformationKind] = FspFileSystemOpQueryStreamInformation;
|
FileSystem->Operations[FspFsctlTransactQueryStreamInformationKind] = FspFileSystemOpQueryStreamInformation;
|
||||||
@ -187,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('D', 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);
|
||||||
@ -397,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;
|
||||||
@ -535,6 +273,13 @@ static DWORD WINAPI FspFileSystemDispatcherThread(PVOID FileSystem0)
|
|||||||
OperationContext.Response = Response;
|
OperationContext.Response = Response;
|
||||||
TlsSetValue(FspFileSystemTlsKey, &OperationContext);
|
TlsSetValue(FspFileSystemTlsKey, &OperationContext);
|
||||||
|
|
||||||
|
#if defined(FSP_CFG_REJECT_EARLY_IRP)
|
||||||
|
Result = FspFsctlTransact(FileSystem->VolumeHandle, 0, 0, 0, 0, FALSE);
|
||||||
|
/* send a Transact0 to inform the FSD that the dispatcher is ready */
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
goto exit;
|
||||||
|
#endif
|
||||||
|
|
||||||
memset(Response, 0, sizeof *Response);
|
memset(Response, 0, sizeof *Response);
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
@ -629,6 +374,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-2020 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>
|
||||||
@ -31,7 +35,7 @@ FSP_API NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath,
|
|||||||
{
|
{
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
PWSTR DeviceRoot;
|
PWSTR DeviceRoot;
|
||||||
SIZE_T DeviceRootSize, DevicePathSize;
|
SIZE_T DeviceRootSize, DevicePathSize, VolumeParamsSize;
|
||||||
WCHAR DevicePathBuf[MAX_PATH + sizeof *VolumeParams], *DevicePathPtr, *DevicePathEnd;
|
WCHAR DevicePathBuf[MAX_PATH + sizeof *VolumeParams], *DevicePathPtr, *DevicePathEnd;
|
||||||
HANDLE VolumeHandle = INVALID_HANDLE_VALUE;
|
HANDLE VolumeHandle = INVALID_HANDLE_VALUE;
|
||||||
DWORD Bytes;
|
DWORD Bytes;
|
||||||
@ -55,8 +59,11 @@ FSP_API NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath,
|
|||||||
memcpy(DevicePathPtr, DevicePath, DevicePathSize);
|
memcpy(DevicePathPtr, DevicePath, DevicePathSize);
|
||||||
DevicePathPtr = (PVOID)((PUINT8)DevicePathPtr + DevicePathSize);
|
DevicePathPtr = (PVOID)((PUINT8)DevicePathPtr + DevicePathSize);
|
||||||
memcpy(DevicePathPtr, PREFIXW, PREFIXW_SIZE);
|
memcpy(DevicePathPtr, PREFIXW, PREFIXW_SIZE);
|
||||||
|
VolumeParamsSize = 0 == VolumeParams->Version ?
|
||||||
|
sizeof(FSP_FSCTL_VOLUME_PARAMS_V0) :
|
||||||
|
VolumeParams->Version;
|
||||||
DevicePathPtr = (PVOID)((PUINT8)DevicePathPtr + PREFIXW_SIZE);
|
DevicePathPtr = (PVOID)((PUINT8)DevicePathPtr + PREFIXW_SIZE);
|
||||||
DevicePathEnd = (PVOID)((PUINT8)DevicePathPtr + sizeof *VolumeParams * sizeof(WCHAR));
|
DevicePathEnd = (PVOID)((PUINT8)DevicePathPtr + VolumeParamsSize * sizeof(WCHAR));
|
||||||
for (PUINT8 VolumeParamsPtr = (PVOID)VolumeParams;
|
for (PUINT8 VolumeParamsPtr = (PVOID)VolumeParams;
|
||||||
DevicePathEnd > DevicePathPtr; DevicePathPtr++, VolumeParamsPtr++)
|
DevicePathEnd > DevicePathPtr; DevicePathPtr++, VolumeParamsPtr++)
|
||||||
{
|
{
|
||||||
@ -100,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,
|
||||||
@ -221,6 +242,22 @@ static NTSTATUS FspFsctlStartService(VOID)
|
|||||||
DWORD LastError;
|
DWORD LastError;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
/* Determine if we are running inside container.
|
||||||
|
*
|
||||||
|
* See https://github.com/microsoft/perfview/blob/V1.9.65/src/TraceEvent/TraceEventSession.cs#L525
|
||||||
|
* See https://stackoverflow.com/a/50748300
|
||||||
|
*/
|
||||||
|
LastError = RegGetValueW(
|
||||||
|
HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control",
|
||||||
|
L"ContainerType",
|
||||||
|
RRF_RT_REG_DWORD, 0,
|
||||||
|
0, 0);
|
||||||
|
if (ERROR_SUCCESS == LastError)
|
||||||
|
{
|
||||||
|
Result = STATUS_SUCCESS;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
ScmHandle = OpenSCManagerW(0, 0, 0);
|
ScmHandle = OpenSCManagerW(0, 0, 0);
|
||||||
if (0 == ScmHandle)
|
if (0 == ScmHandle)
|
||||||
{
|
{
|
||||||
|
309
src/dll/fsop.c
309
src/dll/fsop.c
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fsop.c
|
* @file dll/fsop.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2020 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;
|
||||||
@ -672,7 +760,7 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F
|
|||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
WCHAR Root[2] = L"\\";
|
WCHAR Root[2] = L"\\";
|
||||||
PWSTR Parent, Suffix;
|
PWSTR Parent, Suffix;
|
||||||
UINT32 GrantedAccess;
|
UINT32 CreateOptions, 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;
|
||||||
UINT32 Information;
|
UINT32 Information;
|
||||||
@ -687,8 +775,10 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F
|
|||||||
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;
|
||||||
FspPathSuffix((PWSTR)Request->Buffer, &Parent, &Suffix, Root);
|
FspPathSuffix((PWSTR)Request->Buffer, &Parent, &Suffix, Root);
|
||||||
|
CreateOptions =
|
||||||
|
(Request->Req.Create.CreateOptions | FILE_DIRECTORY_FILE) & ~FILE_NON_DIRECTORY_FILE;
|
||||||
Result = FileSystem->Interface->Open(FileSystem,
|
Result = FileSystem->Interface->Open(FileSystem,
|
||||||
Parent, Request->Req.Create.CreateOptions, GrantedAccess,
|
Parent, CreateOptions, GrantedAccess,
|
||||||
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
AddrOfFileContext(FullContext), &OpenFileInfo.FileInfo);
|
||||||
FspPathCombine((PWSTR)Request->Buffer, Suffix);
|
FspPathCombine((PWSTR)Request->Buffer, Suffix);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
@ -807,9 +897,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 +942,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 +1144,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 +1188,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)
|
||||||
{
|
{
|
||||||
@ -1247,6 +1400,30 @@ FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FSP_API NTSTATUS FspFileSystemOpDeviceControl(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
|
{
|
||||||
|
NTSTATUS Result;
|
||||||
|
ULONG BytesTransferred;
|
||||||
|
|
||||||
|
if (0 == FileSystem->Interface->Control)
|
||||||
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
||||||
|
Result = FileSystem->Interface->Control(FileSystem,
|
||||||
|
(PVOID)ValOfFileContext(Request->Req.DeviceControl),
|
||||||
|
Request->Req.DeviceControl.IoControlCode,
|
||||||
|
Request->Buffer, Request->Req.DeviceControl.Buffer.Size,
|
||||||
|
Response->Buffer, Request->Req.DeviceControl.OutputLength/* FSD guarantees correct size! */,
|
||||||
|
&BytesTransferred);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
return STATUS_BUFFER_OVERFLOW != Result ? Result : STATUS_BUFFER_TOO_SMALL;
|
||||||
|
|
||||||
|
Response->Size = (UINT16)(sizeof *Response + BytesTransferred);
|
||||||
|
Response->Rsp.DeviceControl.Buffer.Offset = 0;
|
||||||
|
Response->Rsp.DeviceControl.Buffer.Size = (UINT16)BytesTransferred;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
FSP_API NTSTATUS FspFileSystemOpQuerySecurity(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpQuerySecurity(FSP_FILE_SYSTEM *FileSystem,
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||||
{
|
{
|
||||||
@ -1571,9 +1748,15 @@ reparse_data_exit:
|
|||||||
return IO_REPARSE_TAG_SYMLINK != ReparseData->ReparseTag ?
|
return IO_REPARSE_TAG_SYMLINK != ReparseData->ReparseTag ?
|
||||||
STATUS_IO_REPARSE_DATA_INVALID : STATUS_REPARSE_POINT_NOT_RESOLVED;
|
STATUS_IO_REPARSE_DATA_INVALID : STATUS_REPARSE_POINT_NOT_RESOLVED;
|
||||||
|
|
||||||
|
if (IO_REPARSE_TAG_MOUNT_POINT == ReparseData->ReparseTag)
|
||||||
|
RemainderPathSize = lstrlenW(RemainderPath) * sizeof(WCHAR);
|
||||||
|
|
||||||
*PSize = ReparseDataSize;
|
*PSize = ReparseDataSize;
|
||||||
memcpy(Buffer, ReparseData, ReparseDataSize);
|
memcpy(Buffer, ReparseData, ReparseDataSize);
|
||||||
|
|
||||||
|
if (IO_REPARSE_TAG_MOUNT_POINT == ReparseData->ReparseTag)
|
||||||
|
OutputReparseData->Reserved = (USHORT)RemainderPathSize;
|
||||||
|
|
||||||
PIoStatus->Status = STATUS_REPARSE;
|
PIoStatus->Status = STATUS_REPARSE;
|
||||||
PIoStatus->Information = ReparseData->ReparseTag;
|
PIoStatus->Information = ReparseData->ReparseTag;
|
||||||
return STATUS_REPARSE;
|
return STATUS_REPARSE;
|
||||||
@ -1635,3 +1818,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-2020 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -10,16 +10,17 @@
|
|||||||
* 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>
|
||||||
|
|
||||||
#define FSP_FUSE_SECTORSIZE_MIN 512
|
|
||||||
#define FSP_FUSE_SECTORSIZE_MAX 4096
|
|
||||||
|
|
||||||
struct fuse_chan
|
struct fuse_chan
|
||||||
{
|
{
|
||||||
PWSTR MountPoint;
|
PWSTR MountPoint;
|
||||||
@ -27,25 +28,7 @@ struct fuse_chan
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define FSP_FUSE_CORE_OPT(n, f, v) { n, offsetof(struct fsp_fuse_core_opt_data, f), v }
|
#define FSP_FUSE_CORE_OPT(n, f, v) { n, offsetof(struct fsp_fuse_core_opt_data, f), v }
|
||||||
|
#define FSP_FUSE_CORE_OPT_NOHELP_IDX 4
|
||||||
struct fsp_fuse_core_opt_data
|
|
||||||
{
|
|
||||||
struct fsp_fuse_env *env;
|
|
||||||
int help, debug;
|
|
||||||
HANDLE DebugLogHandle;
|
|
||||||
int set_umask, umask,
|
|
||||||
set_uid, uid,
|
|
||||||
set_gid, gid,
|
|
||||||
set_attr_timeout, attr_timeout,
|
|
||||||
rellinks;
|
|
||||||
int set_FileInfoTimeout;
|
|
||||||
FSP_FSCTL_VOLUME_PARAMS VolumeParams;
|
|
||||||
UINT16 VolumeLabelLength;
|
|
||||||
WCHAR VolumeLabel[sizeof ((FSP_FSCTL_VOLUME_INFO *)0)->VolumeLabel / sizeof(WCHAR)];
|
|
||||||
};
|
|
||||||
FSP_FSCTL_STATIC_ASSERT(
|
|
||||||
sizeof ((struct fuse *)0)->VolumeLabel == sizeof ((struct fsp_fuse_core_opt_data *)0)->VolumeLabel,
|
|
||||||
"fuse::VolumeLabel and fsp_fuse_core_opt_data::VolumeLabel: sizeof must be same.");
|
|
||||||
|
|
||||||
static struct fuse_opt fsp_fuse_core_opts[] =
|
static struct fuse_opt fsp_fuse_core_opts[] =
|
||||||
{
|
{
|
||||||
@ -69,6 +52,12 @@ static struct fuse_opt fsp_fuse_core_opts[] =
|
|||||||
FUSE_OPT_KEY("noauto_cache", FUSE_OPT_KEY_DISCARD),
|
FUSE_OPT_KEY("noauto_cache", FUSE_OPT_KEY_DISCARD),
|
||||||
FSP_FUSE_CORE_OPT("umask=", set_umask, 1),
|
FSP_FUSE_CORE_OPT("umask=", set_umask, 1),
|
||||||
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=%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),
|
||||||
@ -86,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'),
|
||||||
|
|
||||||
@ -96,47 +88,37 @@ static struct fuse_opt fsp_fuse_core_opts[] =
|
|||||||
FSP_FUSE_CORE_OPT("VolumeSerialNumber=%lx", VolumeParams.VolumeSerialNumber, 0),
|
FSP_FUSE_CORE_OPT("VolumeSerialNumber=%lx", VolumeParams.VolumeSerialNumber, 0),
|
||||||
FSP_FUSE_CORE_OPT("FileInfoTimeout=", set_FileInfoTimeout, 1),
|
FSP_FUSE_CORE_OPT("FileInfoTimeout=", set_FileInfoTimeout, 1),
|
||||||
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=%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=%d", VolumeParams.VolumeInfoTimeout, 0),
|
||||||
|
FSP_FUSE_CORE_OPT("KeepFileCache=", set_KeepFileCache, 1),
|
||||||
|
FSP_FUSE_CORE_OPT("ThreadCount=%u", ThreadCount, 0),
|
||||||
FUSE_OPT_KEY("UNC=", 'U'),
|
FUSE_OPT_KEY("UNC=", 'U'),
|
||||||
FUSE_OPT_KEY("--UNC=", 'U'),
|
FUSE_OPT_KEY("--UNC=", 'U'),
|
||||||
FUSE_OPT_KEY("VolumePrefix=", 'U'),
|
FUSE_OPT_KEY("VolumePrefix=", 'U'),
|
||||||
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,
|
||||||
};
|
};
|
||||||
|
|
||||||
static INIT_ONCE fsp_fuse_initonce = INIT_ONCE_STATIC_INIT;
|
static INIT_ONCE fsp_fuse_initonce = INIT_ONCE_STATIC_INIT;
|
||||||
static DWORD fsp_fuse_tlskey = TLS_OUT_OF_INDEXES;
|
DWORD fsp_fuse_tlskey = TLS_OUT_OF_INDEXES;
|
||||||
|
|
||||||
struct fsp_fuse_obj_hdr
|
|
||||||
{
|
|
||||||
void (*dtor)(void *);
|
|
||||||
__declspec(align(MEMORY_ALLOCATION_ALIGNMENT)) UINT8 ObjectBuf[];
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline void *fsp_fuse_obj_alloc(struct fsp_fuse_env *env, size_t size)
|
|
||||||
{
|
|
||||||
struct fsp_fuse_obj_hdr *hdr;
|
|
||||||
|
|
||||||
hdr = env->memalloc(sizeof(struct fsp_fuse_obj_hdr) + size);
|
|
||||||
if (0 == hdr)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
hdr->dtor = env->memfree;
|
|
||||||
memset(hdr->ObjectBuf, 0, size);
|
|
||||||
return hdr->ObjectBuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void fsp_fuse_obj_free(void *obj)
|
|
||||||
{
|
|
||||||
if (0 == obj)
|
|
||||||
return;
|
|
||||||
|
|
||||||
struct fsp_fuse_obj_hdr *hdr = (PVOID)((PUINT8)obj - sizeof(struct fsp_fuse_obj_hdr));
|
|
||||||
|
|
||||||
hdr->dtor(hdr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL WINAPI fsp_fuse_initialize(
|
static BOOL WINAPI fsp_fuse_initialize(
|
||||||
PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context)
|
PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context)
|
||||||
@ -262,200 +244,41 @@ 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 void fsp_fuse_cleanup(struct fuse *f);
|
static int fsp_fuse_username_to_uid(const char *username, int *puid)
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_svcstart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
|
|
||||||
{
|
{
|
||||||
struct fuse *f = Service->UserContext;
|
union
|
||||||
struct fuse_context *context;
|
{
|
||||||
struct fuse_conn_info conn;
|
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;
|
NTSTATUS Result;
|
||||||
|
|
||||||
f->Service = Service;
|
*puid = 0;
|
||||||
|
|
||||||
context = fsp_fuse_get_context(f->env);
|
NameSize = lstrlenA(username) + 1;
|
||||||
if (0 == context)
|
if (sizeof Name / sizeof Name[0] < NameSize)
|
||||||
{
|
return -1;
|
||||||
Result = STATUS_INSUFFICIENT_RESOURCES;
|
memcpy(Name, username, NameSize);
|
||||||
goto fail;
|
for (PSTR P = Name, EndP = P + NameSize; EndP > P; P++)
|
||||||
}
|
if ('+' == *P)
|
||||||
context->fuse = f;
|
*P = '\\';
|
||||||
context->private_data = f->data;
|
|
||||||
context->uid = -1;
|
|
||||||
context->gid = -1;
|
|
||||||
context->pid = -1;
|
|
||||||
|
|
||||||
memset(&conn, 0, sizeof conn);
|
SidSize = sizeof SidBuf;
|
||||||
conn.proto_major = 7; /* pretend that we are FUSE kernel protocol 7.12 */
|
DomnSize = sizeof Domn / sizeof Domn[0];
|
||||||
conn.proto_minor = 12; /* which was current at the time of FUSE 2.8 */
|
if (!LookupAccountNameA(0, Name, &SidBuf, &SidSize, Domn, &DomnSize, &Use))
|
||||||
conn.async_read = 1;
|
return -1;
|
||||||
conn.max_write = UINT_MAX;
|
|
||||||
conn.capable =
|
|
||||||
FUSE_CAP_ASYNC_READ |
|
|
||||||
//FUSE_CAP_POSIX_LOCKS | /* WinFsp handles locking in the FSD currently */
|
|
||||||
//FUSE_CAP_ATOMIC_O_TRUNC | /* due to Windows/WinFsp design, no support */
|
|
||||||
//FUSE_CAP_EXPORT_SUPPORT | /* not needed in Windows/WinFsp */
|
|
||||||
FUSE_CAP_BIG_WRITES |
|
|
||||||
FUSE_CAP_DONT_MASK |
|
|
||||||
FSP_FUSE_CAP_READDIR_PLUS |
|
|
||||||
FSP_FUSE_CAP_READ_ONLY |
|
|
||||||
FSP_FUSE_CAP_STAT_EX |
|
|
||||||
FSP_FUSE_CAP_CASE_INSENSITIVE;
|
|
||||||
if (0 != f->ops.init)
|
|
||||||
{
|
|
||||||
context->private_data = f->data = f->ops.init(&conn);
|
|
||||||
f->VolumeParams.ReadOnlyVolume = 0 != (conn.want & FSP_FUSE_CAP_READ_ONLY);
|
|
||||||
f->VolumeParams.CaseSensitiveSearch = 0 == (conn.want & FSP_FUSE_CAP_CASE_INSENSITIVE);
|
|
||||||
if (!f->VolumeParams.CaseSensitiveSearch)
|
|
||||||
/*
|
|
||||||
* Disable GetDirInfoByName when file system is case-insensitive.
|
|
||||||
* The reason is that Windows always sends us queries with uppercase
|
|
||||||
* file names in GetDirInfoByName and we have no way in FUSE to normalize
|
|
||||||
* those file names when embedding them in FSP_FSCTL_DIR_INFO.
|
|
||||||
*/
|
|
||||||
f->VolumeParams.PassQueryDirectoryFileName = FALSE;
|
|
||||||
f->conn_want = conn.want;
|
|
||||||
}
|
|
||||||
f->fsinit = TRUE;
|
|
||||||
if (0 != f->ops.statfs)
|
|
||||||
{
|
|
||||||
struct fuse_statvfs stbuf;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
memset(&stbuf, 0, sizeof stbuf);
|
Result = FspPosixMapSidToUid(&SidBuf, &Uid);
|
||||||
err = f->ops.statfs("/", &stbuf);
|
|
||||||
if (0 != err)
|
|
||||||
{
|
|
||||||
Result = fsp_fuse_ntstatus_from_errno(f->env, err);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 == f->VolumeParams.SectorSize && 0 != stbuf.f_frsize)
|
|
||||||
f->VolumeParams.SectorSize = (UINT16)stbuf.f_frsize;
|
|
||||||
#if 0
|
|
||||||
if (0 == f->VolumeParams.SectorsPerAllocationUnit && 0 != stbuf.f_frsize)
|
|
||||||
f->VolumeParams.SectorsPerAllocationUnit = (UINT16)(stbuf.f_bsize / stbuf.f_frsize);
|
|
||||||
#endif
|
|
||||||
if (0 == f->VolumeParams.MaxComponentLength)
|
|
||||||
f->VolumeParams.MaxComponentLength = (UINT16)stbuf.f_namemax;
|
|
||||||
}
|
|
||||||
if (0 != f->ops.getattr)
|
|
||||||
{
|
|
||||||
struct fuse_stat_ex stbuf;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
memset(&stbuf, 0, sizeof stbuf);
|
|
||||||
err = f->ops.getattr("/", (void *)&stbuf);
|
|
||||||
if (0 != err)
|
|
||||||
{
|
|
||||||
Result = fsp_fuse_ntstatus_from_errno(f->env, err);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 == f->VolumeParams.VolumeCreationTime)
|
|
||||||
{
|
|
||||||
if (0 != stbuf.st_birthtim.tv_sec)
|
|
||||||
FspPosixUnixTimeToFileTime((void *)&stbuf.st_birthtim,
|
|
||||||
&f->VolumeParams.VolumeCreationTime);
|
|
||||||
else
|
|
||||||
if (0 != stbuf.st_ctim.tv_sec)
|
|
||||||
FspPosixUnixTimeToFileTime((void *)&stbuf.st_ctim,
|
|
||||||
&f->VolumeParams.VolumeCreationTime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* the FSD does not currently limit these VolumeParams fields; do so here! */
|
|
||||||
if (f->VolumeParams.SectorSize < FSP_FUSE_SECTORSIZE_MIN ||
|
|
||||||
f->VolumeParams.SectorSize > FSP_FUSE_SECTORSIZE_MAX)
|
|
||||||
f->VolumeParams.SectorSize = FSP_FUSE_SECTORSIZE_MAX;
|
|
||||||
if (f->VolumeParams.SectorsPerAllocationUnit == 0)
|
|
||||||
f->VolumeParams.SectorsPerAllocationUnit = 1;
|
|
||||||
if (f->VolumeParams.MaxComponentLength > 255)
|
|
||||||
f->VolumeParams.MaxComponentLength = 255;
|
|
||||||
|
|
||||||
if (0 == f->VolumeParams.VolumeCreationTime)
|
|
||||||
{
|
|
||||||
FILETIME FileTime;
|
|
||||||
GetSystemTimeAsFileTime(&FileTime);
|
|
||||||
f->VolumeParams.VolumeCreationTime = *(PUINT64)&FileTime;
|
|
||||||
}
|
|
||||||
if (0 == f->VolumeParams.VolumeSerialNumber)
|
|
||||||
f->VolumeParams.VolumeSerialNumber =
|
|
||||||
((PLARGE_INTEGER)&f->VolumeParams.VolumeCreationTime)->HighPart ^
|
|
||||||
((PLARGE_INTEGER)&f->VolumeParams.VolumeCreationTime)->LowPart;
|
|
||||||
|
|
||||||
Result = FspFileSystemCreate(
|
|
||||||
f->VolumeParams.Prefix[0] ?
|
|
||||||
L"" FSP_FSCTL_NET_DEVICE_NAME : L"" FSP_FSCTL_DISK_DEVICE_NAME,
|
|
||||||
&f->VolumeParams, &fsp_fuse_intf,
|
|
||||||
&f->FileSystem);
|
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
{
|
return -1;
|
||||||
FspServiceLog(EVENTLOG_ERROR_TYPE,
|
|
||||||
L"Cannot create " FSP_FUSE_LIBRARY_NAME " file system.");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
f->FileSystem->UserContext = f;
|
*puid = Uid;
|
||||||
FspFileSystemSetOperationGuard(f->FileSystem, fsp_fuse_op_enter, fsp_fuse_op_leave);
|
|
||||||
FspFileSystemSetOperationGuardStrategy(f->FileSystem, f->OpGuardStrategy);
|
|
||||||
FspFileSystemSetDebugLog(f->FileSystem, f->DebugLog);
|
|
||||||
|
|
||||||
if (0 != f->MountPoint)
|
return 0;
|
||||||
{
|
|
||||||
Result = FspFileSystemSetMountPoint(f->FileSystem,
|
|
||||||
L'*' == f->MountPoint[0] && L'\0' == f->MountPoint[1] ? 0 : f->MountPoint);
|
|
||||||
if (!NT_SUCCESS(Result))
|
|
||||||
{
|
|
||||||
FspServiceLog(EVENTLOG_ERROR_TYPE,
|
|
||||||
L"Cannot set " FSP_FUSE_LIBRARY_NAME " file system mount point.");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Result = FspFileSystemStartDispatcher(f->FileSystem, 0);
|
|
||||||
if (!NT_SUCCESS(Result))
|
|
||||||
{
|
|
||||||
FspServiceLog(EVENTLOG_ERROR_TYPE,
|
|
||||||
L"Cannot start " FSP_FUSE_LIBRARY_NAME " file system dispatcher.");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
fsp_fuse_cleanup(f);
|
|
||||||
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_svcstop(FSP_SERVICE *Service)
|
|
||||||
{
|
|
||||||
struct fuse *f = Service->UserContext;
|
|
||||||
|
|
||||||
FspFileSystemStopDispatcher(f->FileSystem);
|
|
||||||
|
|
||||||
fsp_fuse_cleanup(f);
|
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void fsp_fuse_cleanup(struct fuse *f)
|
|
||||||
{
|
|
||||||
if (0 != f->FileSystem)
|
|
||||||
{
|
|
||||||
FspFileSystemDelete(f->FileSystem);
|
|
||||||
f->FileSystem = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f->fsinit)
|
|
||||||
{
|
|
||||||
if (f->ops.destroy)
|
|
||||||
f->ops.destroy(f->data);
|
|
||||||
f->fsinit = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
f->Service = 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,
|
||||||
@ -468,26 +291,31 @@ static int fsp_fuse_core_opt_proc(void *opt_data0, const char *arg, int key,
|
|||||||
default:
|
default:
|
||||||
return 1;
|
return 1;
|
||||||
case 'h':
|
case 'h':
|
||||||
/* Note: The limit on FspServiceLog messages is 1024 bytes. This is getting close. */
|
/* Note: The limit on FspServiceLog messages is 1024 bytes. */
|
||||||
FspServiceLog(EVENTLOG_ERROR_TYPE, L""
|
FspServiceLog(EVENTLOG_ERROR_TYPE, L""
|
||||||
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_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"
|
||||||
" -o FileSystemName=NAME set file system name\n"
|
" -o FileSystemName=NAME set file system name\n"
|
||||||
" -o DebugLog=FILE debug log file (requires -d)\n"
|
" -o DebugLog=FILE debug log file (requires -d)\n"
|
||||||
"\n"
|
);
|
||||||
|
FspServiceLog(EVENTLOG_ERROR_TYPE, L""
|
||||||
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 SectorSize=N (512-4096, deflt: 4096)\n"
|
" -o DirInfoTimeout=N directory info timeout (millis)\n"
|
||||||
" -o SectorsPerAllocationUnit=N (deflt: 1)\n"
|
" -o EaTimeout=N extended attribute timeout (millis)\n"
|
||||||
" -o MaxComponentLength=N (deflt: 255)\n"
|
" -o VolumeInfoTimeout=N volume info timeout (millis)\n"
|
||||||
" -o VolumeCreationTime=T (FILETIME hex format)\n"
|
" -o KeepFileCache do not discard cache when files are closed\n"
|
||||||
" -o VolumeSerialNumber=N (32-bit wide)\n"
|
" -o ThreadCount number of file system dispatcher threads\n"
|
||||||
);
|
);
|
||||||
opt_data->help = 1;
|
opt_data->help = 1;
|
||||||
return 1;
|
return 1;
|
||||||
@ -541,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) *
|
||||||
@ -552,6 +414,18 @@ static int fsp_fuse_core_opt_proc(void *opt_data0, const char *arg, int key,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fsp_fuse_core_opt_parse(struct fsp_fuse_env *env,
|
||||||
|
struct fuse_args *args, struct fsp_fuse_core_opt_data *opt_data,
|
||||||
|
int help)
|
||||||
|
{
|
||||||
|
if (help)
|
||||||
|
return fsp_fuse_opt_parse(env, args, opt_data,
|
||||||
|
fsp_fuse_core_opts, fsp_fuse_core_opt_proc);
|
||||||
|
else
|
||||||
|
return fsp_fuse_opt_parse(env, args, opt_data,
|
||||||
|
fsp_fuse_core_opts + FSP_FUSE_CORE_OPT_NOHELP_IDX, fsp_fuse_core_opt_proc);
|
||||||
|
}
|
||||||
|
|
||||||
FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
|
FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
|
||||||
struct fuse_chan *ch, struct fuse_args *args,
|
struct fuse_chan *ch, struct fuse_args *args,
|
||||||
const struct fuse_operations *ops, size_t opsize, void *data)
|
const struct fuse_operations *ops, size_t opsize, void *data)
|
||||||
@ -568,10 +442,19 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
|
|||||||
memset(&opt_data, 0, sizeof opt_data);
|
memset(&opt_data, 0, sizeof opt_data);
|
||||||
opt_data.env = env;
|
opt_data.env = env;
|
||||||
opt_data.DebugLogHandle = GetStdHandle(STD_ERROR_HANDLE);
|
opt_data.DebugLogHandle = GetStdHandle(STD_ERROR_HANDLE);
|
||||||
opt_data.VolumeParams.FileInfoTimeout = 1000; /* default FileInfoTimeout for FUSE file systems */
|
opt_data.VolumeParams.Version = sizeof(FSP_FSCTL_VOLUME_PARAMS);
|
||||||
|
opt_data.VolumeParams.FileInfoTimeout = 1000;
|
||||||
|
opt_data.VolumeParams.FlushAndPurgeOnCleanup = TRUE;
|
||||||
|
|
||||||
if (-1 == fsp_fuse_opt_parse(env, args, &opt_data, fsp_fuse_core_opts, fsp_fuse_core_opt_proc))
|
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;
|
||||||
|
|
||||||
@ -608,7 +491,15 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!opt_data.set_FileInfoTimeout && opt_data.set_attr_timeout)
|
if (!opt_data.set_FileInfoTimeout && opt_data.set_attr_timeout)
|
||||||
opt_data.VolumeParams.FileInfoTimeout = opt_data.set_attr_timeout * 1000;
|
opt_data.VolumeParams.FileInfoTimeout = opt_data.attr_timeout * 1000;
|
||||||
|
if (opt_data.set_DirInfoTimeout)
|
||||||
|
opt_data.VolumeParams.DirInfoTimeoutValid = 1;
|
||||||
|
if (opt_data.set_EaTimeout)
|
||||||
|
opt_data.VolumeParams.EaTimeoutValid = 1;
|
||||||
|
if (opt_data.set_VolumeInfoTimeout)
|
||||||
|
opt_data.VolumeParams.VolumeInfoTimeoutValid = 1;
|
||||||
|
if (opt_data.set_KeepFileCache)
|
||||||
|
opt_data.VolumeParams.FlushAndPurgeOnCleanup = FALSE;
|
||||||
opt_data.VolumeParams.CaseSensitiveSearch = TRUE;
|
opt_data.VolumeParams.CaseSensitiveSearch = TRUE;
|
||||||
opt_data.VolumeParams.CasePreservedNames = TRUE;
|
opt_data.VolumeParams.CasePreservedNames = TRUE;
|
||||||
opt_data.VolumeParams.PersistentAcls = TRUE;
|
opt_data.VolumeParams.PersistentAcls = TRUE;
|
||||||
@ -618,6 +509,10 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
|
|||||||
opt_data.VolumeParams.ReadOnlyVolume = FALSE;
|
opt_data.VolumeParams.ReadOnlyVolume = FALSE;
|
||||||
opt_data.VolumeParams.PostCleanupWhenModifiedOnly = TRUE;
|
opt_data.VolumeParams.PostCleanupWhenModifiedOnly = TRUE;
|
||||||
opt_data.VolumeParams.PassQueryDirectoryFileName = TRUE;
|
opt_data.VolumeParams.PassQueryDirectoryFileName = TRUE;
|
||||||
|
opt_data.VolumeParams.DeviceControl = TRUE;
|
||||||
|
#if defined(FSP_CFG_REJECT_EARLY_IRP)
|
||||||
|
opt_data.VolumeParams.RejectIrpPriorToTransact0 = TRUE;
|
||||||
|
#endif
|
||||||
opt_data.VolumeParams.UmFileContextIsUserContext2 = TRUE;
|
opt_data.VolumeParams.UmFileContextIsUserContext2 = TRUE;
|
||||||
if (L'\0' == opt_data.VolumeParams.FileSystemName[0])
|
if (L'\0' == opt_data.VolumeParams.FileSystemName[0])
|
||||||
memcpy(opt_data.VolumeParams.FileSystemName, L"FUSE", 5 * sizeof(WCHAR));
|
memcpy(opt_data.VolumeParams.FileSystemName, L"FUSE", 5 * sizeof(WCHAR));
|
||||||
@ -628,9 +523,14 @@ 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_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;
|
||||||
memcpy(&f->ops, ops, opsize);
|
memcpy(&f->ops, ops, opsize);
|
||||||
f->data = data;
|
f->data = data;
|
||||||
f->DebugLog = opt_data.debug ? -1 : 0;
|
f->DebugLog = opt_data.debug ? -1 : 0;
|
||||||
@ -691,34 +591,16 @@ 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)
|
||||||
{
|
{
|
||||||
fsp_fuse_cleanup(f);
|
|
||||||
|
|
||||||
fsp_fuse_obj_free(f->MountPoint);
|
fsp_fuse_obj_free(f->MountPoint);
|
||||||
|
|
||||||
fsp_fuse_obj_free(f);
|
fsp_fuse_obj_free(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
FSP_FUSE_API int fsp_fuse_loop(struct fsp_fuse_env *env,
|
|
||||||
struct fuse *f)
|
|
||||||
{
|
|
||||||
f->OpGuardStrategy = FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY_COARSE;
|
|
||||||
return 0 == FspServiceRunEx(FspDiagIdent(), fsp_fuse_svcstart, fsp_fuse_svcstop, 0, f) ?
|
|
||||||
0 : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
FSP_FUSE_API int fsp_fuse_loop_mt(struct fsp_fuse_env *env,
|
|
||||||
struct fuse *f)
|
|
||||||
{
|
|
||||||
f->OpGuardStrategy = FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY_FINE;
|
|
||||||
return 0 == FspServiceRunEx(FspDiagIdent(), fsp_fuse_svcstart, fsp_fuse_svcstop, 0, f) ?
|
|
||||||
0 : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
if (0 != f->Service)
|
if (0 != f->LoopEvent)
|
||||||
FspServiceStop(f->Service);
|
SetEvent(f->LoopEvent);
|
||||||
f->exited = 1;
|
f->exited = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -779,10 +661,3 @@ FSP_FUSE_API int32_t fsp_fuse_ntstatus_from_errno(struct fsp_fuse_env *env,
|
|||||||
return STATUS_ACCESS_DENIED;
|
return STATUS_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cygwin signal support */
|
|
||||||
|
|
||||||
FSP_FUSE_API void fsp_fuse_signal_handler(int sig)
|
|
||||||
{
|
|
||||||
FspServiceConsoleCtrlHandler(CTRL_BREAK_EVENT);
|
|
||||||
}
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fuse/fuse_compat.c
|
* @file dll/fuse/fuse_compat.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2020 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-2020 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>
|
||||||
@ -266,7 +270,7 @@ loopend:;
|
|||||||
if (0 != f->ops.getattr)
|
if (0 != f->ops.getattr)
|
||||||
err = f->ops.getattr(PosixHiddenPath, (void *)&stbuf);
|
err = f->ops.getattr(PosixHiddenPath, (void *)&stbuf);
|
||||||
else
|
else
|
||||||
err = -ENOSYS;
|
err = -ENOSYS_(f->env);
|
||||||
} while (0 == err && 0 < --maxtries);
|
} while (0 == err && 0 < --maxtries);
|
||||||
|
|
||||||
if (0 == err)
|
if (0 == err)
|
||||||
@ -308,7 +312,7 @@ static BOOLEAN fsp_fuse_intf_CheckSymlinkDirectory(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
if (0 != f->ops.getattr)
|
if (0 != f->ops.getattr)
|
||||||
err = f->ops.getattr(PosixDotPath, (void *)&stbuf);
|
err = f->ops.getattr(PosixDotPath, (void *)&stbuf);
|
||||||
else
|
else
|
||||||
err = -ENOSYS;
|
err = -ENOSYS_(f->env);
|
||||||
|
|
||||||
MemFree(PosixDotPath);
|
MemFree(PosixDotPath);
|
||||||
|
|
||||||
@ -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)
|
||||||
@ -711,14 +731,16 @@ static NTSTATUS fsp_fuse_intf_GetSecurityByName(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
|
|
||||||
Result = fsp_fuse_intf_GetSecurityEx(FileSystem, PosixPath, 0,
|
Result = fsp_fuse_intf_GetSecurityEx(FileSystem, PosixPath, 0,
|
||||||
PFileAttributes, SecurityDescriptorBuf, PSecurityDescriptorSize);
|
PFileAttributes, SecurityDescriptorBuf, PSecurityDescriptorSize);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result) &&
|
||||||
|
STATUS_OBJECT_NAME_NOT_FOUND != Result &&
|
||||||
|
STATUS_OBJECT_PATH_NOT_FOUND != Result)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
if (FSP_FUSE_HAS_SYMLINKS(f) &&
|
if (FSP_FUSE_HAS_SYMLINKS(f) &&
|
||||||
FspFileSystemFindReparsePoint(FileSystem, fsp_fuse_intf_GetReparsePointByName, 0,
|
FspFileSystemFindReparsePoint(FileSystem, fsp_fuse_intf_GetReparsePointByName, 0,
|
||||||
FileName, PFileAttributes))
|
FileName, PFileAttributes))
|
||||||
Result = STATUS_REPARSE;
|
Result = STATUS_REPARSE;
|
||||||
else
|
else if (NT_SUCCESS(Result))
|
||||||
Result = STATUS_SUCCESS;
|
Result = STATUS_SUCCESS;
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
@ -731,7 +753,8 @@ 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 *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo)
|
PVOID ExtraBuffer, ULONG ExtraLength, BOOLEAN ExtraBufferIsReparsePoint,
|
||||||
|
PVOID *PFileDesc, FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fuse_context *context = fsp_fuse_get_context(f->env);
|
struct fuse_context *context = fsp_fuse_get_context(f->env);
|
||||||
@ -744,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)
|
||||||
{
|
{
|
||||||
@ -762,6 +804,22 @@ static NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
Mode &= ~context->umask;
|
Mode &= ~context->umask;
|
||||||
|
if (CreateOptions & FILE_DIRECTORY_FILE)
|
||||||
|
{
|
||||||
|
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 */
|
||||||
@ -841,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
|
||||||
@ -849,12 +923,13 @@ 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;
|
||||||
|
|
||||||
*PFileNode = filedesc;
|
*PFileDesc = filedesc;
|
||||||
memcpy(FileInfo, &FileInfoBuf, sizeof FileInfoBuf);
|
memcpy(FileInfo, &FileInfoBuf, sizeof FileInfoBuf);
|
||||||
|
|
||||||
filedesc->PosixPath = contexthdr->PosixPath;
|
filedesc->PosixPath = contexthdr->PosixPath;
|
||||||
@ -892,7 +967,7 @@ exit:
|
|||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess,
|
PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess,
|
||||||
PVOID *PFileNode, FSP_FSCTL_FILE_INFO *FileInfo)
|
PVOID *PFileDesc, FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fuse_context *context = fsp_fuse_get_context(f->env);
|
struct fuse_context *context = fsp_fuse_get_context(f->env);
|
||||||
@ -951,6 +1026,18 @@ 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.
|
||||||
|
*/
|
||||||
|
if (GrantedAccess & FILE_APPEND_DATA)
|
||||||
|
{
|
||||||
|
if (fi.flags == 0)
|
||||||
|
fi.flags = 1; /* need O_WRONLY as a bare minimum in order to 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);
|
||||||
@ -971,7 +1058,7 @@ static NTSTATUS fsp_fuse_intf_Open(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
* Ignore fuse_file_info::nonseekable.
|
* Ignore fuse_file_info::nonseekable.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
*PFileNode = filedesc;
|
*PFileDesc = filedesc;
|
||||||
memcpy(FileInfo, &FileInfoBuf, sizeof FileInfoBuf);
|
memcpy(FileInfo, &FileInfoBuf, sizeof FileInfoBuf);
|
||||||
|
|
||||||
filedesc->PosixPath = contexthdr->PosixPath;
|
filedesc->PosixPath = contexthdr->PosixPath;
|
||||||
@ -992,11 +1079,12 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_Overwrite(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_Overwrite(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode, 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;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
UINT32 Uid, Gid, Mode;
|
UINT32 Uid, Gid, Mode;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
int err;
|
int err;
|
||||||
@ -1005,6 +1093,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);
|
||||||
@ -1040,15 +1151,16 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID fsp_fuse_intf_Cleanup(FSP_FILE_SYSTEM *FileSystem,
|
static VOID fsp_fuse_intf_Cleanup(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode, PWSTR FileName, ULONG Flags)
|
PVOID FileDesc, PWSTR FileName, ULONG Flags)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In Windows a DeleteFile/RemoveDirectory is the sequence of the following:
|
* In Windows a DeleteFile/RemoveDirectory is the sequence of the following:
|
||||||
@ -1081,10 +1193,10 @@ static VOID fsp_fuse_intf_Cleanup(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static VOID fsp_fuse_intf_Close(FSP_FILE_SYSTEM *FileSystem,
|
static VOID fsp_fuse_intf_Close(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode)
|
PVOID FileDesc)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
|
|
||||||
memset(&fi, 0, sizeof fi);
|
memset(&fi, 0, sizeof fi);
|
||||||
@ -1114,11 +1226,11 @@ static VOID fsp_fuse_intf_Close(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_Read(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_Read(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode, PVOID Buffer, UINT64 Offset, ULONG Length,
|
PVOID FileDesc, PVOID Buffer, UINT64 Offset, ULONG Length,
|
||||||
PULONG PBytesTransferred)
|
PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
int bytes;
|
int bytes;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
@ -1148,12 +1260,12 @@ static NTSTATUS fsp_fuse_intf_Read(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_Write(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_Write(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode, PVOID Buffer, UINT64 Offset, ULONG Length,
|
PVOID FileDesc, PVOID Buffer, UINT64 Offset, ULONG Length,
|
||||||
BOOLEAN WriteToEndOfFile, BOOLEAN ConstrainedIo,
|
BOOLEAN WriteToEndOfFile, BOOLEAN ConstrainedIo,
|
||||||
PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo)
|
PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
UINT32 Uid, Gid, Mode;
|
UINT32 Uid, Gid, Mode;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
FSP_FSCTL_FILE_INFO FileInfoBuf;
|
FSP_FSCTL_FILE_INFO FileInfoBuf;
|
||||||
@ -1171,7 +1283,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;
|
||||||
@ -1211,11 +1324,11 @@ success:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_Flush(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_Flush(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode,
|
PVOID FileDesc,
|
||||||
FSP_FSCTL_FILE_INFO *FileInfo)
|
FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
UINT32 Uid, Gid, Mode;
|
UINT32 Uid, Gid, Mode;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
FSP_FSCTL_FILE_INFO FileInfoBuf;
|
FSP_FSCTL_FILE_INFO FileInfoBuf;
|
||||||
@ -1251,7 +1364,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;
|
||||||
@ -1262,11 +1376,11 @@ static NTSTATUS fsp_fuse_intf_Flush(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_GetFileInfo(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_GetFileInfo(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode,
|
PVOID FileDesc,
|
||||||
FSP_FSCTL_FILE_INFO *FileInfo)
|
FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
UINT32 Uid, Gid, Mode;
|
UINT32 Uid, Gid, Mode;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
|
|
||||||
@ -1274,17 +1388,18 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_SetBasicInfo(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_SetBasicInfo(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode, UINT32 FileAttributes,
|
PVOID FileDesc, UINT32 FileAttributes,
|
||||||
UINT64 CreationTime, UINT64 LastAccessTime, UINT64 LastWriteTime, UINT64 ChangeTime,
|
UINT64 CreationTime, UINT64 LastAccessTime, UINT64 LastWriteTime, UINT64 ChangeTime,
|
||||||
FSP_FSCTL_FILE_INFO *FileInfo)
|
FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
UINT32 Uid, Gid, Mode;
|
UINT32 Uid, Gid, Mode;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
FSP_FSCTL_FILE_INFO FileInfoBuf;
|
FSP_FSCTL_FILE_INFO FileInfoBuf;
|
||||||
@ -1312,7 +1427,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;
|
||||||
@ -1359,16 +1475,17 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_SetFileSize(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_SetFileSize(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode, UINT64 NewSize, BOOLEAN SetAllocationSize,
|
PVOID FileDesc, UINT64 NewSize, BOOLEAN SetAllocationSize,
|
||||||
FSP_FSCTL_FILE_INFO *FileInfo)
|
FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
UINT32 Uid, Gid, Mode;
|
UINT32 Uid, Gid, Mode;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
FSP_FSCTL_FILE_INFO FileInfoBuf;
|
FSP_FSCTL_FILE_INFO FileInfoBuf;
|
||||||
@ -1386,7 +1503,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;
|
||||||
@ -1423,7 +1541,8 @@ static NTSTATUS fsp_fuse_intf_SetFileSize(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fsp_fuse_intf_CanDeleteAddDirInfo(void *buf, const char *name,
|
/* !static: used by fuse2to3 */
|
||||||
|
int fsp_fuse_intf_CanDeleteAddDirInfo(void *buf, const char *name,
|
||||||
const struct fuse_stat *stbuf, fuse_off_t off)
|
const struct fuse_stat *stbuf, fuse_off_t off)
|
||||||
{
|
{
|
||||||
struct fuse_dirhandle *dh = buf;
|
struct fuse_dirhandle *dh = buf;
|
||||||
@ -1447,10 +1566,10 @@ static int fsp_fuse_intf_CanDeleteAddDirInfoOld(fuse_dirh_t dh, const char *name
|
|||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_CanDelete(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_CanDelete(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode, PWSTR FileName)
|
PVOID FileDesc, PWSTR FileName)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
struct fuse_dirhandle dh;
|
struct fuse_dirhandle dh;
|
||||||
int err;
|
int err;
|
||||||
@ -1486,7 +1605,7 @@ static NTSTATUS fsp_fuse_intf_CanDelete(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_Rename(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_Rename(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode,
|
PVOID FileDesc,
|
||||||
PWSTR FileName, PWSTR NewFileName, BOOLEAN ReplaceIfExists)
|
PWSTR FileName, PWSTR NewFileName, BOOLEAN ReplaceIfExists)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
@ -1494,7 +1613,7 @@ static NTSTATUS fsp_fuse_intf_Rename(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
struct fsp_fuse_context_header *contexthdr = FSP_FUSE_HDR_FROM_CONTEXT(context);
|
struct fsp_fuse_context_header *contexthdr = FSP_FUSE_HDR_FROM_CONTEXT(context);
|
||||||
UINT32 Uid, Gid, Mode;
|
UINT32 Uid, Gid, Mode;
|
||||||
FSP_FSCTL_FILE_INFO FileInfoBuf;
|
FSP_FSCTL_FILE_INFO FileInfoBuf;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
int err;
|
int err;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
@ -1520,11 +1639,11 @@ static NTSTATUS fsp_fuse_intf_Rename(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_GetSecurity(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_GetSecurity(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode,
|
PVOID FileDesc,
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptorBuf, SIZE_T *PSecurityDescriptorSize)
|
PSECURITY_DESCRIPTOR SecurityDescriptorBuf, SIZE_T *PSecurityDescriptorSize)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
UINT32 FileAttributes;
|
UINT32 FileAttributes;
|
||||||
|
|
||||||
@ -1532,16 +1651,17 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_SetSecurity(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_SetSecurity(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode,
|
PVOID FileDesc,
|
||||||
SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor)
|
SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
UINT32 Uid, Gid, Mode, NewUid, NewGid, NewMode;
|
UINT32 Uid, Gid, Mode, NewUid, NewGid, NewMode;
|
||||||
FSP_FSCTL_FILE_INFO FileInfo;
|
FSP_FSCTL_FILE_INFO FileInfo;
|
||||||
@ -1556,8 +1676,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;
|
||||||
|
|
||||||
@ -1613,7 +1734,23 @@ exit:
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fsp_fuse_intf_AddDirInfo(void *buf, const char *name,
|
static VOID fsp_fuse_intf_LogBadDirInfo(
|
||||||
|
const char *PosixPath, const char *PosixName, const char *Message)
|
||||||
|
{
|
||||||
|
static LONG Count = 0;
|
||||||
|
ULONG NewCount;
|
||||||
|
|
||||||
|
NewCount = (ULONG)InterlockedIncrement(&Count);
|
||||||
|
|
||||||
|
/* log only the first 5 such warnings to avoid warning overload */
|
||||||
|
if (5 >= NewCount)
|
||||||
|
FspDebugLog("%S[TID=%04lx]: WARN: readdir(\"%s\"): name=\"%s\": %s\n",
|
||||||
|
FspDiagIdent(), GetCurrentThreadId(),
|
||||||
|
PosixPath, PosixName, Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* !static: used by fuse2to3 */
|
||||||
|
int fsp_fuse_intf_AddDirInfo(void *buf, const char *name,
|
||||||
const struct fuse_stat *stbuf, fuse_off_t off)
|
const struct fuse_stat *stbuf, fuse_off_t off)
|
||||||
{
|
{
|
||||||
struct fuse_dirhandle *dh = buf;
|
struct fuse_dirhandle *dh = buf;
|
||||||
@ -1637,23 +1774,30 @@ static int fsp_fuse_intf_AddDirInfo(void *buf, const char *name,
|
|||||||
|
|
||||||
SizeA = lstrlenA(name);
|
SizeA = lstrlenA(name);
|
||||||
if (SizeA > 255)
|
if (SizeA > 255)
|
||||||
/* ignore bad filenames; should we return error code? */
|
{
|
||||||
|
fsp_fuse_intf_LogBadDirInfo(filedesc->PosixPath, name,
|
||||||
|
"too long");
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
SizeW = MultiByteToWideChar(CP_UTF8, 0, name, SizeA, DirInfo->FileNameBuf, 255);
|
SizeW = MultiByteToWideChar(CP_UTF8, 0, name, SizeA, DirInfo->FileNameBuf, 255);
|
||||||
if (0 == SizeW)
|
if (0 == SizeW)
|
||||||
/* ignore bad filenames; should we return error code? */
|
{
|
||||||
|
fsp_fuse_intf_LogBadDirInfo(filedesc->PosixPath, name,
|
||||||
|
"MultiByteToWideChar failed");
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
memset(DirInfo, 0, sizeof *DirInfo);
|
memset(DirInfo, 0, sizeof *DirInfo);
|
||||||
DirInfo->Size = (UINT16)(sizeof(FSP_FSCTL_DIR_INFO) + SizeW * sizeof(WCHAR));
|
DirInfo->Size = (UINT16)(sizeof(FSP_FSCTL_DIR_INFO) + SizeW * sizeof(WCHAR));
|
||||||
|
|
||||||
if (dh->ReaddirPlus && 0 != stbuf)
|
if (dh->ReaddirPlus && 0 != stbuf &&
|
||||||
|
0120000/* S_IFLNK */ != (stbuf->st_mode & 0170000))
|
||||||
{
|
{
|
||||||
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 */
|
||||||
@ -1743,7 +1887,12 @@ static NTSTATUS fsp_fuse_intf_FixDirInfo(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, PosixPath, 0,
|
Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, PosixPath, 0,
|
||||||
&Uid, &Gid, &Mode, &DirInfo->FileInfo);
|
&Uid, &Gid, &Mode, &DirInfo->FileInfo);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
goto exit;
|
{
|
||||||
|
/* mark the directory buffer entry as invalid */
|
||||||
|
*Index = FspFileSystemDirectoryBufferEntryInvalid;
|
||||||
|
fsp_fuse_intf_LogBadDirInfo(filedesc->PosixPath, PosixName,
|
||||||
|
"getattr failed");
|
||||||
|
}
|
||||||
|
|
||||||
if (0 != PosixPathEnd)
|
if (0 != PosixPathEnd)
|
||||||
*PosixPathEnd = SavedPathChar;
|
*PosixPathEnd = SavedPathChar;
|
||||||
@ -1761,11 +1910,11 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_ReadDirectory(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_ReadDirectory(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode, PWSTR Pattern, PWSTR Marker,
|
PVOID FileDesc, PWSTR Pattern, PWSTR Marker,
|
||||||
PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
|
PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
struct fuse_dirhandle dh;
|
struct fuse_dirhandle dh;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
int err;
|
int err;
|
||||||
@ -1816,11 +1965,11 @@ static NTSTATUS fsp_fuse_intf_ReadDirectory(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_GetDirInfoByName(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_GetDirInfoByName(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode, PWSTR FileName,
|
PVOID FileDesc, PWSTR FileName,
|
||||||
FSP_FSCTL_DIR_INFO *DirInfo)
|
FSP_FSCTL_DIR_INFO *DirInfo)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
char *PosixName = 0;
|
char *PosixName = 0;
|
||||||
char PosixPath[FSP_FSCTL_TRANSACT_PATH_SIZEMAX / sizeof(WCHAR)];
|
char PosixPath[FSP_FSCTL_TRANSACT_PATH_SIZEMAX / sizeof(WCHAR)];
|
||||||
int ParentLength, FSlashLength, PosixNameLength;
|
int ParentLength, FSlashLength, PosixNameLength;
|
||||||
@ -1903,26 +2052,28 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_GetReparsePoint(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_GetReparsePoint(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode,
|
PVOID FileDesc,
|
||||||
PWSTR FileName, PVOID Buffer, PSIZE_T PSize)
|
PWSTR FileName, PVOID Buffer, PSIZE_T PSize)
|
||||||
{
|
{
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
|
|
||||||
memset(&fi, 0, sizeof fi);
|
memset(&fi, 0, sizeof fi);
|
||||||
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,
|
||||||
PVOID FileNode,
|
PVOID FileDesc,
|
||||||
PWSTR FileName, PVOID Buffer, SIZE_T Size)
|
PWSTR FileName, PVOID Buffer, SIZE_T Size)
|
||||||
{
|
{
|
||||||
struct fuse *f = FileSystem->UserContext;
|
struct fuse *f = FileSystem->UserContext;
|
||||||
struct fuse_context *context = fsp_fuse_get_context(f->env);
|
struct fuse_context *context = fsp_fuse_get_context(f->env);
|
||||||
struct fsp_fuse_file_desc *filedesc = FileNode;
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
struct fuse_file_info fi;
|
struct fuse_file_info fi;
|
||||||
UINT32 Uid, Gid, Mode, Dev;
|
UINT32 Uid, Gid, Mode, Dev;
|
||||||
FSP_FSCTL_FILE_INFO FileInfo;
|
FSP_FSCTL_FILE_INFO FileInfo;
|
||||||
@ -1984,7 +2135,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;
|
||||||
@ -2113,21 +2265,163 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS fsp_fuse_intf_DeleteReparsePoint(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS fsp_fuse_intf_DeleteReparsePoint(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileNode,
|
PVOID FileDesc,
|
||||||
PWSTR FileName, PVOID Buffer, SIZE_T Size)
|
PWSTR FileName, PVOID Buffer, SIZE_T Size)
|
||||||
{
|
{
|
||||||
/* we were asked to delete the reparse point? no can do! */
|
/* we were asked to delete the reparse point? no can do! */
|
||||||
return STATUS_ACCESS_DENIED;
|
return STATUS_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NTSTATUS fsp_fuse_intf_Control(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
PVOID FileDesc, UINT32 ControlCode,
|
||||||
|
PVOID InputBuffer, ULONG InputBufferLength,
|
||||||
|
PVOID OutputBuffer, ULONG OutputBufferLength, PULONG PBytesTransferred)
|
||||||
|
{
|
||||||
|
struct fuse *f = FileSystem->UserContext;
|
||||||
|
struct fsp_fuse_file_desc *filedesc = FileDesc;
|
||||||
|
struct fuse_file_info fi;
|
||||||
|
int cmd;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (0 == f->ops.ioctl)
|
||||||
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
||||||
|
if (FSP_FUSE_DEVICE_TYPE != DEVICE_TYPE_FROM_CTL_CODE(ControlCode))
|
||||||
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
||||||
|
if (0 != InputBufferLength && 0 != OutputBufferLength &&
|
||||||
|
InputBufferLength != OutputBufferLength)
|
||||||
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
||||||
|
memset(&fi, 0, sizeof fi);
|
||||||
|
fi.flags = filedesc->OpenFlags;
|
||||||
|
fi.fh = filedesc->FileHandle;
|
||||||
|
|
||||||
|
/* construct a Linux compatible ioctl code */
|
||||||
|
cmd = FSP_FUSE_IOCTL((ControlCode >> 2) & 0xfff, InputBufferLength, OutputBufferLength);
|
||||||
|
|
||||||
|
if (0 == OutputBufferLength)
|
||||||
|
err = f->ops.ioctl(filedesc->PosixPath, cmd, 0, &fi, 0, InputBuffer);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (0 != InputBufferLength)
|
||||||
|
// OutputBuffer points to Response->Buffer which is FSP_FSCTL_TRANSACT_RSP_BUFFER_SIZEMAX long
|
||||||
|
memcpy(OutputBuffer, InputBuffer, InputBufferLength);
|
||||||
|
err = f->ops.ioctl(filedesc->PosixPath, cmd, 0, &fi, 0, OutputBuffer);
|
||||||
|
}
|
||||||
|
*PBytesTransferred = OutputBufferLength;
|
||||||
|
|
||||||
|
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,
|
||||||
@ -2147,6 +2441,12 @@ FSP_FILE_SYSTEM_INTERFACE fsp_fuse_intf =
|
|||||||
fsp_fuse_intf_DeleteReparsePoint,
|
fsp_fuse_intf_DeleteReparsePoint,
|
||||||
0,
|
0,
|
||||||
fsp_fuse_intf_GetDirInfoByName,
|
fsp_fuse_intf_GetDirInfoByName,
|
||||||
|
fsp_fuse_intf_Control,
|
||||||
|
0,
|
||||||
|
fsp_fuse_intf_Create,
|
||||||
|
fsp_fuse_intf_Overwrite,
|
||||||
|
fsp_fuse_intf_GetEa,
|
||||||
|
fsp_fuse_intf_SetEa,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
318
src/dll/fuse/fuse_loop.c
Normal file
318
src/dll/fuse/fuse_loop.c
Normal file
@ -0,0 +1,318 @@
|
|||||||
|
/**
|
||||||
|
* @file dll/fuse/fuse_loop.c
|
||||||
|
*
|
||||||
|
* @copyright 2015-2020 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/fuse/library.h>
|
||||||
|
|
||||||
|
#define FSP_FUSE_SECTORSIZE_MIN 512
|
||||||
|
#define FSP_FUSE_SECTORSIZE_MAX 4096
|
||||||
|
|
||||||
|
static INIT_ONCE fsp_fuse_svconce = INIT_ONCE_STATIC_INIT;
|
||||||
|
static HANDLE fsp_fuse_svcthread;
|
||||||
|
|
||||||
|
static NTSTATUS fsp_fuse_svcstart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
|
||||||
|
{
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS fsp_fuse_svcstop(FSP_SERVICE *Service)
|
||||||
|
{
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD WINAPI fsp_fuse_svcmain(PVOID Context)
|
||||||
|
{
|
||||||
|
return FspServiceRun(FspDiagIdent(), fsp_fuse_svcstart, fsp_fuse_svcstop, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL WINAPI fsp_fuse_svcinit(
|
||||||
|
PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context)
|
||||||
|
{
|
||||||
|
fsp_fuse_svcthread = CreateThread(0, 0, fsp_fuse_svcmain, 0, 0, 0);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fsp_fuse_loop_cleanup(struct fuse *f);
|
||||||
|
|
||||||
|
static NTSTATUS fsp_fuse_loop_start(struct fuse *f)
|
||||||
|
{
|
||||||
|
struct fuse_context *context;
|
||||||
|
struct fuse_conn_info conn;
|
||||||
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
f->LoopEvent = CreateEventW(0, TRUE, FALSE, 0);
|
||||||
|
if (0 == f->LoopEvent)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
context = fsp_fuse_get_context(f->env);
|
||||||
|
if (0 == context)
|
||||||
|
{
|
||||||
|
Result = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
context->fuse = f;
|
||||||
|
context->private_data = f->data;
|
||||||
|
context->uid = -1;
|
||||||
|
context->gid = -1;
|
||||||
|
context->pid = -1;
|
||||||
|
|
||||||
|
memset(&conn, 0, sizeof conn);
|
||||||
|
conn.proto_major = 7; /* pretend that we are FUSE kernel protocol 7.12 */
|
||||||
|
conn.proto_minor = 12; /* which was current at the time of FUSE 2.8 */
|
||||||
|
conn.async_read = 1;
|
||||||
|
conn.max_write = UINT_MAX;
|
||||||
|
conn.capable =
|
||||||
|
FUSE_CAP_ASYNC_READ |
|
||||||
|
//FUSE_CAP_POSIX_LOCKS | /* WinFsp handles locking in the FSD currently */
|
||||||
|
//FUSE_CAP_ATOMIC_O_TRUNC | /* due to Windows/WinFsp design, no support */
|
||||||
|
//FUSE_CAP_EXPORT_SUPPORT | /* not needed in Windows/WinFsp */
|
||||||
|
FUSE_CAP_BIG_WRITES |
|
||||||
|
FUSE_CAP_DONT_MASK |
|
||||||
|
FSP_FUSE_CAP_READDIR_PLUS |
|
||||||
|
FSP_FUSE_CAP_READ_ONLY |
|
||||||
|
FSP_FUSE_CAP_STAT_EX |
|
||||||
|
FSP_FUSE_CAP_CASE_INSENSITIVE;
|
||||||
|
if (0 != f->ops.init)
|
||||||
|
{
|
||||||
|
context->private_data = f->data = f->ops.init(&conn);
|
||||||
|
f->VolumeParams.ReadOnlyVolume = 0 != (conn.want & FSP_FUSE_CAP_READ_ONLY);
|
||||||
|
f->VolumeParams.CaseSensitiveSearch = 0 == (conn.want & FSP_FUSE_CAP_CASE_INSENSITIVE);
|
||||||
|
if (!f->VolumeParams.CaseSensitiveSearch)
|
||||||
|
/*
|
||||||
|
* Disable GetDirInfoByName when file system is case-insensitive.
|
||||||
|
* The reason is that Windows always sends us queries with uppercase
|
||||||
|
* file names in GetDirInfoByName and we have no way in FUSE to normalize
|
||||||
|
* those file names when embedding them in FSP_FSCTL_DIR_INFO.
|
||||||
|
*/
|
||||||
|
f->VolumeParams.PassQueryDirectoryFileName = FALSE;
|
||||||
|
f->conn_want = conn.want;
|
||||||
|
}
|
||||||
|
f->fsinit = TRUE;
|
||||||
|
if (0 != f->ops.statfs)
|
||||||
|
{
|
||||||
|
struct fuse_statvfs stbuf;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
memset(&stbuf, 0, sizeof stbuf);
|
||||||
|
err = f->ops.statfs("/", &stbuf);
|
||||||
|
if (0 != err)
|
||||||
|
{
|
||||||
|
Result = fsp_fuse_ntstatus_from_errno(f->env, err);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == f->VolumeParams.SectorSize && 0 != stbuf.f_frsize)
|
||||||
|
f->VolumeParams.SectorSize = (UINT16)stbuf.f_frsize;
|
||||||
|
#if 0
|
||||||
|
if (0 == f->VolumeParams.SectorsPerAllocationUnit && 0 != stbuf.f_frsize)
|
||||||
|
f->VolumeParams.SectorsPerAllocationUnit = (UINT16)(stbuf.f_bsize / stbuf.f_frsize);
|
||||||
|
#endif
|
||||||
|
if (0 == f->VolumeParams.MaxComponentLength)
|
||||||
|
f->VolumeParams.MaxComponentLength = (UINT16)stbuf.f_namemax;
|
||||||
|
}
|
||||||
|
if (0 != f->ops.getattr)
|
||||||
|
{
|
||||||
|
struct fuse_stat_ex stbuf;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
memset(&stbuf, 0, sizeof stbuf);
|
||||||
|
err = f->ops.getattr("/", (void *)&stbuf);
|
||||||
|
if (0 != err)
|
||||||
|
{
|
||||||
|
Result = fsp_fuse_ntstatus_from_errno(f->env, err);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == f->VolumeParams.VolumeCreationTime)
|
||||||
|
{
|
||||||
|
if (0 != stbuf.st_birthtim.tv_sec)
|
||||||
|
FspPosixUnixTimeToFileTime((void *)&stbuf.st_birthtim,
|
||||||
|
&f->VolumeParams.VolumeCreationTime);
|
||||||
|
else
|
||||||
|
if (0 != stbuf.st_ctim.tv_sec)
|
||||||
|
FspPosixUnixTimeToFileTime((void *)&stbuf.st_ctim,
|
||||||
|
&f->VolumeParams.VolumeCreationTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (0 != f->ops.readlink)
|
||||||
|
{
|
||||||
|
char buf[FSP_FSCTL_TRANSACT_PATH_SIZEMAX / sizeof(WCHAR)];
|
||||||
|
int err;
|
||||||
|
|
||||||
|
/* this should always fail with ENOSYS or EINVAL */
|
||||||
|
err = f->ops.readlink("/", buf, sizeof buf);
|
||||||
|
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! */
|
||||||
|
if (f->VolumeParams.SectorSize < FSP_FUSE_SECTORSIZE_MIN ||
|
||||||
|
f->VolumeParams.SectorSize > FSP_FUSE_SECTORSIZE_MAX)
|
||||||
|
f->VolumeParams.SectorSize = FSP_FUSE_SECTORSIZE_MAX;
|
||||||
|
if (f->VolumeParams.SectorsPerAllocationUnit == 0)
|
||||||
|
f->VolumeParams.SectorsPerAllocationUnit = 1;
|
||||||
|
if (f->VolumeParams.MaxComponentLength > 255)
|
||||||
|
f->VolumeParams.MaxComponentLength = 255;
|
||||||
|
|
||||||
|
if (0 == f->VolumeParams.VolumeCreationTime)
|
||||||
|
{
|
||||||
|
FILETIME FileTime;
|
||||||
|
GetSystemTimeAsFileTime(&FileTime);
|
||||||
|
f->VolumeParams.VolumeCreationTime = *(PUINT64)&FileTime;
|
||||||
|
}
|
||||||
|
if (0 == f->VolumeParams.VolumeSerialNumber)
|
||||||
|
f->VolumeParams.VolumeSerialNumber =
|
||||||
|
((PLARGE_INTEGER)&f->VolumeParams.VolumeCreationTime)->HighPart ^
|
||||||
|
((PLARGE_INTEGER)&f->VolumeParams.VolumeCreationTime)->LowPart;
|
||||||
|
|
||||||
|
Result = FspFileSystemCreate(
|
||||||
|
f->VolumeParams.Prefix[0] ?
|
||||||
|
L"" FSP_FSCTL_NET_DEVICE_NAME : L"" FSP_FSCTL_DISK_DEVICE_NAME,
|
||||||
|
&f->VolumeParams, &fsp_fuse_intf,
|
||||||
|
&f->FileSystem);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
FspServiceLog(EVENTLOG_ERROR_TYPE,
|
||||||
|
L"Cannot create " FSP_FUSE_LIBRARY_NAME " file system.");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
f->FileSystem->UserContext = f;
|
||||||
|
FspFileSystemSetOperationGuard(f->FileSystem, fsp_fuse_op_enter, fsp_fuse_op_leave);
|
||||||
|
FspFileSystemSetOperationGuardStrategy(f->FileSystem, f->OpGuardStrategy);
|
||||||
|
FspFileSystemSetDebugLog(f->FileSystem, f->DebugLog);
|
||||||
|
|
||||||
|
if (0 != f->MountPoint)
|
||||||
|
{
|
||||||
|
Result = FspFileSystemSetMountPoint(f->FileSystem,
|
||||||
|
L'*' == f->MountPoint[0] && L'\0' == f->MountPoint[1] ? 0 : f->MountPoint);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
FspServiceLog(EVENTLOG_ERROR_TYPE,
|
||||||
|
L"Cannot set " FSP_FUSE_LIBRARY_NAME " file system mount point.");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Result = FspFileSystemStartDispatcher(f->FileSystem, f->ThreadCount);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
FspServiceLog(EVENTLOG_ERROR_TYPE,
|
||||||
|
L"Cannot start " FSP_FUSE_LIBRARY_NAME " file system dispatcher.");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
fsp_fuse_loop_cleanup(f);
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fsp_fuse_loop_stop(struct fuse *f)
|
||||||
|
{
|
||||||
|
FspFileSystemStopDispatcher(f->FileSystem);
|
||||||
|
|
||||||
|
fsp_fuse_loop_cleanup(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fsp_fuse_loop_cleanup(struct fuse *f)
|
||||||
|
{
|
||||||
|
if (0 != f->FileSystem)
|
||||||
|
{
|
||||||
|
FspFileSystemDelete(f->FileSystem);
|
||||||
|
f->FileSystem = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (f->fsinit)
|
||||||
|
{
|
||||||
|
if (f->ops.destroy)
|
||||||
|
f->ops.destroy(f->data);
|
||||||
|
f->fsinit = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 != f->LoopEvent)
|
||||||
|
{
|
||||||
|
CloseHandle(f->LoopEvent);
|
||||||
|
f->LoopEvent = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS fsp_fuse_loop_internal(struct fuse *f)
|
||||||
|
{
|
||||||
|
HANDLE WaitObjects[2];
|
||||||
|
DWORD WaitResult;
|
||||||
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
Result = fsp_fuse_loop_start(f);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
/* emulate WinFsp-FUSE v1.3 behavior! */
|
||||||
|
FspServiceLog(EVENTLOG_ERROR_TYPE,
|
||||||
|
L"The service %s has failed to start (Status=%lx).", FspDiagIdent(), Result);
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
InitOnceExecuteOnce(&fsp_fuse_svconce, fsp_fuse_svcinit, 0, 0);
|
||||||
|
if (0 == fsp_fuse_svcthread)
|
||||||
|
{
|
||||||
|
fsp_fuse_loop_stop(f);
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if either the service thread dies or our event gets signaled, stop the loop */
|
||||||
|
Result = STATUS_SUCCESS;
|
||||||
|
if (!f->exited)
|
||||||
|
{
|
||||||
|
WaitObjects[0] = fsp_fuse_svcthread;
|
||||||
|
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);
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
FSP_FUSE_API int fsp_fuse_loop(struct fsp_fuse_env *env,
|
||||||
|
struct fuse *f)
|
||||||
|
{
|
||||||
|
f->OpGuardStrategy = FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY_COARSE;
|
||||||
|
return NT_SUCCESS(fsp_fuse_loop_internal(f)) ? 0 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
FSP_FUSE_API int fsp_fuse_loop_mt(struct fsp_fuse_env *env,
|
||||||
|
struct fuse *f)
|
||||||
|
{
|
||||||
|
f->OpGuardStrategy = FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY_FINE;
|
||||||
|
return NT_SUCCESS(fsp_fuse_loop_internal(f)) ? 0 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cygwin signal support */
|
||||||
|
|
||||||
|
FSP_FUSE_API void fsp_fuse_signal_handler(int sig)
|
||||||
|
{
|
||||||
|
FspServiceConsoleCtrlHandler(CTRL_BREAK_EVENT);
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file dll/fuse/fuse_main.c
|
* @file dll/fuse/fuse_main.c
|
||||||
*
|
*
|
||||||
* @copyright 2015-2018 Bill Zissimopoulos
|
* @copyright 2015-2020 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>
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user