Compare commits
371 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
4fdec4d37f | ||
|
2da97d48f5 | ||
|
7c5dc48414 | ||
|
93c057571a | ||
|
da16d0e6ea | ||
|
dbaee25ed2 | ||
|
2bf9a6c16e | ||
|
b058925692 | ||
|
507c794470 | ||
|
9a6571809e | ||
|
e452f75c9c | ||
|
7551193ad7 | ||
|
65bf8c5319 | ||
|
be5faf34bc | ||
|
0e1c8ae1dc | ||
|
9aa67bdad4 | ||
|
de321620fd | ||
|
a482183149 | ||
|
6fb72555d3 | ||
|
9accf72d39 | ||
|
5c03dd11ee | ||
|
1f37e5a81a | ||
|
db319bc3c1 | ||
|
c04e3d9534 | ||
|
1912814d79 | ||
|
97c075e744 | ||
|
874a223bcc | ||
|
901a98e118 | ||
|
0ab4300738 | ||
|
52e6aa97b5 | ||
|
a7d82d5f8d | ||
|
3aadaee511 | ||
|
da3a8aa229 | ||
|
1f0fd4c280 | ||
|
6da92f0b54 | ||
|
4f5f1dd350 | ||
|
ba5d52e9a5 | ||
|
d626fb9563 | ||
|
69cc1820e1 | ||
|
c06141c8c8 | ||
|
760c2acded | ||
|
671efe625a | ||
|
a59b32b1ee | ||
|
22d81846df | ||
|
8c9b8362b4 | ||
|
e92eb023fe | ||
|
e550e261f0 | ||
|
46054c03fe | ||
|
db07b24342 | ||
|
cb81e81985 | ||
|
b62e1e920b | ||
|
c61679a35d | ||
|
619e41a18e | ||
|
80fa156e7b | ||
|
01d9fa1719 | ||
|
6846508631 | ||
|
0488451c3d | ||
|
7c3292af81 | ||
|
3d2ba637e5 | ||
|
db72b57ca4 | ||
|
020157a9ae | ||
|
d99cb2d7d1 | ||
|
298261c4af | ||
|
3c674a556d | ||
|
f85fb49f49 | ||
|
92084a56c6 | ||
|
53f97c9841 | ||
|
2770eca1bf | ||
|
2945971ba9 | ||
|
0a39ef60bd | ||
|
e1faf1351e | ||
|
7333451eac | ||
|
c178db127c | ||
|
9747af22e8 | ||
|
e1b2e77df0 | ||
|
ef9b7e22c6 | ||
|
4783902d1d | ||
|
fd27c470b0 | ||
|
4cd2b8c612 | ||
|
dacaff41e4 | ||
|
c187209159 | ||
|
a2e92207c5 | ||
|
be27a82879 | ||
|
4f5ad93f00 | ||
|
b9ca46694e | ||
|
b47c42877a | ||
|
e50d7adc50 | ||
|
d1fc5e5d0f | ||
|
7f73192f8d | ||
|
c4ecd15c0a | ||
|
d71049225e | ||
|
91d7f3b673 | ||
|
63e23c2039 | ||
|
4d1594b1cf | ||
|
0eb6912296 | ||
|
c237a55951 | ||
|
c15006cce8 | ||
|
53b44dcb5c | ||
|
a3765d6360 | ||
|
98d68c4007 | ||
|
6c6dd8abcc | ||
|
16dd729fc7 | ||
|
e8cec5dfc1 | ||
|
a2d49a1ded | ||
|
9ede097e73 | ||
|
2c3800077f | ||
|
84b3f98d38 | ||
|
16734bf37a | ||
|
ea189c5b68 | ||
|
7735506cc7 | ||
|
ca3170c293 | ||
|
9a27a3225b | ||
|
d44cb54bd5 | ||
|
ba13995d10 | ||
|
d1f863e9ac | ||
|
ccdbc9daf9 | ||
|
1723179430 | ||
|
8e0f5b457c | ||
|
2fc2c237d3 | ||
|
b99fb9a5cb | ||
|
538fee8e54 | ||
|
925fa4b6e4 | ||
|
b179c7a933 | ||
|
b25e116f08 | ||
|
422c369b15 | ||
|
d450683e2e | ||
|
ad1aa156dc | ||
|
aa012db099 | ||
|
b08f60bfbd | ||
|
a9b3cef253 | ||
|
b43d1f5502 | ||
|
de9112f6e6 | ||
|
329b14d838 | ||
|
7009324e7f | ||
|
f4ae097722 | ||
|
50be07e8ac | ||
|
2dd054087c | ||
|
7f6608cf7d | ||
|
39e9d8156b | ||
|
90acd19014 | ||
|
9154ec784d | ||
|
0b3ce52958 | ||
|
deee7edded | ||
|
f41f410546 | ||
|
a2dc40fe3a | ||
|
adeed2b79d | ||
|
5dda5903a8 | ||
|
a7bc306b2d | ||
|
7e59c2e5a6 | ||
|
637e8bb8c2 | ||
|
9670caa3fe | ||
|
005d3e4fb0 | ||
|
62a6bbab66 | ||
|
40ba537dc2 | ||
|
ec832b45ff | ||
|
fc03b485f3 | ||
|
651e45c3ba | ||
|
95c2fadce0 | ||
|
b4453c89cc | ||
|
5483dcbd73 | ||
|
f1cfe758ec | ||
|
e9143a73a6 | ||
|
264450f627 | ||
|
a731f0e5d8 | ||
|
d7450d740e | ||
|
5251dcbce9 | ||
|
dd3adf34ef | ||
|
b8a6a8efed | ||
|
d67acf3b3a | ||
|
3b104723af | ||
|
699278a7ed | ||
|
e070cdd6be | ||
|
fbbca110fb | ||
|
0083a45e31 | ||
|
faaac2da3c | ||
|
e44cba033f | ||
|
91400babe0 | ||
|
e1ac7b60f7 | ||
|
573897b06e | ||
|
b77b0a51f4 | ||
|
26af6c9363 | ||
|
2e441534a3 | ||
|
66f3620808 | ||
|
805742f306 | ||
|
18842682c8 | ||
|
a7a526351f | ||
|
22bf0b09ef | ||
|
0a919d317a | ||
|
8e45f7d795 | ||
|
646818a65c | ||
|
6023efa7e6 | ||
|
2dcb21edf2 | ||
|
edc56df2b2 | ||
|
64b57476dc | ||
|
acfa0ad880 | ||
|
d63cbd4146 | ||
|
a90f19dbe3 | ||
|
b0cfdc0396 | ||
|
69257949ac | ||
|
09ab9de32c | ||
|
75620332c7 | ||
|
47aa53c70a | ||
|
c343253718 | ||
|
6764269a49 | ||
|
41d69d7186 | ||
|
f6e6660362 | ||
|
61027daf6e | ||
|
9ae9b8ff2c | ||
|
74bb51ae07 | ||
|
332ba48203 | ||
|
0d7f13abeb | ||
|
e88a7742df | ||
|
c7b3312cf6 | ||
|
c0fa5696d7 | ||
|
43af829d46 | ||
|
9c1a7fb40b | ||
|
dd907a44ad | ||
|
df4c19c113 | ||
|
deaf475861 | ||
|
bda0477a79 | ||
|
4b65871747 | ||
|
eaa0d7d7d2 | ||
|
facbc2c1b5 | ||
|
e5879a9cb0 | ||
|
0a91292e05 | ||
|
1a879e3302 | ||
|
98421fe11b | ||
|
f6fef97a10 | ||
|
f0931a0cf2 | ||
|
9ecb6541cf | ||
|
d816d607f4 | ||
|
f3df3f6dd2 | ||
|
7527155cb8 | ||
|
868812d248 | ||
|
20680fa5b5 | ||
|
00d4aba946 | ||
|
fadcd84ca9 | ||
|
966e08e7c1 | ||
|
8d83d46e7f | ||
|
cdcd6af81d | ||
|
9567b94d37 | ||
|
50a28c4284 | ||
|
87a1d5468d | ||
|
fda950b90e | ||
|
4ccf0d2085 | ||
|
2c42dc535c | ||
|
84ab502b98 | ||
|
0c90a69b27 | ||
|
2ed46a39fa | ||
|
cf13cac438 | ||
|
025e42e046 | ||
|
c4807bd7c9 | ||
|
71db03b0d3 | ||
|
98f9921413 | ||
|
d82caabb47 | ||
|
172056b51e | ||
|
f7ba091364 | ||
|
1ad13aebdb | ||
|
83e59f33fc | ||
|
b011bad5c0 | ||
|
290bc0d4c9 | ||
|
4de72f7c32 | ||
|
cb98f711f7 | ||
|
c306a52d19 | ||
|
627ad8be8c | ||
|
42f534bee8 | ||
|
48d599edf7 | ||
|
eaa5fa8043 | ||
|
1ef85d5d3a | ||
|
f28902dd7b | ||
|
13810e94fc | ||
|
7bd122a8db | ||
|
c43ce26a1b | ||
|
29251dc2be | ||
|
362b9ceb7c | ||
|
04c2f0120c | ||
|
a3b98634de | ||
|
228f1d658d | ||
|
73f587e674 | ||
|
545184da66 | ||
|
e2bf834ff1 | ||
|
57fce78ff3 | ||
|
24e6f1a2f6 | ||
|
6720dfacbc | ||
|
dc5862c2a2 | ||
|
30d09b4a11 | ||
|
e9808a4373 | ||
|
751eaa69df | ||
|
aa644b4c7a | ||
|
61a8adc809 | ||
|
76ad6d6ac9 | ||
|
0621a545ed | ||
|
eff74d78f5 | ||
|
36a3f1e1bf | ||
|
2fb2de067c | ||
|
27b52fd167 | ||
|
423c70757c | ||
|
551ed341a7 | ||
|
b8038604d1 | ||
|
38a8a4c2d2 | ||
|
fbd7036efa | ||
|
c8ff0d4c88 | ||
|
1cf40caedc | ||
|
defa57fd94 | ||
|
c4cc444b80 | ||
|
b2681ff9c8 | ||
|
3bcb025389 | ||
|
3b19b125b7 | ||
|
8f0b80f46c | ||
|
5a44f4a233 | ||
|
6ab1ed3b7f | ||
|
52ffb47fee | ||
|
41cc70e573 | ||
|
c208e0ecbd | ||
|
87389f010b | ||
|
c32b1c19c2 | ||
|
8ce6836674 | ||
|
8ba8d31e50 | ||
|
c1ab78e8e1 | ||
|
ed404ee579 | ||
|
620ebd9e72 | ||
|
fc8d18e4de | ||
|
00219f29cf | ||
|
c4f994f8f6 | ||
|
91211f6ccb | ||
|
666561bfa1 | ||
|
4e94991221 | ||
|
826a514fe3 | ||
|
a9d90acd71 | ||
|
d72fe2ee33 | ||
|
e09042c028 | ||
|
6e13825dcc | ||
|
cc90b5dd80 | ||
|
4b6d9b70d7 | ||
|
1f68eb0f3d | ||
|
61c48ab417 | ||
|
d7e49dfb20 | ||
|
10c5fa6301 | ||
|
368855676a | ||
|
6fbe73ce4d | ||
|
e1763bcd10 | ||
|
378beb55eb | ||
|
14b212f9af | ||
|
cca8b32128 | ||
|
0b94e8bc6a | ||
|
ec3386c2b3 | ||
|
d67a917c6f | ||
|
2a86cd2c90 | ||
|
67c4011263 | ||
|
90d67bc07d | ||
|
70643f40a0 | ||
|
366a9c562f | ||
|
d7a8b0d9fb | ||
|
52dd6f7478 | ||
|
73359d682b | ||
|
2a3f1a3990 | ||
|
e823103334 | ||
|
1208c6c652 | ||
|
b13b24e0b1 | ||
|
91aa0ac2d0 | ||
|
dcce0d44a7 | ||
|
af257d4bff | ||
|
9eaaefd154 | ||
|
bb3e92df6c | ||
|
76bfa395a8 | ||
|
81248f3899 | ||
|
a4d7aee6f5 | ||
|
19823d84de | ||
|
3e66082f11 | ||
|
490d021b22 | ||
|
2d41693f3c |
2
.github/ISSUE_TEMPLATE/question.md
vendored
@ -5,4 +5,4 @@ about: Questions are better asked in the WinFsp Google Group. However you may as
|
|||||||
|
|
||||||
## Question
|
## 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)._
|
_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/winfsp/winfsp/wiki/Frequently-Asked-Questions)._
|
||||||
|
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
Before submitting this PR please review this checklist. Ideally all checkmarks should be checked upon submitting. (Use an x inside square brackets like so: [x])
|
Before submitting this PR please review this checklist. Ideally all checkmarks should be checked upon submitting. (Use an x inside square brackets like so: [x])
|
||||||
|
|
||||||
- [ ] **Contributing**: You MUST read and be willing to accept the [CONTRIBUTOR AGREEMENT](https://github.com/billziss-gh/winfsp/blob/master/Contributors.asciidoc). The agreement gives joint copyright interests in your contributions to you and the original WinFsp author. If you have already accepted the [CONTRIBUTOR AGREEMENT](https://github.com/billziss-gh/winfsp/blob/master/Contributors.asciidoc) you do not need to do so again.
|
- [ ] **Contributing**: You MUST read and be willing to accept the [CONTRIBUTOR AGREEMENT](https://github.com/winfsp/winfsp/blob/master/Contributors.asciidoc). The agreement gives joint copyright interests in your contributions to you and the original WinFsp author. If you have already accepted the [CONTRIBUTOR AGREEMENT](https://github.com/winfsp/winfsp/blob/master/Contributors.asciidoc) you do not need to do so again.
|
||||||
- [ ] **Topic branch**: Avoid creating the PR off the master branch of your fork. Consider creating a topic branch and request a pull from that. This allows you to add commits to the master branch of your fork without affecting this PR.
|
- [ ] **Topic branch**: Avoid creating the PR off the master branch of your fork. Consider creating a topic branch and request a pull from that. This allows you to add commits to the master branch of your fork without affecting this PR.
|
||||||
- [ ] **No tabs**: Consistently use SPACES everywhere. NO TABS, unless the file format requires it (e.g. Makefile).
|
- [ ] **No tabs**: Consistently use SPACES everywhere. NO TABS, unless the file format requires it (e.g. Makefile).
|
||||||
- [ ] **Style**: Follow the same code style as the rest of the project.
|
- [ ] **Style**: Follow the same code style as the rest of the project.
|
||||||
|
8
.github/workflows/avm.yml
vendored
@ -11,6 +11,8 @@ jobs:
|
|||||||
- uses: billziss-gh/avm@v1
|
- uses: billziss-gh/avm@v1
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
https://github.com/billziss-gh/winfsp/releases/download/v1.6/winfsp-1.6.20027.msi
|
https://github.com/winfsp/winfsp/releases/download/v1.10/winfsp-1.10.22006.msi
|
||||||
https://github.com/billziss-gh/winfsp/releases/download/v1.7B1/winfsp-1.7.20038.msi
|
https://github.com/winfsp/winfsp/releases/download/v1.11/winfsp-1.11.22176.msi
|
||||||
https://github.com/billziss-gh/winfsp/releases/download/v1.8/winfsp-1.8.20304.msi
|
https://github.com/winfsp/winfsp/releases/download/v1.12/winfsp-1.12.22301.msi
|
||||||
|
https://github.com/winfsp/winfsp/releases/download/v1.12.22339/winfsp-1.12.22339.msi
|
||||||
|
https://github.com/winfsp/winfsp/releases/download/v2.0/winfsp-2.0.23075.msi
|
||||||
|
365
Changelog.md
Normal file
@ -0,0 +1,365 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
|
||||||
|
## v2.1B2 (2024 Beta2)
|
||||||
|
|
||||||
|
- [FIX] Fixes a rare BSOD on recent versions of Windows. See commit a482183 for details.
|
||||||
|
|
||||||
|
- [FIX] Fixes a rare problem when using `NtCreateFile` to perform "relative" opens on a network drive (see GitHub issue #561).
|
||||||
|
|
||||||
|
- [FIX] Fixes a racing issue with two processes competing to start the FSD discovered during testing.
|
||||||
|
|
||||||
|
|
||||||
|
## v2.1B1 (2024 Beta1)
|
||||||
|
|
||||||
|
- [FIX] Fixes a rare BSOD on recent versions of Windows. See commit a482183 for details.
|
||||||
|
|
||||||
|
- [FIX] Fixes a racing issue with two processes competing to start the FSD discovered during testing.
|
||||||
|
|
||||||
|
|
||||||
|
## v2.0 (2023)
|
||||||
|
|
||||||
|
This release is a major version change for WinFsp (from 1.x to 2.x). There are no backwards incompatible API changes in this release, but nevertheless enough things change that warrant a version change.
|
||||||
|
|
||||||
|
The major new feature of this release is that it allows uninstallation and reinstallation of WinFsp **without reboot**. Going forward installers named `winfsp-2.x.y.msi` can be uninstalled and reinstalled without reboot. Furthermore a later version `winfsp-2.x.y.msi` installer can be used to upgrade over an earlier version `winfsp-2.x.y.msi` installer. However note that a `winfsp-2.x.y.msi` installer cannot be used to upgrade over a legacy `winfsp-1.x.y.msi` installer; you will still need to uninstall the old `winfsp-1.x.y.msi` installer, potentially reboot and then install the new `winfsp-2.x.y.msi` installer.
|
||||||
|
|
||||||
|
Changes visible to file system developers are listed below:
|
||||||
|
|
||||||
|
- WinFsp executable files are now installed by default in the directory `C:\Program Files (x86)\WinFsp\SxS\sxs.<InstanceID>\bin`. The previous directory `C:\Program Files (x86)\WinFsp\bin` is now a junction that points to the above directory.
|
||||||
|
|
||||||
|
- The WinFsp driver name is no longer `winfsp`, but rather a name such as `winfsp+<InstanceID>`. This means that managing the driver using the `sc.exe` utility is no longer as easy.
|
||||||
|
|
||||||
|
- The `fsptool` utility has been updated with new commands `lsdrv`, `load`, `unload` and `ver`. The `lsdrv`, `load` and `unload` commands can be used to manage the driver from the command line. This is rarely necessary, but may be useful for troubleshooting purposes.
|
||||||
|
|
||||||
|
- Prior to this release the WinFsp driver would never unmount a file system volume unless the user mode file system requested the unmount. From this release onward it is possible for the WinFsp driver to unmount a file system volume, without a user mode file system request. This is to allow for the driver to be unloaded.
|
||||||
|
|
||||||
|
A new operation `DispatcherStopped` has been added to `FSP_FILE_SYSTEM_INTERFACE`, which is sent after the file system volume has been unmounted and the file system dispatcher has been stopped. This can happen because of a user mode file system request via `FspFileSystemStopDispatcher` or because of driver unload. The `DispatcherStopped` operation includes a `Normally` parameter, which is `TRUE` for normal file system shutdown via `FspFileSystemStopDispatcher` and `FALSE` otherwise.
|
||||||
|
|
||||||
|
Native file systems that use the `FspService` infrastructure can use the `FspFileSystemStopServiceIfNecessary` API to handle the `DispatcherStopped` operation (see the MEMFS and NTPTFS samples). FUSE file systems get this functionality for free. .NET file systems that use the `Service` class infrastructure also get this functionality for free.
|
||||||
|
|
||||||
|
- WinFsp now offers a .NET library that targets .NET Framework 3.5 (as before) and one that targets .NET Standard 2.0. This is due to work by @Noire001 in PR #451.
|
||||||
|
|
||||||
|
- There is now a winfsp.net nuget package at https://www.nuget.org/packages/winfsp.net
|
||||||
|
|
||||||
|
- FUSE now supports path components up to 255 characters long (previously it was 255 bytes). This is due to work by @zeho11 in PR #474.
|
||||||
|
|
||||||
|
- The FUSE passthrough file systems have been updated to support long paths. This is also due to work by @zeho11.
|
||||||
|
|
||||||
|
- In some rare circumstances WinFsp file systems could report duplicate directory entries. This problem has been fixed. (GitHub issue #475.)
|
||||||
|
|
||||||
|
- The WinFsp symbols directory has been removed. If you are looking for WinFsp symbols you can find them at https://github.com/winfsp/winfsp.sym
|
||||||
|
|
||||||
|
|
||||||
|
## v2.0RC1 (2023 RC1)
|
||||||
|
|
||||||
|
This release is a major version change for WinFsp (from 1.x to 2.x). There are no backwards incompatible API changes in this release, but nevertheless enough things change that warrant a version change.
|
||||||
|
|
||||||
|
The major new feature of this release is that it allows uninstallation and reinstallation of WinFsp **without reboot**. Going forward installers named `winfsp-2.x.y.msi` can be uninstalled and reinstalled without reboot. Furthermore a later version `winfsp-2.x.y.msi` installer can be used to upgrade over an earlier version `winfsp-2.x.y.msi` installer. However note that a `winfsp-2.x.y.msi` installer cannot be used to upgrade over a legacy `winfsp-1.x.y.msi` installer; you will still need to uninstall the old `winfsp-1.x.y.msi` installer, potentially reboot and then install the new `winfsp-2.x.y.msi` installer.
|
||||||
|
|
||||||
|
Changes visible to file system developers are listed below:
|
||||||
|
|
||||||
|
- WinFsp executable files are now installed by default in the directory `C:\Program Files (x86)\WinFsp\SxS\sxs.<InstanceID>\bin`. The previous directory `C:\Program Files (x86)\WinFsp\bin` is now a junction that points to the above directory.
|
||||||
|
|
||||||
|
- The WinFsp driver name is no longer `winfsp`, but rather a name such as `winfsp+<InstanceID>`. This means that managing the driver using the `sc.exe` utility is no longer as easy.
|
||||||
|
|
||||||
|
- The `fsptool` utility has been updated with new commands `lsdrv`, `load`, `unload` and `ver`. The `lsdrv`, `load` and `unload` commands can be used to manage the driver from the command line. This is rarely necessary, but may be useful for troubleshooting purposes.
|
||||||
|
|
||||||
|
- Prior to this release the WinFsp driver would never unmount a file system volume unless the user mode file system requested the unmount. From this release onward it is possible for the WinFsp driver to unmount a file system volume, without a user mode file system request. This is to allow for the driver to be unloaded.
|
||||||
|
|
||||||
|
A new operation `DispatcherStopped` has been added to `FSP_FILE_SYSTEM_INTERFACE`, which is sent after the file system volume has been unmounted and the file system dispatcher has been stopped. This can happen because of a user mode file system request via `FspFileSystemStopDispatcher` or because of driver unload. The `DispatcherStopped` operation includes a `Normally` parameter, which is `TRUE` for normal file system shutdown via `FspFileSystemStopDispatcher` and `FALSE` otherwise.
|
||||||
|
|
||||||
|
Native file systems that use the `FspService` infrastructure can use the `FspFileSystemStopServiceIfNecessary` API to handle the `DispatcherStopped` operation (see the MEMFS and NTPTFS samples). FUSE file systems get this functionality for free. .NET file systems that use the `Service` class infrastructure also get this functionality for free.
|
||||||
|
|
||||||
|
- WinFsp now offers a .NET library that targets .NET Framework 3.5 (as before) and one that targets .NET Standard 2.0. This is due to work by @Noire001 in PR #451.
|
||||||
|
|
||||||
|
- There is now a winfsp.net nuget package at https://www.nuget.org/packages/winfsp.net
|
||||||
|
|
||||||
|
- FUSE now supports path components up to 255 characters long (previously it was 255 bytes). This is due to work by @zeho11 in PR #474.
|
||||||
|
|
||||||
|
- The FUSE passthrough file systems have been updated to support long paths. This is also due to work by @zeho11.
|
||||||
|
|
||||||
|
- In some rare circumstances WinFsp file systems could report duplicate directory entries. This problem has been fixed. (GitHub issue #475.)
|
||||||
|
|
||||||
|
- The WinFsp symbols directory has been removed. If you are looking for WinFsp symbols you can find them at https://github.com/winfsp/winfsp.sym
|
||||||
|
|
||||||
|
|
||||||
|
## v2.0B2 (2023 Beta2)
|
||||||
|
|
||||||
|
This release is a major version change for WinFsp (from 1.x to 2.x). There are no backwards incompatible API changes in this release, but nevertheless enough things change that warrant a version change.
|
||||||
|
|
||||||
|
The major new feature of this release is that it allows uninstallation and reinstallation of WinFsp **without reboot**. Going forward installers named `winfsp-2.x.y.msi` can be uninstalled and reinstalled without reboot. Furthermore a later version `winfsp-2.x.y.msi` installer can be used to upgrade over an earlier version `winfsp-2.x.y.msi` installer. However note that a `winfsp-2.x.y.msi` installer cannot be used to upgrade over a "legacy" `winfsp-1.x.y.msi` installer; you will still need to uninstall the "old" `winfsp-1.x.y.msi` installer, potentially reboot and then install the "new" `winfsp-2.x.y.msi` installer.
|
||||||
|
|
||||||
|
Changes visible to file system developers are listed below:
|
||||||
|
|
||||||
|
- WinFsp executable files are now installed by default in the directory `C:\Program Files (x86)\WinFsp\SxS\sxs.<InstanceID>\bin`. The previous directory `C:\Program Files (x86)\WinFsp\bin` is now a junction that points to the above directory.
|
||||||
|
|
||||||
|
- The WinFsp driver name is no longer `winfsp`, but rather a name such as `winfsp+<InstanceID>`. This means that managing the driver using the `sc.exe` utility is no longer as easy.
|
||||||
|
|
||||||
|
- The `fsptool` utility has been updated with new commands `lsdrv`, `load`, `unload` and `ver`. The `lsdrv`, `load` and `unload` commands can be used to manage the driver from the command line. This is rarely necessary, but may be useful for troubleshooting purposes.
|
||||||
|
|
||||||
|
- Prior to this release the WinFsp driver would never unmount a file system volume unless the user mode file system requested the unmount. From this release onward it is possible for the WinFsp driver to unmount a file system volume, without a user mode file system request. This is to allow for the driver to be unloaded.
|
||||||
|
|
||||||
|
A new operation `DispatcherStopped` has been added to `FSP_FILE_SYSTEM_INTERFACE`, which is sent after the file system volume has been unmounted and the file system dispatcher has been stopped. This can happen because of a user mode file system request via `FspFileSystemStopDispatcher` or because of driver unload. The `DispatcherStopped` operation includes a `Normally` parameter, which is `TRUE` for normal file system shutdown via `FspFileSystemStopDispatcher` and `FALSE` otherwise.
|
||||||
|
|
||||||
|
Native file systems that use the `FspService` infrastructure can use the `FspFileSystemStopServiceIfNecessary` API to handle the `DispatcherStopped` operation (see the MEMFS and NTPTFS samples). FUSE file systems get this functionality for free. .NET file systems that use the `Service` class infrastructure also get this functionality for free.
|
||||||
|
|
||||||
|
- WinFsp now offers a .NET library that targets .NET Framework 3.5 (as before) and one that targets .NET Standard 2.0. This is due to work by @Noire001 in PR #451.
|
||||||
|
|
||||||
|
- FUSE now supports path components up to 255 characters long (previously it was 255 bytes). This is due to work by @zeho11 in PR #474.
|
||||||
|
|
||||||
|
- The FUSE passthrough file systems have been updated to support long paths. This is also due to work by @zeho11.
|
||||||
|
|
||||||
|
- The WinFsp symbols directory has been removed. If you are looking for WinFsp symbols you can find them at https://github.com/winfsp/winfsp.sym
|
||||||
|
|
||||||
|
|
||||||
|
## v2.0B1 (2023 Beta1)
|
||||||
|
|
||||||
|
This release is a major version change for WinFsp (from 1.x to 2.x). There are no backwards incompatible API changes in this release, but nevertheless enough things change that warrant a version change.
|
||||||
|
|
||||||
|
The major new feature of this release is that it allows uninstallation and reinstallation of WinFsp **without reboot**. Going forward installers named `winfsp-2.x.y.msi` can be uninstalled and reinstalled without reboot. Furthermore a later version `winfsp-2.x.y.msi` installer can be used to upgrade over an earlier version `winfsp-2.x.y.msi` installer. However note that a `winfsp-2.x.y.msi` installer cannot be used to upgrade over a "legacy" `winfsp-1.x.y.msi` installer; you will still need to uninstall the "old" `winfsp-1.x.y.msi` installer, potentially reboot and then install the "new" `winfsp-2.x.y.msi` installer.
|
||||||
|
|
||||||
|
Some changes that may be visible to file system developers are listed below:
|
||||||
|
|
||||||
|
- WinFsp executable files are now installed by default in the directory `C:\Program Files (x86)\WinFsp\SxS\sxs.<InstanceID>\bin`. The previous directory `C:\Program Files (x86)\WinFsp\bin` is now a junction that points to the above directory.
|
||||||
|
|
||||||
|
- The WinFsp driver name is no longer `winfsp`, but rather a name such as `winfsp+<InstanceID>`. This means that managing the driver using the `sc.exe` utility is no longer as easy.
|
||||||
|
|
||||||
|
- The `fsptool` utility has been updated with new commands `lsdrv`, `load`, `unload` and `ver`. The `lsdrv`, `load` and `unload` commands can be used to manage the driver from the command line. This is rarely necessary, but may be useful for troubleshooting purposes.
|
||||||
|
|
||||||
|
- The WinFsp symbols directory has been removed. If you are looking for WinFsp symbols you can find them at https://github.com/winfsp/winfsp.sym
|
||||||
|
|
||||||
|
|
||||||
|
## v1.12.22339 (2022.2 Update1)
|
||||||
|
|
||||||
|
*Note: This release (`v1.12.22339`) is the same as the previous release (`v1.12`) except that: (1) the kernel-mode drivers are now digitally signed only with the Microsoft Attestation signature, and that: (2) no release assets are digitally signed with SHA-1. (This change was necessary to fix a problem in older versions of Windows such as Windows 7.)*
|
||||||
|
|
||||||
|
- [NEW] WinFsp now supports mounting as directory using the Mount Manager. Use the syntax `\\.\C:\Path\To\Mount\Directory`.
|
||||||
|
|
||||||
|
- [NEW] A new registry setting `MountUseMountmgrFromFSD` has been added. See [WinFsp Registry Settings](https://github.com/winfsp/winfsp/wiki/WinFsp-Registry-Settings) for details.
|
||||||
|
|
||||||
|
- [FIX] A problem with Windows containers has been fixed. (GitHub issue #438.)
|
||||||
|
|
||||||
|
- [FIX] File systems can now be mounted as directories on ARM64. (GitHub issue #448.)
|
||||||
|
|
||||||
|
- [FIX] The passthrough file system now reports correct `IndexNumber`. (GitHub issue #325.)
|
||||||
|
|
||||||
|
- [BUILD] Product configuration for the relative paths to the File System Driver, Network Provider and EventLog is now possible via the file `build.version.props` located in `build\VStudio`.
|
||||||
|
|
||||||
|
|
||||||
|
## v1.12 (2022.2)
|
||||||
|
|
||||||
|
- [NEW] WinFsp now supports mounting as directory using the Mount Manager. Use the syntax `\\.\C:\Path\To\Mount\Directory`.
|
||||||
|
|
||||||
|
- [NEW] A new registry setting `MountUseMountmgrFromFSD` has been added. See [WinFsp Registry Settings](https://github.com/winfsp/winfsp/wiki/WinFsp-Registry-Settings) for details.
|
||||||
|
|
||||||
|
- [FIX] A problem with Windows containers has been fixed. (GitHub issue #438.)
|
||||||
|
|
||||||
|
- [FIX] File systems can now be mounted as directories on ARM64. (GitHub issue #448.)
|
||||||
|
|
||||||
|
- [FIX] The passthrough file system now reports correct `IndexNumber`. (GitHub issue #325.)
|
||||||
|
|
||||||
|
- [BUILD] Product configuration for the relative paths to the File System Driver, Network Provider and EventLog is now possible via the file `build.version.props` located in `build\VStudio`.
|
||||||
|
|
||||||
|
|
||||||
|
## v1.12B2 (2022.2 Beta2)
|
||||||
|
|
||||||
|
- [NEW] WinFsp now supports mounting as directory using the Mount Manager. Use the syntax `\\.\C:\Path\To\Mount\Directory`.
|
||||||
|
|
||||||
|
- [NEW] A new registry setting `MountUseMountmgrFromFSD` has been added. See [WinFsp Registry Settings](https://github.com/winfsp/winfsp/wiki/WinFsp-Registry-Settings) for details.
|
||||||
|
|
||||||
|
- [FIX] A problem with Windows containers has been fixed. (GitHub issue #438.)
|
||||||
|
|
||||||
|
- [FIX] File systems can now be mounted as directories on ARM64. (GitHub issue #448.)
|
||||||
|
|
||||||
|
- [FIX] The passthrough file system now reports correct `IndexNumber`. (GitHub issue #325.)
|
||||||
|
|
||||||
|
- [BUILD] Product configuration for the relative paths to the File System Driver, Network Provider and EventLog is now possible via the file `build.version.props` located in `build\VStudio`.
|
||||||
|
|
||||||
|
|
||||||
|
## v1.12B1 (2022.2 Beta1)
|
||||||
|
|
||||||
|
- [NEW] WinFsp now supports mounting as directory using the Mount Manager. Use the syntax `\\.\C:\Path\To\Mount\Directory`.
|
||||||
|
|
||||||
|
- [NEW] A new registry setting `MountUseMountmgrFromFSD` has been added. See [WinFsp Registry Settings](https://github.com/winfsp/winfsp/wiki/WinFsp-Registry-Settings) for details.
|
||||||
|
|
||||||
|
- [BUILD] Product configuration for the relative paths to the File System Driver, Network Provider and EventLog is now possible via the file `build.version.props` located in `build\VStudio`.
|
||||||
|
|
||||||
|
|
||||||
|
## v1.11 (2022+ARM64)
|
||||||
|
|
||||||
|
- [NEW] ARM64 support! For details see [WinFsp on ARM64](https://github.com/winfsp/winfsp/wiki/WinFsp-on-ARM64).
|
||||||
|
|
||||||
|
- [NEW] A new file system operation has been added to the FUSE API:
|
||||||
|
|
||||||
|
```C
|
||||||
|
int (*getpath)(const char *path, char *buf, size_t size,
|
||||||
|
struct fuse_file_info *fi);
|
||||||
|
```
|
||||||
|
|
||||||
|
The `getpath` operation allows a case-insensitive file system to report the correct case of a file path. For example, `getpath` can be used to report that the actual path of a file opened as `/PATH/TO/FILE` is really `/Path/To/File`. This capability is important for some Windows file system scenarios and can sometimes result in a performance improvement.
|
||||||
|
|
||||||
|
- [NEW] New `ntptfs` sample file system. This is a production quality pass through file system and should be used instead of the original `passthrough` file system that was developed for education purposes only.
|
||||||
|
|
||||||
|
- [NEW] Many performance improvements:
|
||||||
|
|
||||||
|
- A new `PostDispositionForDirOnly` setting has been added to `FSP_FSCTL_VOLUME_PARAMS`. This allows a file system to declare that it does not want to see `SetInformation/Disposition` requests for files (such requests will still be sent for directories, because a file system is supposed to check if a directory is empty before deletion). This makes file (not directory) deletion faster. This optimization should be safe to enable for most file systems. FUSE file systems get this optimization for free.
|
||||||
|
|
||||||
|
- The FSD now implements "fast I/O" reads and writes. Fast I/O is a technique for doing I/O without using IRP's (I/O Request Packets) and can only work for file systems using the cache manager (`FileInfoTimeout==-1`). This results in significant improvement in read/write scenarios.
|
||||||
|
|
||||||
|
- The FSD now implements "fast I/O" for "transact" messages. Transact messages are used in the communication protocol between the kernel-mode FSD and the user-mode file system. Fast I/O speeds this communication protocol by as much as 10% in some scenarios. (Fast I/O for transact messages is enabled only when using the new `FSP_IOCTL_TRANSACT` control code, but does not require any other special configuration to be enabled.)
|
||||||
|
|
||||||
|
- The FSD per directory cache limit has been increased from 16K to 64K. This should allow for more directory data to be maintained in kernel and reduce round-trips to the user mode file system.
|
||||||
|
|
||||||
|
- The user mode directory buffering mechanism (`FspFileSystemAcquireDirectoryBuffer`) has been improved. The mechanism uses the quick-sort algorithm internally which can exhibit bad performance when sorting already sorted data. The quick-sort algorithm has been improved with the use use of median of three partitioning, which alleviates this problem.
|
||||||
|
|
||||||
|
- [NEW] A new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `MountBroadcastDriveChange` has been introduced, which if set to 1 will broadcast an additional "drive change" message to all top-level windows (including Explorer) during mounting and unmounting.
|
||||||
|
|
||||||
|
- Normally the Windows infrastructure broadcasts a `WM_DEVICECHANGE` message whenever a drive gets added/removed. In some rare systems it is possible for this message to get lost or stalled. The workaround for these rare systems is to enable this registry setting, in which case WinFsp will broadcast the `WM_DEVICECHANGE` using a slightly different but more reliable method than the one Windows uses.
|
||||||
|
|
||||||
|
- For more details see source code comments at [`FspMountBroadcastDriveChange`](https://github.com/winfsp/winfsp/blob/v1.11B3/src/dll/mount.c#L390-L406).
|
||||||
|
|
||||||
|
- [FIX] The WinFsp Network Provider now implements `NPGetUniversalName`. This fixes problems with some apps (e.g. Photos app).
|
||||||
|
|
||||||
|
- [FIX] WinFsp-FUSE now supports Azure AD accounts when specifying the `-o uid=-1` option. In addition a new option `-o uidmap=UID:SID` allows the specification of arbitrary UID<->SID or UID<->UserName mappings.
|
||||||
|
|
||||||
|
- [FIX] All executables (`*.exe,*.dll,*.sys`) in the WinFsp installation `bin` folder are now signed.
|
||||||
|
|
||||||
|
- [FIX] The default value for the registry setting `DistinctPermsForSameOwnerGroup` has been changed from 0 to 1.
|
||||||
|
|
||||||
|
- [BUILD] Product configuration (`MyProductName`, etc.) is done by the file `build.version.props` located in `build\VStudio`. This file was previously named `version.properties`.
|
||||||
|
|
||||||
|
|
||||||
|
## v1.11RC1 (2022+ARM64 RC1)
|
||||||
|
|
||||||
|
- [NEW] ARM64 support! For details see [WinFsp on ARM64](https://github.com/winfsp/winfsp/wiki/WinFsp-on-ARM64).
|
||||||
|
|
||||||
|
- [NEW] A new file system operation has been added to the FUSE API:
|
||||||
|
|
||||||
|
```C
|
||||||
|
int (*getpath)(const char *path, char *buf, size_t size,
|
||||||
|
struct fuse_file_info *fi);
|
||||||
|
```
|
||||||
|
|
||||||
|
The `getpath` operation allows a case-insensitive file system to report the correct case of a file path. For example, `getpath` can be used to report that the actual path of a file opened as `/PATH/TO/FILE` is really `/Path/To/File`. This capability is important for some Windows file system scenarios and can sometimes result in a performance improvement.
|
||||||
|
|
||||||
|
- [NEW] New `ntptfs` sample file system. This is a production quality pass through file system and should be used instead of the original `passthrough` file system that was developed for education purposes only.
|
||||||
|
|
||||||
|
- [NEW] Many performance improvements:
|
||||||
|
|
||||||
|
- A new `PostDispositionForDirOnly` setting has been added to `FSP_FSCTL_VOLUME_PARAMS`. This allows a file system to declare that it does not want to see `SetInformation/Disposition` requests for files (such requests will still be sent for directories, because a file system is supposed to check if a directory is empty before deletion). This makes file (not directory) deletion faster. This optimization should be safe to enable for most file systems. FUSE file systems get this optimization for free.
|
||||||
|
|
||||||
|
- The FSD now implements "fast I/O" reads and writes. Fast I/O is a technique for doing I/O without using IRP's (I/O Request Packets) and can only work for file systems using the cache manager (`FileInfoTimeout==-1`). This results in significant improvement in read/write scenarios.
|
||||||
|
|
||||||
|
- The FSD now implements "fast I/O" for "transact" messages. Transact messages are used in the communication protocol between the kernel-mode FSD and the user-mode file system. Fast I/O speeds this communication protocol by as much as 10% in some scenarios. (Fast I/O for transact messages is enabled only when using the new `FSP_IOCTL_TRANSACT` control code, but does not require any other special configuration to be enabled.)
|
||||||
|
|
||||||
|
- The FSD per directory cache limit has been increased from 16K to 64K. This should allow for more directory data to be maintained in kernel and reduce round-trips to the user mode file system.
|
||||||
|
|
||||||
|
- The user mode directory buffering mechanism (`FspFileSystemAcquireDirectoryBuffer`) has been improved. The mechanism uses the quick-sort algorithm internally which can exhibit bad performance when sorting already sorted data. The quick-sort algorithm has been improved with the use use of median of three partitioning, which alleviates this problem.
|
||||||
|
|
||||||
|
- [NEW] A new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `MountBroadcastDriveChange` has been introduced, which if set to 1 will broadcast an additional "drive change" message to all top-level windows (including Explorer) during mounting and unmounting.
|
||||||
|
|
||||||
|
- Normally the Windows infrastructure broadcasts a `WM_DEVICECHANGE` message whenever a drive gets added/removed. In some rare systems it is possible for this message to get lost or stalled. The workaround for these rare systems is to enable this registry setting, in which case WinFsp will broadcast the `WM_DEVICECHANGE` using a slightly different but more reliable method than the one Windows uses.
|
||||||
|
|
||||||
|
- For more details see source code comments at [`FspMountBroadcastDriveChange`](https://github.com/winfsp/winfsp/blob/v1.11B3/src/dll/mount.c#L390-L406).
|
||||||
|
|
||||||
|
- [FIX] The WinFsp Network Provider now implements `NPGetUniversalName`. This fixes problems with some apps (e.g. Photos app).
|
||||||
|
|
||||||
|
- [FIX] WinFsp-FUSE now supports Azure AD accounts when specifying the `-o uid=-1` option. In addition a new option `-o uidmap=UID:SID` allows the specification of arbitrary UID<->SID or UID<->UserName mappings.
|
||||||
|
|
||||||
|
- [FIX] All executables (`*.exe,*.dll,*.sys`) in the WinFsp installation `bin` folder are now signed.
|
||||||
|
|
||||||
|
- [FIX] The default value for the registry setting `DistinctPermsForSameOwnerGroup` has been changed from 0 to 1.
|
||||||
|
|
||||||
|
- [BUILD] Product configuration (`MyProductName`, etc.) is done by the file `build.version.props` located in `build\VStudio`. This file was previously named `version.properties`.
|
||||||
|
|
||||||
|
|
||||||
|
## v1.11B3 (2022+ARM64 Beta3)
|
||||||
|
|
||||||
|
- [NEW] ARM64 support! For details see [WinFsp on ARM64](https://github.com/winfsp/winfsp/wiki/WinFsp-on-ARM64).
|
||||||
|
|
||||||
|
- [NEW] A new file system operation has been added to the FUSE API:
|
||||||
|
|
||||||
|
```C
|
||||||
|
int (*getpath)(const char *path, char *buf, size_t size,
|
||||||
|
struct fuse_file_info *fi);
|
||||||
|
```
|
||||||
|
|
||||||
|
The `getpath` operation allows a case-insensitive file system to report the correct case of a file path. For example, `getpath` can be used to report that the actual path of a file opened as `/PATH/TO/FILE` is really `/Path/To/File`. This capability is important for some Windows file system scenarios and can sometimes result in a performance improvement.
|
||||||
|
|
||||||
|
- [NEW] New `ntptfs` sample file system. This is a production quality pass through file system and should be used instead of the original `passthrough` file system that was developed for education purposes only.
|
||||||
|
|
||||||
|
- [NEW] Many performance improvements:
|
||||||
|
|
||||||
|
- A new `PostDispositionForDirOnly` setting has been added to `FSP_FSCTL_VOLUME_PARAMS`. This allows a file system to declare that it does not want to see `SetInformation/Disposition` requests for files (such requests will still be sent for directories, because a file system is supposed to check if a directory is empty before deletion). This makes file (not directory) deletion faster. This optimization should be safe to enable for most file systems. FUSE file systems get this optimization for free.
|
||||||
|
|
||||||
|
- The FSD now implements "fast I/O" reads and writes. Fast I/O is a technique for doing I/O without using IRP's (I/O Request Packets) and can only work for file systems using the cache manager (`FileInfoTimeout==-1`). This results in significant improvement in read/write scenarios.
|
||||||
|
|
||||||
|
- The FSD now implements "fast I/O" for "transact" messages. Transact messages are used in the communication protocol between the kernel-mode FSD and the user-mode file system. Fast I/O speeds this communication protocol by as much as 10% in some scenarios. (Fast I/O for transact messages is enabled only when using the new `FSP_IOCTL_TRANSACT` control code, but does not require any other special configuration to be enabled.)
|
||||||
|
|
||||||
|
- The FSD per directory cache limit has been increased from 16K to 64K. This should allow for more directory data to be maintained in kernel and reduce round-trips to the user mode file system.
|
||||||
|
|
||||||
|
- The user mode directory buffering mechanism (`FspFileSystemAcquireDirectoryBuffer`) has been improved. The mechanism uses the quick-sort algorithm internally which can exhibit bad performance when sorting already sorted data. The quick-sort algorithm has been improved with the use use of median of three partitioning, which alleviates this problem.
|
||||||
|
|
||||||
|
- [NEW] A new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `MountBroadcastDriveChange` has been introduced, which if set to 1 will broadcast an additional "drive change" message to all top-level windows (including Explorer) during mounting and unmounting.
|
||||||
|
|
||||||
|
- Normally the Windows infrastructure broadcasts a `WM_DEVICECHANGE` message whenever a drive gets added/removed. In some rare systems it is possible for this message to get lost or stalled. The workaround for these rare systems is to enable this registry setting, in which case WinFsp will broadcast the `WM_DEVICECHANGE` using a slightly different but more reliable method than the one Windows uses.
|
||||||
|
|
||||||
|
- For more details see source code comments at [`FspMountBroadcastDriveChange`](https://github.com/winfsp/winfsp/blob/v1.11B3/src/dll/mount.c#L390-L406).
|
||||||
|
|
||||||
|
- [FIX] The WinFsp Network Provider now implements `NPGetUniversalName`. This fixes problems with some apps (e.g. Photos app).
|
||||||
|
|
||||||
|
- [FIX] WinFsp-FUSE now supports Azure AD accounts when specifying the `-o uid=-1` option. In addition a new option `-o uidmap=UID:SID` allows the specification of arbitrary UID<->SID or UID<->UserName mappings.
|
||||||
|
|
||||||
|
- [FIX] All executables (`*.exe,*.dll,*.sys`) in the WinFsp installation `bin` folder are now signed.
|
||||||
|
|
||||||
|
- [FIX] The default value for the registry setting `DistinctPermsForSameOwnerGroup` has been changed from 0 to 1.
|
||||||
|
|
||||||
|
- [BUILD] Product configuration (`MyProductName`, etc.) is done by the file `build.version.props` located in `build\VStudio`. This file was previously named `version.properties`.
|
||||||
|
|
||||||
|
|
||||||
|
## v1.11B2 (2022+ARM64 Beta2)
|
||||||
|
|
||||||
|
- [NEW] ARM64 support! For details see [WinFsp on ARM64](https://github.com/winfsp/winfsp/wiki/WinFsp-on-ARM64).
|
||||||
|
|
||||||
|
- [NEW] A new file system operation has been added to the FUSE API:
|
||||||
|
|
||||||
|
```C
|
||||||
|
int (*getpath)(const char *path, char *buf, size_t size,
|
||||||
|
struct fuse_file_info *fi);
|
||||||
|
```
|
||||||
|
|
||||||
|
The `getpath` operation allows a case-insensitive file system to report the correct case of a file path. For example, `getpath` can be used to report that the actual path of a file opened as `/PATH/TO/FILE` is really `/Path/To/File`. This capability is important for some Windows file system scenarios and can sometimes result in a performance improvement.
|
||||||
|
|
||||||
|
- [NEW] Many performance improvements:
|
||||||
|
|
||||||
|
- A new `PostDispositionForDirOnly` setting has been added to `FSP_FSCTL_VOLUME_PARAMS`. This allows a file system to declare that it does not want to see `SetInformation/Disposition` requests for files (such requests will still be sent for directories, because a file system is supposed to check if a directory is empty before deletion). This makes file (not directory) deletion faster. This optimization should be safe to enable for most file systems. FUSE file systems get this optimization for free.
|
||||||
|
|
||||||
|
- The FSD now implements "fast I/O" reads and writes. Fast I/O is a technique for doing I/O without using IRP's (I/O Request Packets) and can only work for file systems using the cache manager (`FileInfoTimeout==-1`). This results in significant improvement in read/write scenarios.
|
||||||
|
|
||||||
|
- The FSD per directory cache limit has been increased from 16K to 64K. This should allow for more directory data to be maintained in kernel and reduce round-trips to a user mode file system.
|
||||||
|
|
||||||
|
- The user mode directory buffering mechanism (`FspFileSystemAcquireDirectoryBuffer`) has been improved. The mechanism uses the quick-sort algorithm internally which can exhibit bad performance when sorting already sorted data. The quick-sort algorithm has been improved with the use use of median of three partitioning, which alleviates this problem.
|
||||||
|
|
||||||
|
- [NEW] The default value for the registry setting `DistinctPermsForSameOwnerGroup` has been changed from 0 to 1.
|
||||||
|
|
||||||
|
- [NEW] New `ntptfs` sample file system. This is a production quality pass through file system and should be used instead of the original `passthrough` file system that was developed for education purposes only.
|
||||||
|
|
||||||
|
- [FIX] The WinFsp Network Provider now implements `NPGetUniversalName`. This fixes problems with some apps (e.g. Photos app).
|
||||||
|
|
||||||
|
- [BUILD] Product configuration (`MyProductName`, etc.) is done by the file `build.version.props` located in `build\VStudio`. This file was previously named `version.properties`.
|
||||||
|
|
||||||
|
|
||||||
|
## v1.11B1 (2022+ARM64 Beta1)
|
||||||
|
|
||||||
|
- [NEW] ARM64 support! For details see [WinFsp on ARM64](https://github.com/winfsp/winfsp/wiki/WinFsp-on-ARM64).
|
||||||
|
|
||||||
|
- [NEW] New `ntptfs` sample file system. This is a production quality pass through file system and should be used instead of the original `passthrough` file system that was developed for education purposes only.
|
||||||
|
|
||||||
|
- [NEW] The default value for the registry setting `DistinctPermsForSameOwnerGroup` has been changed from 0 to 1.
|
||||||
|
|
||||||
|
- [BUILD] Product configuration (`MyProductName`, etc.) is done by the file `build.version.props` located in `build\VStudio`. This file was previously named `version.properties`.
|
||||||
|
|
||||||
|
|
||||||
|
## v1.10 (2022)
|
||||||
|
|
||||||
|
Prior changes are recorded in `doc/archive/Changelog-upto-v1.10.asciidoc`.
|
@ -58,6 +58,7 @@ CONTRIBUTOR LIST
|
|||||||
|Ben Rubson |ben.rubson at gmail.com
|
|Ben Rubson |ben.rubson at gmail.com
|
||||||
|Bill Zissimopoulos |billziss at navimatics.com
|
|Bill Zissimopoulos |billziss at navimatics.com
|
||||||
|Brett Dutro |brett.dutro at gmail.com
|
|Brett Dutro |brett.dutro at gmail.com
|
||||||
|
|Changjian Gao (Juicedata, https://juicefs.com) |gcj at juicedata.io
|
||||||
|Colin Atkinson (Atakama, https://atakama.com) |colin at atakama.com
|
|Colin Atkinson (Atakama, https://atakama.com) |colin at atakama.com
|
||||||
|Felix Croes |felix at dworkin.nl
|
|Felix Croes |felix at dworkin.nl
|
||||||
|Francois Karam (KS2, http://www.ks2.fr) |francois.karam at ks2.fr
|
|Francois Karam (KS2, http://www.ks2.fr) |francois.karam at ks2.fr
|
||||||
@ -65,10 +66,14 @@ CONTRIBUTOR LIST
|
|||||||
|Gal Hammer (Red Hat, https://www.redhat.com) |ghammer at redhat.com
|
|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
|
|John Tyner |jtyner at gmail.com
|
||||||
|
|Konstantinos Karakostas |noiredev at protonmail.com
|
||||||
|
|Naoki Ikeguchi |me at s6n.jp
|
||||||
|Paweł Wegner (Google LLC, https://google.com) |lemourin at google.com
|
|Paweł Wegner (Google LLC, https://google.com) |lemourin at google.com
|
||||||
|Pedro Frejo (Arpa System, https://arpasystem.com) |pedro.frejo at arpasystem.com
|
|Pedro Frejo (Arpa System, https://arpasystem.com) |pedro.frejo at arpasystem.com
|
||||||
|
|Ronny Chan |ronny at ronnychan.ca
|
||||||
|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
|
|Santiago Ganis |sganis at gmail.com
|
||||||
|Tobias Urlaub |saibotu at outlook.de
|
|Tobias Urlaub |saibotu at outlook.de
|
||||||
|Victor Gao |victgm at outlook.com
|
|Victor Gao |victgm at outlook.com
|
||||||
|
|Zeho Huang |zeho11 at protonmail.com
|
||||||
|===
|
|===
|
||||||
|
@ -6,7 +6,7 @@ permissions to Free/Libre and Open Source Software ("FLOSS") without requiring
|
|||||||
that such software is covered by the GPLv3.
|
that such software is covered by the GPLv3.
|
||||||
|
|
||||||
1. Permission to link with a platform specific version of the WinFsp DLL
|
1. Permission to link with a platform specific version of the WinFsp DLL
|
||||||
(one of: winfsp-x64.dll, winfsp-x86.dll, winfsp-msil.dll).
|
(one of: winfsp-a64.dll, winfsp-x64.dll, winfsp-x86.dll, winfsp-msil.dll).
|
||||||
|
|
||||||
2. Permission to distribute unmodified binary releases of the WinFsp
|
2. Permission to distribute unmodified binary releases of the WinFsp
|
||||||
installer (as released by the WinFsp project).
|
installer (as released by the WinFsp project).
|
||||||
|
162
README.md
@ -1,140 +1,110 @@
|
|||||||
<h1 align="center">
|
<h1 align="center">WinFsp · Windows File System Proxy</h1>
|
||||||
<img src="art/winfsp-glow.png" width="256"/>
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
WinFsp · Windows File System Proxy
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<b>Download</b><br>
|
<img src="art/winfsp-glow.png" width="128"/>
|
||||||
<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/>
|
<br/>
|
||||||
<br/>
|
<br/>
|
||||||
<a href="https://ci.appveyor.com/project/billziss-gh/winfsp">
|
<i>WinFsp enables developers to write their own file systems (i.e. "Windows drives") as user mode programs and without any knowledge of Windows kernel programming. It is similar to FUSE (Filesystem in Userspace) for Linux and other UNIX-like computers.</i>
|
||||||
<img src="https://img.shields.io/appveyor/ci/billziss-gh/winfsp.svg"/>
|
|
||||||
</a>
|
|
||||||
<br/>
|
<br/>
|
||||||
<br/>
|
<br/>
|
||||||
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.
|
<a href="https://winfsp.dev"><b>winfsp.dev</b></a>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
<a href="https://github.com/winfsp/winfsp/releases/latest"><img src="https://img.shields.io/github/release/winfsp/winfsp.svg?label=stable&style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0ODAgNDgwIj48cGF0aCBkPSJNMzg3LjAwMiAyMDEuMDAxQzM3Mi45OTggMTMyLjAwMiAzMTIuOTk4IDgwIDI0MCA4MGMtNTcuOTk4IDAtMTA3Ljk5OCAzMi45OTgtMTMyLjk5OCA4MS4wMDFDNDcuMDAyIDE2Ny4wMDIgMCAyMTcuOTk4IDAgMjgwYzAgNjUuOTk2IDUzLjk5OSAxMjAgMTIwIDEyMGgyNjBjNTUgMCAxMDAtNDUgMTAwLTEwMCAwLTUyLjk5OC00MC45OTYtOTYuMDAxLTkyLjk5OC05OC45OTl6TTIwOCAyNTJ2LTc2aDY0djc2aDY4TDI0MCAzNTIgMTQwIDI1Mmg2OHoiIGZpbGw9IiNmZmYiLz48L3N2Zz4="/></a>
|
||||||
|
<a href="https://github.com/winfsp/winfsp/releases"><img src="https://img.shields.io/github/release/winfsp/winfsp/all.svg?label=latest&colorB=e52e4b&style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0ODAgNDgwIj48cGF0aCBkPSJNMzg3LjAwMiAyMDEuMDAxQzM3Mi45OTggMTMyLjAwMiAzMTIuOTk4IDgwIDI0MCA4MGMtNTcuOTk4IDAtMTA3Ljk5OCAzMi45OTgtMTMyLjk5OCA4MS4wMDFDNDcuMDAyIDE2Ny4wMDIgMCAyMTcuOTk4IDAgMjgwYzAgNjUuOTk2IDUzLjk5OSAxMjAgMTIwIDEyMGgyNjBjNTUgMCAxMDAtNDUgMTAwLTEwMCAwLTUyLjk5OC00MC45OTYtOTYuMDAxLTkyLjk5OC05OC45OTl6TTIwOCAyNTJ2LTc2aDY0djc2aDY4TDI0MCAzNTIgMTQwIDI1Mmg2OHoiIGZpbGw9IiNmZmYiLz48L3N2Zz4="/></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/>
|
||||||
|
<br/>
|
||||||
|
<img src="doc/cap.gif" width="75%" height="75%"/>
|
||||||
<br/>
|
<br/>
|
||||||
<br/>
|
<br/>
|
||||||
<img src="doc/cap.gif" height="450"/>
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
## Benefits
|
<hr/>
|
||||||
|
|
||||||
### Stability
|
## Overview
|
||||||
|
|
||||||
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 platform that provides development and runtime support for custom file systems on Windows computers. Typically any information or storage may be organized and presented as a file system via WinFsp, with the benefit being that the information can be accessed via the standand Windows file API’s by any Windows application.
|
||||||
|
|
||||||
### Performance
|
The core WinFsp consists of a kernel mode file system driver (FSD) and a user mode DLL. The FSD interfaces with the Windows kernel and handles all interactions necessary to present itself as a file system driver. The DLL interfaces with the FSD and presents an API that can be used to handle file system functions. For example, when an application attempts to open a file, the file system receives an `Open` call with the necessary information.
|
||||||
|
|
||||||
WinFsp outperforms its competition and in many scenarios performs as well as NTFS. Read more about its [Performance](doc/WinFsp-Performance-Testing.asciidoc).
|
Using WinFsp to build a file system has many benefits:
|
||||||
|
|
||||||
|
**Easy development**: Developing kernel mode file systems for Windows is a notoriously difficult task. WinFsp makes file system development relatively painless. This [Tutorial](doc/WinFsp-Tutorial.asciidoc) explains how to build a file system.
|
||||||
|
|
||||||
|
**Stability**: Stable software without any known kernel mode crashes, 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).
|
||||||
|
|
||||||
|
**Correctness**: Strives for file system correctness and compatibility with NTFS. For details see the [Compatibility](doc/NTFS-Compatibility.asciidoc) document.
|
||||||
|
|
||||||
|
**Performance**: Has excellent performance that rivals or exceeds that of NTFS in many file system scenarios. Read more about its [Performance](doc/WinFsp-Performance-Testing.asciidoc).
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="doc/WinFsp-Performance-Testing/file_tests.png" height="300"/>
|
<img src="doc/WinFsp-Performance-Testing/file_tests.png" height="300"/>
|
||||||
<img src="doc/WinFsp-Performance-Testing/rdwr_tests.png" height="300"/>
|
<img src="doc/WinFsp-Performance-Testing/rdwr_tests.png" height="300"/>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
### Compatibility
|
**Wide support**: Supports Windows 7 to Windows 11 and the x86, x64 and ARM64 architectures.
|
||||||
|
|
||||||
WinFsp strives for compatibility with NTFS and file system correctness. For the full details see the [Compatibility](doc/NTFS-Compatibility.asciidoc) document.
|
**Flexible API**: Includes Native, FUSE2, FUSE3 and .NET API's.
|
||||||
|
|
||||||
### Easy to Use
|
**Shell integration**: Provides facilities to integrate user mode file systems with the Windows shell. See the [Service Architecture](doc/WinFsp-Service-Architecture.asciidoc) document.
|
||||||
|
|
||||||
WinFsp has an easy to use but comprehensive API.
|
**Self-contained**: Self-contained software without external dependencies.
|
||||||
|
|
||||||
* This simple [Tutorial](doc/WinFsp-Tutorial.asciidoc) explains how to build a file system.
|
**Widely used**: Used in many open-source and commercial applications with millions of installations (estimated: the WinFsp project does not track its users).
|
||||||
* 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
|
**Flexible licensing**: Available under the [GPLv3](License.txt) license with a special exception for Free/Libre and Open Source Software. A commercial license is also available. Please contact Bill Zissimopoulos \<billziss at navimatics.com> for more details.
|
||||||
|
|
||||||
* Signed drivers provided on every release.
|
## Installation
|
||||||
* Available under the [GPLv3](License.txt) license with a special exception for Free/Libre and Open Source Software.
|
|
||||||
|
|
||||||
To learn more about WinFsp, please visit its website: http://www.secfs.net/winfsp/
|
Download and run the [WinFsp installer](https://github.com/winfsp/winfsp/releases/latest). In the installer select the option to install the "Developer" files. These include the MEMFS sample file system, but also header and library files that let you develop your own user-mode file system.
|
||||||
|
|
||||||
## Project Organization
|
<img src="doc/WinFsp-Tutorial/Installer.png" height="290"/>
|
||||||
|
|
||||||
The project source code is organized as follows:
|
### Launch a file system for testing
|
||||||
|
|
||||||
* :file_folder: [build/VStudio](build/VStudio): WinFsp solution and project files.
|
You can test WinFsp by launching MEMFS from the command line:
|
||||||
* :file_folder: [doc](doc): The WinFsp design documents and additional documentation can be found here.
|
|
||||||
* :file_folder: [ext](ext): External dependencies.
|
|
||||||
* :file_folder: [ext/tlib](ext/tlib): A small test library originally from the secfs (Secure Cloud File System) project.
|
|
||||||
* :file_folder: ext/test: Submodule pointing to the secfs.test project, which contains a number of tools for testing Windows and POSIX file systems.
|
|
||||||
* :file_folder: [inc](inc): Public headers.
|
|
||||||
* :file_folder: [inc/fuse](inc/fuse): Public headers for the FUSE compatibility layer.
|
|
||||||
* :file_folder: [inc/fuse3](inc/fuse3): Public headers for the FUSE3 compatibility layer.
|
|
||||||
* :file_folder: [inc/winfsp](inc/winfsp): Public headers for the WinFsp API.
|
|
||||||
* :file_folder: [src](src): WinFsp source code.
|
|
||||||
* :file_folder: [src/dll](src/dll): Source code to the WinFsp DLL.
|
|
||||||
* :file_folder: [src/dll/fuse](src/dll/fuse): Source code to the FUSE compatibility layer.
|
|
||||||
* :file_folder: [src/dll/fuse3](src/dll/fuse3): Source code to the FUSE3 compatibility layer.
|
|
||||||
* :file_folder: [src/dotnet](src/dotnet): Source code to the .NET layer.
|
|
||||||
* :file_folder: [src/fsptool](src/fsptool): Source code to fsptool command line utility.
|
|
||||||
* :file_folder: [src/ku](src/ku): Source code that can be used from kernel or user mode.
|
|
||||||
* :file_folder: [src/launcher](src/launcher): Source code to the launcher service and the launchctl utility.
|
|
||||||
* :file_folder: [src/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
|
|
||||||
|
|
||||||
In order to build WinFsp you will need the following:
|
|
||||||
|
|
||||||
* Visual Studio 2015 - 2019
|
|
||||||
* 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"/>
|
billziss@xps ⟩ ~ ⟩ net use X: \\memfs64\test
|
||||||
|
The command completed successfully.
|
||||||
|
|
||||||
|
billziss@xps ⟩ ~ ⟩ X:
|
||||||
|
billziss@xps ⟩ X:\ ⟩ echo "hello world" > hello.txt
|
||||||
|
billziss@xps ⟩ X:\ ⟩ dir
|
||||||
|
|
||||||
|
|
||||||
|
Directory: X:\
|
||||||
|
|
||||||
|
|
||||||
|
Mode LastWriteTime Length Name
|
||||||
|
---- ------------- ------ ----
|
||||||
|
-a---- 6/12/2022 5:15 PM 28 hello.txt
|
||||||
|
|
||||||
|
|
||||||
|
billziss@xps ⟩ X:\ ⟩ type hello.txt
|
||||||
|
hello world
|
||||||
|
billziss@xps ⟩ X:\ ⟩ cd ~
|
||||||
|
billziss@xps ⟩ ~ ⟩ net use X: /delete
|
||||||
|
X: was deleted successfully.
|
||||||
```
|
```
|
||||||
* [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:
|
MEMFS (and all file systems that use the WinFsp Launcher as documented in the [Service Architecture](doc/WinFsp-Service-Architecture.asciidoc) document) can also be launched from Explorer using the "Map Network Drive" functionality.
|
||||||
|
|
||||||
tools\build.bat CONFIGURATION
|
## Resources
|
||||||
|
|
||||||
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).
|
**Documentation**:
|
||||||
|
|
||||||
WinFsp is designed to run on Windows 7 and above. It has been tested on the following platforms:
|
- [Tutorial](doc/WinFsp-Tutorial.asciidoc)
|
||||||
|
|
||||||
* Windows 7 Enterprise
|
- [API Reference](doc/WinFsp-API-winfsp.h.md)
|
||||||
* Windows 8 Pro
|
|
||||||
* Windows Server 2012
|
|
||||||
* Windows 10 Pro
|
|
||||||
* Windows Server 2016
|
|
||||||
|
|
||||||
## How to Help
|
- [Building](doc/WinFsp-Building.asciidoc)
|
||||||
|
|
||||||
I am looking for help in the following areas:
|
- [Project wiki](https://github.com/winfsp/winfsp/wiki)
|
||||||
|
|
||||||
* If you have a file system that runs on FUSE please consider porting it to WinFsp. WinFsp has a native API, but it also has a FUSE (high-level) API.
|
**Discussion**:
|
||||||
* If you are working with a language other than C/C++ (e.g. Delphi, Java, etc.) and you are interested in porting/wrapping WinFsp I would love to hear from you.
|
|
||||||
* There are a number of outstanding issues listed in the [GitHub repository](https://github.com/billziss-gh/winfsp/issues). Many of these require knowledge of Windows kernel-mode and an understanding of the internals of WinFsp so they are not for the faint of heart.
|
|
||||||
|
|
||||||
In all cases I can provide ideas and/or support.
|
|
||||||
|
|
||||||
## Where to Discuss
|
|
||||||
|
|
||||||
If you wish to discuss WinFsp there are now two options:
|
|
||||||
|
|
||||||
- [WinFsp Google Group](https://groups.google.com/forum/#!forum/winfsp)
|
- [WinFsp Google Group](https://groups.google.com/forum/#!forum/winfsp)
|
||||||
|
|
||||||
- [Author's Twitter](https://twitter.com/BZissimopoulos)
|
- [Author's Twitter](https://twitter.com/BZissimopoulos)
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
WinFsp is available under the [GPLv3](License.txt) license with a special exception for Free/Libre and Open Source Software. A commercial license is also available. Please contact Bill Zissimopoulos \<billziss at navimatics.com> for more details.
|
|
||||||
|
59
appveyor.yml
@ -1,29 +1,61 @@
|
|||||||
version: '{build}'
|
version: '{build}'
|
||||||
|
|
||||||
|
skip_tags: true
|
||||||
|
skip_commits:
|
||||||
|
files:
|
||||||
|
- README.md
|
||||||
|
- Changelog.md
|
||||||
|
- Contributors.asciidoc
|
||||||
|
- art/**
|
||||||
|
- doc/**
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
# Disable the winfsp-tests built-in exception filter to allow WER to collect dumps.
|
# Disable the winfsp-tests built-in exception filter to allow WER to collect dumps.
|
||||||
WINFSP_TESTS_EXCEPTION_FILTER_DISABLE: 1
|
WINFSP_TESTS_EXCEPTION_FILTER_DISABLE: 1
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
- CONFIGURATION: Debug
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||||
|
CONFIGURATION: Debug
|
||||||
TESTING: Func
|
TESTING: Func
|
||||||
- CONFIGURATION: Release
|
DOCKER_TESTING: None
|
||||||
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||||
|
CONFIGURATION: Release
|
||||||
TESTING: Func
|
TESTING: Func
|
||||||
|
DOCKER_TESTING: None
|
||||||
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||||
|
CONFIGURATION: Release
|
||||||
|
TESTING: Func
|
||||||
|
DOCKER_TESTING: None
|
||||||
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||||
|
CONFIGURATION: Release
|
||||||
|
TESTING: Func
|
||||||
|
DOCKER_TESTING: Func
|
||||||
#- CONFIGURATION: Release
|
#- CONFIGURATION: Release
|
||||||
# TESTING: Avast
|
# TESTING: Avast
|
||||||
|
# DOCKER_TESTING: None
|
||||||
#- CONFIGURATION: Release
|
#- CONFIGURATION: Release
|
||||||
# TESTING: Perf
|
# TESTING: Perf
|
||||||
|
# DOCKER_TESTING: None
|
||||||
|
|
||||||
init:
|
init:
|
||||||
#- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
||||||
|
|
||||||
install:
|
install:
|
||||||
# Hack to make WDK 1903 work on VS2015.
|
# Hack to make WDK 1903 work on VS2015.
|
||||||
# See https://github.com/appveyor-tests/WDK-10.0.14393.0/blob/31cf12217fe0c92b218c70d7027dfe145be4f4cb/appveyor.yml#L7
|
# See https://github.com/appveyor-tests/WDK-10.0.14393.0/blob/31cf12217fe0c92b218c70d7027dfe145be4f4cb/appveyor.yml#L7
|
||||||
- ps: |
|
- ps: |
|
||||||
|
if ($env:APPVEYOR_BUILD_WORKER_IMAGE -eq "Visual Studio 2015") {
|
||||||
[xml]$targets = get-content "C:\Program Files (x86)\Windows Kits\10\build\WindowsDriver.Common.targets"
|
[xml]$targets = get-content "C:\Program Files (x86)\Windows Kits\10\build\WindowsDriver.Common.targets"
|
||||||
$usingTask = $targets.ChildNodes[1].UsingTask | ? {$_.TaskName -eq "ValidateNTTargetVersion"}
|
$usingTask = $targets.ChildNodes[1].UsingTask | ? {$_.TaskName -eq "ValidateNTTargetVersion"}
|
||||||
$usingTask.AssemblyFile = '$(WDKContentRoot)build\bin\Microsoft.DriverKit.Build.Tasks.16.0.dll'
|
$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")
|
$targets.Save("C:\Program Files (x86)\Windows Kits\10\build\WindowsDriver.Common.targets")
|
||||||
|
Add-AppveyorMessage "Hack to make WDK 1903 work on VS2015"
|
||||||
|
}
|
||||||
|
# Install .NET SDK on VS2015 image
|
||||||
|
- ps: |
|
||||||
|
if ($env:APPVEYOR_BUILD_WORKER_IMAGE -eq "Visual Studio 2015") {
|
||||||
|
& ([scriptblock]::Create((New-Object System.Net.WebClient).DownloadString('https://dot.net/v1/dotnet-install.ps1'))) -InstallDir "C:\dotnet"
|
||||||
|
}
|
||||||
# Submodules
|
# Submodules
|
||||||
- git submodule update --init --recursive
|
- git submodule update --init --recursive
|
||||||
# Kernel and user mode dumps
|
# Kernel and user mode dumps
|
||||||
@ -35,25 +67,35 @@ install:
|
|||||||
# Boot configuration
|
# Boot configuration
|
||||||
- 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
|
||||||
- if %TESTING%==Func verifier /standard /driver winfsp-x64.sys
|
- if %TESTING%==Func verifier /standard /driver winfsp-x64.sys & exit 0
|
||||||
- ps: Restart-Computer -Force
|
- ps: Restart-Computer -Force
|
||||||
- ps: Start-Sleep -s 60
|
- ps: Start-Sleep -s 60
|
||||||
|
|
||||||
build_script:
|
build_script:
|
||||||
- appveyor AddMessage "Reboot complete" -Category Information
|
- appveyor AddMessage "Reboot complete" -Category Information
|
||||||
# build cygfuse
|
# build cygfuse
|
||||||
- C:\cygwin64\setup-x86_64.exe -qnNd -P cygport
|
#- C:\cygwin64\setup-x86_64.exe -qnNd -P cygport
|
||||||
- C:\cygwin64\bin\bash --login -c "make -C '%CD%\opt\cygfuse' dist"
|
#- C:\cygwin64\bin\bash --login -c "make -C '%CD%\opt\cygfuse' dist"
|
||||||
#- C:\cygwin\setup-x86.exe -qnNd -P cygport
|
#- C:\cygwin\setup-x86.exe -qnNd -P cygport
|
||||||
#- C:\cygwin\bin\bash --login -c "make -C '%CD%\opt\cygfuse' dist"
|
#- C:\cygwin\bin\bash --login -c "make -C '%CD%\opt\cygfuse' dist"
|
||||||
|
# remove ARM64 project configurations to build in VS2015/VS2017
|
||||||
|
- if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2015" tools\gensrc\remove-build-arm64.bat
|
||||||
|
- if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2017" tools\gensrc\remove-build-arm64.bat
|
||||||
|
# remove .NET library from solution for VS2015 and use the .NET SDK instead
|
||||||
|
- if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2015" tools\gensrc\remove-build-dotnet.bat build\VStudio
|
||||||
|
- if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2015" set PATH=C:\dotnet;%PATH%
|
||||||
# build winfsp
|
# build winfsp
|
||||||
- tools\build.bat %CONFIGURATION%
|
- tools\build.bat %CONFIGURATION%
|
||||||
|
|
||||||
test_script:
|
test_script:
|
||||||
- choco install winfsp -s build\VStudio\build\%CONFIGURATION% -y --pre
|
- choco install winfsp -s build\VStudio\build\%CONFIGURATION% -y --pre
|
||||||
- if %TESTING%==Func appveyor DownloadFile http://www.secfs.net/Test.Filter.Driver.zip && 7z x Test.Filter.Driver.zip
|
- if %TESTING%==Func appveyor DownloadFile https://winfsp.dev/assets/pvt/Test.Filter.Driver.zip.001
|
||||||
|
- if %TESTING%==Func appveyor DownloadFile https://winfsp.dev/assets/pvt/Test.Filter.Driver.zip.002
|
||||||
|
- if %TESTING%==Func 7z x Test.Filter.Driver.zip.001
|
||||||
- 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%
|
||||||
|
#- ps: . "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /k +spp *
|
||||||
|
- if %DOCKER_TESTING%==Func docker run -d --name=Container0 --isolation=process "-vC:\Program Files (x86)\WinFsp:C:\Program Files (x86)\WinFsp:RO" "-vC:\projects:C:\projects:RO" mcr.microsoft.com/windows/servercore:ltsc2019 cmd.exe /c waitfor 7BF47D72F6664550B03248ECFE77C7DD
|
||||||
- if %TESTING%==Func tools\run-tests.bat %CONFIGURATION%
|
- if %TESTING%==Func tools\run-tests.bat %CONFIGURATION%
|
||||||
- if %TESTING%==Func tools\run-tests.bat %CONFIGURATION% ifstest
|
- if %TESTING%==Func tools\run-tests.bat %CONFIGURATION% ifstest
|
||||||
- if %TESTING%==Func tools\run-tests.bat %CONFIGURATION% sample
|
- if %TESTING%==Func tools\run-tests.bat %CONFIGURATION% sample
|
||||||
@ -61,6 +103,9 @@ test_script:
|
|||||||
- if %TESTING%==Avast choco install avastfreeantivirus && fltmc instances -v "C:"
|
- if %TESTING%==Avast choco install avastfreeantivirus && fltmc instances -v "C:"
|
||||||
- if %TESTING%==Avast tools\run-tests.bat %CONFIGURATION% avast-tests
|
- if %TESTING%==Avast tools\run-tests.bat %CONFIGURATION% avast-tests
|
||||||
- if %TESTING%==Perf tools\run-perf-tests.bat %CONFIGURATION% baseline > perf-tests.csv && type perf-tests.csv & appveyor PushArtifact perf-tests.csv
|
- if %TESTING%==Perf tools\run-perf-tests.bat %CONFIGURATION% baseline > perf-tests.csv && type perf-tests.csv & appveyor PushArtifact perf-tests.csv
|
||||||
|
- if %DOCKER_TESTING%==Func docker exec Container0 cmd.exe /c C:\projects\winfsp\build\VStudio\build\%CONFIGURATION%\winfsp-tests-x64.exe +*
|
||||||
|
#- if %DOCKER_TESTING%==Func docker run -d --name=Container1 --isolation=process "-vC:\Program Files (x86)\WinFsp:C:\Program Files (x86)\WinFsp:RO" "-vC:\projects:C:\projects:RO" mcr.microsoft.com/windows/servercore:ltsc2019 cmd.exe /c waitfor 7BF47D72F6664550B03248ECFE77C7DD
|
||||||
|
#- if %DOCKER_TESTING%==Func docker exec Container1 cmd.exe /c C:\projects\winfsp\build\VStudio\build\%CONFIGURATION%\winfsp-tests-x64.exe +*
|
||||||
- choco uninstall winfsp -y
|
- choco uninstall winfsp -y
|
||||||
|
|
||||||
on_finish:
|
on_finish:
|
||||||
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 14 KiB |
33
build/VStudio/build.common.props
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MsbuildThisFileDirectory)\build.version.props" />
|
||||||
|
<ItemDefinitionGroup>
|
||||||
|
<ClCompile>
|
||||||
|
<PreprocessorDefinitions>NTDDI_VERSION=0x06010000;_WIN32_WINNT=0x0601;MyProductName=$(MyProductName);MyProductFileName=$(MyProductFileName);MyDescription=$(MyDescription);MyCompanyName=$(MyCompanyName);MyCopyright=$(MyCopyright);MyProductVersion=$(MyProductVersion);MyProductStage=$(MyProductStage);MyVersion=$(MyVersion);MyVersionWithCommas=$(MyVersionWithCommas);MyFullVersion=$(MyFullVersion);MyFspFsctlDeviceClassGuid=$(MyFspFsctlDeviceClassGuid);MyFspFsvrtDeviceClassGuid=$(MyFspFsvrtDeviceClassGuid);MyFsctlRegisterPath=$(MyFsctlRegisterPath);MyNpRegisterPath=$(MyNpRegisterPath);MyEventLogRegisterPath=$(MyEventLogRegisterPath)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<PreprocessorDefinitions>MyProductName=$(MyProductName);MyProductFileName=$(MyProductFileName);MyDescription=$(MyDescription);MyCompanyName=$(MyCompanyName);MyCopyright=$(MyCopyright);MyProductVersion=$(MyProductVersion);MyProductStage=$(MyProductStage);MyVersion=$(MyVersion);MyVersionWithCommas=$(MyVersionWithCommas);MyFullVersion=$(MyFullVersion);MyFspFsctlDeviceClassGuid=$(MyFspFsctlDeviceClassGuid);MyFspFsvrtDeviceClassGuid=$(MyFspFsvrtDeviceClassGuid);MyFsctlRegisterPath=$(MyFsctlRegisterPath);MyNpRegisterPath=$(MyNpRegisterPath);MyEventLogRegisterPath=$(MyEventLogRegisterPath)</PreprocessorDefinitions>
|
||||||
|
</ResourceCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(IsKernelModeToolset)'=='true'">
|
||||||
|
<ClCompile>
|
||||||
|
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
|
||||||
|
</ClCompile>
|
||||||
|
<DriverSign>
|
||||||
|
<FileDigestAlgorithm>sha256</FileDigestAlgorithm>
|
||||||
|
</DriverSign>
|
||||||
|
</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>
|
76
build/VStudio/build.version.props
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<!-- build number: concat 2-digit year with 3-digit day of the year (16-bits until 2066) -->
|
||||||
|
<MyBuildNumber>$([System.DateTime]::Now.ToString(`yy`))$([System.DateTime]::Now.DayOfYear.ToString(`000`))</MyBuildNumber>
|
||||||
|
|
||||||
|
<!-- git revision -->
|
||||||
|
<MyGitRoot>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), .git/HEAD))</MyGitRoot>
|
||||||
|
<MyGitHead Condition=" Exists('$(MyGitRoot)/.git/HEAD')">$([System.IO.File]::ReadAllText($(MyGitRoot)/.git/HEAD).Trim())</MyGitHead>
|
||||||
|
<MyGitHead Condition="!Exists('$(MyGitRoot)/.git/HEAD')">0000000</MyGitHead>
|
||||||
|
<MyGitRevision Condition="$(MyGitHead.StartsWith(ref: )) And Exists('$(MyGitRoot)/.git/$(MyGitHead.Substring(5))')">$([System.IO.File]::ReadAllText($(MyGitRoot)/.git/$(MyGitHead.Substring(5))).Trim().Substring(0, 7))</MyGitRevision>
|
||||||
|
<MyGitRevision Condition="$(MyGitHead.StartsWith(ref: )) And !Exists('$(MyGitRoot)/.git/$(MyGitHead.Substring(5))')">$([System.Text.RegularExpressions.Regex]::Match($([System.IO.File]::ReadAllText($(MyGitRoot)/.git/packed-refs)), '[0-9a-fA-F]{40,}.*$(MyGitHead.Substring(5))').Value.Substring(0, 7))</MyGitRevision>
|
||||||
|
<MyGitRevision Condition="!$(MyGitHead.StartsWith(ref: ))">$(MyGitHead.Substring(0, 7))</MyGitRevision>
|
||||||
|
|
||||||
|
<MyProductName>WinFsp</MyProductName>
|
||||||
|
<MyProductFileName>winfsp</MyProductFileName>
|
||||||
|
<MyDescription>Windows File System Proxy</MyDescription>
|
||||||
|
<MyCompanyName>Navimatics LLC</MyCompanyName>
|
||||||
|
<MyCopyright>2015-$([System.DateTime]::Now.ToString(`yyyy`)) Bill Zissimopoulos</MyCopyright>
|
||||||
|
|
||||||
|
<MyCanonicalVersion>2.1</MyCanonicalVersion>
|
||||||
|
|
||||||
|
<MyProductVersion>2024 Beta2</MyProductVersion>
|
||||||
|
<MyProductStage>Beta</MyProductStage>
|
||||||
|
|
||||||
|
<MyCrossCert>DigiCertGlobalG3CodeSigningECCSHA3842021CA1.cer</MyCrossCert>
|
||||||
|
<MyCertIssuer>DigiCert</MyCertIssuer>
|
||||||
|
|
||||||
|
<MyVersion>$(MyCanonicalVersion).$(MyBuildNumber)</MyVersion>
|
||||||
|
<MyVersionWithCommas>$(MyVersion.Replace('.',',')),0</MyVersionWithCommas>
|
||||||
|
<MyFullVersion>$(MyCanonicalVersion).$(MyBuildNumber).$(MyGitRevision)</MyFullVersion>
|
||||||
|
|
||||||
|
<MyAssemblyPolicyVersion>$(MyCanonicalVersion.Substring(0,$(MyVersion.IndexOf('.')))).0</MyAssemblyPolicyVersion>
|
||||||
|
<MyAssemblyVersion>$(MyAssemblyPolicyVersion).0.0</MyAssemblyVersion>
|
||||||
|
|
||||||
|
<MyProductFileArch Condition="'$(Platform)'=='ARM64'">a64</MyProductFileArch>
|
||||||
|
<MyProductFileArch Condition="'$(Platform)'=='x64'">x64</MyProductFileArch>
|
||||||
|
<MyProductFileArch Condition="'$(Platform)'=='Win32'">x86</MyProductFileArch>
|
||||||
|
|
||||||
|
<!-- When rebranding WinFsp you MUST change the following GUIDs - use VS "Create GUID" tool -->
|
||||||
|
<MyFspFsctlDeviceClassGuid>{ 0x6f9d25fa, 0x6dee, 0x4a9d, { 0x80, 0xf5, 0xe9, 0x8e, 0x14, 0xf3, 0x5e, 0x54 } }</MyFspFsctlDeviceClassGuid>
|
||||||
|
<MyFspFsvrtDeviceClassGuid>{ 0xb48171c3, 0xdd50, 0x4852, { 0x83, 0xa3, 0x34, 0x4c, 0x50, 0xd9, 0x3b, 0x17 } }</MyFspFsvrtDeviceClassGuid>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Configure paths used for registration via DllRegisterServer:
|
||||||
|
|
||||||
|
- MyFsctlRegisterPath: File System Driver registration path
|
||||||
|
- MyNpRegisterPath: Network Provider registration path
|
||||||
|
- MyEventLogRegisterPath: Event Log registration path
|
||||||
|
|
||||||
|
These paths are assumed to be relative to the location of the WinFsp DLL during
|
||||||
|
registration: during DLLRegisterServer the DLL uses PathCombineW to combine its own
|
||||||
|
location with these paths to produce the final locations to be used for registration.
|
||||||
|
|
||||||
|
For example, if the DLL location is `C:\Program Files (x86)\WinFsp\bin\winfsp-x64.dll`:
|
||||||
|
|
||||||
|
- Combining with the path "." will produce the original DLL location:
|
||||||
|
`C:\Program Files (x86)\WinFsp\bin\winfsp-x64.dll`
|
||||||
|
|
||||||
|
- Combining with the path "..\\NetworkProvider.dll" will produce:
|
||||||
|
`C:\Program Files (x86)\WinFsp\bin\NetworkProvider.dll`
|
||||||
|
|
||||||
|
- For Network Provider registrations only it is allowed to use environment variables
|
||||||
|
in the path. For example combining the above DLL location with the path
|
||||||
|
"..\\NetworkProvider-\x25PROCESSOR_ARCHITECTURE\x25.dll" will produce:
|
||||||
|
`C:\Program Files (x86)\WinFsp\bin\NetworkProvider-%PROCESSOR_ARCHITECTURE%.dll`
|
||||||
|
|
||||||
|
(Note that the \x25 escape sequence must be used otherwise the VS build system will
|
||||||
|
try to interpret the string %PROCESSOR_ARCHITECTURE% as an environment variable during
|
||||||
|
the build.)
|
||||||
|
-->
|
||||||
|
<MyFsctlRegisterPath>"."</MyFsctlRegisterPath>
|
||||||
|
<MyNpRegisterPath>"."</MyNpRegisterPath>
|
||||||
|
<MyEventLogRegisterPath>"."</MyEventLogRegisterPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
@ -1,25 +1,29 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<Project>
|
||||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<PropertyGroup>
|
||||||
<Import Project="..\version.properties" />
|
<BaseIntermediateOutputPath>$(SolutionDir)build\$(MSBuildProjectName).build\</BaseIntermediateOutputPath>
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
</PropertyGroup>
|
||||||
|
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
|
||||||
|
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), build.common.props))/build.common.props" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
<ProjectGuid>{94580219-CC8D-4FE5-A3BE-437B0B3481E1}</ProjectGuid>
|
|
||||||
<OutputType>Library</OutputType>
|
<OutputType>Library</OutputType>
|
||||||
<ProjectName>winfsp.net</ProjectName>
|
<ProjectName>winfsp.net</ProjectName>
|
||||||
<RootNamespace>Fsp</RootNamespace>
|
<RootNamespace>Fsp</RootNamespace>
|
||||||
<AssemblyName>$(MyProductFileName)-msil</AssemblyName>
|
<AssemblyName>$(MyProductFileName)-msil</AssemblyName>
|
||||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
<TargetFrameworks>netstandard2.0;net35</TargetFrameworks>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<TargetFrameworkProfile />
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(TargetFramework)' != 'netstandard2.0'">
|
||||||
|
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||||
|
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<Optimize>false</Optimize>
|
<Optimize>false</Optimize>
|
||||||
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
||||||
<BaseIntermediateOutputPath>$(SolutionDir)build\$(ProjectName).build\</BaseIntermediateOutputPath>
|
|
||||||
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
@ -32,7 +36,6 @@
|
|||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
||||||
<BaseIntermediateOutputPath>$(SolutionDir)build\$(ProjectName).build\</BaseIntermediateOutputPath>
|
|
||||||
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
@ -47,9 +50,6 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<AssemblyOriginatorKeyFile>winfsp.net.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>winfsp.net.snk</AssemblyOriginatorKeyFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="System" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="..\..\..\src\dotnet\FileSystemBase+Const.cs">
|
<Compile Include="..\..\..\src\dotnet\FileSystemBase+Const.cs">
|
||||||
<Link>FileSystemBase+Const.cs</Link>
|
<Link>FileSystemBase+Const.cs</Link>
|
||||||
@ -70,29 +70,28 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="winfsp.net.snk" />
|
<None Include="winfsp.net.snk" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<PackageReference Include="Microsoft.Win32.Registry">
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
<Version>5.0.0</Version>
|
||||||
<Target Name="AfterBuild">
|
</PackageReference>
|
||||||
</Target>
|
<PackageReference Include="System.IO.FileSystem.AccessControl">
|
||||||
-->
|
<Version>5.0.0</Version>
|
||||||
<Target Name="BeforeBuild">
|
</PackageReference>
|
||||||
<ItemGroup>
|
|
||||||
<AssemblyInfo Include="using System.Reflection%3b" />
|
|
||||||
<AssemblyInfo Include="[assembly: AssemblyProduct("$(MyProductName)")]" />
|
|
||||||
<AssemblyInfo Include="[assembly: AssemblyTitle("$(MyDescription)")]" />
|
|
||||||
<AssemblyInfo Include="[assembly: AssemblyCompany("$(MyCompanyName)")]" />
|
|
||||||
<AssemblyInfo Include="[assembly: AssemblyCopyright("$(MyCopyright)")]" />
|
|
||||||
<AssemblyInfo Include="[assembly: AssemblyVersion("$(MyAssemblyVersion)")]" />
|
|
||||||
<AssemblyInfo Include="[assembly: AssemblyFileVersion("$(MyVersion)")]" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<MakeDir Directories="$(IntermediateOutputPath)" />
|
<PropertyGroup>
|
||||||
<WriteLinesToFile File="$(IntermediateOutputPath)AssemblyInfo.cs" Lines="@(AssemblyInfo)" Overwrite="true" />
|
<AssemblyName>$(MyProductFileName)-msil</AssemblyName>
|
||||||
<ItemGroup>
|
<AssemblyTitle>$(MyDescription)</AssemblyTitle>
|
||||||
<Compile Include="$(IntermediateOutputPath)AssemblyInfo.cs" />
|
<Product>$(MyProductName)</Product>
|
||||||
<FileWrites Include="$(IntermediateOutputPath)AssemblyInfo.cs" />
|
<Copyright>$(MyCopyright)</Copyright>
|
||||||
</ItemGroup>
|
<AssemblyVersion>$(MyAssemblyVersion)</AssemblyVersion>
|
||||||
</Target>
|
<FileVersion>$(MyVersion)</FileVersion>
|
||||||
|
<!-- NuGet metadata -->
|
||||||
|
<PackageId>$(MyProductFileName).net</PackageId>
|
||||||
|
<Version>$(MyVersion)</Version>
|
||||||
|
<Description>$(MyDescription)</Description>
|
||||||
|
<Authors>$(MyCopyright)</Authors>
|
||||||
|
<Company>$(MyCompanyName)</Company>
|
||||||
|
</PropertyGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>exit /b 0
|
<PostBuildEvent>exit /b 0
|
||||||
|
|
||||||
@ -110,4 +109,5 @@ for /f "delims=" %25%25l in ($(ProjectDir)winfsp.net.policy.config) do (
|
|||||||
"$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.0A\Bin\al.exe" /product:"$(MyProductName)" /title:"$(MyDescription)" /company:"$(MyCompanyName)" /copyright:"$(MyCopyright)" /version:"$(MyAssemblyPolicyVersion)" /fileversion:"$(MyVersion)" /link:$(OutDir)policy.$(MyAssemblyPolicyVersion).$(TargetName).config /out:$(OutDir)policy.$(MyAssemblyPolicyVersion).$(TargetName).dll /keyfile:$(ProjectDir)$(ProjectName).snk
|
"$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.0A\Bin\al.exe" /product:"$(MyProductName)" /title:"$(MyDescription)" /company:"$(MyCompanyName)" /copyright:"$(MyCopyright)" /version:"$(MyAssemblyPolicyVersion)" /fileversion:"$(MyVersion)" /link:$(OutDir)policy.$(MyAssemblyPolicyVersion).$(TargetName).config /out:$(OutDir)policy.$(MyAssemblyPolicyVersion).$(TargetName).dll /keyfile:$(ProjectDir)$(ProjectName).snk
|
||||||
</PostBuildEvent>
|
</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
|
||||||
</Project>
|
</Project>
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file CustomActions.cpp
|
* @file CustomActions.cpp
|
||||||
*
|
*
|
||||||
* @copyright 2015-2021 Bill Zissimopoulos
|
* @copyright 2015-2024 Bill Zissimopoulos
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file is part of WinFsp.
|
* This file is part of WinFsp.
|
||||||
@ -21,10 +21,55 @@
|
|||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#include <shellapi.h>
|
||||||
#include <msiquery.h>
|
#include <msiquery.h>
|
||||||
#include <wcautil.h>
|
#include <wcautil.h>
|
||||||
#include <strutil.h>
|
#include <strutil.h>
|
||||||
|
|
||||||
|
static HINSTANCE DllInstance;
|
||||||
|
|
||||||
|
UINT __stdcall InstanceID(MSIHANDLE MsiHandle)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
WCHAR MessageBuf[64];
|
||||||
|
wsprintfW(MessageBuf, L"PID=%ld", GetCurrentProcessId());
|
||||||
|
MessageBoxW(0, MessageBuf, L"" __FUNCTION__ " Break", MB_OK);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
HRESULT hr = S_OK;
|
||||||
|
UINT err = ERROR_SUCCESS;
|
||||||
|
SYSTEMTIME SystemTime;
|
||||||
|
WCHAR Result[32+1];
|
||||||
|
|
||||||
|
hr = WcaInitialize(MsiHandle, __FUNCTION__);
|
||||||
|
ExitOnFailure(hr, "Failed to initialize");
|
||||||
|
|
||||||
|
WcaLog(LOGMSG_STANDARD, "Initialized");
|
||||||
|
|
||||||
|
GetSystemTime(&SystemTime);
|
||||||
|
wsprintfW(Result, L"%04u%02u%02uT%02u%02u%02uZ",
|
||||||
|
SystemTime.wYear,
|
||||||
|
SystemTime.wMonth,
|
||||||
|
SystemTime.wDay,
|
||||||
|
SystemTime.wHour,
|
||||||
|
SystemTime.wMinute,
|
||||||
|
SystemTime.wSecond);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sleep 1 second to ensure timestamp uniqueness.
|
||||||
|
*
|
||||||
|
* Note that this assumes that time is monotonic and users do not change time.
|
||||||
|
* Disable for now as it is assumed that the installation takes more than 1 second to complete.
|
||||||
|
*/
|
||||||
|
//Sleep(1000);
|
||||||
|
|
||||||
|
WcaSetProperty(L"" __FUNCTION__, Result);
|
||||||
|
|
||||||
|
LExit:
|
||||||
|
err = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
|
||||||
|
return WcaFinalize(err);
|
||||||
|
}
|
||||||
|
|
||||||
UINT __stdcall ServiceRunning(MSIHANDLE MsiHandle)
|
UINT __stdcall ServiceRunning(MSIHANDLE MsiHandle)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
@ -44,7 +89,7 @@ UINT __stdcall ServiceRunning(MSIHANDLE MsiHandle)
|
|||||||
hr = WcaInitialize(MsiHandle, __FUNCTION__);
|
hr = WcaInitialize(MsiHandle, __FUNCTION__);
|
||||||
ExitOnFailure(hr, "Failed to initialize");
|
ExitOnFailure(hr, "Failed to initialize");
|
||||||
|
|
||||||
WcaGetProperty(L"" __FUNCTION__, &ServiceName);
|
hr = WcaGetProperty(L"" __FUNCTION__, &ServiceName);
|
||||||
ExitOnFailure(hr, "Failed to get ServiceName");
|
ExitOnFailure(hr, "Failed to get ServiceName");
|
||||||
|
|
||||||
WcaLog(LOGMSG_STANDARD, "Initialized: \"%S\"", ServiceName);
|
WcaLog(LOGMSG_STANDARD, "Initialized: \"%S\"", ServiceName);
|
||||||
@ -70,12 +115,390 @@ LExit:
|
|||||||
return WcaFinalize(err);
|
return WcaFinalize(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UINT __stdcall DeferredAction(MSIHANDLE MsiHandle)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
WCHAR MessageBuf[64];
|
||||||
|
wsprintfW(MessageBuf, L"PID=%ld", GetCurrentProcessId());
|
||||||
|
MessageBoxW(0, MessageBuf, L"" __FUNCTION__ " Break", MB_OK);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
HRESULT hr = S_OK;
|
||||||
|
UINT err = ERROR_SUCCESS;
|
||||||
|
PWSTR CommandLine = 0;
|
||||||
|
PWSTR *Argv;
|
||||||
|
int Argc;
|
||||||
|
CHAR ProcName[64];
|
||||||
|
FARPROC Proc;
|
||||||
|
|
||||||
|
hr = WcaInitialize(MsiHandle, __FUNCTION__);
|
||||||
|
ExitOnFailure(hr, "Failed to initialize");
|
||||||
|
|
||||||
|
hr = WcaGetProperty(L"CustomActionData", &CommandLine);
|
||||||
|
ExitOnFailure(hr, "Failed to get CommandLine");
|
||||||
|
|
||||||
|
WcaLog(LOGMSG_STANDARD, "Initialized: \"%S\"", CommandLine);
|
||||||
|
|
||||||
|
Argv = CommandLineToArgvW(CommandLine, &Argc);
|
||||||
|
ExitOnNullWithLastError(Argv, hr, "Failed to CommandLineToArgvW");
|
||||||
|
|
||||||
|
if (0 < Argc)
|
||||||
|
{
|
||||||
|
if (0 == WideCharToMultiByte(CP_UTF8, 0, Argv[0], -1, ProcName, sizeof ProcName, 0, 0))
|
||||||
|
ExitWithLastError(hr, "Failed to WideCharToMultiByte");
|
||||||
|
|
||||||
|
Proc = GetProcAddress(DllInstance, ProcName);
|
||||||
|
ExitOnNullWithLastError(Proc, hr, "Failed to GetProcAddress");
|
||||||
|
|
||||||
|
err = ((HRESULT (*)(int, PWSTR *))Proc)(Argc, Argv);
|
||||||
|
ExitOnWin32Error(err, hr, "Failed to %s", ProcName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hr = E_INVALIDARG;
|
||||||
|
ExitOnFailure(hr, "Failed to get arguments");
|
||||||
|
}
|
||||||
|
|
||||||
|
LExit:
|
||||||
|
LocalFree(Argv);
|
||||||
|
ReleaseStr(CommandLine);
|
||||||
|
|
||||||
|
err = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
|
||||||
|
return WcaFinalize(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD MakeSymlink(PWSTR Symlink, PWSTR Target);
|
||||||
|
static DWORD MakeJunction(PWSTR Junction, PWSTR Target);
|
||||||
|
static DWORD CreateJunction(PWSTR Junction, PWSTR Target);
|
||||||
|
static DWORD RemoveFile(PWSTR FileName);
|
||||||
|
|
||||||
|
DWORD InstallSymlinks(int Argc, PWSTR *Argv)
|
||||||
|
{
|
||||||
|
/* usage: InstallSymlinks/InstallJunctions SourceDir TargetDir Name... */
|
||||||
|
|
||||||
|
DWORD Result;
|
||||||
|
BOOL Junctions;
|
||||||
|
PWSTR SourceDir, TargetDir;
|
||||||
|
WCHAR SourcePath[MAX_PATH], TargetPath[MAX_PATH];
|
||||||
|
int SourceDirLen, TargetDirLen, Len;
|
||||||
|
|
||||||
|
if (4 > Argc)
|
||||||
|
{
|
||||||
|
Result = ERROR_INVALID_PARAMETER;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
Junctions = 0 == lstrcmpW(L"InstallJunctions", Argv[0]);
|
||||||
|
SourceDir = Argv[1];
|
||||||
|
TargetDir = Argv[2];
|
||||||
|
SourceDirLen = lstrlenW(SourceDir);
|
||||||
|
TargetDirLen = lstrlenW(TargetDir);
|
||||||
|
|
||||||
|
for (int Argi = 3; Argc > Argi; Argi++)
|
||||||
|
{
|
||||||
|
Len = lstrlenW(Argv[Argi]);
|
||||||
|
if (MAX_PATH < SourceDirLen + Len + 1 || MAX_PATH < TargetDirLen + Len + 1)
|
||||||
|
{
|
||||||
|
Result = ERROR_FILENAME_EXCED_RANGE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(SourcePath, SourceDir, SourceDirLen * sizeof(WCHAR));
|
||||||
|
memcpy(SourcePath + SourceDirLen, Argv[Argi], Len * sizeof(WCHAR));
|
||||||
|
SourcePath[SourceDirLen + Len] = L'\0';
|
||||||
|
|
||||||
|
memcpy(TargetPath, TargetDir, TargetDirLen * sizeof(WCHAR));
|
||||||
|
memcpy(TargetPath + TargetDirLen, Argv[Argi], Len * sizeof(WCHAR));
|
||||||
|
TargetPath[TargetDirLen + Len] = L'\0';
|
||||||
|
|
||||||
|
if (!Junctions)
|
||||||
|
Result = MakeSymlink(SourcePath, TargetPath);
|
||||||
|
else
|
||||||
|
Result = MakeJunction(SourcePath, TargetPath);
|
||||||
|
#if 0
|
||||||
|
WCHAR MessageBuf[1024];
|
||||||
|
wsprintfW(MessageBuf, L"MakeSymlink(\"%s\", \"%s\") = %lu", SourcePath, TargetPath, Result);
|
||||||
|
MessageBoxW(0, MessageBuf, L"TRACE", MB_OK);
|
||||||
|
#endif
|
||||||
|
if (ERROR_SUCCESS != Result)
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD InstallJunctions(int Argc, PWSTR *Argv)
|
||||||
|
{
|
||||||
|
return InstallSymlinks(Argc, Argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD RemoveFiles(int Argc, PWSTR *Argv)
|
||||||
|
{
|
||||||
|
/* usage: RemoveFiles Dir Name... */
|
||||||
|
|
||||||
|
DWORD Result;
|
||||||
|
PWSTR Dir;
|
||||||
|
WCHAR Path[MAX_PATH];
|
||||||
|
int DirLen, Len;
|
||||||
|
|
||||||
|
if (3 > Argc)
|
||||||
|
{
|
||||||
|
Result = ERROR_INVALID_PARAMETER;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
Dir = Argv[1];
|
||||||
|
DirLen = lstrlenW(Dir);
|
||||||
|
|
||||||
|
for (int Argi = 2; Argc > Argi; Argi++)
|
||||||
|
{
|
||||||
|
Len = lstrlenW(Argv[Argi]);
|
||||||
|
if (MAX_PATH < DirLen + Len + 1)
|
||||||
|
{
|
||||||
|
Result = ERROR_FILENAME_EXCED_RANGE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(Path, Dir, DirLen * sizeof(WCHAR));
|
||||||
|
memcpy(Path + DirLen, Argv[Argi], Len * sizeof(WCHAR));
|
||||||
|
Path[DirLen + Len] = L'\0';
|
||||||
|
|
||||||
|
Result = RemoveFile(Path);
|
||||||
|
#if 0
|
||||||
|
WCHAR MessageBuf[1024];
|
||||||
|
wsprintfW(MessageBuf, L"RemoveFile(\"%s\") = %lu", Path, Result);
|
||||||
|
MessageBoxW(0, MessageBuf, L"TRACE", MB_OK);
|
||||||
|
#endif
|
||||||
|
if (ERROR_SUCCESS != Result)
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD MakeSymlink(PWSTR Symlink, PWSTR Target)
|
||||||
|
{
|
||||||
|
DWORD Result;
|
||||||
|
DWORD FileAttributes, Flags;
|
||||||
|
|
||||||
|
RemoveFile(Symlink);
|
||||||
|
|
||||||
|
FileAttributes = GetFileAttributesW(Target);
|
||||||
|
if (INVALID_FILE_ATTRIBUTES == FileAttributes)
|
||||||
|
{
|
||||||
|
Result = GetLastError();
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
Flags = 0 != (FileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0;
|
||||||
|
|
||||||
|
if (!CreateSymbolicLinkW(Symlink, Target, Flags))
|
||||||
|
{
|
||||||
|
Result = GetLastError();
|
||||||
|
RemoveFile(Symlink);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD MakeJunction(PWSTR Junction, PWSTR Target)
|
||||||
|
{
|
||||||
|
DWORD Result;
|
||||||
|
DWORD FileAttributes;
|
||||||
|
|
||||||
|
RemoveFile(Junction);
|
||||||
|
|
||||||
|
FileAttributes = GetFileAttributesW(Target);
|
||||||
|
if (INVALID_FILE_ATTRIBUTES == FileAttributes)
|
||||||
|
{
|
||||||
|
Result = GetLastError();
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
if (0 == (FileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
||||||
|
{
|
||||||
|
Result = ERROR_DIRECTORY;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result = CreateJunction(Junction, Target);
|
||||||
|
if (ERROR_SUCCESS != Result)
|
||||||
|
{
|
||||||
|
RemoveFile(Junction);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD CreateJunction(PWSTR Junction, PWSTR Target)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* The REPARSE_DATA_BUFFER definitions appear to be missing from the user mode headers.
|
||||||
|
*/
|
||||||
|
typedef struct _REPARSE_DATA_BUFFER
|
||||||
|
{
|
||||||
|
ULONG ReparseTag;
|
||||||
|
USHORT ReparseDataLength;
|
||||||
|
USHORT Reserved;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
USHORT SubstituteNameOffset;
|
||||||
|
USHORT SubstituteNameLength;
|
||||||
|
USHORT PrintNameOffset;
|
||||||
|
USHORT PrintNameLength;
|
||||||
|
ULONG Flags;
|
||||||
|
WCHAR PathBuffer[1];
|
||||||
|
} SymbolicLinkReparseBuffer;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
USHORT SubstituteNameOffset;
|
||||||
|
USHORT SubstituteNameLength;
|
||||||
|
USHORT PrintNameOffset;
|
||||||
|
USHORT PrintNameLength;
|
||||||
|
WCHAR PathBuffer[1];
|
||||||
|
} MountPointReparseBuffer;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
UCHAR DataBuffer[1];
|
||||||
|
} GenericReparseBuffer;
|
||||||
|
} DUMMYUNIONNAME;
|
||||||
|
} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
|
||||||
|
const LONG REPARSE_DATA_BUFFER_HEADER_SIZE =
|
||||||
|
FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer);
|
||||||
|
const DWORD FSCTL_SET_REPARSE_POINT = 0x000900a4;
|
||||||
|
|
||||||
|
DWORD Result;
|
||||||
|
HANDLE Handle = INVALID_HANDLE_VALUE;
|
||||||
|
USHORT TargetLength, ReparseDataLength;
|
||||||
|
PREPARSE_DATA_BUFFER ReparseData = 0;
|
||||||
|
PWSTR PathBuffer;
|
||||||
|
DWORD Bytes;
|
||||||
|
|
||||||
|
if (!(
|
||||||
|
((L'A' <= Target[0] && Target[0] <= L'Z') || (L'a' <= Target[0] && Target[0] <= L'z')) &&
|
||||||
|
L':' == Target[1]
|
||||||
|
))
|
||||||
|
{
|
||||||
|
Result = ERROR_INVALID_NAME;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle = CreateFileW(Junction,
|
||||||
|
FILE_WRITE_ATTRIBUTES,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
||||||
|
0,
|
||||||
|
CREATE_NEW,
|
||||||
|
FILE_ATTRIBUTE_DIRECTORY |
|
||||||
|
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS,
|
||||||
|
0);
|
||||||
|
if (INVALID_HANDLE_VALUE == Handle)
|
||||||
|
{
|
||||||
|
Result = GetLastError();
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
TargetLength = (USHORT)lstrlenW(Target) * sizeof(WCHAR);
|
||||||
|
ReparseDataLength = (USHORT)(
|
||||||
|
FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer) -
|
||||||
|
FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer)) +
|
||||||
|
4 * sizeof(WCHAR) + 2 * (TargetLength + sizeof(WCHAR));
|
||||||
|
ReparseData = (PREPARSE_DATA_BUFFER)
|
||||||
|
HeapAlloc(GetProcessHeap(), 0, REPARSE_DATA_BUFFER_HEADER_SIZE + ReparseDataLength);
|
||||||
|
if (0 == ReparseData)
|
||||||
|
{
|
||||||
|
Result = ERROR_NO_SYSTEM_RESOURCES;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReparseData->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
|
||||||
|
ReparseData->ReparseDataLength = ReparseDataLength;
|
||||||
|
ReparseData->Reserved = 0;
|
||||||
|
ReparseData->MountPointReparseBuffer.SubstituteNameOffset = 0;
|
||||||
|
ReparseData->MountPointReparseBuffer.SubstituteNameLength =
|
||||||
|
4 * sizeof(WCHAR) + TargetLength;
|
||||||
|
ReparseData->MountPointReparseBuffer.PrintNameOffset =
|
||||||
|
ReparseData->MountPointReparseBuffer.SubstituteNameLength + sizeof(WCHAR);
|
||||||
|
ReparseData->MountPointReparseBuffer.PrintNameLength =
|
||||||
|
TargetLength;
|
||||||
|
|
||||||
|
PathBuffer = ReparseData->MountPointReparseBuffer.PathBuffer;
|
||||||
|
PathBuffer[0] = L'\\';
|
||||||
|
PathBuffer[1] = L'?';
|
||||||
|
PathBuffer[2] = L'?';
|
||||||
|
PathBuffer[3] = L'\\';
|
||||||
|
memcpy(PathBuffer + 4, Target, TargetLength);
|
||||||
|
PathBuffer[4 + TargetLength / sizeof(WCHAR)] = L'\0';
|
||||||
|
|
||||||
|
PathBuffer = ReparseData->MountPointReparseBuffer.PathBuffer +
|
||||||
|
(ReparseData->MountPointReparseBuffer.PrintNameOffset) / sizeof(WCHAR);
|
||||||
|
memcpy(PathBuffer, Target, TargetLength);
|
||||||
|
PathBuffer[TargetLength / sizeof(WCHAR)] = L'\0';
|
||||||
|
|
||||||
|
if (!DeviceIoControl(Handle, FSCTL_SET_REPARSE_POINT,
|
||||||
|
ReparseData, REPARSE_DATA_BUFFER_HEADER_SIZE + ReparseData->ReparseDataLength,
|
||||||
|
0, 0,
|
||||||
|
&Bytes, 0))
|
||||||
|
{
|
||||||
|
Result = GetLastError();
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
if (INVALID_HANDLE_VALUE != Handle)
|
||||||
|
CloseHandle(Handle);
|
||||||
|
|
||||||
|
if (0 != ReparseData)
|
||||||
|
HeapFree(GetProcessHeap(), 0, ReparseData);
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD RemoveFile(PWSTR FileName)
|
||||||
|
{
|
||||||
|
DWORD Result;
|
||||||
|
|
||||||
|
if (!RemoveDirectoryW(FileName))
|
||||||
|
{
|
||||||
|
Result = GetLastError();
|
||||||
|
if (ERROR_DIRECTORY != Result)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
if (!DeleteFileW(FileName))
|
||||||
|
{
|
||||||
|
Result = GetLastError();
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Result = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
BOOL WINAPI DllMain(HINSTANCE Instance, DWORD Reason, PVOID Reserved)
|
BOOL WINAPI DllMain(HINSTANCE Instance, DWORD Reason, PVOID Reserved)
|
||||||
{
|
{
|
||||||
switch(Reason)
|
switch(Reason)
|
||||||
{
|
{
|
||||||
case DLL_PROCESS_ATTACH:
|
case DLL_PROCESS_ATTACH:
|
||||||
|
DllInstance = Instance;
|
||||||
WcaGlobalInitialize(Instance);
|
WcaGlobalInitialize(Instance);
|
||||||
break;
|
break;
|
||||||
case DLL_PROCESS_DETACH:
|
case DLL_PROCESS_DETACH:
|
||||||
|
@ -1,2 +1,7 @@
|
|||||||
EXPORTS
|
EXPORTS
|
||||||
|
InstanceID
|
||||||
ServiceRunning
|
ServiceRunning
|
||||||
|
DeferredAction
|
||||||
|
InstallSymlinks
|
||||||
|
InstallJunctions
|
||||||
|
RemoveFiles
|
||||||
|
@ -1,6 +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" />
|
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), build.common.props))/build.common.props" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
@ -43,21 +43,20 @@
|
|||||||
<_ProjectFileVersion>14.0.25123.0</_ProjectFileVersion>
|
<_ProjectFileVersion>14.0.25123.0</_ProjectFileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<AdditionalIncludeDirectories>$(WIX)sdk\VS2015\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(WIX)sdk\VS2015\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;CUSTOMACTIONTEST_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;CUSTOMACTIONTEST_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<MinimalRebuild>true</MinimalRebuild>
|
|
||||||
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
|
@ -1,4 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<!-- The UpgradeCode of the old WinFsp installer that did not support upgrades. -->
|
||||||
|
<?define OldVersionUpgradeCode="82F812D9-4083-4EF1-8BC8-0F1EDA05B46B"?>
|
||||||
|
|
||||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
|
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
|
||||||
xmlns:dep="http://schemas.microsoft.com/wix/DependencyExtension">
|
xmlns:dep="http://schemas.microsoft.com/wix/DependencyExtension">
|
||||||
<Product
|
<Product
|
||||||
@ -7,7 +11,7 @@
|
|||||||
Manufacturer="$(var.MyCompanyName)"
|
Manufacturer="$(var.MyCompanyName)"
|
||||||
Version="$(var.MyVersion)"
|
Version="$(var.MyVersion)"
|
||||||
Language="1033"
|
Language="1033"
|
||||||
UpgradeCode="82F812D9-4083-4EF1-8BC8-0F1EDA05B46B">
|
UpgradeCode="5466A3D8-3AA1-4240-B6A0-3A051940A3EC">
|
||||||
|
|
||||||
<Package
|
<Package
|
||||||
Description="$(var.MyProductName) - $(var.MyDescription)"
|
Description="$(var.MyProductName) - $(var.MyDescription)"
|
||||||
@ -15,17 +19,39 @@
|
|||||||
Compressed="yes"
|
Compressed="yes"
|
||||||
InstallScope="perMachine" />
|
InstallScope="perMachine" />
|
||||||
<MajorUpgrade
|
<MajorUpgrade
|
||||||
Disallow="yes"
|
Disallow="no"
|
||||||
AllowDowngrades="no"
|
AllowDowngrades="no"
|
||||||
AllowSameVersionUpgrades="no"
|
AllowSameVersionUpgrades="yes"
|
||||||
DisallowUpgradeErrorMessage="An older version of $(var.MyProductName) is already installed. You must uninstall it before you can install this version."
|
|
||||||
DowngradeErrorMessage="A newer version of $(var.MyProductName) is already installed." />
|
DowngradeErrorMessage="A newer version of $(var.MyProductName) is already installed." />
|
||||||
<Media Id="1" Cabinet="$(var.MyProductName).cab" EmbedCab="yes" />
|
<Media Id="1" Cabinet="$(var.MyProductName).cab" EmbedCab="yes" />
|
||||||
|
|
||||||
<Property Id="P.LauncherName">$(var.MyProductName).Launcher</Property>
|
<!-- Determine if we are on Win7 or above. -->
|
||||||
<Property Id="P.LauncherRegistryKey">Software\$(var.MyProductName)\Services</Property>
|
<Condition Message="$(var.MyProductName) requires Windows version 7 or higher in order to be installed.">
|
||||||
|
<![CDATA[Installed OR (VersionNT >= 601)]]>
|
||||||
|
</Condition>
|
||||||
|
|
||||||
|
<!-- Determine if the old WinFsp installer that did not support upgrades is installed. -->
|
||||||
|
<Property Id="OLDVERSIONINSTALLED">
|
||||||
|
<ProductSearch UpgradeCode="$(var.OldVersionUpgradeCode)" Minimum="0.0.0.0" />
|
||||||
|
</Property>
|
||||||
|
<Condition Message="An older version of $(var.MyProductName) that cannot be upgraded is already installed. You must uninstall it before you can install this version.">
|
||||||
|
NOT OLDVERSIONINSTALLED
|
||||||
|
</Condition>
|
||||||
|
|
||||||
|
<!-- Determine OS architecture. -->
|
||||||
|
<Property Id="OSARCH" Secure="yes" Value="AMD64">
|
||||||
|
<RegistrySearch
|
||||||
|
Id="R.OSARCH"
|
||||||
|
Root="HKLM"
|
||||||
|
Key="SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
|
||||||
|
Name="PROCESSOR_ARCHITECTURE"
|
||||||
|
Type="raw" />
|
||||||
|
</Property>
|
||||||
|
|
||||||
|
<!-- Setup INSTALLDIR and SXSDIR from the registry or defaults. -->
|
||||||
<Property Id="P.RegistryKey">Software\$(var.MyProductName)</Property>
|
<Property Id="P.RegistryKey">Software\$(var.MyProductName)</Property>
|
||||||
<Property Id="INSTALLDIR">
|
<Property Id="P.LauncherRegistryKey">Software\$(var.MyProductName)\Services</Property>
|
||||||
|
<Property Id="INSTALLDIR" Secure="yes">
|
||||||
<RegistrySearch
|
<RegistrySearch
|
||||||
Id="R.INSTALLDIR"
|
Id="R.INSTALLDIR"
|
||||||
Root="HKLM"
|
Root="HKLM"
|
||||||
@ -33,22 +59,40 @@
|
|||||||
Name="InstallDir"
|
Name="InstallDir"
|
||||||
Type="raw" />
|
Type="raw" />
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property Id="SXSDIR" Secure="yes">
|
||||||
|
<RegistrySearch
|
||||||
|
Id="R.SXSDIR"
|
||||||
|
Root="HKLM"
|
||||||
|
Key="[P.RegistryKey]"
|
||||||
|
Name="SxsDir"
|
||||||
|
Type="raw" />
|
||||||
|
</Property>
|
||||||
|
<SetProperty Id="INSTALLDIR" Value="[ProgramFilesFolder]$(var.MyProductName)\" After="CostInitialize">
|
||||||
|
NOT INSTALLDIR
|
||||||
|
</SetProperty>
|
||||||
|
<SetProperty Id="SXSDIR" Value="[INSTALLDIR]SxS\sxs.[InstanceID]\" After="SetINSTALLDIR">
|
||||||
|
((NOT SXSDIR) OR WIX_UPGRADE_DETECTED) AND InstanceID
|
||||||
|
</SetProperty>
|
||||||
|
|
||||||
|
<!-- Setup directory structure. -->
|
||||||
<Directory Id="TARGETDIR" Name="SourceDir">
|
<Directory Id="TARGETDIR" Name="SourceDir">
|
||||||
<Directory Id="ProgramFilesFolder">
|
<Directory Id="ProgramFilesFolder">
|
||||||
<Directory Id="INSTALLDIR" Name="$(var.MyProductName)">
|
<Directory Id="INSTALLDIR" Name="DYNAMIC">
|
||||||
|
<Directory Id="SXSBASEDIR" Name="SxS">
|
||||||
|
<Directory Id="SXSDIR" Name="DYNAMIC">
|
||||||
<Directory Id="BINDIR" Name="bin" />
|
<Directory Id="BINDIR" Name="bin" />
|
||||||
|
</Directory>
|
||||||
|
</Directory>
|
||||||
<Directory Id="INCDIR" Name="inc" />
|
<Directory Id="INCDIR" Name="inc" />
|
||||||
<Directory Id="LIBDIR" Name="lib" />
|
<Directory Id="LIBDIR" Name="lib" />
|
||||||
<Directory Id="OPTDIR" Name="opt" />
|
<Directory Id="OPTDIR" Name="opt" />
|
||||||
<Directory Id="SMPDIR" Name="samples" />
|
<Directory Id="SMPDIR" Name="samples" />
|
||||||
<Directory Id="SYMDIR" Name="sym" />
|
|
||||||
</Directory>
|
</Directory>
|
||||||
</Directory>
|
</Directory>
|
||||||
</Directory>
|
</Directory>
|
||||||
|
|
||||||
<DirectoryRef Id="INSTALLDIR">
|
<DirectoryRef Id="INSTALLDIR">
|
||||||
<Component Id="C.INSTALLDIR" Guid="{F876F26E-5016-4AC6-93B3-653C0312A6CE}">
|
<Component Id="C.INSTALLDIR" Guid="C086521F-8552-43D1-AAE2-CDD579F66FDD">
|
||||||
<RegistryValue
|
<RegistryValue
|
||||||
Root="HKLM"
|
Root="HKLM"
|
||||||
Key="[P.RegistryKey]"
|
Key="[P.RegistryKey]"
|
||||||
@ -61,7 +105,21 @@
|
|||||||
<File Name="License.txt" Source="..\..\..\License.txt" KeyPath="yes" />
|
<File Name="License.txt" Source="..\..\..\License.txt" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
</DirectoryRef>
|
</DirectoryRef>
|
||||||
|
<DirectoryRef Id="SXSDIR">
|
||||||
|
<Component Id="C.SXSDIR" Guid="0F09CD39-1137-4DB8-A783-27B1F51353D1">
|
||||||
|
<RegistryValue
|
||||||
|
Root="HKLM"
|
||||||
|
Key="[P.RegistryKey]"
|
||||||
|
Name="SxsDir"
|
||||||
|
Type="string"
|
||||||
|
Value="[SXSDIR]"
|
||||||
|
KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
</DirectoryRef>
|
||||||
<DirectoryRef Id="BINDIR" FileSource="..\build\$(var.Configuration)">
|
<DirectoryRef Id="BINDIR" FileSource="..\build\$(var.Configuration)">
|
||||||
|
<Component Id="C.$(var.MyProductFileName)_a64.sys">
|
||||||
|
<File Name="$(var.MyProductFileName)-a64.sys" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
<Component Id="C.$(var.MyProductFileName)_x64.sys">
|
<Component Id="C.$(var.MyProductFileName)_x64.sys">
|
||||||
<File Name="$(var.MyProductFileName)-x64.sys" KeyPath="yes" />
|
<File Name="$(var.MyProductFileName)-x64.sys" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
@ -69,35 +127,57 @@
|
|||||||
<File Name="$(var.MyProductFileName)-x86.sys" KeyPath="yes" />
|
<File Name="$(var.MyProductFileName)-x86.sys" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
<!-- On Win64 register $(var.MyProductFileName)-x64.dll -->
|
<!-- On WinArm64 register $(var.MyProductFileName)-a64.dll -->
|
||||||
<Component Id="C.$(var.MyProductFileName)_x64.dll.selfreg" Guid="F0A67746-1A9C-4976-8EC0-882E9407FA6D">
|
<Component Id="C.$(var.MyProductFileName)_a64.dll.a64" Guid="2A7E68EB-D05F-4DD8-ABF2-EB8CB09697F0">
|
||||||
<File Id="FILE.$(var.MyProductFileName)_x64.dll.selfreg" Name="$(var.MyProductFileName)-x64.dll" KeyPath="yes" SelfRegCost="1" />
|
<File Id="FILE.$(var.MyProductFileName)_a64.dll.a64" Name="$(var.MyProductFileName)-a64.dll" KeyPath="yes" SelfRegCost="1" />
|
||||||
<Condition>VersionNT64</Condition>
|
<Condition><![CDATA[OSARCH = "ARM64"]]></Condition>
|
||||||
</Component>
|
</Component>
|
||||||
<Component Id="C.$(var.MyProductFileName)_x86.dll" Guid="950492FB-12F7-4E27-9124-8325A2BC9927">
|
<Component Id="C.$(var.MyProductFileName)_x64.dll.a64" Guid="EA5ED4FB-FC72-4D27-9802-88D84DAE61B4">
|
||||||
<File Name="$(var.MyProductFileName)-x86.dll" KeyPath="yes" />
|
<File Id="FILE.$(var.MyProductFileName)_x64.dll.a64" Name="$(var.MyProductFileName)-x64.dll" KeyPath="yes" />
|
||||||
<Condition>VersionNT64</Condition>
|
<Condition><![CDATA[OSARCH = "ARM64"]]></Condition>
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.$(var.MyProductFileName)_x86.dll.a64" Guid="2A9BD712-2F96-4794-8A58-929E39F3F3CC">
|
||||||
|
<File Id="FILE.$(var.MyProductFileName)_x86.dll.a64" Name="$(var.MyProductFileName)-x86.dll" KeyPath="yes" />
|
||||||
|
<Condition><![CDATA[OSARCH = "ARM64"]]></Condition>
|
||||||
|
</Component>
|
||||||
|
|
||||||
|
<!-- On Win64 register $(var.MyProductFileName)-x64.dll -->
|
||||||
|
<Component Id="C.$(var.MyProductFileName)_a64.dll.x64" Guid="026DA201-43E1-450C-9687-8A684FBF2D2D">
|
||||||
|
<File Id="FILE.$(var.MyProductFileName)_a64.dll.x64" Name="$(var.MyProductFileName)-a64.dll" KeyPath="yes" />
|
||||||
|
<Condition><![CDATA[OSARCH = "AMD64"]]></Condition>
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.$(var.MyProductFileName)_x64.dll.x64" Guid="89201BAF-5812-4ECE-91CD-12EDFFF11CB1">
|
||||||
|
<File Id="FILE.$(var.MyProductFileName)_x64.dll.x64" Name="$(var.MyProductFileName)-x64.dll" KeyPath="yes" SelfRegCost="1" />
|
||||||
|
<Condition><![CDATA[OSARCH = "AMD64"]]></Condition>
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.$(var.MyProductFileName)_x86.dll.x64" Guid="E6EE48A4-6BC7-4135-9A2F-FBBA30DE80BE">
|
||||||
|
<File Id="FILE.$(var.MyProductFileName)_x86.dll.x64" Name="$(var.MyProductFileName)-x86.dll" KeyPath="yes" />
|
||||||
|
<Condition><![CDATA[OSARCH = "AMD64"]]></Condition>
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
<!-- On Win32 register $(var.MyProductFileName)-x86.dll -->
|
<!-- On Win32 register $(var.MyProductFileName)-x86.dll -->
|
||||||
<Component Id="C.$(var.MyProductFileName)_x64.dll" Guid="4D6E7A8E-0CA6-49BE-B312-1EDADE725756">
|
<Component Id="C.$(var.MyProductFileName)_a64.dll.x86" Guid="2B264958-DECC-4B32-9BB2-DE32D6B6BE77">
|
||||||
<File Name="$(var.MyProductFileName)-x64.dll" KeyPath="yes" />
|
<File Id="FILE.$(var.MyProductFileName)_a64.dll.x86" Name="$(var.MyProductFileName)-a64.dll" KeyPath="yes" />
|
||||||
<Condition>NOT VersionNT64</Condition>
|
<Condition><![CDATA[OSARCH = "x86"]]></Condition>
|
||||||
</Component>
|
</Component>
|
||||||
<Component Id="C.$(var.MyProductFileName)_x86.dll.selfreg" Guid="F0DEF7A6-AF55-419F-A58A-DF4018C6FA73">
|
<Component Id="C.$(var.MyProductFileName)_x64.dll.x86" Guid="29FB908F-1D36-4789-9778-4CE2E9C19CEA">
|
||||||
<File Id="FILE.$(var.MyProductFileName)_x86.dll.selfreg" Name="$(var.MyProductFileName)-x86.dll" KeyPath="yes" SelfRegCost="1" />
|
<File Id="FILE.$(var.MyProductFileName)_x64.dll.x86" Name="$(var.MyProductFileName)-x64.dll" KeyPath="yes" />
|
||||||
<Condition>NOT VersionNT64</Condition>
|
<Condition><![CDATA[OSARCH = "x86"]]></Condition>
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.$(var.MyProductFileName)_x86.dll.x86" Guid="80E87D91-69A8-4942-ABC1-36652B1CA700">
|
||||||
|
<File Id="FILE.$(var.MyProductFileName)_x86.dll.x86" Name="$(var.MyProductFileName)-x86.dll" KeyPath="yes" SelfRegCost="1" />
|
||||||
|
<Condition><![CDATA[OSARCH = "x86"]]></Condition>
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
<!-- install assembly -->
|
<!-- install assembly -->
|
||||||
<Component Id="C.$(var.MyProductFileName)_msil.dll" Guid="0D8BA6AE-9F87-402B-AE1A-95B0AE3BE179">
|
<Component Id="C.$(var.MyProductFileName)_msil.dll" Guid="1772CDE5-4B2F-48CF-B2DA-CA43818053A8">
|
||||||
<File Id="FILE.$(var.MyProductFileName)_msil.dll" Name="$(var.MyProductFileName)-msil.dll" KeyPath="yes" />
|
<File Id="FILE.$(var.MyProductFileName)_msil.dll" Name="$(var.MyProductFileName)-msil.dll" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
<Component Id="C.$(var.MyProductFileName)_msil.xml" Guid="1657F707-C112-454C-91AE-0FDEBBF454AB">
|
<Component Id="C.$(var.MyProductFileName)_msil.xml" Guid="C76745D2-51FA-4028-B827-3F2F3F763751">
|
||||||
<File Id="FILE.$(var.MyProductFileName)_msil.xml" Name="$(var.MyProductFileName)-msil.xml" KeyPath="yes" />
|
<File Id="FILE.$(var.MyProductFileName)_msil.xml" Name="$(var.MyProductFileName)-msil.xml" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
<!--
|
<!--
|
||||||
<Component Id="C.$(var.MyProductFileName)_msil.dll.GAC" Guid="6469467D-8C90-4889-8138-4028F9DA6E85">
|
<Component Id="C.$(var.MyProductFileName)_msil.dll.GAC" Guid="D86F8764-2FCC-43DA-A174-23E0FD6D45B7">
|
||||||
<File Id="FILE.$(var.MyProductFileName)_msil.dll.GAC" Name="$(var.MyProductFileName)-msil.dll" KeyPath="yes" Assembly=".net" />
|
<File Id="FILE.$(var.MyProductFileName)_msil.dll.GAC" Name="$(var.MyProductFileName)-msil.dll" KeyPath="yes" Assembly=".net" />
|
||||||
</Component>
|
</Component>
|
||||||
<Component Id="C.policy.$(var.MyProductFileName)_msil.dll.GAC">
|
<Component Id="C.policy.$(var.MyProductFileName)_msil.dll.GAC">
|
||||||
@ -106,63 +186,104 @@
|
|||||||
</Component>
|
</Component>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!-- On Win64 ServiceInstall launcher-x64.exe -->
|
<!-- On WinArm64 ServiceInstall launcher-a64.exe -->
|
||||||
<Component Id="C.launcher_x64.exe.svcinst">
|
<Component Id="C.launcher_a64.exe.a64" Guid="D8B657EA-7B08-48D1-B5F7-76CFB68E1BD5">
|
||||||
<File Id="launcher_x64.exe.svcinst" Name="launcher-x64.exe" KeyPath="yes" />
|
<File Id="FILE.launcher_a64.exe.a64" Name="launcher-a64.exe" KeyPath="yes" />
|
||||||
<ServiceInstall
|
<ServiceInstall
|
||||||
Id="launcher_x64.exe.svcinst"
|
Id="launcher_a64.exe.a64"
|
||||||
Name="[P.LauncherName]"
|
Name="$(var.MyProductName).Launcher"
|
||||||
Description="$(var.MyDescription)"
|
Description="$(var.MyDescription)"
|
||||||
Type="ownProcess"
|
Type="ownProcess"
|
||||||
Start="auto"
|
Start="auto"
|
||||||
ErrorControl="ignore" />
|
ErrorControl="ignore" />
|
||||||
<ServiceControl
|
<ServiceControl
|
||||||
Id="launcher_x64.exe.svcinst"
|
Id="launcher_a64.exe.a64"
|
||||||
Name="[P.LauncherName]"
|
Name="$(var.MyProductName).Launcher"
|
||||||
Start="install"
|
Start="install"
|
||||||
Stop="both"
|
Stop="both"
|
||||||
Remove="uninstall" />
|
Remove="uninstall" />
|
||||||
<Condition>VersionNT64</Condition>
|
<Condition><![CDATA[OSARCH = "ARM64"]]></Condition>
|
||||||
</Component>
|
</Component>
|
||||||
<Component Id="C.launcher_x86.exe">
|
<Component Id="C.launcher_x64.exe.a64" Guid="3EFC0561-6EA2-4E7E-B707-C2EA706CFBA0">
|
||||||
<File Name="launcher-x86.exe" KeyPath="yes" />
|
<File Id="FILE.launcher_x64.exe.a64" Name="launcher-x64.exe" KeyPath="yes" />
|
||||||
<Condition>VersionNT64</Condition>
|
<Condition><![CDATA[OSARCH = "ARM64"]]></Condition>
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.launcher_x86.exe.a64" Guid="69F16682-10AE-4FC4-9007-8D80CE0D8388">
|
||||||
|
<File Id="FILE.launcher_x86.exe.a64" Name="launcher-x86.exe" KeyPath="yes" />
|
||||||
|
<Condition><![CDATA[OSARCH = "ARM64"]]></Condition>
|
||||||
|
</Component>
|
||||||
|
|
||||||
|
<!-- On Win64 ServiceInstall launcher-x64.exe -->
|
||||||
|
<Component Id="C.launcher_a64.exe.x64" Guid="29760ACE-69CD-4061-8C0C-8A6E72D23A45">
|
||||||
|
<File Id="FILE.launcher_a64.exe.x64" Name="launcher-a64.exe" KeyPath="yes" />
|
||||||
|
<Condition><![CDATA[OSARCH = "AMD64"]]></Condition>
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.launcher_x64.exe.x64" Guid="36ACBA60-1C92-4D2A-B497-CD4FB13A042F">
|
||||||
|
<File Id="FILE.launcher_x64.exe.x64" Name="launcher-x64.exe" KeyPath="yes" />
|
||||||
|
<ServiceInstall
|
||||||
|
Id="launcher_x64.exe.x64"
|
||||||
|
Name="$(var.MyProductName).Launcher"
|
||||||
|
Description="$(var.MyDescription)"
|
||||||
|
Type="ownProcess"
|
||||||
|
Start="auto"
|
||||||
|
ErrorControl="ignore" />
|
||||||
|
<ServiceControl
|
||||||
|
Id="launcher_x64.exe.x64"
|
||||||
|
Name="$(var.MyProductName).Launcher"
|
||||||
|
Start="install"
|
||||||
|
Stop="both"
|
||||||
|
Remove="uninstall" />
|
||||||
|
<Condition><![CDATA[OSARCH = "AMD64"]]></Condition>
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.launcher_x86.exe.x64" Guid="98F17F67-AC1D-4E16-A147-B7AE113E3CB3">
|
||||||
|
<File Id="FILE.launcher_x86.exe.x64" Name="launcher-x86.exe" KeyPath="yes" />
|
||||||
|
<Condition><![CDATA[OSARCH = "AMD64"]]></Condition>
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
<!-- On Win32 ServiceInstall launcher-x86.exe -->
|
<!-- On Win32 ServiceInstall launcher-x86.exe -->
|
||||||
<Component Id="C.launcher_x64.exe" Guid="88CDBE92-8B67-485A-838F-FA4AD37F306F">
|
<Component Id="C.launcher_a64.exe.x86" Guid="9024A9FE-7445-4241-ADA3-82A57C92719A">
|
||||||
<File Name="launcher-x64.exe" KeyPath="yes" />
|
<File Id="FILE.launcher_a64.exe.x86" Name="launcher-a64.exe" KeyPath="yes" />
|
||||||
<Condition>NOT VersionNT64</Condition>
|
<Condition><![CDATA[OSARCH = "x86"]]></Condition>
|
||||||
</Component>
|
</Component>
|
||||||
<Component Id="C.launcher_x86.exe.svcinst" Guid="E995D906-0273-4758-9B26-99A3A8CD143A">
|
<Component Id="C.launcher_x64.exe.x86" Guid="A85DA9CD-26AA-460E-950D-CA9692B87465">
|
||||||
<File Id="launcher_x86.exe.svcinst" Name="launcher-x86.exe" KeyPath="yes" />
|
<File Id="FILE.launcher_x64.exe.x86" Name="launcher-x64.exe" KeyPath="yes" />
|
||||||
|
<Condition><![CDATA[OSARCH = "x86"]]></Condition>
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.launcher_x86.exe.x86" Guid="01FCCF6B-9F4B-4F29-8149-489470FFD449">
|
||||||
|
<File Id="FILE.launcher_x86.exe.x86" Name="launcher-x86.exe" KeyPath="yes" />
|
||||||
<ServiceInstall
|
<ServiceInstall
|
||||||
Id="launcher_x86.exe.svcinst"
|
Id="launcher_x86.exe.x86"
|
||||||
Name="[P.LauncherName]"
|
Name="$(var.MyProductName).Launcher"
|
||||||
Description="$(var.MyDescription)"
|
Description="$(var.MyDescription)"
|
||||||
Type="ownProcess"
|
Type="ownProcess"
|
||||||
Start="auto"
|
Start="auto"
|
||||||
ErrorControl="ignore" />
|
ErrorControl="ignore" />
|
||||||
<ServiceControl
|
<ServiceControl
|
||||||
Id="launcher_x86.exe.svcinst"
|
Id="launcher_x86.exe.x86"
|
||||||
Name="[P.LauncherName]"
|
Name="$(var.MyProductName).Launcher"
|
||||||
Start="install"
|
Start="install"
|
||||||
Stop="both"
|
Stop="both"
|
||||||
Remove="uninstall" />
|
Remove="uninstall" />
|
||||||
<Condition>NOT VersionNT64</Condition>
|
<Condition><![CDATA[OSARCH = "x86"]]></Condition>
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
<Component Id="C.launchctl_x64.exe" Guid="2753623B-66F1-4514-B9C7-F879178DFF49">
|
<Component Id="C.launchctl_a64.exe" Guid="A7D830DD-20D2-48BF-85B6-E306BCCAFD2D">
|
||||||
|
<File Name="launchctl-a64.exe" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.launchctl_x64.exe" Guid="CCC8974A-4CD0-443E-840D-1C92535BBD04">
|
||||||
<File Name="launchctl-x64.exe" KeyPath="yes" />
|
<File Name="launchctl-x64.exe" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
<Component Id="C.launchctl_x86.exe" Guid="EBDEC4FB-07BB-47CA-BFFF-EB854CA2D22D">
|
<Component Id="C.launchctl_x86.exe" Guid="6E382342-10D4-4274-8FA9-F1B44C40C277">
|
||||||
<File Name="launchctl-x86.exe" KeyPath="yes" />
|
<File Name="launchctl-x86.exe" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
<Component Id="C.fsptool_x64.exe" Guid="013FE508-097D-4433-9C60-717F5446E7F4">
|
<Component Id="C.fsptool_a64.exe" Guid="8ACEB970-CAD5-491D-8CE8-12675CC0E812">
|
||||||
|
<File Name="fsptool-a64.exe" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.fsptool_x64.exe" Guid="35EE49E2-9565-4FA2-A0AC-D51FD94FA380">
|
||||||
<File Name="fsptool-x64.exe" KeyPath="yes" />
|
<File Name="fsptool-x64.exe" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
<Component Id="C.fsptool_x86.exe" Guid="6C16DC2C-E12F-49FB-A665-3AF0475487AD">
|
<Component Id="C.fsptool_x86.exe" Guid="0E6D5742-D500-4E24-A0FA-E6316DB70D8B">
|
||||||
<File Name="fsptool-x86.exe" KeyPath="yes" />
|
<File Name="fsptool-x86.exe" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
@ -173,6 +294,32 @@
|
|||||||
<File Name="fsreg.bat" Source="..\..\..\tools\fsreg.bat" KeyPath="yes" />
|
<File Name="fsreg.bat" Source="..\..\..\tools\fsreg.bat" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
|
<Component Id="C.memfs_a64.exe">
|
||||||
|
<File Name="memfs-a64.exe" KeyPath="yes" />
|
||||||
|
<RegistryKey
|
||||||
|
Root="HKLM"
|
||||||
|
Key="[P.LauncherRegistryKey]">
|
||||||
|
<RegistryKey
|
||||||
|
Key="memfs-a64">
|
||||||
|
<RegistryValue
|
||||||
|
Type="string"
|
||||||
|
Name="Executable"
|
||||||
|
Value="[BINDIR]memfs-a64.exe" />
|
||||||
|
<RegistryValue
|
||||||
|
Type="string"
|
||||||
|
Name="CommandLine"
|
||||||
|
Value="-i -F NTFS -n 65536 -s 67108864 -u %1 -m %2" />
|
||||||
|
<RegistryValue
|
||||||
|
Type="string"
|
||||||
|
Name="Security"
|
||||||
|
Value="D:P(A;;RPWPLC;;;WD)" />
|
||||||
|
<RegistryValue
|
||||||
|
Type="integer"
|
||||||
|
Name="JobControl"
|
||||||
|
Value="1" />
|
||||||
|
</RegistryKey>
|
||||||
|
</RegistryKey>
|
||||||
|
</Component>
|
||||||
<Component Id="C.memfs_x64.exe">
|
<Component Id="C.memfs_x64.exe">
|
||||||
<File Name="memfs-x64.exe" KeyPath="yes" />
|
<File Name="memfs-x64.exe" KeyPath="yes" />
|
||||||
<RegistryKey
|
<RegistryKey
|
||||||
@ -297,6 +444,9 @@
|
|||||||
</Directory>
|
</Directory>
|
||||||
</DirectoryRef>
|
</DirectoryRef>
|
||||||
<DirectoryRef Id="LIBDIR" FileSource="..\build\$(var.Configuration)">
|
<DirectoryRef Id="LIBDIR" FileSource="..\build\$(var.Configuration)">
|
||||||
|
<Component Id="C.$(var.MyProductFileName)_a64.lib">
|
||||||
|
<File Name="$(var.MyProductFileName)-a64.lib" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
<Component Id="C.$(var.MyProductFileName)_x64.lib">
|
<Component Id="C.$(var.MyProductFileName)_x64.lib">
|
||||||
<File Name="$(var.MyProductFileName)-x64.lib" KeyPath="yes" />
|
<File Name="$(var.MyProductFileName)-x64.lib" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
@ -304,44 +454,64 @@
|
|||||||
<File Name="$(var.MyProductFileName)-x86.lib" KeyPath="yes" />
|
<File Name="$(var.MyProductFileName)-x86.lib" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
|
<!-- On WinArm64 copy fuse-a64.pc -->
|
||||||
|
<Component Id="C.fuse_a64.pc" Guid="776C28B5-DA1A-4EB6-96E6-3D22FE1573AC">
|
||||||
|
<File
|
||||||
|
Id="FILE.fuse_a64.pc"
|
||||||
|
Name="fuse.pc"
|
||||||
|
Source="..\build\$(var.Configuration)\fuse-a64.pc"
|
||||||
|
KeyPath="yes" />
|
||||||
|
<Condition><![CDATA[OSARCH = "ARM64"]]></Condition>
|
||||||
|
</Component>
|
||||||
|
|
||||||
<!-- On Win64 copy fuse-x64.pc -->
|
<!-- On Win64 copy fuse-x64.pc -->
|
||||||
<Component Id="C.fuse_x64.pc" Guid="407395D2-D076-411E-B1D0-D97E21E11A3C">
|
<Component Id="C.fuse_x64.pc" Guid="89D39F6E-2994-4E6F-ACB6-5B544057C051">
|
||||||
<File
|
<File
|
||||||
Id="FILE.fuse_x64.pc"
|
Id="FILE.fuse_x64.pc"
|
||||||
Name="fuse.pc"
|
Name="fuse.pc"
|
||||||
Source="..\build\$(var.Configuration)\fuse-x64.pc"
|
Source="..\build\$(var.Configuration)\fuse-x64.pc"
|
||||||
KeyPath="yes" />
|
KeyPath="yes" />
|
||||||
<Condition>VersionNT64</Condition>
|
<Condition><![CDATA[OSARCH = "AMD64"]]></Condition>
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
<!-- On Win32 copy fuse-x86.pc -->
|
<!-- On Win32 copy fuse-x86.pc -->
|
||||||
<Component Id="C.fuse_x86.pc" Guid="0568EBCB-782E-4C17-9B64-BAFCC43F64ED">
|
<Component Id="C.fuse_x86.pc" Guid="75637ECD-B3EC-4A19-98B7-9AFAB0722D9A">
|
||||||
<File
|
<File
|
||||||
Id="FILE.fuse_x86.pc"
|
Id="FILE.fuse_x86.pc"
|
||||||
Name="fuse.pc"
|
Name="fuse.pc"
|
||||||
Source="..\build\$(var.Configuration)\fuse-x86.pc"
|
Source="..\build\$(var.Configuration)\fuse-x86.pc"
|
||||||
KeyPath="yes" />
|
KeyPath="yes" />
|
||||||
<Condition>NOT VersionNT64</Condition>
|
<Condition><![CDATA[OSARCH = "x86"]]></Condition>
|
||||||
|
</Component>
|
||||||
|
|
||||||
|
<!-- On WinArm64 copy fuse3-x64.pc -->
|
||||||
|
<Component Id="C.fuse3_a64.pc" Guid="5A69B633-11E4-46E4-8D08-BED1BE7BF4F0">
|
||||||
|
<File
|
||||||
|
Id="FILE.fuse3_a64.pc"
|
||||||
|
Name="fuse3.pc"
|
||||||
|
Source="..\build\$(var.Configuration)\fuse3-a64.pc"
|
||||||
|
KeyPath="yes" />
|
||||||
|
<Condition><![CDATA[OSARCH = "ARM64"]]></Condition>
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
<!-- On Win64 copy fuse3-x64.pc -->
|
<!-- On Win64 copy fuse3-x64.pc -->
|
||||||
<Component Id="C.fuse3_x64.pc" Guid="FE59E3BA-E5EA-4822-80B1-19A1DE6B62C7">
|
<Component Id="C.fuse3_x64.pc" Guid="EEAF35B5-5D6C-47D6-BEE3-5E44DD5A294B">
|
||||||
<File
|
<File
|
||||||
Id="FILE.fuse3_x64.pc"
|
Id="FILE.fuse3_x64.pc"
|
||||||
Name="fuse3.pc"
|
Name="fuse3.pc"
|
||||||
Source="..\build\$(var.Configuration)\fuse3-x64.pc"
|
Source="..\build\$(var.Configuration)\fuse3-x64.pc"
|
||||||
KeyPath="yes" />
|
KeyPath="yes" />
|
||||||
<Condition>VersionNT64</Condition>
|
<Condition><![CDATA[OSARCH = "AMD64"]]></Condition>
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
<!-- On Win32 copy fuse3-x86.pc -->
|
<!-- On Win32 copy fuse3-x86.pc -->
|
||||||
<Component Id="C.fuse3_x86.pc" Guid="176205D0-07EA-4DFC-947F-18E89ABDAFAB">
|
<Component Id="C.fuse3_x86.pc" Guid="476CF5E5-2B8E-4D75-B1A5-FFA8C3DAECB2">
|
||||||
<File
|
<File
|
||||||
Id="FILE.fuse3_x86.pc"
|
Id="FILE.fuse3_x86.pc"
|
||||||
Name="fuse3.pc"
|
Name="fuse3.pc"
|
||||||
Source="..\build\$(var.Configuration)\fuse3-x86.pc"
|
Source="..\build\$(var.Configuration)\fuse3-x86.pc"
|
||||||
KeyPath="yes" />
|
KeyPath="yes" />
|
||||||
<Condition>NOT VersionNT64</Condition>
|
<Condition><![CDATA[OSARCH = "x86"]]></Condition>
|
||||||
</Component>
|
</Component>
|
||||||
</DirectoryRef>
|
</DirectoryRef>
|
||||||
<DirectoryRef Id="OPTDIR">
|
<DirectoryRef Id="OPTDIR">
|
||||||
@ -378,6 +548,9 @@
|
|||||||
</Directory>
|
</Directory>
|
||||||
</Directory>
|
</Directory>
|
||||||
<Directory Id="OPTDIR.fsext.lib" Name="lib">
|
<Directory Id="OPTDIR.fsext.lib" Name="lib">
|
||||||
|
<Component Id="C.fsext.winfsp_a64.lib">
|
||||||
|
<File Id="FILE.fsext.winfsp_a64.lib" Name="winfsp-a64.lib" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
<Component Id="C.fsext.winfsp_x64.lib">
|
<Component Id="C.fsext.winfsp_x64.lib">
|
||||||
<File Id="FILE.fsext.winfsp_x64.lib" Name="winfsp-x64.lib" KeyPath="yes" />
|
<File Id="FILE.fsext.winfsp_x64.lib" Name="winfsp-x64.lib" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
@ -399,6 +572,29 @@
|
|||||||
<File Name="memfs-main.c" KeyPath="yes" />
|
<File Name="memfs-main.c" KeyPath="yes" />
|
||||||
</Component>
|
</Component>
|
||||||
</Directory>
|
</Directory>
|
||||||
|
<Directory Id="SMPDIR.memfs_fuse" Name="memfs-fuse">
|
||||||
|
<Component Id="C.memfs_fuse.cpp">
|
||||||
|
<File Name="memfs-fuse.cpp" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.memfs_fuse.compat.h">
|
||||||
|
<File Id="F.memfs_fuse.compat.h" Name="compat.h" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.memfs_fuse.sln">
|
||||||
|
<File Name="memfs-fuse.sln" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.memfs_fuse.vcxproj">
|
||||||
|
<File Name="memfs-fuse.vcxproj" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.memfs_fuse.vcxproj.filters">
|
||||||
|
<File Name="memfs-fuse.vcxproj.filters" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.memfs_fuse.Makefile">
|
||||||
|
<File Id="F.memfs_fuse.Makefile" Name="Makefile" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.memfs_fuse.README.md">
|
||||||
|
<File Id="F.memfsx_fuse.README.md" Name="README.md" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
</Directory>
|
||||||
<Directory Id="SMPDIR.memfs_fuse3" Name="memfs-fuse3">
|
<Directory Id="SMPDIR.memfs_fuse3" Name="memfs-fuse3">
|
||||||
<Component Id="C.memfs_fuse3.cpp">
|
<Component Id="C.memfs_fuse3.cpp">
|
||||||
<File Name="memfs-fuse3.cpp" KeyPath="yes" />
|
<File Name="memfs-fuse3.cpp" KeyPath="yes" />
|
||||||
@ -427,6 +623,29 @@
|
|||||||
<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.ntptfs" Name="ntptfs">
|
||||||
|
<Component Id="C.ptfs.c">
|
||||||
|
<File Name="ptfs.c" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.lfs.c">
|
||||||
|
<File Name="lfs.c" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.ptfs_main.c">
|
||||||
|
<File Name="ptfs-main.c" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.ptfs.h">
|
||||||
|
<File Name="ptfs.h" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.ntptfs.sln">
|
||||||
|
<File Name="ntptfs.sln" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.ntptfs.vcxproj">
|
||||||
|
<File Name="ntptfs.vcxproj" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
<Component Id="C.ntptfs.vcxproj.filters">
|
||||||
|
<File Name="ntptfs.vcxproj.filters" KeyPath="yes" />
|
||||||
|
</Component>
|
||||||
|
</Directory>
|
||||||
<Directory Id="SMPDIR.airfs" Name="airfs">
|
<Directory Id="SMPDIR.airfs" Name="airfs">
|
||||||
<Component Id="C.airfs.cpp">
|
<Component Id="C.airfs.cpp">
|
||||||
<File Name="airfs.cpp" KeyPath="yes" />
|
<File Name="airfs.cpp" KeyPath="yes" />
|
||||||
@ -564,58 +783,33 @@
|
|||||||
</Component>
|
</Component>
|
||||||
</Directory>
|
</Directory>
|
||||||
</DirectoryRef>
|
</DirectoryRef>
|
||||||
<DirectoryRef Id="SYMDIR">
|
|
||||||
<Component Id="C.$(var.MyProductFileName)_x64.sys.pdb">
|
|
||||||
<File Name="$(var.MyProductFileName)-x64.sys.pdb" Source="..\build\$(var.Configuration)\$(var.MyProductFileName)-x64.sys.public.pdb" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
<Component Id="C.$(var.MyProductFileName)_x86.sys.pdb">
|
|
||||||
<File Name="$(var.MyProductFileName)-x86.sys.pdb" Source="..\build\$(var.Configuration)\$(var.MyProductFileName)-x86.sys.public.pdb" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
<Component Id="C.$(var.MyProductFileName)_x64.dll.pdb">
|
|
||||||
<File Name="$(var.MyProductFileName)-x64.dll.pdb" Source="..\build\$(var.Configuration)\$(var.MyProductFileName)-x64.dll.public.pdb" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
<Component Id="C.$(var.MyProductFileName)_x86.dll.pdb">
|
|
||||||
<File Name="$(var.MyProductFileName)-x86.dll.pdb" Source="..\build\$(var.Configuration)\$(var.MyProductFileName)-x86.dll.public.pdb" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
<Component Id="C.launcher_x64.pdb">
|
|
||||||
<File Name="launcher-x64.pdb" Source="..\build\$(var.Configuration)\launcher-x64.public.pdb" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
<Component Id="C.launcher_x86.pdb">
|
|
||||||
<File Name="launcher-x86.pdb" Source="..\build\$(var.Configuration)\launcher-x86.public.pdb" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
<Component Id="C.launchctl_x64.pdb">
|
|
||||||
<File Name="launchctl-x64.pdb" Source="..\build\$(var.Configuration)\launchctl-x64.public.pdb" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
<Component Id="C.launchctl_x86.pdb">
|
|
||||||
<File Name="launchctl-x86.pdb" Source="..\build\$(var.Configuration)\launchctl-x86.public.pdb" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
<Component Id="C.fsptool_x64.pdb">
|
|
||||||
<File Name="fsptool-x64.pdb" Source="..\build\$(var.Configuration)\fsptool-x64.public.pdb" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
<Component Id="C.fsptool_x86.pdb">
|
|
||||||
<File Name="fsptool-x86.pdb" Source="..\build\$(var.Configuration)\fsptool-x86.public.pdb" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
<Component Id="C.memfs_x64.pdb">
|
|
||||||
<File Name="memfs-x64.pdb" Source="..\build\$(var.Configuration)\memfs-x64.public.pdb" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
<Component Id="C.memfs_x86.pdb">
|
|
||||||
<File Name="memfs-x86.pdb" Source="..\build\$(var.Configuration)\memfs-x86.public.pdb" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
</DirectoryRef>
|
|
||||||
|
|
||||||
<ComponentGroup Id="C.$(var.MyProductName).bin">
|
<ComponentGroup Id="C.$(var.MyProductName).bin">
|
||||||
|
<ComponentRef Id="C.$(var.MyProductFileName)_a64.sys" />
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_x64.sys" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_x64.sys" />
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_x86.sys" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_x86.sys" />
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_x64.dll.selfreg" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_a64.dll.a64" />
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_x86.dll" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_x64.dll.a64" />
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_x64.dll" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_x86.dll.a64" />
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_x86.dll.selfreg" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_a64.dll.x64" />
|
||||||
<ComponentRef Id="C.launcher_x64.exe.svcinst" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_x64.dll.x64" />
|
||||||
<ComponentRef Id="C.launcher_x86.exe" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_x86.dll.x64" />
|
||||||
<ComponentRef Id="C.launcher_x64.exe" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_a64.dll.x86" />
|
||||||
<ComponentRef Id="C.launcher_x86.exe.svcinst" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_x64.dll.x86" />
|
||||||
|
<ComponentRef Id="C.$(var.MyProductFileName)_x86.dll.x86" />
|
||||||
|
<ComponentRef Id="C.launcher_a64.exe.a64" />
|
||||||
|
<ComponentRef Id="C.launcher_x64.exe.a64" />
|
||||||
|
<ComponentRef Id="C.launcher_x86.exe.a64" />
|
||||||
|
<ComponentRef Id="C.launcher_a64.exe.x64" />
|
||||||
|
<ComponentRef Id="C.launcher_x64.exe.x64" />
|
||||||
|
<ComponentRef Id="C.launcher_x86.exe.x64" />
|
||||||
|
<ComponentRef Id="C.launcher_a64.exe.x86" />
|
||||||
|
<ComponentRef Id="C.launcher_x64.exe.x86" />
|
||||||
|
<ComponentRef Id="C.launcher_x86.exe.x86" />
|
||||||
|
<ComponentRef Id="C.launchctl_a64.exe" />
|
||||||
<ComponentRef Id="C.launchctl_x64.exe" />
|
<ComponentRef Id="C.launchctl_x64.exe" />
|
||||||
<ComponentRef Id="C.launchctl_x86.exe" />
|
<ComponentRef Id="C.launchctl_x86.exe" />
|
||||||
|
<ComponentRef Id="C.fsptool_a64.exe" />
|
||||||
<ComponentRef Id="C.fsptool_x64.exe" />
|
<ComponentRef Id="C.fsptool_x64.exe" />
|
||||||
<ComponentRef Id="C.fsptool_x86.exe" />
|
<ComponentRef Id="C.fsptool_x86.exe" />
|
||||||
<ComponentRef Id="C.diag.bat" />
|
<ComponentRef Id="C.diag.bat" />
|
||||||
@ -636,10 +830,13 @@
|
|||||||
<ComponentRef Id="C.winfsp_fuse3.h" />
|
<ComponentRef Id="C.winfsp_fuse3.h" />
|
||||||
</ComponentGroup>
|
</ComponentGroup>
|
||||||
<ComponentGroup Id="C.$(var.MyProductName).lib">
|
<ComponentGroup Id="C.$(var.MyProductName).lib">
|
||||||
|
<ComponentRef Id="C.$(var.MyProductFileName)_a64.lib" />
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_x64.lib" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_x64.lib" />
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_x86.lib" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_x86.lib" />
|
||||||
|
<ComponentRef Id="C.fuse_a64.pc" />
|
||||||
<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_a64.pc" />
|
||||||
<ComponentRef Id="C.fuse3_x64.pc" />
|
<ComponentRef Id="C.fuse3_x64.pc" />
|
||||||
<ComponentRef Id="C.fuse3_x86.pc" />
|
<ComponentRef Id="C.fuse3_x86.pc" />
|
||||||
</ComponentGroup>
|
</ComponentGroup>
|
||||||
@ -653,15 +850,24 @@
|
|||||||
</ComponentGroup>
|
</ComponentGroup>
|
||||||
<ComponentGroup Id="C.$(var.MyProductName).opt.fsext">
|
<ComponentGroup Id="C.$(var.MyProductName).opt.fsext">
|
||||||
<ComponentRef Id="C.fsext.h" />
|
<ComponentRef Id="C.fsext.h" />
|
||||||
|
<ComponentRef Id="C.fsext.winfsp_a64.lib" />
|
||||||
<ComponentRef Id="C.fsext.winfsp_x64.lib" />
|
<ComponentRef Id="C.fsext.winfsp_x64.lib" />
|
||||||
<ComponentRef Id="C.fsext.winfsp_x86.lib" />
|
<ComponentRef Id="C.fsext.winfsp_x86.lib" />
|
||||||
</ComponentGroup>
|
</ComponentGroup>
|
||||||
<ComponentGroup Id="C.$(var.MyProductName).smp">
|
<ComponentGroup Id="C.$(var.MyProductName).smp">
|
||||||
|
<ComponentRef Id="C.memfs_a64.exe" />
|
||||||
<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_fuse.cpp" />
|
||||||
|
<ComponentRef Id="C.memfs_fuse.compat.h" />
|
||||||
|
<ComponentRef Id="C.memfs_fuse.sln" />
|
||||||
|
<ComponentRef Id="C.memfs_fuse.vcxproj" />
|
||||||
|
<ComponentRef Id="C.memfs_fuse.vcxproj.filters" />
|
||||||
|
<ComponentRef Id="C.memfs_fuse.Makefile" />
|
||||||
|
<ComponentRef Id="C.memfs_fuse.README.md" />
|
||||||
<ComponentRef Id="C.memfs_fuse3.cpp" />
|
<ComponentRef Id="C.memfs_fuse3.cpp" />
|
||||||
<ComponentRef Id="C.memfs_fuse3.compat.h" />
|
<ComponentRef Id="C.memfs_fuse3.compat.h" />
|
||||||
<ComponentRef Id="C.memfs_fuse3.sln" />
|
<ComponentRef Id="C.memfs_fuse3.sln" />
|
||||||
@ -669,6 +875,13 @@
|
|||||||
<ComponentRef Id="C.memfs_fuse3.vcxproj.filters" />
|
<ComponentRef Id="C.memfs_fuse3.vcxproj.filters" />
|
||||||
<ComponentRef Id="C.memfs_fuse3.Makefile" />
|
<ComponentRef Id="C.memfs_fuse3.Makefile" />
|
||||||
<ComponentRef Id="C.memfs_fuse3.README.md" />
|
<ComponentRef Id="C.memfs_fuse3.README.md" />
|
||||||
|
<ComponentRef Id="C.ptfs.c" />
|
||||||
|
<ComponentRef Id="C.lfs.c" />
|
||||||
|
<ComponentRef Id="C.ptfs_main.c" />
|
||||||
|
<ComponentRef Id="C.ptfs.h" />
|
||||||
|
<ComponentRef Id="C.ntptfs.sln" />
|
||||||
|
<ComponentRef Id="C.ntptfs.vcxproj" />
|
||||||
|
<ComponentRef Id="C.ntptfs.vcxproj.filters" />
|
||||||
<ComponentRef Id="C.airfs.cpp" />
|
<ComponentRef Id="C.airfs.cpp" />
|
||||||
<ComponentRef Id="C.persistence.cpp" />
|
<ComponentRef Id="C.persistence.cpp" />
|
||||||
<ComponentRef Id="C.common.h" />
|
<ComponentRef Id="C.common.h" />
|
||||||
@ -704,20 +917,6 @@
|
|||||||
<ComponentRef Id="C.notifyfs.vcxproj" />
|
<ComponentRef Id="C.notifyfs.vcxproj" />
|
||||||
<ComponentRef Id="C.notifyfs.vcxproj.filters" />
|
<ComponentRef Id="C.notifyfs.vcxproj.filters" />
|
||||||
</ComponentGroup>
|
</ComponentGroup>
|
||||||
<ComponentGroup Id="C.$(var.MyProductName).sym">
|
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_x64.sys.pdb" />
|
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_x86.sys.pdb" />
|
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_x86.dll.pdb" />
|
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_x64.dll.pdb" />
|
|
||||||
<ComponentRef Id="C.launcher_x86.pdb" />
|
|
||||||
<ComponentRef Id="C.launcher_x64.pdb" />
|
|
||||||
<ComponentRef Id="C.launchctl_x64.pdb" />
|
|
||||||
<ComponentRef Id="C.launchctl_x86.pdb" />
|
|
||||||
<ComponentRef Id="C.fsptool_x64.pdb" />
|
|
||||||
<ComponentRef Id="C.fsptool_x86.pdb" />
|
|
||||||
<ComponentRef Id="C.memfs_x64.pdb" />
|
|
||||||
<ComponentRef Id="C.memfs_x86.pdb" />
|
|
||||||
</ComponentGroup>
|
|
||||||
<ComponentGroup Id="C.$(var.MyProductName).net">
|
<ComponentGroup Id="C.$(var.MyProductName).net">
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_msil.dll" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_msil.dll" />
|
||||||
<ComponentRef Id="C.$(var.MyProductFileName)_msil.xml" />
|
<ComponentRef Id="C.$(var.MyProductFileName)_msil.xml" />
|
||||||
@ -749,6 +948,7 @@
|
|||||||
Absent="disallow">
|
Absent="disallow">
|
||||||
<ComponentRef Id="C.INSTALLDIR" />
|
<ComponentRef Id="C.INSTALLDIR" />
|
||||||
<ComponentRef Id="C.License.txt" />
|
<ComponentRef Id="C.License.txt" />
|
||||||
|
<ComponentRef Id="C.SXSDIR" />
|
||||||
<Feature
|
<Feature
|
||||||
Id="F.User"
|
Id="F.User"
|
||||||
Level="1"
|
Level="1"
|
||||||
@ -784,7 +984,6 @@
|
|||||||
<ComponentGroupRef Id="C.$(var.MyProductName).lib" />
|
<ComponentGroupRef Id="C.$(var.MyProductName).lib" />
|
||||||
<ComponentGroupRef Id="C.$(var.MyProductName).smp" />
|
<ComponentGroupRef Id="C.$(var.MyProductName).smp" />
|
||||||
<ComponentGroupRef Id="C.$(var.MyProductName).smp.net" />
|
<ComponentGroupRef Id="C.$(var.MyProductName).smp.net" />
|
||||||
<ComponentGroupRef Id="C.$(var.MyProductName).sym" />
|
|
||||||
</Feature>
|
</Feature>
|
||||||
<Feature
|
<Feature
|
||||||
Id="F.KernelDeveloper"
|
Id="F.KernelDeveloper"
|
||||||
@ -827,7 +1026,24 @@
|
|||||||
Order="10">NOT Installed</Publish>
|
Order="10">NOT Installed</Publish>
|
||||||
</UI>
|
</UI>
|
||||||
|
|
||||||
|
<!-- Custom Actions -->
|
||||||
<Binary Id="CustomActions" SourceFile="..\build\$(var.Configuration)\CustomActions.dll" />
|
<Binary Id="CustomActions" SourceFile="..\build\$(var.Configuration)\CustomActions.dll" />
|
||||||
|
|
||||||
|
<!-- InstanceID computes a unique per-installer-run ID -->
|
||||||
|
<CustomAction
|
||||||
|
Id="Action.InstanceID"
|
||||||
|
BinaryKey="CustomActions"
|
||||||
|
DllEntry="InstanceID"
|
||||||
|
Execute="firstSequence"
|
||||||
|
Return="check" />
|
||||||
|
<InstallExecuteSequence>
|
||||||
|
<Custom Action="Action.InstanceID" Before="AppSearch" />
|
||||||
|
</InstallExecuteSequence>
|
||||||
|
<InstallUISequence>
|
||||||
|
<Custom Action="Action.InstanceID" Before="AppSearch" />
|
||||||
|
</InstallUISequence>
|
||||||
|
|
||||||
|
<!-- ServiceRunning determines if the old driver (that did not support unload) is running. -->
|
||||||
<CustomAction
|
<CustomAction
|
||||||
Id="Params.ServiceRunning"
|
Id="Params.ServiceRunning"
|
||||||
Property="ServiceRunning"
|
Property="ServiceRunning"
|
||||||
@ -840,16 +1056,109 @@
|
|||||||
Return="ignore" />
|
Return="ignore" />
|
||||||
<CustomAction
|
<CustomAction
|
||||||
Id="Action.ServiceRunning.Error"
|
Id="Action.ServiceRunning.Error"
|
||||||
Error="The $(var.MyProductName) service appears to be running. If you just uninstalled $(var.MyProductName) please restart your computer. If you are running a development version of $(var.MyProductName) please remove it before proceeding." />
|
Error="A component from an older version of $(var.MyProductName) that cannot be upgraded appears to be running. If you just uninstalled an older version of $(var.MyProductName) please restart your computer." />
|
||||||
<InstallExecuteSequence>
|
<InstallExecuteSequence>
|
||||||
<Custom Action="Params.ServiceRunning" Before="Action.ServiceRunning" />
|
<Custom Action="Params.ServiceRunning" Before="Action.ServiceRunning" />
|
||||||
<Custom Action="Action.ServiceRunning" Before="LaunchConditions" />
|
<Custom Action="Action.ServiceRunning" After="LaunchConditions">
|
||||||
|
<![CDATA[NOT Installed]]>
|
||||||
|
</Custom>
|
||||||
<Custom Action="Action.ServiceRunning.Error" After="Action.ServiceRunning">
|
<Custom Action="Action.ServiceRunning.Error" After="Action.ServiceRunning">
|
||||||
<![CDATA[NOT Installed AND (0 <> ServiceRunning)]]>
|
<![CDATA[NOT Installed AND (0 <> ServiceRunning)]]>
|
||||||
</Custom>
|
</Custom>
|
||||||
<ScheduleReboot After="RemoveFiles">
|
|
||||||
<![CDATA[(REMOVE ~= "ALL") AND (0 <> ServiceRunning)]]>
|
|
||||||
</ScheduleReboot>
|
|
||||||
</InstallExecuteSequence>
|
</InstallExecuteSequence>
|
||||||
|
<InstallUISequence>
|
||||||
|
<Custom Action="Params.ServiceRunning" Before="Action.ServiceRunning" />
|
||||||
|
<Custom Action="Action.ServiceRunning" After="LaunchConditions">
|
||||||
|
<![CDATA[NOT Installed]]>
|
||||||
|
</Custom>
|
||||||
|
<Custom Action="Action.ServiceRunning.Error" After="Action.ServiceRunning">
|
||||||
|
<![CDATA[NOT Installed AND (0 <> ServiceRunning)]]>
|
||||||
|
</Custom>
|
||||||
|
</InstallUISequence>
|
||||||
|
|
||||||
|
<!-- InstallSymlinks installs SxS symlinks -->
|
||||||
|
<SetProperty
|
||||||
|
Id="Deferred.InstallSymlinks"
|
||||||
|
Value='InstallJunctions "[INSTALLDIR]\" "[SXSDIR]\" bin'
|
||||||
|
Before="Deferred.InstallSymlinks"
|
||||||
|
Sequence="execute" />
|
||||||
|
<CustomAction
|
||||||
|
Id="Deferred.InstallSymlinks"
|
||||||
|
BinaryKey="CustomActions"
|
||||||
|
DllEntry="DeferredAction"
|
||||||
|
Execute="deferred"
|
||||||
|
Impersonate="no"
|
||||||
|
Return="check" />
|
||||||
|
<SetProperty
|
||||||
|
Id="Rollback.InstallSymlinks"
|
||||||
|
Value='RemoveFiles "[INSTALLDIR]\" bin'
|
||||||
|
Before="Rollback.InstallSymlinks"
|
||||||
|
Sequence="execute" />
|
||||||
|
<CustomAction
|
||||||
|
Id="Rollback.InstallSymlinks"
|
||||||
|
BinaryKey="CustomActions"
|
||||||
|
DllEntry="DeferredAction"
|
||||||
|
Execute="rollback"
|
||||||
|
Impersonate="no"
|
||||||
|
Return="ignore" />
|
||||||
|
<InstallExecuteSequence>
|
||||||
|
<!--
|
||||||
|
deferred: `InstallSymlinks` on install or repair
|
||||||
|
rollback: `RemoveSymlinks` on install only
|
||||||
|
-->
|
||||||
|
<Custom Action="Rollback.InstallSymlinks" After="InstallFiles">
|
||||||
|
NOT Installed
|
||||||
|
</Custom>
|
||||||
|
<Custom Action="Deferred.InstallSymlinks" After="Rollback.InstallSymlinks">
|
||||||
|
(NOT Installed) OR REINSTALL
|
||||||
|
</Custom>
|
||||||
|
</InstallExecuteSequence>
|
||||||
|
|
||||||
|
<!-- RemoveSymlinks removes SxS symlinks -->
|
||||||
|
<SetProperty
|
||||||
|
Id="Deferred.RemoveSymlinks"
|
||||||
|
Value='RemoveFiles "[INSTALLDIR]\" bin'
|
||||||
|
Before="Deferred.RemoveSymlinks"
|
||||||
|
Sequence="execute" />
|
||||||
|
<CustomAction
|
||||||
|
Id="Deferred.RemoveSymlinks"
|
||||||
|
BinaryKey="CustomActions"
|
||||||
|
DllEntry="DeferredAction"
|
||||||
|
Execute="deferred"
|
||||||
|
Impersonate="no"
|
||||||
|
Return="ignore" />
|
||||||
|
<SetProperty
|
||||||
|
Id="Rollback.RemoveSymlinks"
|
||||||
|
Value='InstallJunctions "[INSTALLDIR]\" "[SXSDIR]\" bin'
|
||||||
|
Before="Rollback.RemoveSymlinks"
|
||||||
|
Sequence="execute" />
|
||||||
|
<CustomAction
|
||||||
|
Id="Rollback.RemoveSymlinks"
|
||||||
|
BinaryKey="CustomActions"
|
||||||
|
DllEntry="DeferredAction"
|
||||||
|
Execute="rollback"
|
||||||
|
Impersonate="no"
|
||||||
|
Return="check" />
|
||||||
|
<InstallExecuteSequence>
|
||||||
|
<!--
|
||||||
|
deferred: `RemoveSymlinks` on uninstall
|
||||||
|
rollback: `InstallSymlinks` on uninstall
|
||||||
|
-->
|
||||||
|
<Custom Action="Rollback.RemoveSymlinks" Before="RemoveFiles">
|
||||||
|
REMOVE ~= "ALL"
|
||||||
|
</Custom>
|
||||||
|
<Custom Action="Deferred.RemoveSymlinks" After="Rollback.RemoveSymlinks">
|
||||||
|
REMOVE ~= "ALL"
|
||||||
|
</Custom>
|
||||||
|
</InstallExecuteSequence>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Specify WIXFAILWHENDEFERRED=1 on the msiexec cmdline for rollback testing.
|
||||||
|
See http://tinyurl.com/yxkaywek
|
||||||
|
-->
|
||||||
|
<!--
|
||||||
|
<Property Id="WIXFAILWHENDEFERRED" Value="0" Secure="yes" />
|
||||||
|
<CustomActionRef Id="WixFailWhenDeferred" />
|
||||||
|
-->
|
||||||
</Product>
|
</Product>
|
||||||
</Wix>
|
</Wix>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<Import Project="..\version.properties" />
|
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), build.common.props))/build.common.props" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||||
@ -20,7 +20,7 @@
|
|||||||
<SuppressAllWarnings>False</SuppressAllWarnings>
|
<SuppressAllWarnings>False</SuppressAllWarnings>
|
||||||
<Pedantic>True</Pedantic>
|
<Pedantic>True</Pedantic>
|
||||||
<SuppressPdbOutput>True</SuppressPdbOutput>
|
<SuppressPdbOutput>True</SuppressPdbOutput>
|
||||||
<SuppressIces>ICE30</SuppressIces>
|
<SuppressIces>ICE30;ICE61</SuppressIces>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||||
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
||||||
@ -29,12 +29,16 @@
|
|||||||
<SuppressAllWarnings>False</SuppressAllWarnings>
|
<SuppressAllWarnings>False</SuppressAllWarnings>
|
||||||
<Pedantic>True</Pedantic>
|
<Pedantic>True</Pedantic>
|
||||||
<SuppressPdbOutput>True</SuppressPdbOutput>
|
<SuppressPdbOutput>True</SuppressPdbOutput>
|
||||||
<SuppressIces>ICE30</SuppressIces>
|
<SuppressIces>ICE30;ICE61</SuppressIces>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Product.wxs" />
|
<Compile Include="Product.wxs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<WixExtension Include="WixUtilExtension">
|
||||||
|
<HintPath>$(WixExtDir)\WixUtilExtension.dll</HintPath>
|
||||||
|
<Name>WixUtilExtension</Name>
|
||||||
|
</WixExtension>
|
||||||
<WixExtension Include="WixUIExtension">
|
<WixExtension Include="WixUIExtension">
|
||||||
<HintPath>$(WixExtDir)\WixUIExtension.dll</HintPath>
|
<HintPath>$(WixExtDir)\WixUIExtension.dll</HintPath>
|
||||||
<Name>WixUIExtension</Name>
|
<Name>WixUIExtension</Name>
|
||||||
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 451 KiB After Width: | Height: | Size: 451 KiB |
Before Width: | Height: | Size: 451 KiB After Width: | Height: | Size: 451 KiB |
Before Width: | Height: | Size: 451 KiB After Width: | Height: | Size: 451 KiB |
@ -1,11 +1,19 @@
|
|||||||
<?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" />
|
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), build.common.props))/build.common.props" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|ARM64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|ARM64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
@ -45,6 +53,12 @@
|
|||||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</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>
|
||||||
@ -52,6 +66,13 @@
|
|||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
@ -66,33 +87,51 @@
|
|||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
@ -107,6 +146,7 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
|
<AdditionalDependencies>ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
@ -122,6 +162,23 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
|
<AdditionalDependencies>ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\ext</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<AdditionalDependencies>ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
@ -141,6 +198,7 @@
|
|||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
@ -160,6 +218,27 @@
|
|||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\ext</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -169,9 +248,13 @@
|
|||||||
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">TurnOffAllWarnings</WarningLevel>
|
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">TurnOffAllWarnings</WarningLevel>
|
||||||
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</SDLCheck>
|
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</SDLCheck>
|
||||||
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">TurnOffAllWarnings</WarningLevel>
|
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">TurnOffAllWarnings</WarningLevel>
|
||||||
|
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">TurnOffAllWarnings</WarningLevel>
|
||||||
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</SDLCheck>
|
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</SDLCheck>
|
||||||
|
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">false</SDLCheck>
|
||||||
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Release|x64'">TurnOffAllWarnings</WarningLevel>
|
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Release|x64'">TurnOffAllWarnings</WarningLevel>
|
||||||
|
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">TurnOffAllWarnings</WarningLevel>
|
||||||
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</SDLCheck>
|
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</SDLCheck>
|
||||||
|
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">false</SDLCheck>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\..\tst\fsbench\fsbench.c" />
|
<ClCompile Include="..\..\..\tst\fsbench\fsbench.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -1,11 +1,19 @@
|
|||||||
<?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" />
|
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), build.common.props))/build.common.props" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|ARM64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|ARM64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
@ -45,6 +53,12 @@
|
|||||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</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>
|
||||||
@ -52,6 +66,13 @@
|
|||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
@ -66,33 +87,51 @@
|
|||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
@ -124,6 +163,21 @@
|
|||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\tst\memfs;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
@ -162,6 +216,25 @@
|
|||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\tst\memfs;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\..\tst\fscrash\fscrash-main.c" />
|
<ClCompile Include="..\..\..\tst\fscrash\fscrash-main.c" />
|
||||||
<ClCompile Include="..\..\..\tst\fscrash\fscrash.c" />
|
<ClCompile Include="..\..\..\tst\fscrash\fscrash.c" />
|
||||||
|
@ -1,26 +1,30 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<Project>
|
||||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<PropertyGroup>
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
<BaseIntermediateOutputPath>$(SolutionDir)build\$(MSBuildProjectName).build\</BaseIntermediateOutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
|
||||||
|
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), build.common.props))/build.common.props" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
<ProjectGuid>{4920E350-D496-4652-AE98-6C4208AEC1D8}</ProjectGuid>
|
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<ProjectName>memfs-dotnet</ProjectName>
|
<ProjectName>memfs-dotnet</ProjectName>
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<RootNamespace>memfs</RootNamespace>
|
<RootNamespace>memfs</RootNamespace>
|
||||||
<AssemblyName>memfs-dotnet-msil</AssemblyName>
|
<AssemblyName>memfs-dotnet-msil</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
<TargetFramework>net452</TargetFramework>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||||
|
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<Optimize>false</Optimize>
|
<Optimize>false</Optimize>
|
||||||
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
||||||
<BaseIntermediateOutputPath>$(SolutionDir)build\$(ProjectName).build\</BaseIntermediateOutputPath>
|
|
||||||
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
@ -32,32 +36,16 @@
|
|||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
||||||
<BaseIntermediateOutputPath>$(SolutionDir)build\$(ProjectName).build\</BaseIntermediateOutputPath>
|
|
||||||
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="System" />
|
<ProjectReference Include="..\dotnet\winfsp.net.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="..\..\..\tst\memfs-dotnet\Program.cs">
|
<Compile Include="..\..\..\tst\memfs-dotnet\Program.cs" />
|
||||||
<Link>Program.cs</Link>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
|
||||||
<ProjectReference Include="..\dotnet\winfsp.net.csproj">
|
|
||||||
<Project>{94580219-cc8d-4fe5-a3be-437b0b3481e1}</Project>
|
|
||||||
<Name>winfsp.net</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
|
||||||
<Target Name="BeforeBuild">
|
|
||||||
</Target>
|
|
||||||
<Target Name="AfterBuild">
|
|
||||||
</Target>
|
|
||||||
-->
|
|
||||||
</Project>
|
</Project>
|
@ -1,11 +1,19 @@
|
|||||||
<?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" />
|
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), build.common.props))/build.common.props" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|ARM64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|ARM64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
@ -46,6 +54,12 @@
|
|||||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</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>
|
||||||
@ -53,6 +67,13 @@
|
|||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
@ -67,33 +88,51 @@
|
|||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
@ -127,6 +166,22 @@
|
|||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>MEMFS_STANDALONE;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
@ -169,6 +224,27 @@
|
|||||||
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>MEMFS_STANDALONE;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<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>
|
||||||
|
@ -1,11 +1,19 @@
|
|||||||
<?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" />
|
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), build.common.props))/build.common.props" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|ARM64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|ARM64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
@ -45,6 +53,12 @@
|
|||||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</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>
|
||||||
@ -52,6 +66,13 @@
|
|||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
@ -66,33 +87,51 @@
|
|||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
@ -126,6 +165,22 @@
|
|||||||
<AdditionalDependencies>ntdll.lib;netapi32.lib;dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>ntdll.lib;netapi32.lib;dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>__func__=__FUNCTION__;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\tst\memfs;..\..\..\src;..\..\..\inc;..\..\..\ext</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<AdditionalDependencies>ntdll.lib;netapi32.lib;dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
@ -166,16 +221,40 @@
|
|||||||
<AdditionalDependencies>ntdll.lib;netapi32.lib;dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>ntdll.lib;netapi32.lib;dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>__func__=__FUNCTION__;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\tst\memfs;..\..\..\src;..\..\..\inc;..\..\..\ext</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>ntdll.lib;netapi32.lib;dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\..\ext\tlib\testsuite.c">
|
<ClCompile Include="..\..\..\ext\tlib\testsuite.c">
|
||||||
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</SDLCheck>
|
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</SDLCheck>
|
||||||
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</SDLCheck>
|
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</SDLCheck>
|
||||||
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</SDLCheck>
|
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</SDLCheck>
|
||||||
|
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">false</SDLCheck>
|
||||||
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</SDLCheck>
|
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</SDLCheck>
|
||||||
|
<SDLCheck Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">false</SDLCheck>
|
||||||
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">TurnOffAllWarnings</WarningLevel>
|
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">TurnOffAllWarnings</WarningLevel>
|
||||||
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">TurnOffAllWarnings</WarningLevel>
|
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">TurnOffAllWarnings</WarningLevel>
|
||||||
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">TurnOffAllWarnings</WarningLevel>
|
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">TurnOffAllWarnings</WarningLevel>
|
||||||
|
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">TurnOffAllWarnings</WarningLevel>
|
||||||
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Release|x64'">TurnOffAllWarnings</WarningLevel>
|
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Release|x64'">TurnOffAllWarnings</WarningLevel>
|
||||||
|
<WarningLevel Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">TurnOffAllWarnings</WarningLevel>
|
||||||
</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" />
|
||||||
@ -205,6 +284,7 @@
|
|||||||
<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\loadun-test.c" />
|
||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\uuid5-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\volpath-test.c" />
|
||||||
|
@ -112,6 +112,9 @@
|
|||||||
<ClCompile Include="..\..\..\tst\winfsp-tests\notify-test.c">
|
<ClCompile Include="..\..\..\tst\winfsp-tests\notify-test.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\tst\winfsp-tests\loadun-test.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\..\ext\tlib\testsuite.h">
|
<ClInclude Include="..\..\..\ext\tlib\testsuite.h">
|
||||||
|
@ -1,11 +1,19 @@
|
|||||||
<?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" />
|
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), build.common.props))/build.common.props" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|ARM64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|ARM64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
@ -45,6 +53,12 @@
|
|||||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</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>
|
||||||
@ -52,6 +66,13 @@
|
|||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
@ -66,33 +87,51 @@
|
|||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
@ -130,6 +169,24 @@
|
|||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
|
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
@ -174,6 +231,28 @@
|
|||||||
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<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>
|
||||||
|
@ -1,11 +1,19 @@
|
|||||||
<?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" />
|
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), build.common.props))/build.common.props" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|ARM64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|ARM64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
@ -45,6 +53,12 @@
|
|||||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</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>
|
||||||
@ -52,6 +66,13 @@
|
|||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
@ -66,33 +87,51 @@
|
|||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
@ -134,6 +173,26 @@
|
|||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
|
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||||
|
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
@ -182,6 +241,30 @@
|
|||||||
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
|
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\..\src\launcher\launchctl.c" />
|
<ClCompile Include="..\..\..\src\launcher\launchctl.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@ -190,7 +273,9 @@
|
|||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -1,11 +1,19 @@
|
|||||||
<?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" />
|
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), build.common.props))/build.common.props" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|ARM64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|ARM64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
@ -45,6 +53,12 @@
|
|||||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</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>
|
||||||
@ -52,6 +66,13 @@
|
|||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
@ -66,33 +87,51 @@
|
|||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(ProjectName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
@ -136,6 +175,27 @@
|
|||||||
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
|
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||||
|
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
|
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;userenv.lib</AdditionalDependencies>
|
||||||
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
@ -186,6 +246,31 @@
|
|||||||
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\inc</AdditionalIncludeDirectories>
|
||||||
|
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
|
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;userenv.lib</AdditionalDependencies>
|
||||||
|
<StripPrivateSymbols>$(OutDir)$(TargetName).public.pdb</StripPrivateSymbols>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\..\src\launcher\launcher.c" />
|
<ClCompile Include="..\..\..\src\launcher\launcher.c" />
|
||||||
<ClCompile Include="..\..\..\src\launcher\ptrans.c" />
|
<ClCompile Include="..\..\..\src\launcher\ptrans.c" />
|
||||||
@ -200,7 +285,9 @@
|
|||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -1,63 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<!-- build number: concat 2-digit year with 3-digit day of the year (16-bits until 2066) -->
|
|
||||||
<MyBuildNumber>$([System.DateTime]::Now.ToString(`yy`))$([System.DateTime]::Now.DayOfYear.ToString(`000`))</MyBuildNumber>
|
|
||||||
|
|
||||||
<!-- git revision -->
|
|
||||||
<MyGitRoot>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), .git/HEAD))</MyGitRoot>
|
|
||||||
<MyGitHead>$([System.IO.File]::ReadAllText($(MyGitRoot)/.git/HEAD).Trim())</MyGitHead>
|
|
||||||
<MyGitRevision Condition="$(MyGitHead.StartsWith(ref: )) And Exists('$(MyGitRoot)/.git/$(MyGitHead.Substring(5))')">$([System.IO.File]::ReadAllText($(MyGitRoot)/.git/$(MyGitHead.Substring(5))).Trim().Substring(0, 7))</MyGitRevision>
|
|
||||||
<MyGitRevision Condition="$(MyGitHead.StartsWith(ref: )) And !Exists('$(MyGitRoot)/.git/$(MyGitHead.Substring(5))')">$([System.Text.RegularExpressions.Regex]::Match($([System.IO.File]::ReadAllText($(MyGitRoot)/.git/packed-refs)), '[0-9a-fA-F]{40,}.*$(MyGitHead.Substring(5))').Value.Substring(0, 7))</MyGitRevision>
|
|
||||||
<MyGitRevision Condition="!$(MyGitHead.StartsWith(ref: ))">$(MyGitHead.Substring(0, 7))</MyGitRevision>
|
|
||||||
|
|
||||||
<MyProductName>WinFsp</MyProductName>
|
|
||||||
<MyProductFileName>winfsp</MyProductFileName>
|
|
||||||
<MyDescription>Windows File System Proxy</MyDescription>
|
|
||||||
<MyCompanyName>Navimatics LLC</MyCompanyName>
|
|
||||||
<MyCopyright>2015-$([System.DateTime]::Now.ToString(`yyyy`)) Bill Zissimopoulos</MyCopyright>
|
|
||||||
|
|
||||||
<MyCanonicalVersion>1.10</MyCanonicalVersion>
|
|
||||||
|
|
||||||
<MyProductVersion>2021.1 Beta2</MyProductVersion>
|
|
||||||
<MyProductStage>Beta</MyProductStage>
|
|
||||||
|
|
||||||
<MyVersion>$(MyCanonicalVersion).$(MyBuildNumber)</MyVersion>
|
|
||||||
<MyVersionWithCommas>$(MyVersion.Replace('.',',')),0</MyVersionWithCommas>
|
|
||||||
<MyFullVersion>$(MyCanonicalVersion).$(MyBuildNumber).$(MyGitRevision)</MyFullVersion>
|
|
||||||
|
|
||||||
<MyAssemblyPolicyVersion>$(MyCanonicalVersion.Substring(0,$(MyVersion.IndexOf('.')))).0</MyAssemblyPolicyVersion>
|
|
||||||
<MyAssemblyVersion>$(MyAssemblyPolicyVersion).0.0</MyAssemblyVersion>
|
|
||||||
|
|
||||||
<!-- When rebranding WinFsp you MUST change the following GUIDs - use VS "Create GUID" tool -->
|
|
||||||
<MyFspFsctlDeviceClassGuid>{ 0x6f9d25fa, 0x6dee, 0x4a9d, { 0x80, 0xf5, 0xe9, 0x8e, 0x14, 0xf3, 0x5e, 0x54 } }</MyFspFsctlDeviceClassGuid>
|
|
||||||
<MyFspFsvrtDeviceClassGuid>{ 0xb48171c3, 0xdd50, 0x4852, { 0x83, 0xa3, 0x34, 0x4c, 0x50, 0xd9, 0x3b, 0x17 } }</MyFspFsvrtDeviceClassGuid>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemDefinitionGroup>
|
|
||||||
<ClCompile>
|
|
||||||
<PreprocessorDefinitions>NTDDI_VERSION=0x06010000;_WIN32_WINNT=0x0601;MyProductName=$(MyProductName);MyProductFileName=$(MyProductFileName);MyDescription=$(MyDescription);MyCompanyName=$(MyCompanyName);MyCopyright=$(MyCopyright);MyProductVersion=$(MyProductVersion);MyProductStage=$(MyProductStage);MyVersion=$(MyVersion);MyVersionWithCommas=$(MyVersionWithCommas);MyFullVersion=$(MyFullVersion);MyFspFsctlDeviceClassGuid=$(MyFspFsctlDeviceClassGuid);MyFspFsvrtDeviceClassGuid=$(MyFspFsvrtDeviceClassGuid)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<ResourceCompile>
|
|
||||||
<PreprocessorDefinitions>MyProductName=$(MyProductName);MyProductFileName=$(MyProductFileName);MyDescription=$(MyDescription);MyCompanyName=$(MyCompanyName);MyCopyright=$(MyCopyright);MyProductVersion=$(MyProductVersion);MyProductStage=$(MyProductStage);MyVersion=$(MyVersion);MyVersionWithCommas=$(MyVersionWithCommas);MyFullVersion=$(MyFullVersion)MyFspFsctlDeviceClassGuid=$(MyFspFsctlDeviceClassGuid);MyFspFsvrtDeviceClassGuid=$(MyFspFsvrtDeviceClassGuid)</PreprocessorDefinitions>
|
|
||||||
</ResourceCompile>
|
|
||||||
</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>
|
|
@ -60,168 +60,250 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fsptool", "tools\fsptool.vc
|
|||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|ARM64 = Debug|ARM64
|
||||||
Debug|x64 = Debug|x64
|
Debug|x64 = Debug|x64
|
||||||
Debug|x86 = Debug|x86
|
Debug|x86 = Debug|x86
|
||||||
|
Installer.Debug|ARM64 = Installer.Debug|ARM64
|
||||||
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|ARM64 = Installer.Release|ARM64
|
||||||
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|ARM64 = Release|ARM64
|
||||||
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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
|
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|ARM64.Build.0 = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
|
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|ARM64.Build.0 = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
|
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|ARM64.Build.0 = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
|
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|ARM64.Build.0 = Release|ARM64
|
||||||
{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|ARM64.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|ARM64.ActiveCfg = Release|x86
|
||||||
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|ARM64.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|ARM64.ActiveCfg = Release|x86
|
||||||
|
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|ARM64.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|ARM64.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|ARM64.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|ARM64.ActiveCfg = Debug|Win32
|
||||||
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|ARM64.Build.0 = Debug|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|ARM64.ActiveCfg = Release|Win32
|
||||||
|
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|ARM64.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|ARM64.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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
|
{10757011-749D-4954-873B-AE38D8145472}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
|
{10757011-749D-4954-873B-AE38D8145472}.Release|ARM64.Build.0 = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
|
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|ARM64.Build.0 = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|Any CPU
|
||||||
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|ARM64.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|ARM64.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|ARM64.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|ARM64.ActiveCfg = Release|Any CPU
|
||||||
|
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|ARM64.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|ARM64.ActiveCfg = Debug|Any CPU
|
||||||
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|ARM64.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|ARM64.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|ARM64.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|ARM64.ActiveCfg = Release|Any CPU
|
||||||
|
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|ARM64.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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
|
{6CDF9411-B852-4EAC-822D-8F930675F17B}.Release|ARM64.Build.0 = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
|
{264A5D09-126F-4760-A3F1-4B3B95C925AA}.Release|ARM64.Build.0 = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
|
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Debug|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
{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|ARM64.ActiveCfg = Release|ARM64
|
||||||
|
{1E997BEC-1642-4A5C-B252-852DA094E11E}.Release|ARM64.Build.0 = Release|ARM64
|
||||||
{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
|
||||||
|
@ -1,11 +1,19 @@
|
|||||||
<?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" />
|
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), build.common.props))/build.common.props" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|ARM64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|ARM64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
@ -40,6 +48,7 @@
|
|||||||
<ClInclude Include="..\..\src\shared\um\minimal.h" />
|
<ClInclude Include="..\..\src\shared\um\minimal.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\src\dll\debug.c" />
|
||||||
<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\fuse2to3.c" />
|
||||||
@ -56,7 +65,7 @@
|
|||||||
<ClCompile Include="..\..\src\dll\mount.c" />
|
<ClCompile Include="..\..\src\dll\mount.c" />
|
||||||
<ClCompile Include="..\..\src\dll\np.c" />
|
<ClCompile Include="..\..\src\dll\np.c" />
|
||||||
<ClCompile Include="..\..\src\dll\security.c" />
|
<ClCompile Include="..\..\src\dll\security.c" />
|
||||||
<ClCompile Include="..\..\src\dll\debug.c" />
|
<ClCompile Include="..\..\src\dll\debuglog.c" />
|
||||||
<ClCompile Include="..\..\src\dll\fsctl.c" />
|
<ClCompile Include="..\..\src\dll\fsctl.c" />
|
||||||
<ClCompile Include="..\..\src\dll\fsop.c" />
|
<ClCompile Include="..\..\src\dll\fsop.c" />
|
||||||
<ClCompile Include="..\..\src\dll\library.c" />
|
<ClCompile Include="..\..\src\dll\library.c" />
|
||||||
@ -64,56 +73,78 @@
|
|||||||
<ClCompile Include="..\..\src\dll\ntstatus.c" />
|
<ClCompile Include="..\..\src\dll\ntstatus.c" />
|
||||||
<ClCompile Include="..\..\src\dll\path.c" />
|
<ClCompile Include="..\..\src\dll\path.c" />
|
||||||
<ClCompile Include="..\..\src\dll\service.c" />
|
<ClCompile Include="..\..\src\dll\service.c" />
|
||||||
|
<ClCompile Include="..\..\src\dll\sxs.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\mountmgr.c" />
|
||||||
<ClCompile Include="..\..\src\shared\ku\posix.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">
|
||||||
<FileType>Document</FileType>
|
<FileType>Document</FileType>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">echo arch=$(PlatformTarget) >$(OutDir)fuse-$(PlatformTarget).pc
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">echo arch=$(MyProductFileArch) >$(OutDir)fuse-$(MyProductFileArch).pc
|
||||||
copy /b $(OutDir)fuse-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse-$(PlatformTarget).pc >nul</Command>
|
copy /b $(OutDir)fuse-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse-$(MyProductFileArch).pc >nul</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Writing fuse-$(PlatformTarget).pc</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Writing fuse-$(MyProductFileArch).pc</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)fuse-$(PlatformTarget).pc</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)fuse-$(MyProductFileArch).pc</Outputs>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">echo arch=$(PlatformTarget) >$(OutDir)fuse-$(PlatformTarget).pc
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">echo arch=$(MyProductFileArch) >$(OutDir)fuse-$(MyProductFileArch).pc
|
||||||
copy /b $(OutDir)fuse-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse-$(PlatformTarget).pc >nul</Command>
|
copy /b $(OutDir)fuse-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse-$(MyProductFileArch).pc >nul</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Writing fuse-$(PlatformTarget).pc</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Writing fuse-$(MyProductFileArch).pc</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)fuse-$(PlatformTarget).pc</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)fuse-$(MyProductFileArch).pc</Outputs>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">echo arch=$(PlatformTarget) >$(OutDir)fuse-$(PlatformTarget).pc
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">echo arch=$(MyProductFileArch) >$(OutDir)fuse-$(MyProductFileArch).pc
|
||||||
copy /b $(OutDir)fuse-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse-$(PlatformTarget).pc >nul</Command>
|
copy /b $(OutDir)fuse-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse-$(MyProductFileArch).pc >nul</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Writing fuse-$(PlatformTarget).pc</Message>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">echo arch=$(MyProductFileArch) >$(OutDir)fuse-$(MyProductFileArch).pc
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)fuse-$(PlatformTarget).pc</Outputs>
|
copy /b $(OutDir)fuse-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse-$(MyProductFileArch).pc >nul</Command>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Writing fuse-$(MyProductFileArch).pc</Message>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">Writing fuse-$(MyProductFileArch).pc</Message>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)fuse-$(MyProductFileArch).pc</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">$(OutDir)fuse-$(MyProductFileArch).pc</Outputs>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkObjects>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">echo arch=$(PlatformTarget) >$(OutDir)fuse-$(PlatformTarget).pc
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">false</LinkObjects>
|
||||||
copy /b $(OutDir)fuse-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse-$(PlatformTarget).pc >nul</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">echo arch=$(MyProductFileArch) >$(OutDir)fuse-$(MyProductFileArch).pc
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Writing fuse-$(PlatformTarget).pc</Message>
|
copy /b $(OutDir)fuse-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse-$(MyProductFileArch).pc >nul</Command>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)fuse-$(PlatformTarget).pc</Outputs>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">echo arch=$(MyProductFileArch) >$(OutDir)fuse-$(MyProductFileArch).pc
|
||||||
|
copy /b $(OutDir)fuse-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse-$(MyProductFileArch).pc >nul</Command>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Writing fuse-$(MyProductFileArch).pc</Message>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">Writing fuse-$(MyProductFileArch).pc</Message>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)fuse-$(MyProductFileArch).pc</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">$(OutDir)fuse-$(MyProductFileArch).pc</Outputs>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkObjects>
|
||||||
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">false</LinkObjects>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
<CustomBuild Include="..\..\src\dll\fuse3\fuse3.pc.in">
|
<CustomBuild Include="..\..\src\dll\fuse3\fuse3.pc.in">
|
||||||
<FileType>Document</FileType>
|
<FileType>Document</FileType>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">echo arch=$(PlatformTarget) >$(OutDir)fuse3-$(PlatformTarget).pc
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">echo arch=$(MyProductFileArch) >$(OutDir)fuse3-$(MyProductFileArch).pc
|
||||||
copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(PlatformTarget).pc >nul</Command>
|
copy /b $(OutDir)fuse3-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse3-$(MyProductFileArch).pc >nul</Command>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">echo arch=$(PlatformTarget) >$(OutDir)fuse3-$(PlatformTarget).pc
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">echo arch=$(MyProductFileArch) >$(OutDir)fuse3-$(MyProductFileArch).pc
|
||||||
copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(PlatformTarget).pc >nul</Command>
|
copy /b $(OutDir)fuse3-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse3-$(MyProductFileArch).pc >nul</Command>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">echo arch=$(PlatformTarget) >$(OutDir)fuse3-$(PlatformTarget).pc
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">echo arch=$(MyProductFileArch) >$(OutDir)fuse3-$(MyProductFileArch).pc
|
||||||
copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(PlatformTarget).pc >nul</Command>
|
copy /b $(OutDir)fuse3-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse3-$(MyProductFileArch).pc >nul</Command>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">echo arch=$(PlatformTarget) >$(OutDir)fuse3-$(PlatformTarget).pc
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">echo arch=$(MyProductFileArch) >$(OutDir)fuse3-$(MyProductFileArch).pc
|
||||||
copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(PlatformTarget).pc >nul</Command>
|
copy /b $(OutDir)fuse3-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse3-$(MyProductFileArch).pc >nul</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Writing fuse3-$(PlatformTarget).pc</Message>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">echo arch=$(MyProductFileArch) >$(OutDir)fuse3-$(MyProductFileArch).pc
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Writing fuse3-$(PlatformTarget).pc</Message>
|
copy /b $(OutDir)fuse3-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse3-$(MyProductFileArch).pc >nul</Command>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Writing fuse3-$(PlatformTarget).pc</Message>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">echo arch=$(MyProductFileArch) >$(OutDir)fuse3-$(MyProductFileArch).pc
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Writing fuse3-$(PlatformTarget).pc</Message>
|
copy /b $(OutDir)fuse3-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse3-$(MyProductFileArch).pc >nul</Command>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)fuse3-$(PlatformTarget).pc</Outputs>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Writing fuse3-$(MyProductFileArch).pc</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)fuse3-$(PlatformTarget).pc</Outputs>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Writing fuse3-$(MyProductFileArch).pc</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)fuse3-$(PlatformTarget).pc</Outputs>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Writing fuse3-$(MyProductFileArch).pc</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)fuse3-$(PlatformTarget).pc</Outputs>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">Writing fuse3-$(MyProductFileArch).pc</Message>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Writing fuse3-$(MyProductFileArch).pc</Message>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">Writing fuse3-$(MyProductFileArch).pc</Message>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)fuse3-$(MyProductFileArch).pc</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)fuse3-$(MyProductFileArch).pc</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)fuse3-$(MyProductFileArch).pc</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">$(OutDir)fuse3-$(MyProductFileArch).pc</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)fuse3-$(MyProductFileArch).pc</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">$(OutDir)fuse3-$(MyProductFileArch).pc</Outputs>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkObjects>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkObjects>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkObjects>
|
||||||
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">false</LinkObjects>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkObjects>
|
||||||
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">false</LinkObjects>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
<None Include="..\..\src\dll\library.def" />
|
<None Include="..\..\src\dll\library.def" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@ -123,7 +154,9 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
@ -153,6 +186,12 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</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>
|
||||||
@ -160,6 +199,13 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
@ -174,33 +220,51 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(MyProductFileName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(MyProductFileName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(MyProductFileName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(MyProductFileName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<TargetName>$(MyProductFileName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(MyProductFileName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(MyProductFileName)-$(PlatformTarget)</TargetName>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(MyProductFileName)-$(MyProductFileArch)</TargetName>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
<TargetName>$(MyProductFileName)-$(PlatformTarget)</TargetName>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<TargetName>$(MyProductFileName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
@ -225,7 +289,7 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
||||||
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
||||||
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib;netapi32.lib;wldap32.lib</AdditionalDependencies>
|
<AdditionalDependencies>%(AdditionalDependencies);credui.lib;netapi32.lib;rpcrt4.lib;secur32.lib;shlwapi.lib;version.lib;wldap32.lib</AdditionalDependencies>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
@ -252,7 +316,34 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
||||||
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib;netapi32.lib;wldap32.lib</AdditionalDependencies>
|
<AdditionalDependencies>%(AdditionalDependencies);credui.lib;netapi32.lib;rpcrt4.lib;secur32.lib;shlwapi.lib;version.lib;wldap32.lib</AdditionalDependencies>
|
||||||
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;WINFSPDLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>
|
||||||
|
</SDLCheck>
|
||||||
|
<AdditionalIncludeDirectories>..\..\src;..\..\inc</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||||
|
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
||||||
|
<GenerateMapFile>true</GenerateMapFile>
|
||||||
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
|
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
||||||
|
<AdditionalDependencies>%(AdditionalDependencies);credui.lib;netapi32.lib;rpcrt4.lib;secur32.lib;shlwapi.lib;version.lib;wldap32.lib</AdditionalDependencies>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
@ -282,7 +373,7 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
||||||
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
||||||
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib;netapi32.lib;wldap32.lib</AdditionalDependencies>
|
<AdditionalDependencies>%(AdditionalDependencies);credui.lib;netapi32.lib;rpcrt4.lib;secur32.lib;shlwapi.lib;version.lib;wldap32.lib</AdditionalDependencies>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
<AdditionalOptions>/PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
@ -313,7 +404,38 @@ copy /b $(OutDir)fuse3-$(PlatformTarget).pc + %(FullPath) $(OutDir)fuse3-$(Platf
|
|||||||
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
||||||
<AdditionalDependencies>%(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib;netapi32.lib;wldap32.lib</AdditionalDependencies>
|
<AdditionalDependencies>%(AdditionalDependencies);credui.lib;netapi32.lib;rpcrt4.lib;secur32.lib;shlwapi.lib;version.lib;wldap32.lib</AdditionalDependencies>
|
||||||
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;WINFSPDLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>
|
||||||
|
</SDLCheck>
|
||||||
|
<AdditionalIncludeDirectories>..\..\src;..\..\inc</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
||||||
|
<GenerateMapFile>true</GenerateMapFile>
|
||||||
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
|
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||||
|
<ModuleDefinitionFile>..\..\src\dll\library.def</ModuleDefinitionFile>
|
||||||
|
<AdditionalDependencies>%(AdditionalDependencies);credui.lib;netapi32.lib;rpcrt4.lib;secur32.lib;shlwapi.lib;version.lib;wldap32.lib</AdditionalDependencies>
|
||||||
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
<AdditionalOptions>/PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
|
@ -94,7 +94,7 @@
|
|||||||
<ClCompile Include="..\..\src\dll\library.c">
|
<ClCompile Include="..\..\src\dll\library.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\dll\debug.c">
|
<ClCompile Include="..\..\src\dll\debuglog.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\dll\ntstatus.c">
|
<ClCompile Include="..\..\src\dll\ntstatus.c">
|
||||||
@ -172,6 +172,15 @@
|
|||||||
<ClCompile Include="..\..\src\dll\ldap.c">
|
<ClCompile Include="..\..\src\dll\ldap.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\dll\debug.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\shared\ku\mountmgr.c">
|
||||||
|
<Filter>Source\shared\ku</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\dll\sxs.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="..\..\src\dll\library.def">
|
<None Include="..\..\src\dll\library.def">
|
||||||
|
@ -1,11 +1,19 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<Import Project="version.properties" />
|
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), build.common.props))/build.common.props" />
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|ARM64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|ARM64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>ARM64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
@ -55,6 +63,14 @@
|
|||||||
<ConfigurationType>Driver</ConfigurationType>
|
<ConfigurationType>Driver</ConfigurationType>
|
||||||
<DriverType>WDM</DriverType>
|
<DriverType>WDM</DriverType>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
|
||||||
|
<TargetVersion>Windows10</TargetVersion>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<KernelBufferOverflowLib>$(DDK_LIB_PATH)\BufferOverflowFastFailK.lib</KernelBufferOverflowLib>
|
||||||
|
<PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
|
||||||
|
<ConfigurationType>Driver</ConfigurationType>
|
||||||
|
<DriverType>WDM</DriverType>
|
||||||
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<TargetVersion>Windows10</TargetVersion>
|
<TargetVersion>Windows10</TargetVersion>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
@ -63,6 +79,14 @@
|
|||||||
<ConfigurationType>Driver</ConfigurationType>
|
<ConfigurationType>Driver</ConfigurationType>
|
||||||
<DriverType>WDM</DriverType>
|
<DriverType>WDM</DriverType>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
|
||||||
|
<TargetVersion>Windows10</TargetVersion>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<KernelBufferOverflowLib>$(DDK_LIB_PATH)\BufferOverflowFastFailK.lib</KernelBufferOverflowLib>
|
||||||
|
<PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
|
||||||
|
<ConfigurationType>Driver</ConfigurationType>
|
||||||
|
<DriverType>WDM</DriverType>
|
||||||
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
@ -73,31 +97,45 @@
|
|||||||
<PropertyGroup />
|
<PropertyGroup />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<TargetName>$(MyProductFileName)-$(MyProductFileArch)</TargetName>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
|
||||||
<TargetName>$(MyProductFileName)-$(PlatformTarget)</TargetName>
|
|
||||||
<EnableInf2cat>false</EnableInf2cat>
|
<EnableInf2cat>false</EnableInf2cat>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<TargetName>$(MyProductFileName)-$(MyProductFileArch)</TargetName>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
|
||||||
<TargetName>$(MyProductFileName)-$(PlatformTarget)</TargetName>
|
|
||||||
<EnableInf2cat>false</EnableInf2cat>
|
<EnableInf2cat>false</EnableInf2cat>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<TargetName>$(MyProductFileName)-$(MyProductFileArch)</TargetName>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
|
||||||
<TargetName>$(MyProductFileName)-$(PlatformTarget)</TargetName>
|
|
||||||
<EnableInf2cat>false</EnableInf2cat>
|
<EnableInf2cat>false</EnableInf2cat>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||||
|
<TargetName>$(MyProductFileName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<EnableInf2cat>false</EnableInf2cat>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
<TargetName>$(MyProductFileName)-$(MyProductFileArch)</TargetName>
|
||||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
|
||||||
<TargetName>$(MyProductFileName)-$(PlatformTarget)</TargetName>
|
|
||||||
<EnableInf2cat>false</EnableInf2cat>
|
<EnableInf2cat>false</EnableInf2cat>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||||
|
<TargetName>$(MyProductFileName)-$(MyProductFileArch)</TargetName>
|
||||||
|
<EnableInf2cat>false</EnableInf2cat>
|
||||||
|
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(MyProductFileArch)\</IntDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
@ -110,6 +148,7 @@
|
|||||||
<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>
|
||||||
|
<ImportLibrary>$(OutDir)$(TargetName)$(TargetExt).lib</ImportLibrary>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
@ -124,6 +163,7 @@
|
|||||||
<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>
|
<AdditionalOptions>/PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<ImportLibrary>$(OutDir)$(TargetName)$(TargetExt).lib</ImportLibrary>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
@ -137,6 +177,21 @@
|
|||||||
<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>
|
||||||
|
<ImportLibrary>$(OutDir)$(TargetName)$(TargetExt).lib</ImportLibrary>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<AdditionalIncludeDirectories>..\..\src;..\..\opt\fsext\inc;..\..\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions> _WIN64;_ARM64_;ARM64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<AdditionalDependencies>cng.lib;wdmsec.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<GenerateMapFile>true</GenerateMapFile>
|
||||||
|
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
||||||
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
|
<ImportLibrary>$(OutDir)$(TargetName)$(TargetExt).lib</ImportLibrary>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
@ -151,12 +206,29 @@
|
|||||||
<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>
|
<AdditionalOptions>/PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<ImportLibrary>$(OutDir)$(TargetName)$(TargetExt).lib</ImportLibrary>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||||
|
<ClCompile>
|
||||||
|
<AdditionalIncludeDirectories>..\..\src;..\..\opt\fsext\inc;..\..\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions> _WIN64;_ARM64_;ARM64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<AdditionalDependencies>cng.lib;wdmsec.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<GenerateMapFile>true</GenerateMapFile>
|
||||||
|
<ProgramDatabaseFile>$(OutDir)$(TargetFileName).pdb</ProgramDatabaseFile>
|
||||||
|
<MapFileName>$(OutDir)$(TargetFileName).map</MapFileName>
|
||||||
|
<StripPrivateSymbols>$(OutDir)$(TargetFileName).public.pdb</StripPrivateSymbols>
|
||||||
|
<AdditionalOptions>/PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<ImportLibrary>$(OutDir)$(TargetName)$(TargetExt).lib</ImportLibrary>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<FilesToPackage Include="$(TargetPath)" />
|
<FilesToPackage Include="$(TargetPath)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\src\shared\ku\mountmgr.c" />
|
||||||
<ClCompile Include="..\..\src\shared\ku\posix.c" />
|
<ClCompile Include="..\..\src\shared\ku\posix.c" />
|
||||||
<ClCompile Include="..\..\src\shared\ku\uuid5.c" />
|
<ClCompile Include="..\..\src\shared\ku\uuid5.c" />
|
||||||
<ClCompile Include="..\..\src\sys\cleanup.c" />
|
<ClCompile Include="..\..\src\sys\cleanup.c" />
|
||||||
@ -176,6 +248,7 @@
|
|||||||
<ClCompile Include="..\..\src\sys\fsext.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\devtimer.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\mountdev.c" />
|
||||||
@ -187,6 +260,7 @@
|
|||||||
<ClCompile Include="..\..\src\sys\shutdown.c" />
|
<ClCompile Include="..\..\src\sys\shutdown.c" />
|
||||||
<ClCompile Include="..\..\src\sys\silo.c" />
|
<ClCompile Include="..\..\src\sys\silo.c" />
|
||||||
<ClCompile Include="..\..\src\sys\statistics.c" />
|
<ClCompile Include="..\..\src\sys\statistics.c" />
|
||||||
|
<ClCompile Include="..\..\src\sys\sxs.c" />
|
||||||
<ClCompile Include="..\..\src\sys\trace.c" />
|
<ClCompile Include="..\..\src\sys\trace.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" />
|
||||||
@ -206,7 +280,9 @@
|
|||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">_WIN64;_AMD64_=1;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">_WIN64;_AMD64_=1;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">_WIN64;_ARM64_=1;ARM64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">_WIN64;_AMD64_=1;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">_WIN64;_AMD64_=1;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">_WIN64;_ARM64_=1;ARM64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ResourceCompile>
|
</ResourceCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -214,64 +290,112 @@
|
|||||||
<FileType>Document</FileType>
|
<FileType>Document</FileType>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">set DriverFile=$(TargetFileName)
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">set DriverFile=$(TargetFileName)
|
||||||
set Provider="$(MyCompanyName)"
|
set Provider="$(MyCompanyName)"
|
||||||
set CatalogFile=driver-$(PlatformTarget).cat
|
set CatalogFile=driver-$(MyProductFileArch).cat
|
||||||
|
if "$(MyProductFileArch)"=="a64" set ArchDecoration=ntarm64
|
||||||
|
if "$(MyProductFileArch)"=="x64" set ArchDecoration=ntamd64
|
||||||
|
if "$(MyProductFileArch)"=="x86" set ArchDecoration=ntx86
|
||||||
|
|
||||||
setlocal EnableDelayedExpansion
|
setlocal EnableDelayedExpansion
|
||||||
if exist $(OutDir)driver-$(PlatformTarget).inf del $(OutDir)driver-$(PlatformTarget).inf
|
if exist $(OutDir)driver-$(MyProductFileArch).inf del $(OutDir)driver-$(MyProductFileArch).inf
|
||||||
for /f "delims=" %%l in (%(FullPath)) do (
|
for /f "delims=" %%l in (%(FullPath)) do (
|
||||||
set line=%%l
|
set line=%%l
|
||||||
echo !line! >>$(OutDir)driver-$(PlatformTarget).inf
|
echo !line! >>$(OutDir)driver-$(MyProductFileArch).inf
|
||||||
)
|
)
|
||||||
|
|
||||||
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(PlatformTarget).inf</Command>
|
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(MyProductFileArch).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)"
|
||||||
set CatalogFile=driver-$(PlatformTarget).cat
|
set CatalogFile=driver-$(MyProductFileArch).cat
|
||||||
|
if "$(MyProductFileArch)"=="a64" set ArchDecoration=ntarm64
|
||||||
|
if "$(MyProductFileArch)"=="x64" set ArchDecoration=ntamd64
|
||||||
|
if "$(MyProductFileArch)"=="x86" set ArchDecoration=ntx86
|
||||||
|
|
||||||
setlocal EnableDelayedExpansion
|
setlocal EnableDelayedExpansion
|
||||||
if exist $(OutDir)driver-$(PlatformTarget).inf del $(OutDir)driver-$(PlatformTarget).inf
|
if exist $(OutDir)driver-$(MyProductFileArch).inf del $(OutDir)driver-$(MyProductFileArch).inf
|
||||||
for /f "delims=" %%l in (%(FullPath)) do (
|
for /f "delims=" %%l in (%(FullPath)) do (
|
||||||
set line=%%l
|
set line=%%l
|
||||||
echo !line! >>$(OutDir)driver-$(PlatformTarget).inf
|
echo !line! >>$(OutDir)driver-$(MyProductFileArch).inf
|
||||||
)
|
)
|
||||||
|
|
||||||
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(PlatformTarget).inf</Command>
|
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(MyProductFileArch).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)"
|
||||||
set CatalogFile=driver-$(PlatformTarget).cat
|
set CatalogFile=driver-$(MyProductFileArch).cat
|
||||||
|
if "$(MyProductFileArch)"=="a64" set ArchDecoration=ntarm64
|
||||||
|
if "$(MyProductFileArch)"=="x64" set ArchDecoration=ntamd64
|
||||||
|
if "$(MyProductFileArch)"=="x86" set ArchDecoration=ntx86
|
||||||
|
|
||||||
setlocal EnableDelayedExpansion
|
setlocal EnableDelayedExpansion
|
||||||
if exist $(OutDir)driver-$(PlatformTarget).inf del $(OutDir)driver-$(PlatformTarget).inf
|
if exist $(OutDir)driver-$(MyProductFileArch).inf del $(OutDir)driver-$(MyProductFileArch).inf
|
||||||
for /f "delims=" %%l in (%(FullPath)) do (
|
for /f "delims=" %%l in (%(FullPath)) do (
|
||||||
set line=%%l
|
set line=%%l
|
||||||
echo !line! >>$(OutDir)driver-$(PlatformTarget).inf
|
echo !line! >>$(OutDir)driver-$(MyProductFileArch).inf
|
||||||
)
|
)
|
||||||
|
|
||||||
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(PlatformTarget).inf</Command>
|
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(MyProductFileArch).inf</Command>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">set DriverFile=$(TargetFileName)
|
||||||
|
set Provider="$(MyCompanyName)"
|
||||||
|
set CatalogFile=driver-$(MyProductFileArch).cat
|
||||||
|
if "$(MyProductFileArch)"=="a64" set ArchDecoration=ntarm64
|
||||||
|
if "$(MyProductFileArch)"=="x64" set ArchDecoration=ntamd64
|
||||||
|
if "$(MyProductFileArch)"=="x86" set ArchDecoration=ntx86
|
||||||
|
|
||||||
|
setlocal EnableDelayedExpansion
|
||||||
|
if exist $(OutDir)driver-$(MyProductFileArch).inf del $(OutDir)driver-$(MyProductFileArch).inf
|
||||||
|
for /f "delims=" %%l in (%(FullPath)) do (
|
||||||
|
set line=%%l
|
||||||
|
echo !line! >>$(OutDir)driver-$(MyProductFileArch).inf
|
||||||
|
)
|
||||||
|
|
||||||
|
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(MyProductFileArch).inf</Command>
|
||||||
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkObjects>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkObjects>
|
||||||
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">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)"
|
||||||
set CatalogFile=driver-$(PlatformTarget).cat
|
set CatalogFile=driver-$(MyProductFileArch).cat
|
||||||
|
if "$(MyProductFileArch)"=="a64" set ArchDecoration=ntarm64
|
||||||
|
if "$(MyProductFileArch)"=="x64" set ArchDecoration=ntamd64
|
||||||
|
if "$(MyProductFileArch)"=="x86" set ArchDecoration=ntx86
|
||||||
|
|
||||||
setlocal EnableDelayedExpansion
|
setlocal EnableDelayedExpansion
|
||||||
if exist $(OutDir)driver-$(PlatformTarget).inf del $(OutDir)driver-$(PlatformTarget).inf
|
if exist $(OutDir)driver-$(MyProductFileArch).inf del $(OutDir)driver-$(MyProductFileArch).inf
|
||||||
for /f "delims=" %%l in (%(FullPath)) do (
|
for /f "delims=" %%l in (%(FullPath)) do (
|
||||||
set line=%%l
|
set line=%%l
|
||||||
echo !line! >>$(OutDir)driver-$(PlatformTarget).inf
|
echo !line! >>$(OutDir)driver-$(MyProductFileArch).inf
|
||||||
)
|
)
|
||||||
|
|
||||||
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(PlatformTarget).inf</Command>
|
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(MyProductFileArch).inf</Command>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">set DriverFile=$(TargetFileName)
|
||||||
|
set Provider="$(MyCompanyName)"
|
||||||
|
set CatalogFile=driver-$(MyProductFileArch).cat
|
||||||
|
if "$(MyProductFileArch)"=="a64" set ArchDecoration=ntarm64
|
||||||
|
if "$(MyProductFileArch)"=="x64" set ArchDecoration=ntamd64
|
||||||
|
if "$(MyProductFileArch)"=="x86" set ArchDecoration=ntx86
|
||||||
|
|
||||||
|
setlocal EnableDelayedExpansion
|
||||||
|
if exist $(OutDir)driver-$(MyProductFileArch).inf del $(OutDir)driver-$(MyProductFileArch).inf
|
||||||
|
for /f "delims=" %%l in (%(FullPath)) do (
|
||||||
|
set line=%%l
|
||||||
|
echo !line! >>$(OutDir)driver-$(MyProductFileArch).inf
|
||||||
|
)
|
||||||
|
|
||||||
|
stampinf -d * -v $(MyVersion) -f $(OutDir)driver-$(MyProductFileArch).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>
|
<LinkObjects Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">false</LinkObjects>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)driver-$(PlatformTarget).inf</Outputs>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Writing driver-$(MyProductFileArch).inf</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Writing driver-$(PlatformTarget).inf</Message>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)driver-$(MyProductFileArch).inf</Outputs>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)driver-$(PlatformTarget).inf</Outputs>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Writing driver-$(MyProductFileArch).inf</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Writing driver-$(PlatformTarget).inf</Message>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)driver-$(MyProductFileArch).inf</Outputs>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)driver-$(PlatformTarget).inf</Outputs>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Writing driver-$(MyProductFileArch).inf</Message>
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Writing driver-$(PlatformTarget).inf</Message>
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">Writing driver-$(MyProductFileArch).inf</Message>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)driver-$(PlatformTarget).inf</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)driver-$(MyProductFileArch).inf</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">$(OutDir)driver-$(MyProductFileArch).inf</Outputs>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Writing driver-$(MyProductFileArch).inf</Message>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">Writing driver-$(MyProductFileArch).inf</Message>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)driver-$(MyProductFileArch).inf</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">$(OutDir)driver-$(MyProductFileArch).inf</Outputs>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
@ -128,6 +128,15 @@
|
|||||||
<ClCompile Include="..\..\src\sys\trace.c">
|
<ClCompile Include="..\..\src\sys\trace.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\sys\devtimer.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\shared\ku\mountmgr.c">
|
||||||
|
<Filter>Source\shared\ku</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\sys\sxs.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\src\sys\driver.h">
|
<ClInclude Include="..\..\src\sys\driver.h">
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
From: https://github.com/billziss-gh/winfsp/blob/master/License.txt
|
From: https://github.com/winfsp/winfsp/blob/master/License.txt
|
||||||
|
|
||||||
LICENSE
|
LICENSE
|
||||||
|
|
||||||
|
@ -2,8 +2,8 @@ VERIFICATION
|
|||||||
Verification is intended to assist the Chocolatey moderators and community
|
Verification is intended to assist the Chocolatey moderators and community
|
||||||
in verifying that this package's contents are trustworthy.
|
in verifying that this package's contents are trustworthy.
|
||||||
|
|
||||||
WinFsp GitHub repository: https://github.com/billziss-gh/winfsp
|
WinFsp GitHub repository: https://github.com/winfsp/winfsp
|
||||||
WinFsp MSI releases : https://github.com/billziss-gh/winfsp/releases
|
WinFsp MSI releases : https://github.com/winfsp/winfsp/releases
|
||||||
|
|
||||||
You may use the Windows certutil utility to confirm the hash of the MSI
|
You may use the Windows certutil utility to confirm the hash of the MSI
|
||||||
included in this package against the WinFsp MSI release of the same version.
|
included in this package against the WinFsp MSI release of the same version.
|
||||||
@ -12,4 +12,3 @@ For example, for WinFsp version 1.0.17072 the command line to use is:
|
|||||||
certutil -hashfile winfsp-1.0.17072.msi SHA256
|
certutil -hashfile winfsp-1.0.17072.msi SHA256
|
||||||
|
|
||||||
The certutil output of the MSI in this package is included below.
|
The certutil output of the MSI in this package is included below.
|
||||||
|
|
||||||
|
@ -3,20 +3,20 @@
|
|||||||
<metadata>
|
<metadata>
|
||||||
<id>winfsp</id>
|
<id>winfsp</id>
|
||||||
<version>$version$</version>
|
<version>$version$</version>
|
||||||
<packageSourceUrl>https://github.com/billziss-gh/winfsp/tree/master/build/choco</packageSourceUrl>
|
<packageSourceUrl>https://github.com/winfsp/winfsp/tree/master/build/choco</packageSourceUrl>
|
||||||
<owners>Bill Zissimopoulos</owners>
|
<owners>Bill Zissimopoulos</owners>
|
||||||
|
|
||||||
<title>WinFsp</title>
|
<title>WinFsp</title>
|
||||||
<authors>Bill Zissimopoulos</authors>
|
<authors>Bill Zissimopoulos</authors>
|
||||||
<projectUrl>https://github.com/billziss-gh/winfsp</projectUrl>
|
<projectUrl>https://github.com/winfsp/winfsp</projectUrl>
|
||||||
<iconUrl>https://github.com/billziss-gh/winfsp/raw/master/art/winfsp-solid.png</iconUrl>
|
<iconUrl>https://github.com/winfsp/winfsp/raw/master/art/winfsp-solid.png</iconUrl>
|
||||||
<copyright>Bill Zissimopoulos</copyright>
|
<copyright>Bill Zissimopoulos</copyright>
|
||||||
<licenseUrl>https://github.com/billziss-gh/winfsp/blob/master/License.txt</licenseUrl>
|
<licenseUrl>https://github.com/winfsp/winfsp/blob/master/License.txt</licenseUrl>
|
||||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||||
<projectSourceUrl>https://github.com/billziss-gh/winfsp</projectSourceUrl>
|
<projectSourceUrl>https://github.com/winfsp/winfsp</projectSourceUrl>
|
||||||
<docsUrl>https://github.com/billziss-gh/winfsp/tree/master/doc</docsUrl>
|
<docsUrl>https://github.com/winfsp/winfsp/tree/master/doc</docsUrl>
|
||||||
<mailingListUrl>https://groups.google.com/forum/#!forum/winfsp</mailingListUrl>
|
<mailingListUrl>https://groups.google.com/forum/#!forum/winfsp</mailingListUrl>
|
||||||
<bugTrackerUrl>https://github.com/billziss-gh/winfsp/issues</bugTrackerUrl>
|
<bugTrackerUrl>https://github.com/winfsp/winfsp/issues</bugTrackerUrl>
|
||||||
<tags>driver filesystem fuse gplv3 windows-kernel admin</tags>
|
<tags>driver filesystem fuse gplv3 windows-kernel admin</tags>
|
||||||
<summary>Windows File System Proxy - FUSE for Windows</summary>
|
<summary>Windows File System Proxy - FUSE for Windows</summary>
|
||||||
<description>
|
<description>
|
||||||
@ -39,7 +39,7 @@ To verify installation:
|
|||||||
* For Cygwin: `net use m: '\\memfs64\share'`
|
* For Cygwin: `net use m: '\\memfs64\share'`
|
||||||
* To delete the drive: `net use m: /delete`
|
* To delete the drive: `net use m: /delete`
|
||||||
</description>
|
</description>
|
||||||
<releaseNotes>https://github.com/billziss-gh/winfsp/blob/master/Changelog.asciidoc</releaseNotes>
|
<releaseNotes>https://github.com/winfsp/winfsp/blob/master/Changelog.md</releaseNotes>
|
||||||
|
|
||||||
<!--<dependencies>
|
<!--<dependencies>
|
||||||
<dependency id="chocolatey-uninstall.extension" />
|
<dependency id="chocolatey-uninstall.extension" />
|
||||||
|
@ -6,18 +6,17 @@
|
|||||||
|
|
||||||
I am running Windows 7 and I am finding that the installed driver is not signed.::
|
I am running Windows 7 and I am finding that the installed driver is not signed.::
|
||||||
|
|
||||||
Your Windows 7 OS is missing SHA-2 Code Signing Support. You need to install the following security advisory that will rectify the problem:
|
Your Windows 7 OS is missing SHA-2 Code Signing Support. Make sure it is fully updated.
|
||||||
https://technet.microsoft.com/en-us/library/security/3033929.aspx
|
|
||||||
|
|
||||||
|
I cannot run a program located in a WinFsp drive as administrator. I cannot run `regedit.exe` from within a WinFsp drive.::
|
||||||
|
|
||||||
|
When running an executable as administrator, the Windows OS seems to require that the name of the file system that is housing the executable is "NTFS". For example, the MEMFS file system with the command line `memfs-x64.exe -i -F NTFS -m X:` works.
|
||||||
|
|
||||||
|
|
||||||
Disconnecting (unmapping) a network drive does not work.::
|
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 https://www.interfacett.com/blogs/changing-the-network-provider-order-in-windows-10/[article].
|
||||||
|
|
||||||
|
|
||||||
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?::
|
Why is the DLL not installed in the Windows system directories?::
|
||||||
@ -29,7 +28,7 @@ There are a few alternative methods to overcome this problem. WinFsp recommends
|
|||||||
|
|
||||||
Does WinFsp provide debugging symbols?::
|
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.
|
Debugging symbols can be found in the https://github.com/winfsp/winfsp.sym repository.
|
||||||
|
|
||||||
|
|
||||||
Is there a maximum number of concurrent file systems?::
|
Is there a maximum number of concurrent file systems?::
|
||||||
@ -61,11 +60,6 @@ With this in mind here are the reasons for the current WinFsp-FUSE behavior:
|
|||||||
- 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?::
|
I have problems getting permissions to work properly in a WinFsp-FUSE file system. Can you help?::
|
||||||
|
|
||||||
The WinFsp-FUSE layer includes a built-in command line option that can help: `-o uid=-1`. This instructs the WinFsp-FUSE layer to present all file system files as if they are owned by the user that launched the file system.
|
The 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.
|
||||||
|
@ -5,28 +5,32 @@ This document contains a list of known open-source file systems and file system
|
|||||||
== 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/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/cryptomator/cryptomator[Cryptomator] - Multi-platform transparent client-side encryption of your files in the cloud
|
||||||
- https://github.com/vgough/encfs[EncFS] - an Encrypted Filesystem for FUSE
|
- https://github.com/vgough/encfs[EncFS] - an Encrypted Filesystem for FUSE
|
||||||
- https://github.com/lowleveldesign/fsmemfs[fsmemfs] - Memory File System written in F#
|
- https://github.com/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/sganis/golddrive[golddrive] - Windows ssh network drive
|
||||||
- https://github.com/billziss-gh/hubfs[hubfs] - File system for GitHub
|
- https://github.com/winfsp/hubfs[hubfs] - File system for GitHub
|
||||||
|
- https://github.com/juicedata/juicefs[JuiceFS] - a distributed POSIX file system built on top of Redis and S3
|
||||||
- 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/winfsp/nfs-win[nfs-win] - NFS for Windows
|
||||||
- https://github.com/billziss-gh/objfs[objfs] - Object Storage File System
|
- https://github.com/winfsp/objfs[objfs] - Object Storage File System
|
||||||
- https://github.com/ncw/rclone[rclone] - rsync for cloud storage
|
- https://github.com/ncw/rclone[rclone] - rsync for cloud storage
|
||||||
- https://github.com/hasse69/rar2fs[rar2fs] - FUSE file system for reading RAR archives
|
- https://github.com/hasse69/rar2fs[rar2fs] - FUSE file system for reading RAR archives
|
||||||
- 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/s3fs-fuse/s3fs-fuse[s3fs-fuse] - FUSE-based file system backed by Amazon S3
|
||||||
- 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/winfsp/sshfs-win[sshfs-win] - SSHFS for Windows
|
||||||
- https://github.com/printpagestopdf/WordpressDrive[WordpressDrive] - Windows Userspace Filesystem based on WinFsp that presents a Wordpress Site as a Windows Drive
|
- https://github.com/printpagestopdf/WordpressDrive[WordpressDrive] - Windows Userspace Filesystem based on WinFsp that presents a Wordpress Site as a Windows Drive
|
||||||
- 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/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
|
- https://github.com/UtrechtUniversity/YodaDrive[YodaDrive] - Mount a Yoda drive as a local drive
|
||||||
|
|
||||||
== File System Libraries
|
== File System Libraries
|
||||||
|
|
||||||
- https://github.com/billziss-gh/cgofuse[Go: cgofuse] - Cross-platform FUSE library for Go
|
- https://github.com/winfsp/cgofuse[Go: cgofuse] - Cross-platform FUSE library for Go
|
||||||
- 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/jnr-winfsp-team/jnr-winfsp[Java: jnr-winfsp] - A Java binding for WinFsp 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/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
|
- https://github.com/Scille/winfspy[Python: winfspy] - WinFSP binding for Python
|
||||||
|
- https://github.com/SnowflakePowered/winfsp-rs[Rust: winfsp-rs] - WinFSP binding for Rust
|
||||||
|
@ -17,13 +17,14 @@ WinFsp supports the following NTFS features:
|
|||||||
- Opportunistic locks.
|
- Opportunistic locks.
|
||||||
- Open, create, close, delete, query named streams.
|
- Open, create, close, delete, query named streams.
|
||||||
- Reparse points with special support for symbolic links.
|
- Reparse points with special support for symbolic links.
|
||||||
|
- Extended attributes.
|
||||||
|
- Traditional Windows and POSIX semantics for delete and rename.
|
||||||
|
|
||||||
== Unsupported features
|
== Unsupported features
|
||||||
|
|
||||||
WinFsp does not support the following NTFS features:
|
WinFsp does not support the following NTFS features:
|
||||||
|
|
||||||
- Hard links. Rather rarely used on Windows. However it might be worthwhile to implement them for WinFsp.
|
- Hard links. Rather rarely used on Windows. However it might be worthwhile to implement them for WinFsp.
|
||||||
- Extended attributes. Although popular with POSIX file systems, they are severely hampered and rarely used on Windows. They are also not exposed via the Win32 API.
|
|
||||||
- Short file names. Short file names are a relic of the past. WinFsp made a conscious decision not to support them.
|
- Short file names. Short file names are a relic of the past. WinFsp made a conscious decision not to support them.
|
||||||
- Paging files. Providing paging file support via a user mode file system is impossible for a number of reasons.
|
- Paging files. Providing paging file support via a user mode file system is impossible for a number of reasons.
|
||||||
- Object ID's. Opening files by ID (+FILE_OPEN_BY_FILE_ID+) is not supported.
|
- Object ID's. Opening files by ID (+FILE_OPEN_BY_FILE_ID+) is not supported.
|
||||||
|
@ -6,7 +6,7 @@ This document compares the "native" WinFsp API to the FUSE API and provides a ra
|
|||||||
|
|
||||||
WinFsp provides two different but conceptually similar API's for the same purpose of implementing a user mode file system:
|
WinFsp provides two different but conceptually similar API's for the same purpose of implementing a user mode file system:
|
||||||
|
|
||||||
- The WinFsp API, which is documented in the include file `inc/winfsp/winfsp.h` (and online at http://www.secfs.net/winfsp/apiref/). This API consists of the `FSP_FILE_SYSTEM_INTERFACE` "class" and the `FspFileSystem*` functions.
|
- The WinFsp API, which is documented in the include file `inc/winfsp/winfsp.h` (and online at https://winfsp.dev/apiref). This API consists of the `FSP_FILE_SYSTEM_INTERFACE` "class" and the `FspFileSystem*` functions.
|
||||||
- The FUSE (high-level) API, which is the well understood API from the FUSE project originally by Miklos Szeredi.
|
- The FUSE (high-level) API, which is the well understood API from the FUSE project originally by Miklos Szeredi.
|
||||||
|
|
||||||
Given the similarities between the two API's some questions naturally arise:
|
Given the similarities between the two API's some questions naturally arise:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
= Queued Events - Windows kernel events with IOCP scheduling characteristics
|
= Queued Events - Windows kernel events with IOCP scheduling characteristics
|
||||||
|
|
||||||
In this article I am discussing _Queued Events_. _Queued Events_ are a Windows kernel synchronization mechanism that I invented for https://github.com/billziss-gh/winfsp[WinFsp - FUSE for Windows]. _Queued Events_ behave like kernel Synchronization Events (i.e. Win32 auto-reset events), but provide scheduling characteristics similar to those of I/O Completion Ports.
|
In this article I am discussing _Queued Events_. _Queued Events_ are a Windows kernel synchronization mechanism that I invented for https://github.com/winfsp/winfsp[WinFsp - FUSE for Windows]. _Queued Events_ behave like kernel Synchronization Events (i.e. Win32 auto-reset events), but provide scheduling characteristics similar to those of I/O Completion Ports.
|
||||||
|
|
||||||
== The Problem
|
== The Problem
|
||||||
|
|
||||||
@ -92,7 +92,7 @@ We now have to consider what happens when we have one EventSet concurrently with
|
|||||||
|
|
||||||
NOTE: _Queued Events_ cannot cleanly support an EventClear operation. The obvious choice of using KeRemoveQueue with a 0 timeout is insufficient because it would associate the current thread with the KQUEUE and that is not desirable. KeRundownQueue cannot be used either because it disassociates all threads from the KQUEUE.
|
NOTE: _Queued Events_ cannot cleanly support an EventClear operation. The obvious choice of using KeRemoveQueue with a 0 timeout is insufficient because it would associate the current thread with the KQUEUE and that is not desirable. KeRundownQueue cannot be used either because it disassociates all threads from the KQUEUE.
|
||||||
|
|
||||||
The complete implementation of _Queued Events_ within WinFsp can be found here: https://github.com/billziss-gh/winfsp/blob/v1.1/src/sys/driver.h#L655-L795
|
The complete implementation of _Queued Events_ within WinFsp can be found here: https://github.com/winfsp/winfsp/blob/v1.1/src/sys/driver.h#L655-L795
|
||||||
|
|
||||||
== Queued Events Scheduling Characteristics
|
== Queued Events Scheduling Characteristics
|
||||||
|
|
||||||
@ -102,4 +102,3 @@ Queued Events encapsulate KQUEUE's and therefore inherit their scheduling charac
|
|||||||
- They limit the number of threads that can be satisfied concurrently.
|
- They limit the number of threads that can be satisfied concurrently.
|
||||||
|
|
||||||
These characteristics are desirable because they reduce the number of context switches thus speeding up the WinFsp IPC implementation. Performance testing immediately after the incorporation of _Queued Events_ into WinFsp showed significant performance improvements; profiling with xperf showed that context switches among file system threads were now a relatively rare event!
|
These characteristics are desirable because they reduce the number of context switches thus speeding up the WinFsp IPC implementation. Performance testing immediately after the incorporation of _Queued Events_ into WinFsp showed significant performance improvements; profiling with xperf showed that context switches among file system threads were now a relatively rare event!
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ implib=${prefix}/bin/winfsp-${arch}.dll
|
|||||||
Name: fuse
|
Name: fuse
|
||||||
Description: WinFsp FUSE compatible API
|
Description: WinFsp FUSE compatible API
|
||||||
Version: 2.8
|
Version: 2.8
|
||||||
URL: http://www.secfs.net/winfsp/
|
URL: https://winfsp.dev
|
||||||
Libs: "${implib}"
|
Libs: "${implib}"
|
||||||
Cflags: -I"${incdir}"
|
Cflags: -I"${incdir}"
|
||||||
----
|
----
|
||||||
|
@ -397,11 +397,13 @@ typedef struct _FSP_LAUNCH_REG_RECORD {
|
|||||||
PWSTR RunAs;
|
PWSTR RunAs;
|
||||||
PWSTR Security;
|
PWSTR Security;
|
||||||
PWSTR AuthPackage;
|
PWSTR AuthPackage;
|
||||||
PVOID Reserved0[5];
|
PWSTR Stderr;
|
||||||
|
PVOID Reserved0[4];
|
||||||
ULONG JobControl;
|
ULONG JobControl;
|
||||||
ULONG Credentials;
|
ULONG Credentials;
|
||||||
ULONG AuthPackageId;
|
ULONG AuthPackageId;
|
||||||
ULONG Reserved1[5];
|
ULONG Recovery;
|
||||||
|
ULONG Reserved1[4];
|
||||||
UINT8 Buffer[];
|
UINT8 Buffer[];
|
||||||
} FSP_LAUNCH_REG_RECORD;
|
} FSP_LAUNCH_REG_RECORD;
|
||||||
```
|
```
|
||||||
@ -414,7 +416,7 @@ typedef struct _FSP_LAUNCH_REG_RECORD {
|
|||||||
<br/>
|
<br/>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<sub>
|
<sub>
|
||||||
Copyright © 2015-2020 Bill Zissimopoulos
|
Copyright © 2015-2021 Bill Zissimopoulos
|
||||||
<br/>
|
<br/>
|
||||||
Generated with <a href="https://github.com/billziss-gh/prettydoc">prettydoc</a>
|
Generated with <a href="https://github.com/billziss-gh/prettydoc">prettydoc</a>
|
||||||
</sub>
|
</sub>
|
||||||
|
@ -148,7 +148,11 @@ a file or directory in Windows is a three-stage process where the file is first
|
|||||||
tested to see if the delete can proceed and if the answer is positive the file is then
|
tested to see if the delete can proceed and if the answer is positive the file is then
|
||||||
deleted during Cleanup.
|
deleted during Cleanup.
|
||||||
|
|
||||||
When this flag is set, this is the last outstanding cleanup for this particular file node.
|
If the file system supports POSIX unlink (FSP\_FSCTL\_VOLUME\_PARAMS ::
|
||||||
|
SupportsPosixUnlinkRename), then a Cleanup / FspCleanupDelete operation may arrive while
|
||||||
|
there are other open file handles for this particular file node. If the file system does not
|
||||||
|
support POSIX unlink, then a Cleanup / FspCleanupDelete operation will always be the last
|
||||||
|
outstanding cleanup for this particular file node.
|
||||||
|
|
||||||
|
|
||||||
- FspCleanupSetAllocationSize -
|
- FspCleanupSetAllocationSize -
|
||||||
@ -1504,6 +1508,47 @@ This is a helper for implementing the GetEa operation.
|
|||||||
- GetEa
|
- GetEa
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspFileSystemAddNotifyInfo</b> - Add notify information to a buffer.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API BOOLEAN FspFileSystemAddNotifyInfo(
|
||||||
|
FSP_FSCTL_NOTIFY_INFO *NotifyInfo,
|
||||||
|
PVOID Buffer,
|
||||||
|
ULONG Length,
|
||||||
|
PULONG PBytesTransferred);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _NotifyInfo_ \- The notify information to add.
|
||||||
|
- _Buffer_ \- Pointer to a buffer that will receive the notify information.
|
||||||
|
- _Length_ \- Length of buffer.
|
||||||
|
- _PBytesTransferred_ \- [out]
|
||||||
|
Pointer to a memory location that will receive the actual number of bytes stored. This should
|
||||||
|
be initialized to 0 prior to the first call to FspFileSystemAddNotifyInfo for a particular
|
||||||
|
buffer.
|
||||||
|
|
||||||
|
**Return Value**
|
||||||
|
|
||||||
|
TRUE if the notify information was added, FALSE if there was not enough space to add it.
|
||||||
|
|
||||||
|
**Discussion**
|
||||||
|
|
||||||
|
This is a helper for filling a buffer to use with FspFileSystemNotify.
|
||||||
|
|
||||||
|
**See Also**
|
||||||
|
|
||||||
|
- FspFileSystemNotify
|
||||||
|
|
||||||
|
|
||||||
</blockquote>
|
</blockquote>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
@ -1851,6 +1896,123 @@ The current operation context is stored in thread local storage. It allows acces
|
|||||||
Request and Response associated with this operation.
|
Request and Response associated with this operation.
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspFileSystemNotify</b> - Notify Windows that the file system has file changes.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API NTSTATUS FspFileSystemNotify(
|
||||||
|
FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
FSP_FSCTL_NOTIFY_INFO *NotifyInfo,
|
||||||
|
SIZE_T Size);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _FileSystem_ \- The file system object.
|
||||||
|
- _NotifyInfo_ \- Buffer containing information about file changes.
|
||||||
|
- _Size_ \- Size of buffer.
|
||||||
|
|
||||||
|
**Return Value**
|
||||||
|
|
||||||
|
STATUS\_SUCCESS or error code.
|
||||||
|
|
||||||
|
**Discussion**
|
||||||
|
|
||||||
|
A file system that wishes to notify Windows about file changes must
|
||||||
|
first issue an FspFileSystemBegin call, followed by 0 or more
|
||||||
|
FspFileSystemNotify calls, followed by an FspFileSystemNotifyEnd call.
|
||||||
|
|
||||||
|
Note that FspFileSystemNotify requires file names to be normalized. A
|
||||||
|
normalized file name is one that contains the correct case of all characters
|
||||||
|
in the file name.
|
||||||
|
|
||||||
|
For case-sensitive file systems all file names are normalized by definition.
|
||||||
|
For case-insensitive file systems that implement file name normalization,
|
||||||
|
a normalized file name is the one that the file system specifies in the
|
||||||
|
response to Create or Open (see also FspFileSystemGetOpenFileInfo). For
|
||||||
|
case-insensitive file systems that do not implement file name normalization
|
||||||
|
a normalized file name is the upper case version of the file name used
|
||||||
|
to open the file.
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspFileSystemNotifyBegin</b> - Begin notifying Windows that the file system has file changes.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API NTSTATUS FspFileSystemNotifyBegin(
|
||||||
|
FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
ULONG Timeout);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _FileSystem_ \- The file system object.
|
||||||
|
|
||||||
|
**Return Value**
|
||||||
|
|
||||||
|
STATUS\_SUCCESS or error code. The error code STATUS\_CANT\_WAIT means that
|
||||||
|
a file rename operation is currently in progress and the operation must be
|
||||||
|
retried at a later time.
|
||||||
|
|
||||||
|
**Discussion**
|
||||||
|
|
||||||
|
A file system that wishes to notify Windows about file changes must
|
||||||
|
first issue an FspFileSystemBegin call, followed by 0 or more
|
||||||
|
FspFileSystemNotify calls, followed by an FspFileSystemNotifyEnd call.
|
||||||
|
|
||||||
|
This operation blocks concurrent file rename operations. File rename
|
||||||
|
operations may interfere with file notification, because a file being
|
||||||
|
notified may also be concurrently renamed. After all file change
|
||||||
|
notifications have been issued, you must make sure to call
|
||||||
|
FspFileSystemNotifyEnd to allow file rename operations to proceed.
|
||||||
|
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
<b>FspFileSystemNotifyEnd</b> - End notifying Windows that the file system has file changes.
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
```c
|
||||||
|
FSP_API NTSTATUS FspFileSystemNotifyEnd(
|
||||||
|
FSP_FILE_SYSTEM *FileSystem);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters**
|
||||||
|
|
||||||
|
- _FileSystem_ \- The file system object.
|
||||||
|
|
||||||
|
**Return Value**
|
||||||
|
|
||||||
|
STATUS\_SUCCESS or error code.
|
||||||
|
|
||||||
|
**Discussion**
|
||||||
|
|
||||||
|
A file system that wishes to notify Windows about file changes must
|
||||||
|
first issue an FspFileSystemBegin call, followed by 0 or more
|
||||||
|
FspFileSystemNotify calls, followed by an FspFileSystemNotifyEnd call.
|
||||||
|
|
||||||
|
This operation allows any blocked file rename operations to proceed.
|
||||||
|
|
||||||
|
|
||||||
</blockquote>
|
</blockquote>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
@ -2613,7 +2775,7 @@ in a clean manner by calling this function.
|
|||||||
<br/>
|
<br/>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<sub>
|
<sub>
|
||||||
Copyright © 2015-2020 Bill Zissimopoulos
|
Copyright © 2015-2021 Bill Zissimopoulos
|
||||||
<br/>
|
<br/>
|
||||||
Generated with <a href="https://github.com/billziss-gh/prettydoc">prettydoc</a>
|
Generated with <a href="https://github.com/billziss-gh/prettydoc">prettydoc</a>
|
||||||
</sub>
|
</sub>
|
||||||
|
59
doc/WinFsp-Building.asciidoc
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
= WinFsp Building
|
||||||
|
|
||||||
|
This document provides instructions on building WinFsp and describes the WinFsp project structure.
|
||||||
|
|
||||||
|
== Building
|
||||||
|
|
||||||
|
In order to build WinFsp you will need the following:
|
||||||
|
|
||||||
|
* Visual Studio 2019
|
||||||
|
* Windows Driver Kit (WDK)
|
||||||
|
* https://wixtoolset.org[Wix toolset]
|
||||||
|
|
||||||
|
Use the command `tools\build.bat Release` to produce a full build (including the installer). However the resulting product will not be properly signed and Windows will refuse to load the WinFsp driver, unless you enable testsigning with `bcdedit -set testsigning on`.
|
||||||
|
|
||||||
|
Producing a fully functional build requires an EV certificate and a Partner Center for Windows Hardware account. Assuming you have those, the steps to produce a full build are as follows:
|
||||||
|
|
||||||
|
* Produce a build signed with your EV certificate using `tools\build.bat Release`.
|
||||||
|
* Upload the signed `driver.cab` file to Microsoft for "attestation signing".
|
||||||
|
* Download the now Microsoft-signed `driver.cab` file and extract it into a folder (e.g. `signed-drivers`).
|
||||||
|
* Re-run the build using `tools\build.bat Release PATH\TO\signed-drivers`
|
||||||
|
|
||||||
|
== Versioning
|
||||||
|
|
||||||
|
WinFsp versioning (and branding) is controlled by the file `build\VStudio\build.version.props`. See the link:WinFsp-Rebranding.asciidoc[WinFsp Rebranding] document for details.
|
||||||
|
|
||||||
|
== Project Structure
|
||||||
|
|
||||||
|
The WinFsp project is structured as follows:
|
||||||
|
|
||||||
|
* 📁 https://github.com/winfsp/winfsp/tree/master/art[art]: Project logo and other art.
|
||||||
|
* 📁 https://github.com/winfsp/winfsp/tree/master/build[build]: Project build files.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/build/choco[choco]: Chocolatey package files.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/build/VStudio[VStudio]: Visual Studio solution and project files.
|
||||||
|
* 📁 https://github.com/winfsp/winfsp/tree/master/doc[doc]: Project documentation.
|
||||||
|
* 📁 https://github.com/winfsp/winfsp/tree/master/ext[ext]: External dependencies.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/ext/tlib[tlib]: Test library for C originally from the secfs project.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/ext/test[test]: Submodule containing additional file system testing tools.
|
||||||
|
* 📁 https://github.com/winfsp/winfsp/tree/master/inc[inc]: Public headers.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/inc/fuse[fuse]: Public headers for the FUSE compatibility layer.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/inc/fuse3[fuse3]: Public headers for the FUSE3 compatibility layer.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/inc/winfsp[winfsp]: Public headers for the WinFsp API.
|
||||||
|
* 📁 https://github.com/winfsp/winfsp/tree/master/opt[opt]: Additional source code and files.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/opt/cygfuse[cygfuse]: Source code for the FUSE for Cygwin package.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/opt/fsext[fsext]: Source code for the fsext package.
|
||||||
|
* 📁 https://github.com/winfsp/winfsp/tree/master/src[src]: Project source code.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/src/dll[dll]: Source code for the WinFsp DLL.
|
||||||
|
*** 📁 https://github.com/winfsp/winfsp/tree/master/src/dll/fuse[fuse]: Source code for the FUSE compatibility layer.
|
||||||
|
*** 📁 https://github.com/winfsp/winfsp/tree/master/src/dll/fuse3[fuse3]: Source code for the FUSE3 compatibility layer.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/src/dotnet[dotnet]: Source code for the .NET layer.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/src/fsptool[fsptool]: Source code for the fsptool command line utility.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/src/launcher[launcher]: Source code for the launcher and the launchctl utility.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/src/shared[shared]: Shared source code.
|
||||||
|
*** 📁 https://github.com/winfsp/winfsp/tree/master/src/shared/ku[ku]: Shared source code for kernel and user mode.
|
||||||
|
*** 📁 https://github.com/winfsp/winfsp/tree/master/src/shared/um[um]: Shared source code for user mode only.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/src/sys[sys]: Source code for the WinFsp FSD.
|
||||||
|
* 📁 https://github.com/winfsp/winfsp/tree/master/tools[tools]: Tools for building and testing WinFsp.
|
||||||
|
* 📁 https://github.com/winfsp/winfsp/tree/master/tst[tst]: Source code for example file systems and test suites.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/tst/memfs[memfs]: The MEMFS reference file system.
|
||||||
|
** 📁 https://github.com/winfsp/winfsp/tree/master/tst/winfsp-tests[winfsp-tests]: The primary WinFsp test suite.
|
@ -1,192 +1,163 @@
|
|||||||
= Performance Testing
|
= Performance Testing
|
||||||
:caption:
|
|
||||||
|
|
||||||
This document discusses performance testing for WinFsp. The goal of this performance testing is to discover optimization opportunities for WinFsp and compare its performance to that of NTFS and Dokany.
|
This document presents results from performance testing of WinFsp. These results show that WinFsp has excellent performance that rivals or exceeds that of NTFS in many file system scenarios. Some further optimization opportunities are also identified.
|
||||||
|
|
||||||
== Executive Summary
|
== Summary
|
||||||
|
|
||||||
This performance testing shows that WinFsp has excellent performance in all tested scenarios. It outperforms NTFS in most scenarios (an unfair comparison as NTFS is a disk file system and WinFsp is tested with an in-memory file system). It also outperforms Dokany in all scenarios, often by an order of magnitude.
|
Two reference WinFsp file systems, MEMFS and NTPTFS, are compared against NTFS in multiple file system scenarios. MEMFS is an in-memory file system, whereas NTPTFS (NT passthrough file system) is a file system that passes all file system requests onto an underlying NTFS file system.
|
||||||
|
|
||||||
ifdef::env-browser[chart::bar[data-uri="WinFsp-Performance-Testing/file_tests.csv",file="WinFsp-Performance-Testing/file_tests.png",opt="y-label=time"]]
|
The test results are summarized in the charts below. The "File Tests" chart summarizes performance of file path namespace manipulations (e.g. creating/deleting files, opening files, listing files, etc.). The "Read/Write Tests" chart summarizes performance of file I/O (e.g. cached read/write, memory mapped I/O, etc.)
|
||||||
ifndef::env-browser[image::WinFsp-Performance-Testing/file_tests.png[]]
|
|
||||||
|
|
||||||
ifdef::env-browser[chart::bar[data-uri="WinFsp-Performance-Testing/rdwr_tests.csv",file="WinFsp-Performance-Testing/rdwr_tests.png",opt="y-label=time"]]
|
The important takeaways are:
|
||||||
ifndef::env-browser[image::WinFsp-Performance-Testing/rdwr_tests.png[]]
|
|
||||||
|
|
||||||
== Fsbench
|
- MEMFS is faster than NTFS is most scenarios. This is a somewhat expected result because MEMFS is an in-memory file system, whereas NTFS is a disk file system. However it shows that WinFsp does not add significant overhead and user mode file systems can be fast.
|
||||||
|
|
||||||
All testing was performed using a new performance test suite developed as part of WinFsp, called https://github.com/billziss-gh/winfsp/blob/master/tst/fsbench/fsbench.c[fsbench]. Fsbench was developed because it allows the creation of tests that are important to file system developers; for example, it can answer questions of the type: "how long does it take to delete 1000 files" or "how long does it take to list a directory with 10000 files in it".
|
- MEMFS and NTPTFS both outperform NTFS when doing cached file I/O! This is a significant result because doing file I/O is the primary purpose of a file system. It is also an unexpected result at least in the case of NTPTFS, since NTPTFS runs on top of NTFS.
|
||||||
|
|
||||||
Fsbench is based on the https://github.com/billziss-gh/winfsp/tree/master/ext/tlib[tlib] library, originally from the *secfs* project. Tlib is usually used to develop regression test suites in C/C++, but can be also used to create performance tests.
|
The following sections present the testing methodology used, provide instructions for independent verification, describe the individual tests in detail and provide an explanation for the observed results.
|
||||||
|
|
||||||
Fsbench currently includes the following tests:
|
[cols="a,a", frame=none, grid=none]
|
||||||
|
|
||||||
[width="100%",cols="20%,60%,20%",options="header"]
|
|
||||||
|===
|
|===
|
||||||
|Test |Measures performance of |Parameters
|
|image::WinFsp-Performance-Testing/file_tests.png[]
|
||||||
|file_create_test |CreateFileW(CREATE_NEW) / CloseHandle |file count
|
|image::WinFsp-Performance-Testing/rdwr_tests.png[]
|
||||||
|file_open_test |CreateFileW(OPEN_EXISTING) / CloseHandle |file count
|
|
||||||
|file_overwrite_test|CreateFileW(CREATE_ALWAYS) / CloseHandle with existing files|file count
|
|
||||||
|file_list_test |FindFirstFileW / FindNextFile / FindClose |iterations
|
|
||||||
|file_delete_test |DeleteFileW |file count
|
|
||||||
|file_mkdir_test |CreateDirectoryW |file count
|
|
||||||
|file_rmdir_test |RemoveDirectoryW |file count
|
|
||||||
|rdwr_cc_write_page_test |WriteFile (1 page; cached) |iterations
|
|
||||||
|rdwr_cc_read_page_test |ReadFile (1 page; cached) |iterations
|
|
||||||
|rdwr_nc_write_page_test |WriteFile (1 page; non-cached) |iterations
|
|
||||||
|rdwr_nc_read_page_test |ReadFile (1 page; non-cached) |iterations
|
|
||||||
|rdwr_cc_write_large_test |WriteFile (16 pages; cached) |iterations
|
|
||||||
|rdwr_cc_read_large_test |ReadFile (16 pages; cached) |iterations
|
|
||||||
|rdwr_nc_write_large_test |WriteFile (16 pages; non-cached) |iterations
|
|
||||||
|rdwr_nc_read_large_test |ReadFile (16 pages; non-cached) |iterations
|
|
||||||
|mmap_write_test |Memory mapped write test |iterations
|
|
||||||
|mmap_write_test |Memory mapped read test |iterations
|
|
||||||
|===
|
|===
|
||||||
|
|
||||||
== Tested File Systems
|
== Methodology
|
||||||
|
|
||||||
=== NTFS
|
A test run consists of performance tests run one after the other (in sequence). The test driver is careful to clear system caches before each test to minimize timing interference between the tests (because we would not want operations performed in test A to affect measurements of test B). Tests are run on an idle computer to minimize interference from third party components.
|
||||||
|
|
||||||
The comparison to NTFS is very important to establish a baseline. It is also very misleading because NTFS is a disk file system and MEMFS (either the WinFsp or Dokany variants) is an in memory file system. The tests will show that MEMFS is faster than NTFS. This should not be taken to mean that we are trying to make the (obvious) claim that an in memory file system is faster than a disk file system, but to show that the approach of writing a file system in user mode is a valid proposition and can be efficient.
|
Each test run is run a number of times (default: 3) against each file system and the smallest time value for the particular test and file system is chosen. The assumption is that even in a seemingly idle system there is some activity that affects the results; the smallest value is the preferred one to use because it reflects the time when there is less or no other system activity.
|
||||||
|
|
||||||
=== WinFsp/MEMFS
|
For the NTFS file system we use the default configuration as it ships with Windows (e.g. 8.3 names are enabled). For the NTPTFS file system we disable anti-virus checks on the lower file system, because it makes no sense for NTPTFS to pay for virus checking twice. (Consider an NTPTFS file system that exposes a lower NTFS directory `C:\t` as an upper drive `X:`. Such a file system would have virus checking applied on file accesses to `X:`, but also to its own accesses to `C:\t`. This is unnecessary and counter-productive.)
|
||||||
|
|
||||||
MEMFS is the file system used to test WinFsp and shipped as a sample bundled with the WinFsp installer. MEMFS is a simple in memory file system and as such is very fast under most conditions. This is desirable because our goal with this performance testing is to measure the speed of the WinFsp system components rather the performance of a complex user mode file system. MEMFS has minimal overhead and is ideal for this purpose.
|
Note that the sequential nature of the tests represents a worst case scenario for WinFsp. The reason is that a single file system operation may require a roundtrip to the user mode file system and such a roundtrip requires two process context switches (i.e. address space and thread switches): one context switch to carry the file system request to the user mode file system and one context switch to carry the response back to the originating process. WinFsp performs better when multiple processes issue file system operations concurrently, because multiple requests are queued in its internal queues and multiple requests can be handled in a single context switch.
|
||||||
|
|
||||||
WinFsp/MEMFS can be run in different configurations, which enable or disable WinFsp caching features. The tested configurations were:
|
For more information refer to the link:WinFsp-Performance-Testing/WinFsp-Performance-Testing-Analysis.ipynb[Performance Testing Analysis] notebook. This notebook together with the `run-all-perf-tests.bat` script can be used for replication and independent verification of the results presented in this document.
|
||||||
|
|
||||||
- An infinite FileInfoTimeout, which enables caching of metadata and data.
|
The test environment for the results presented in this document is as follows:
|
||||||
- A FileInfoTimeout of 1s (second), which enables caching of metadata but disables caching of data.
|
|
||||||
- A FileInfoTimeout of 0, which completely disables caching.
|
|
||||||
|
|
||||||
The WinFsp git commit at the time of testing was d804f5674d76f11ea86d14f4bcb1157e6e40e719.
|
|
||||||
|
|
||||||
=== Dokany/MEMFS
|
|
||||||
|
|
||||||
To achieve fairness when comparing Dokany to WinFsp the MEMFS file system has been ported to Dokany. Substantial care was taken to ensure that WinFsp/MEMFS and Dokany/MEMFS perform equally well, so that the performance of the Dokany FSD and user-mode components can be measured and compared accurately.
|
|
||||||
|
|
||||||
The Dokany/MEMFS project has its own https://github.com/billziss-gh/memfs-dokany[repository]. The project comes without a license, which means that it may not be used for any purpose other than as a reference.
|
|
||||||
|
|
||||||
The Dokany version used for testing was 1.0.1. The Dokany/MEMFS git commit was 27a678d7c0d5ee2fb3fb2ecc8e38210857ae941c.
|
|
||||||
|
|
||||||
== Test Environment
|
|
||||||
|
|
||||||
Tests were performed on an idle computer/VM. There was a reboot of both the computer and VM before each file system was tested. Each test was run twice and the smaller time value chosen. The assumption is that even in a seemingly idle desktop system there is some activity which will affect the results; the smaller value is the preferred one to use because it reflects the time when there is less or no other activity.
|
|
||||||
|
|
||||||
The test environment was as follows:
|
|
||||||
----
|
----
|
||||||
MacBook Pro (Retina, 13-inch, Early 2015)
|
Dell XPS 13 9300
|
||||||
3.1 GHz Intel Core i7
|
Intel Core i7-1065G7 CPU
|
||||||
16 GB 1867 MHz DDR3
|
32GB 3733MHz LPDDR4x RAM
|
||||||
500 GB SSD
|
2TB M.2 PCIe NVMe SSD
|
||||||
|
|
||||||
VirtualBox Version 5.0.20 r106931
|
Windows 11 (64-bit) Version 21H2 (OS Build 22000.258)
|
||||||
1 CPU
|
WinFsp 2022+ARM64 Beta3 (v1.11B3)
|
||||||
4 GB RAM
|
|
||||||
80 GB Dynamically allocated differencing storage
|
|
||||||
|
|
||||||
Windows 10 (64-bit) Version 1511 (OS Build 10586.420)
|
|
||||||
----
|
----
|
||||||
|
|
||||||
== Test Results
|
== Results
|
||||||
|
|
||||||
In the graphs below we use consistent coloring to quickly identify a file system. Red is used for NTFS, yellow for WinFsp/MEMFS with a FileInfoTimeout of 0, green for WinFsp/MEMFS with a FileInfoTimeout of 1, light blue for WinFsp/MEMFS with an infinite FileInfoTimeout and deep blue for Dokany/MEMFS.
|
In the charts below we use consistent coloring and markers to quickly identify a file system. Blue and the letter 'N' is used for NTFS, orange and the letter 'M' is used for MEMFS, green and the letter 'P' is used for NTPTFS.
|
||||||
|
|
||||||
|
In bar charts shorter bars are better. In plot charts lower times are better. (Better means that the file system is faster).
|
||||||
|
|
||||||
In all tests lower times are better (the file system is faster).
|
|
||||||
|
|
||||||
=== File Tests
|
=== File Tests
|
||||||
|
|
||||||
These tests measure the performance of creating, opening, overwriting and listing files and directories.
|
File tests are tests that are performed against the hierarchical path namespace of a file system. These tests measure the performance of creating, opening, overwriting, listing and deleting files.
|
||||||
|
|
||||||
|
Measured times for these tests are normalized against the NTFS time (so that the NTFS value is always 1). This allows for easy comparison between file systems across all file tests.
|
||||||
|
|
||||||
|
MEMFS has the best performance in most of these tests. NTFS performs better in some tests; these are discussed further below. NTPTFS is last as it has the overhead of both NTFS and WinFsp.
|
||||||
|
|
||||||
|
image::WinFsp-Performance-Testing/file_tests.png[]
|
||||||
|
|
||||||
==== file_create_test
|
==== file_create_test
|
||||||
|
|
||||||
This test measures the performance of CreateFileW(CREATE_NEW) / CloseHandle. WinFsp has the best performance here. Dokany follows and NTFS is last as it has to actually update its data structures on disk.
|
This test measures the performance of creating new files using `CreateFileW(CREATE_NEW)` / `CloseHandle`. MEMFS has the best performance here, while NTFS has worse performance as it has to update its data structures on disk.
|
||||||
|
|
||||||
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/file_create_test.csv",file="WinFsp-Performance-Testing/file_create_test.png",opt="x-label=file count,y-label=time"]]
|
image::WinFsp-Performance-Testing/file_create_test.png[]
|
||||||
ifndef::env-browser[image::WinFsp-Performance-Testing/file_create_test.png[]]
|
|
||||||
|
|
||||||
==== file_open_test
|
==== file_open_test
|
||||||
|
|
||||||
This test measures the performance of CreateFileW(OPEN_EXISTING) / CloseHandle. WinFsp again has the best (although uneven) performance, followed by NTFS and then Dokany.
|
This test measures the performance of opening different files using `CreateFileW(OPEN_EXISTING)` / `CloseHandle`. MEMFS again has the best performance, followed by NTFS and then NTPTFS.
|
||||||
|
|
||||||
WinFsp appears to have very uneven performance here. In particular notice that opening 1000 files is slower than opening 2000 files, which makes no sense! I suspect that the test observes an initial acquisition of resouces when the test first starts, which is not necessary when the test runs for 2000 files at a later time. This uneven performance should probably be investigated in the future.
|
image::WinFsp-Performance-Testing/file_open_test.png[]
|
||||||
|
|
||||||
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/file_open_test.csv",file="WinFsp-Performance-Testing/file_open_test.png",opt="x-label=file count,y-label=time"]]
|
==== iter.file_open_test
|
||||||
ifndef::env-browser[image::WinFsp-Performance-Testing/file_open_test.png[]]
|
|
||||||
|
This test measures the performance of opening the same files repeatedly using `CreateFileW(OPEN_EXISTING)` / `CloseHandle`. NTFS has the best performance, with MEMFS following and NTPTFS a distant third.
|
||||||
|
|
||||||
|
This test shows that NTFS does a better job than WinFsp when re-opening a file. The problem is that in most cases the WinFsp API design requires a round-trip to the user mode file system when opening a file. Improving WinFsp performance here would likely require substantial changes to the WinFsp API.
|
||||||
|
|
||||||
|
image::WinFsp-Performance-Testing/iter.file_open_test.png[]
|
||||||
|
|
||||||
==== file_overwrite_test
|
==== file_overwrite_test
|
||||||
|
|
||||||
This test measures the performance of CreateFileW(CREATE_ALWAYS) / CloseHandle. WinFsp is fastest, followed by NTFS and then Dokany.
|
This test measures the performance of overwriting files using `CreateFileW(CREATE_ALWAYS)` / `CloseHandle`. MEMFS is fastest, followed by NTFS and then NTPTFS.
|
||||||
|
|
||||||
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/file_overwrite_test.csv",file="WinFsp-Performance-Testing/file_overwrite_test.png",opt="x-label=file count,y-label=time"]]
|
image::WinFsp-Performance-Testing/file_overwrite_test.png[]
|
||||||
ifndef::env-browser[image::WinFsp-Performance-Testing/file_overwrite_test.png[]]
|
|
||||||
|
|
||||||
==== file_list_test
|
==== file_list_test
|
||||||
|
|
||||||
This test measures the performance of FindFirstFileW / FindNextFile / FindClose. NTFS wins this scenario, likely because it can satisfy the list operation from cache. WinFsp has overall good performance. Dokany appears to show slightly quadratic performance in this scenario.
|
This test measures the performance of listing files using `FindFirstFileW` / `FindNextFile` / `FindClose`. MEMFS is again fastest with NTFS and NTPTFS following.
|
||||||
|
|
||||||
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/file_list_test.csv",file="WinFsp-Performance-Testing/file_list_test.png",opt="x-label=file count,y-label=time"]]
|
It should be noted that NTFS can perform better in this test, if 8.3 (i.e. short) names are disabled (see `fsutil 8dot3name`). However Microsoft ships NTFS with 8.3 names enabled by default and these tests are performed against the default configuration of NTFS.
|
||||||
ifndef::env-browser[image::WinFsp-Performance-Testing/file_list_test.png[]]
|
|
||||||
|
image::WinFsp-Performance-Testing/file_list_test.png[]
|
||||||
|
|
||||||
|
==== file_list_single_test
|
||||||
|
|
||||||
|
This test measures the performance of listing a single file using `FindFirstFileW` / `FindNextFile` / `FindClose`. NTFS has again best performance, with MEMFS following and NTPTFS a distant third.
|
||||||
|
|
||||||
|
This test shows that NTFS does a better job than WinFsp at caching directory data. Improving WinFsp performance here would likely require a more aggressive and/or intelligent directory caching scheme than the one used now.
|
||||||
|
|
||||||
|
image::WinFsp-Performance-Testing/file_list_single_test.png[]
|
||||||
|
|
||||||
==== file_delete_test
|
==== file_delete_test
|
||||||
|
|
||||||
This test measures the performance of DeleteFileW. WinFsp has the best performance, followed by Dokany and NTFS with very similar performance.
|
This test measures the performance of deleting files using `DeleteFileW`. MEMFS has the best performance, followed by NTFS and NTPTFS.
|
||||||
|
|
||||||
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/file_delete_test.csv",file="WinFsp-Performance-Testing/file_delete_test.png",opt="x-label=file count,y-label=time"]]
|
image::WinFsp-Performance-Testing/file_delete_test.png[]
|
||||||
ifndef::env-browser[image::WinFsp-Performance-Testing/file_delete_test.png[]]
|
|
||||||
|
|
||||||
=== Read/Write Tests
|
=== Read/Write Tests
|
||||||
|
|
||||||
These tests measure the performance of cached, non-cached and memory-mapped I/O.
|
Read/write tests are tests that measure the performance of cached, non-cached and memory-mapped I/O.
|
||||||
|
|
||||||
==== rdwr_cc_write_page_test
|
Measured times for these tests are normalized against the NTFS time (so that the NTFS value is always 1). This allows for easy comparison between file systems across all read/write tests.
|
||||||
|
|
||||||
This test measures the performance of cached WriteFile with 1 page writes. NTFS and WinFsp with an infinite FileInfoTimeout have the best performance, with a clear edge to NTFS (likely because of its use of FastIO, which WinFsp does not currently support). WinFsp with a FileInfoTimeout of 0 or 1 performance is next, because WinFsp does not use the NTOS Cache Manager in this scenario. Dokany performance is last.
|
MEMFS and NTPTFS outperform NTFS in cached and non-cached I/O tests and have equal performance to NTFS in memory mapped I/O tests. This result may be somewhat counter-intuitive (especially for NTPTFS), but the reasons are explained below.
|
||||||
|
|
||||||
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/rdwr_cc_write_page_test.csv",file="WinFsp-Performance-Testing/rdwr_cc_write_page_test.png",opt="x-label=iterations,y-label=time"]]
|
image::WinFsp-Performance-Testing/rdwr_tests.png[]
|
||||||
ifndef::env-browser[image::WinFsp-Performance-Testing/rdwr_cc_write_page_test.png[]]
|
|
||||||
|
|
||||||
==== rdwr_cc_read_page_test
|
==== rdwr_cc_read_page_test
|
||||||
|
|
||||||
This test measures the performance of cached ReadFile with 1 page reads. The results here are very similar to the rdwr_cc_write_page_test case and similar comments apply.
|
This test measures the performance of cached `ReadFile` with 1 page reads. MEMFS and NTPTFS outperform NTFS by a considerable margin.
|
||||||
|
|
||||||
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/rdwr_cc_read_page_test.csv",file="WinFsp-Performance-Testing/rdwr_cc_read_page_test.png",opt="x-label=iterations,y-label=time"]]
|
Cached reads are satisfied from cache and they can effectively be a "memory copy" from the operating system's buffers into the `ReadFile` buffer. Both WinFsp and NTFS implement NT "fast I/O" and one explanation for the test's result is that the WinFsp "fast I/O" implementation is more performant than the NTFS one.
|
||||||
ifndef::env-browser[image::WinFsp-Performance-Testing/rdwr_cc_read_page_test.png[]]
|
|
||||||
|
|
||||||
==== rdwr_nc_write_page_test
|
An alternative explanation is that MEMFS and NTPTFS are simply faster in filling the file system cache when a cache miss occurs. While this may be true for MEMFS (because it maintains file data in user mode memory), it cannot be true for NTPTFS. Recall that the test driver clears system caches prior to running every test, which means that when NTPTFS tries to fill its file system cache for the upper file system, it has to access lower file system data from disk (the same as NTFS).
|
||||||
|
|
||||||
This test measures the performance of non-cached WriteFile with 1 page writes. WinFsp has the best performance, followed by Dokany. NTFS shows bad performance, which of course make sense as we are asking it to write all data to the disk.
|
image::WinFsp-Performance-Testing/rdwr_cc_read_page_test.png[]
|
||||||
|
|
||||||
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/rdwr_nc_write_page_test.csv",file="WinFsp-Performance-Testing/rdwr_nc_write_page_test.png",opt="x-label=iterations,y-label=time"]]
|
==== rdwr_cc_write_page_test
|
||||||
ifndef::env-browser[image::WinFsp-Performance-Testing/rdwr_nc_write_page_test.png[]]
|
|
||||||
|
This test measures the performance of cached `WriteFile` with 1 page writes. As in the read case, MEMFS and NTPTFS outperform NTFS albeit with a smaller margin.
|
||||||
|
|
||||||
|
Similar comments as for `rdwr_cc_read_page_test` apply.
|
||||||
|
|
||||||
|
image::WinFsp-Performance-Testing/rdwr_cc_write_page_test.png[]
|
||||||
|
|
||||||
==== rdwr_nc_read_page_test
|
==== rdwr_nc_read_page_test
|
||||||
|
|
||||||
This test measures the performance of non-cached ReadFile with 1 page reads. The results here are very similar to the rdwr_nc_write_page_test case and similar comments apply.
|
This test measures the performance of non-cached `ReadFile` with 1 page reads. Although MEMFS and NTPTFS have better performance than NTFS, this result is not as interesting, because MEMFS is an in-memory file system and NTPTFS currently implements only cached I/O (this may change in the future). However we include this test for completeness.
|
||||||
|
|
||||||
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/rdwr_nc_read_page_test.csv",file="WinFsp-Performance-Testing/rdwr_nc_read_page_test.png",opt="x-label=iterations,y-label=time"]]
|
image::WinFsp-Performance-Testing/rdwr_nc_read_page_test.png[]
|
||||||
ifndef::env-browser[image::WinFsp-Performance-Testing/rdwr_nc_read_page_test.png[]]
|
|
||||||
|
|
||||||
==== mmap_write_test
|
==== rdwr_nc_write_page_test
|
||||||
|
|
||||||
This test measures the performance of memory mapped writes. NTFS and WinFsp seem to have identical performance here, which actually makes sense because memory mapped I/O is effectively always cached and most of the actual I/O is done asynchronously by the system.
|
This test measures the performance of non-cached `WriteFile` with 1 page writes. Again MEMFS and NTPTFS have better performance than NTFS, but similar comments as for `rdwr_nc_read_page_test` apply.
|
||||||
|
|
||||||
There are no results for Dokany as it seems to (still) not support memory mapped files:
|
image::WinFsp-Performance-Testing/rdwr_nc_write_page_test.png[]
|
||||||
|
|
||||||
----
|
|
||||||
Y:\>c:\Users\billziss\Projects\winfsp\build\VStudio\build\Release\fsbench-x64.exe --mmap=100 mmap*
|
|
||||||
mmap_write_test........................ KO
|
|
||||||
ASSERT(0 != Mapping) failed at fsbench.c:226:mmap_dotest
|
|
||||||
----
|
|
||||||
|
|
||||||
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/mmap_write_test.csv",file="WinFsp-Performance-Testing/mmap_write_test.png",opt="x-label=iterations,y-label=time"]]
|
|
||||||
ifndef::env-browser[image::WinFsp-Performance-Testing/mmap_write_test.png[]]
|
|
||||||
|
|
||||||
==== mmap_read_test
|
==== mmap_read_test
|
||||||
|
|
||||||
This test measures the performance of memory mapped reads. Again NTFS and WinFsp seem to have identical performance here.
|
This test measures the performance of memory mapped reads. NTFS and WinFsp have identical performance here, which actually makes sense because memory mapped I/O is effectively cached by buffers that are mapped into the address space of the process doing the I/O.
|
||||||
|
|
||||||
There are no results for Dokany as it faces the same issue as with mmap_write_test.
|
image::WinFsp-Performance-Testing/mmap_read_test.png[]
|
||||||
|
|
||||||
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/mmap_read_test.csv",file="WinFsp-Performance-Testing/mmap_read_test.png",opt="x-label=iterations,y-label=time"]]
|
==== mmap_write_test
|
||||||
ifndef::env-browser[image::WinFsp-Performance-Testing/mmap_read_test.png[]]
|
|
||||||
|
This test measures the performance of memory mapped writes. NTFS and WinFsp have again identical performance here. Similar comments as for `mmap_read_test` apply.
|
||||||
|
|
||||||
|
image::WinFsp-Performance-Testing/mmap_write_test.png[]
|
||||||
|
@ -0,0 +1,238 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"# Performance Testing Analysis\n",
|
||||||
|
"\n",
|
||||||
|
"This notebook describes the methodology for analyzing WinFsp performance."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Data Collection\n",
|
||||||
|
"\n",
|
||||||
|
"Performance data is collected by running the script `run-all-perf-tests.bat`. This script runs a variety of performance tests against the NTFS, MEMFS and NTPTFS file systems. The tests are run a number of times (default: 3) and the results are saved in CSV files with names `ntfs-N.csv`, `memfs-N.csv` and `ntptfs-N.csv` (where `N` represents the results of test run `N`)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Data Loading\n",
|
||||||
|
"\n",
|
||||||
|
"Data is loaded from all CSV files into a single pandas `DataFrame`. The resulting `DataFrame` has columns `test`, `iter`, `ntfs`, `memfs`, `ntptfs`. With multiple test runs there will be multiple time values for a `test`, `iter`, file system triple; in this case the smallest time value is entered into the `DataFrame`. The assumption is that even in a seemingly idle system there is some activity that affects the results; the smallest value is the preferred one to use because it reflects the time when there is less or no other system activity.\n",
|
||||||
|
"\n",
|
||||||
|
"The resulting `DataFrame` will contain data similar to the following:\n",
|
||||||
|
"\n",
|
||||||
|
"| test | iter | ntfs | memfs | ntptfs |\n",
|
||||||
|
"|:------------------|------:|-------:|-------:|-------:|\n",
|
||||||
|
"| file_create_test | 1000 | 0.20 | 0.06 | 0.28 |\n",
|
||||||
|
"| file_open_test | 1000 | 0.09 | 0.05 | 0.22 |\n",
|
||||||
|
"| ... | ... | ... | ... | ... |"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"import glob, os\n",
|
||||||
|
"import matplotlib.pyplot as plt\n",
|
||||||
|
"import numpy as np\n",
|
||||||
|
"import pandas as pd\n",
|
||||||
|
"\n",
|
||||||
|
"nameord = [\"ntfs\", \"memfs\", \"ntptfs\"]\n",
|
||||||
|
"\n",
|
||||||
|
"datamap = {}\n",
|
||||||
|
"for f in sorted(glob.iglob(\"*.csv\")):\n",
|
||||||
|
" datamap.setdefault(f.rsplit(\"-\", maxsplit=1)[0], []).append(f)\n",
|
||||||
|
"\n",
|
||||||
|
"df = None\n",
|
||||||
|
"for n in nameord:\n",
|
||||||
|
" ndf = None\n",
|
||||||
|
" for f in datamap[n]:\n",
|
||||||
|
" df0 = pd.read_csv(f, header=None, names=[\"test\", \"iter\", n])\n",
|
||||||
|
" if ndf is None:\n",
|
||||||
|
" ndf = df0\n",
|
||||||
|
" else:\n",
|
||||||
|
" ndf = ndf.combine(df0, np.minimum)\n",
|
||||||
|
" if df is None:\n",
|
||||||
|
" df = ndf\n",
|
||||||
|
" else:\n",
|
||||||
|
" df = df.merge(ndf, how=\"left\")\n",
|
||||||
|
"#df"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Data Analysis\n",
|
||||||
|
"\n",
|
||||||
|
"For each test a plot is drawn that shows how each file system performs in the particular test. This allows for easy comparisons between file systems for a particular test."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"markermap = { \"ntfs\": \"$\\mathtt{N}$\", \"memfs\": \"$\\mathtt{M}$\", \"ntptfs\": \"$\\mathtt{P}$\"}\n",
|
||||||
|
"for t, tdf in df.groupby(\"test\", sort=False):\n",
|
||||||
|
" plt.figure(figsize=(10,8), dpi=100, facecolor=\"white\")\n",
|
||||||
|
" plt.title(t)\n",
|
||||||
|
" xlabel = \"iter\"\n",
|
||||||
|
" if t.startswith(\"file_\"):\n",
|
||||||
|
" xlabel = \"files\"\n",
|
||||||
|
" for n in nameord:\n",
|
||||||
|
" tdf.plot(ax=plt.gca(), x=\"iter\", xlabel=xlabel, y=n, ylabel=\"time\", marker=markermap[n], ms=8)\n",
|
||||||
|
" plt.legend(nameord)\n",
|
||||||
|
" plt.savefig(t + \".png\")\n",
|
||||||
|
" #plt.show()\n",
|
||||||
|
" plt.close()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
""
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"### File tests\n",
|
||||||
|
"\n",
|
||||||
|
"File tests are tests that are performed against the hierarchical path namespace of a file system. Such tests include `file_create_test`, `file_open_test`, etc. Measured times for these tests are normalized against the `ntfs` time (so that the `ntfs` time value becomes 1) and a single aggregate plot is produced.\n",
|
||||||
|
"\n",
|
||||||
|
"This allows for easy comparison between file systems across all file tests."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"fileord = [\"create\", \"open\", \"iter.open\", \"overwrite\", \"list\", \"list_single\", \"delete\"]\n",
|
||||||
|
"fdf = pd.concat([df[df.iter == 5000], df[df.iter == 50]])\n",
|
||||||
|
"fdf.test = fdf.test.map(lambda x: x.replace(\"file_\", \"\").replace(\"_test\", \"\"))\n",
|
||||||
|
"fdf = fdf.set_index(\"test\").loc[fileord]\n",
|
||||||
|
"fdf.memfs /= fdf.ntfs; fdf.ntptfs /= fdf.ntfs; fdf.ntfs = 1\n",
|
||||||
|
"plt.figure(figsize=(10,8), dpi=100, facecolor=\"white\")\n",
|
||||||
|
"plt.suptitle(\"File Tests\", fontweight=\"light\", fontsize=20, y=0.95)\n",
|
||||||
|
"plt.title(\"(Shorter bars are better)\")\n",
|
||||||
|
"fdf.plot.barh(ax=plt.gca(), y=nameord).invert_yaxis()\n",
|
||||||
|
"plt.gca().set(ylabel=None)\n",
|
||||||
|
"for container in plt.gca().containers:\n",
|
||||||
|
" plt.gca().bar_label(container, fmt=\"%0.2f\", padding=4.0, fontsize=\"xx-small\")\n",
|
||||||
|
"plt.savefig(\"file_tests.png\")\n",
|
||||||
|
"#plt.show()\n",
|
||||||
|
"plt.close()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
""
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"### Read/write tests\n",
|
||||||
|
"\n",
|
||||||
|
"Read/write tests are file I/O tests. Such tests include `rdwr_cc_write_page_test`, `rdwr_cc_read_page_test`, etc. As before measured times for these tests are normalized against the `ntfs` time (so that the `ntfs` time value becomes 1) and a single aggregate plot is produced.\n",
|
||||||
|
"\n",
|
||||||
|
"This allows for easy comparison between file systems across all read/write tests."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"rdwrord = [\"cc_read_page\", \"cc_write_page\", \"nc_read_page\", \"nc_write_page\", \"mmap_read\", \"mmap_write\"]\n",
|
||||||
|
"sdf = df[df.iter == 500].copy()\n",
|
||||||
|
"sdf.test = sdf.test.map(lambda x: x.replace(\"rdwr_\", \"\").replace(\"_test\", \"\"))\n",
|
||||||
|
"sdf = sdf.set_index(\"test\").loc[rdwrord]\n",
|
||||||
|
"sdf.memfs /= sdf.ntfs; sdf.ntptfs /= sdf.ntfs; sdf.ntfs = 1\n",
|
||||||
|
"plt.figure(figsize=(10,8), dpi=100, facecolor=\"white\")\n",
|
||||||
|
"plt.suptitle(\"Read/Write Tests\", fontweight=\"light\", fontsize=20, y=0.95)\n",
|
||||||
|
"plt.title(\"(Shorter bars are better)\")\n",
|
||||||
|
"sdf.plot.barh(ax=plt.gca(), y=nameord).invert_yaxis()\n",
|
||||||
|
"plt.gca().set(ylabel=None)\n",
|
||||||
|
"for container in plt.gca().containers:\n",
|
||||||
|
" plt.gca().bar_label(container, fmt=\"%0.2f\", padding=4.0, fontsize=\"xx-small\")\n",
|
||||||
|
"plt.savefig(\"rdwr_tests.png\")\n",
|
||||||
|
"#plt.show()\n",
|
||||||
|
"plt.close()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
""
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"interpreter": {
|
||||||
|
"hash": "78f203ba605732dcd419e55e4a2fc56c1449fc8b262db510a48272adb5557637"
|
||||||
|
},
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3.9.7 64-bit ('base': conda)",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.8.12"
|
||||||
|
},
|
||||||
|
"orig_nbformat": 4
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 2
|
||||||
|
}
|
BIN
doc/WinFsp-Performance-Testing/file_attr_test.png
Normal file
After Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 43 KiB |
BIN
doc/WinFsp-Performance-Testing/file_list_none_test.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
doc/WinFsp-Performance-Testing/file_list_single_test.png
Normal file
After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 48 KiB |
BIN
doc/WinFsp-Performance-Testing/file_mkdir_test.png
Normal file
After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 48 KiB |
BIN
doc/WinFsp-Performance-Testing/file_rmdir_test.png
Normal file
After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 31 KiB |
BIN
doc/WinFsp-Performance-Testing/iter.file_attr_test.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
doc/WinFsp-Performance-Testing/iter.file_list_none_test.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
doc/WinFsp-Performance-Testing/iter.file_list_single_test.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
doc/WinFsp-Performance-Testing/iter.file_open_test.png
Normal file
After Width: | Height: | Size: 40 KiB |
120
doc/WinFsp-Performance-Testing/memfs-1.csv
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
file_create_test,1000,0.06
|
||||||
|
file_open_test,1000,0.06
|
||||||
|
file_overwrite_test,1000,0.06
|
||||||
|
file_attr_test,1000,0.03
|
||||||
|
file_list_test,1000,0.06
|
||||||
|
file_list_single_test,1000,0.12
|
||||||
|
file_list_none_test,1000,0.12
|
||||||
|
file_delete_test,1000,0.09
|
||||||
|
file_mkdir_test,1000,0.06
|
||||||
|
file_rmdir_test,1000,0.08
|
||||||
|
file_create_test,2000,0.14
|
||||||
|
file_open_test,2000,0.11
|
||||||
|
file_overwrite_test,2000,0.14
|
||||||
|
file_attr_test,2000,0.08
|
||||||
|
file_list_test,2000,0.16
|
||||||
|
file_list_single_test,2000,0.30
|
||||||
|
file_list_none_test,2000,0.25
|
||||||
|
file_delete_test,2000,0.17
|
||||||
|
file_mkdir_test,2000,0.14
|
||||||
|
file_rmdir_test,2000,0.17
|
||||||
|
file_create_test,3000,0.20
|
||||||
|
file_open_test,3000,0.16
|
||||||
|
file_overwrite_test,3000,0.20
|
||||||
|
file_attr_test,3000,0.12
|
||||||
|
file_list_test,3000,0.23
|
||||||
|
file_list_single_test,3000,0.44
|
||||||
|
file_list_none_test,3000,0.36
|
||||||
|
file_delete_test,3000,0.25
|
||||||
|
file_mkdir_test,3000,0.19
|
||||||
|
file_rmdir_test,3000,0.27
|
||||||
|
file_create_test,4000,0.28
|
||||||
|
file_open_test,4000,0.22
|
||||||
|
file_overwrite_test,4000,0.27
|
||||||
|
file_attr_test,4000,0.16
|
||||||
|
file_list_test,4000,0.31
|
||||||
|
file_list_single_test,4000,0.61
|
||||||
|
file_list_none_test,4000,0.52
|
||||||
|
file_delete_test,4000,0.34
|
||||||
|
file_mkdir_test,4000,0.25
|
||||||
|
file_rmdir_test,4000,0.36
|
||||||
|
file_create_test,5000,0.34
|
||||||
|
file_open_test,5000,0.27
|
||||||
|
file_overwrite_test,5000,0.33
|
||||||
|
file_attr_test,5000,0.22
|
||||||
|
file_list_test,5000,0.42
|
||||||
|
file_list_single_test,5000,0.80
|
||||||
|
file_list_none_test,5000,0.66
|
||||||
|
file_delete_test,5000,0.42
|
||||||
|
file_mkdir_test,5000,0.31
|
||||||
|
file_rmdir_test,5000,0.44
|
||||||
|
iter.file_open_test,10,0.55
|
||||||
|
iter.file_attr_test,10,0.41
|
||||||
|
iter.file_list_single_test,10,0.61
|
||||||
|
iter.file_list_none_test,10,0.61
|
||||||
|
iter.file_open_test,20,1.08
|
||||||
|
iter.file_attr_test,20,0.84
|
||||||
|
iter.file_list_single_test,20,1.25
|
||||||
|
iter.file_list_none_test,20,1.20
|
||||||
|
iter.file_open_test,30,1.62
|
||||||
|
iter.file_attr_test,30,1.30
|
||||||
|
iter.file_list_single_test,30,1.92
|
||||||
|
iter.file_list_none_test,30,1.83
|
||||||
|
iter.file_open_test,40,2.17
|
||||||
|
iter.file_attr_test,40,1.72
|
||||||
|
iter.file_list_single_test,40,2.52
|
||||||
|
iter.file_list_none_test,40,2.42
|
||||||
|
iter.file_open_test,50,2.77
|
||||||
|
iter.file_attr_test,50,2.14
|
||||||
|
iter.file_list_single_test,50,3.12
|
||||||
|
iter.file_list_none_test,50,2.98
|
||||||
|
rdwr_cc_write_page_test,100,0.23
|
||||||
|
rdwr_cc_read_page_test,100,0.23
|
||||||
|
rdwr_cc_write_large_test,100,0.06
|
||||||
|
rdwr_cc_read_large_test,100,0.06
|
||||||
|
rdwr_cc_write_page_test,200,0.45
|
||||||
|
rdwr_cc_read_page_test,200,0.45
|
||||||
|
rdwr_cc_write_large_test,200,0.12
|
||||||
|
rdwr_cc_read_large_test,200,0.11
|
||||||
|
rdwr_cc_write_page_test,300,0.66
|
||||||
|
rdwr_cc_read_page_test,300,0.59
|
||||||
|
rdwr_cc_write_large_test,300,0.19
|
||||||
|
rdwr_cc_read_large_test,300,0.19
|
||||||
|
rdwr_cc_write_page_test,400,0.89
|
||||||
|
rdwr_cc_read_page_test,400,0.86
|
||||||
|
rdwr_cc_write_large_test,400,0.25
|
||||||
|
rdwr_cc_read_large_test,400,0.25
|
||||||
|
rdwr_cc_write_page_test,500,1.11
|
||||||
|
rdwr_cc_read_page_test,500,0.91
|
||||||
|
rdwr_cc_write_large_test,500,0.31
|
||||||
|
rdwr_cc_read_large_test,500,0.25
|
||||||
|
rdwr_nc_write_page_test,100,1.81
|
||||||
|
rdwr_nc_read_page_test,100,1.88
|
||||||
|
rdwr_nc_write_large_test,100,0.14
|
||||||
|
rdwr_nc_read_large_test,100,0.16
|
||||||
|
rdwr_nc_write_page_test,200,3.66
|
||||||
|
rdwr_nc_read_page_test,200,3.77
|
||||||
|
rdwr_nc_write_large_test,200,0.30
|
||||||
|
rdwr_nc_read_large_test,200,0.30
|
||||||
|
rdwr_nc_write_page_test,300,5.42
|
||||||
|
rdwr_nc_read_page_test,300,5.66
|
||||||
|
rdwr_nc_write_large_test,300,0.44
|
||||||
|
rdwr_nc_read_large_test,300,0.47
|
||||||
|
rdwr_nc_write_page_test,400,7.28
|
||||||
|
rdwr_nc_read_page_test,400,7.58
|
||||||
|
rdwr_nc_write_large_test,400,0.58
|
||||||
|
rdwr_nc_read_large_test,400,0.61
|
||||||
|
rdwr_nc_write_page_test,500,9.08
|
||||||
|
rdwr_nc_read_page_test,500,9.56
|
||||||
|
rdwr_nc_write_large_test,500,0.81
|
||||||
|
rdwr_nc_read_large_test,500,0.78
|
||||||
|
mmap_write_test,100,0.01
|
||||||
|
mmap_read_test,100,0.06
|
||||||
|
mmap_write_test,200,0.03
|
||||||
|
mmap_read_test,200,0.11
|
||||||
|
mmap_write_test,300,0.05
|
||||||
|
mmap_read_test,300,0.17
|
||||||
|
mmap_write_test,400,0.05
|
||||||
|
mmap_read_test,400,0.22
|
||||||
|
mmap_write_test,500,0.06
|
||||||
|
mmap_read_test,500,0.27
|
|
120
doc/WinFsp-Performance-Testing/memfs-2.csv
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
file_create_test,1000,0.06
|
||||||
|
file_open_test,1000,0.05
|
||||||
|
file_overwrite_test,1000,0.06
|
||||||
|
file_attr_test,1000,0.03
|
||||||
|
file_list_test,1000,0.06
|
||||||
|
file_list_single_test,1000,0.12
|
||||||
|
file_list_none_test,1000,0.12
|
||||||
|
file_delete_test,1000,0.08
|
||||||
|
file_mkdir_test,1000,0.06
|
||||||
|
file_rmdir_test,1000,0.08
|
||||||
|
file_create_test,2000,0.14
|
||||||
|
file_open_test,2000,0.11
|
||||||
|
file_overwrite_test,2000,0.14
|
||||||
|
file_attr_test,2000,0.08
|
||||||
|
file_list_test,2000,0.14
|
||||||
|
file_list_single_test,2000,0.30
|
||||||
|
file_list_none_test,2000,0.27
|
||||||
|
file_delete_test,2000,0.17
|
||||||
|
file_mkdir_test,2000,0.14
|
||||||
|
file_rmdir_test,2000,0.17
|
||||||
|
file_create_test,3000,0.22
|
||||||
|
file_open_test,3000,0.16
|
||||||
|
file_overwrite_test,3000,0.20
|
||||||
|
file_attr_test,3000,0.12
|
||||||
|
file_list_test,3000,0.23
|
||||||
|
file_list_single_test,3000,0.47
|
||||||
|
file_list_none_test,3000,0.38
|
||||||
|
file_delete_test,3000,0.27
|
||||||
|
file_mkdir_test,3000,0.20
|
||||||
|
file_rmdir_test,3000,0.28
|
||||||
|
file_create_test,4000,0.42
|
||||||
|
file_open_test,4000,0.25
|
||||||
|
file_overwrite_test,4000,0.27
|
||||||
|
file_attr_test,4000,0.17
|
||||||
|
file_list_test,4000,0.34
|
||||||
|
file_list_single_test,4000,0.61
|
||||||
|
file_list_none_test,4000,0.52
|
||||||
|
file_delete_test,4000,0.34
|
||||||
|
file_mkdir_test,4000,0.25
|
||||||
|
file_rmdir_test,4000,0.36
|
||||||
|
file_create_test,5000,0.36
|
||||||
|
file_open_test,5000,0.28
|
||||||
|
file_overwrite_test,5000,0.34
|
||||||
|
file_attr_test,5000,0.22
|
||||||
|
file_list_test,5000,0.44
|
||||||
|
file_list_single_test,5000,0.78
|
||||||
|
file_list_none_test,5000,0.64
|
||||||
|
file_delete_test,5000,0.44
|
||||||
|
file_mkdir_test,5000,0.31
|
||||||
|
file_rmdir_test,5000,0.45
|
||||||
|
iter.file_open_test,10,0.55
|
||||||
|
iter.file_attr_test,10,0.42
|
||||||
|
iter.file_list_single_test,10,0.66
|
||||||
|
iter.file_list_none_test,10,0.61
|
||||||
|
iter.file_open_test,20,1.08
|
||||||
|
iter.file_attr_test,20,0.86
|
||||||
|
iter.file_list_single_test,20,1.26
|
||||||
|
iter.file_list_none_test,20,1.17
|
||||||
|
iter.file_open_test,30,1.61
|
||||||
|
iter.file_attr_test,30,1.28
|
||||||
|
iter.file_list_single_test,30,1.91
|
||||||
|
iter.file_list_none_test,30,1.81
|
||||||
|
iter.file_open_test,40,2.17
|
||||||
|
iter.file_attr_test,40,1.70
|
||||||
|
iter.file_list_single_test,40,2.61
|
||||||
|
iter.file_list_none_test,40,2.41
|
||||||
|
iter.file_open_test,50,2.70
|
||||||
|
iter.file_attr_test,50,2.09
|
||||||
|
iter.file_list_single_test,50,3.17
|
||||||
|
iter.file_list_none_test,50,2.94
|
||||||
|
rdwr_cc_write_page_test,100,0.23
|
||||||
|
rdwr_cc_read_page_test,100,0.22
|
||||||
|
rdwr_cc_write_large_test,100,0.06
|
||||||
|
rdwr_cc_read_large_test,100,0.06
|
||||||
|
rdwr_cc_write_page_test,200,0.44
|
||||||
|
rdwr_cc_read_page_test,200,0.45
|
||||||
|
rdwr_cc_write_large_test,200,0.12
|
||||||
|
rdwr_cc_read_large_test,200,0.12
|
||||||
|
rdwr_cc_write_page_test,300,0.66
|
||||||
|
rdwr_cc_read_page_test,300,0.64
|
||||||
|
rdwr_cc_write_large_test,300,0.19
|
||||||
|
rdwr_cc_read_large_test,300,0.17
|
||||||
|
rdwr_cc_write_page_test,400,0.87
|
||||||
|
rdwr_cc_read_page_test,400,0.73
|
||||||
|
rdwr_cc_write_large_test,400,0.25
|
||||||
|
rdwr_cc_read_large_test,400,0.31
|
||||||
|
rdwr_cc_write_page_test,500,1.09
|
||||||
|
rdwr_cc_read_page_test,500,1.02
|
||||||
|
rdwr_cc_write_large_test,500,0.31
|
||||||
|
rdwr_cc_read_large_test,500,0.39
|
||||||
|
rdwr_nc_write_page_test,100,1.83
|
||||||
|
rdwr_nc_read_page_test,100,1.86
|
||||||
|
rdwr_nc_write_large_test,100,0.16
|
||||||
|
rdwr_nc_read_large_test,100,0.16
|
||||||
|
rdwr_nc_write_page_test,200,3.61
|
||||||
|
rdwr_nc_read_page_test,200,3.81
|
||||||
|
rdwr_nc_write_large_test,200,0.30
|
||||||
|
rdwr_nc_read_large_test,200,0.31
|
||||||
|
rdwr_nc_write_page_test,300,5.50
|
||||||
|
rdwr_nc_read_page_test,300,5.72
|
||||||
|
rdwr_nc_write_large_test,300,0.44
|
||||||
|
rdwr_nc_read_large_test,300,0.47
|
||||||
|
rdwr_nc_write_page_test,400,7.31
|
||||||
|
rdwr_nc_read_page_test,400,7.45
|
||||||
|
rdwr_nc_write_large_test,400,0.59
|
||||||
|
rdwr_nc_read_large_test,400,0.61
|
||||||
|
rdwr_nc_write_page_test,500,9.00
|
||||||
|
rdwr_nc_read_page_test,500,9.42
|
||||||
|
rdwr_nc_write_large_test,500,0.73
|
||||||
|
rdwr_nc_read_large_test,500,0.77
|
||||||
|
mmap_write_test,100,0.01
|
||||||
|
mmap_read_test,100,0.06
|
||||||
|
mmap_write_test,200,0.03
|
||||||
|
mmap_read_test,200,0.11
|
||||||
|
mmap_write_test,300,0.03
|
||||||
|
mmap_read_test,300,0.16
|
||||||
|
mmap_write_test,400,0.05
|
||||||
|
mmap_read_test,400,0.22
|
||||||
|
mmap_write_test,500,0.06
|
||||||
|
mmap_read_test,500,0.27
|
|
120
doc/WinFsp-Performance-Testing/memfs-3.csv
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
file_create_test,1000,0.06
|
||||||
|
file_open_test,1000,0.05
|
||||||
|
file_overwrite_test,1000,0.06
|
||||||
|
file_attr_test,1000,0.03
|
||||||
|
file_list_test,1000,0.05
|
||||||
|
file_list_single_test,1000,0.14
|
||||||
|
file_list_none_test,1000,0.12
|
||||||
|
file_delete_test,1000,0.08
|
||||||
|
file_mkdir_test,1000,0.06
|
||||||
|
file_rmdir_test,1000,0.08
|
||||||
|
file_create_test,2000,0.14
|
||||||
|
file_open_test,2000,0.11
|
||||||
|
file_overwrite_test,2000,0.14
|
||||||
|
file_attr_test,2000,0.09
|
||||||
|
file_list_test,2000,0.14
|
||||||
|
file_list_single_test,2000,0.28
|
||||||
|
file_list_none_test,2000,0.25
|
||||||
|
file_delete_test,2000,0.17
|
||||||
|
file_mkdir_test,2000,0.12
|
||||||
|
file_rmdir_test,2000,0.17
|
||||||
|
file_create_test,3000,0.20
|
||||||
|
file_open_test,3000,0.17
|
||||||
|
file_overwrite_test,3000,0.20
|
||||||
|
file_attr_test,3000,0.14
|
||||||
|
file_list_test,3000,0.25
|
||||||
|
file_list_single_test,3000,0.44
|
||||||
|
file_list_none_test,3000,0.36
|
||||||
|
file_delete_test,3000,0.27
|
||||||
|
file_mkdir_test,3000,0.19
|
||||||
|
file_rmdir_test,3000,0.27
|
||||||
|
file_create_test,4000,0.28
|
||||||
|
file_open_test,4000,0.22
|
||||||
|
file_overwrite_test,4000,0.28
|
||||||
|
file_attr_test,4000,0.17
|
||||||
|
file_list_test,4000,0.33
|
||||||
|
file_list_single_test,4000,0.59
|
||||||
|
file_list_none_test,4000,0.50
|
||||||
|
file_delete_test,4000,0.34
|
||||||
|
file_mkdir_test,4000,0.27
|
||||||
|
file_rmdir_test,4000,0.36
|
||||||
|
file_create_test,5000,0.37
|
||||||
|
file_open_test,5000,0.27
|
||||||
|
file_overwrite_test,5000,0.36
|
||||||
|
file_attr_test,5000,0.22
|
||||||
|
file_list_test,5000,0.42
|
||||||
|
file_list_single_test,5000,0.75
|
||||||
|
file_list_none_test,5000,0.62
|
||||||
|
file_delete_test,5000,0.48
|
||||||
|
file_mkdir_test,5000,0.34
|
||||||
|
file_rmdir_test,5000,0.45
|
||||||
|
iter.file_open_test,10,0.53
|
||||||
|
iter.file_attr_test,10,0.42
|
||||||
|
iter.file_list_single_test,10,0.61
|
||||||
|
iter.file_list_none_test,10,0.61
|
||||||
|
iter.file_open_test,20,1.08
|
||||||
|
iter.file_attr_test,20,0.81
|
||||||
|
iter.file_list_single_test,20,1.20
|
||||||
|
iter.file_list_none_test,20,1.16
|
||||||
|
iter.file_open_test,30,1.61
|
||||||
|
iter.file_attr_test,30,1.25
|
||||||
|
iter.file_list_single_test,30,1.88
|
||||||
|
iter.file_list_none_test,30,1.81
|
||||||
|
iter.file_open_test,40,2.14
|
||||||
|
iter.file_attr_test,40,1.91
|
||||||
|
iter.file_list_single_test,40,2.66
|
||||||
|
iter.file_list_none_test,40,2.48
|
||||||
|
iter.file_open_test,50,2.73
|
||||||
|
iter.file_attr_test,50,2.14
|
||||||
|
iter.file_list_single_test,50,3.16
|
||||||
|
iter.file_list_none_test,50,3.08
|
||||||
|
rdwr_cc_write_page_test,100,0.23
|
||||||
|
rdwr_cc_read_page_test,100,0.22
|
||||||
|
rdwr_cc_write_large_test,100,0.06
|
||||||
|
rdwr_cc_read_large_test,100,0.06
|
||||||
|
rdwr_cc_write_page_test,200,0.45
|
||||||
|
rdwr_cc_read_page_test,200,0.41
|
||||||
|
rdwr_cc_write_large_test,200,0.12
|
||||||
|
rdwr_cc_read_large_test,200,0.11
|
||||||
|
rdwr_cc_write_page_test,300,0.67
|
||||||
|
rdwr_cc_read_page_test,300,0.62
|
||||||
|
rdwr_cc_write_large_test,300,0.19
|
||||||
|
rdwr_cc_read_large_test,300,0.23
|
||||||
|
rdwr_cc_write_page_test,400,0.87
|
||||||
|
rdwr_cc_read_page_test,400,0.94
|
||||||
|
rdwr_cc_write_large_test,400,0.25
|
||||||
|
rdwr_cc_read_large_test,400,0.33
|
||||||
|
rdwr_cc_write_page_test,500,1.09
|
||||||
|
rdwr_cc_read_page_test,500,1.12
|
||||||
|
rdwr_cc_write_large_test,500,0.31
|
||||||
|
rdwr_cc_read_large_test,500,0.44
|
||||||
|
rdwr_nc_write_page_test,100,1.86
|
||||||
|
rdwr_nc_read_page_test,100,1.94
|
||||||
|
rdwr_nc_write_large_test,100,0.16
|
||||||
|
rdwr_nc_read_large_test,100,0.16
|
||||||
|
rdwr_nc_write_page_test,200,3.66
|
||||||
|
rdwr_nc_read_page_test,200,3.83
|
||||||
|
rdwr_nc_write_large_test,200,0.28
|
||||||
|
rdwr_nc_read_large_test,200,0.30
|
||||||
|
rdwr_nc_write_page_test,300,5.42
|
||||||
|
rdwr_nc_read_page_test,300,5.86
|
||||||
|
rdwr_nc_write_large_test,300,0.45
|
||||||
|
rdwr_nc_read_large_test,300,0.45
|
||||||
|
rdwr_nc_write_page_test,400,7.36
|
||||||
|
rdwr_nc_read_page_test,400,7.56
|
||||||
|
rdwr_nc_write_large_test,400,0.58
|
||||||
|
rdwr_nc_read_large_test,400,0.61
|
||||||
|
rdwr_nc_write_page_test,500,9.09
|
||||||
|
rdwr_nc_read_page_test,500,9.45
|
||||||
|
rdwr_nc_write_large_test,500,0.73
|
||||||
|
rdwr_nc_read_large_test,500,0.75
|
||||||
|
mmap_write_test,100,0.01
|
||||||
|
mmap_read_test,100,0.06
|
||||||
|
mmap_write_test,200,0.03
|
||||||
|
mmap_read_test,200,0.11
|
||||||
|
mmap_write_test,300,0.05
|
||||||
|
mmap_read_test,300,0.16
|
||||||
|
mmap_write_test,400,0.05
|
||||||
|
mmap_read_test,400,0.22
|
||||||
|
mmap_write_test,500,0.06
|
||||||
|
mmap_read_test,500,0.27
|
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 40 KiB |
120
doc/WinFsp-Performance-Testing/ntfs-1.csv
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
file_create_test,1000,0.20
|
||||||
|
file_open_test,1000,0.09
|
||||||
|
file_overwrite_test,1000,0.16
|
||||||
|
file_attr_test,1000,0.08
|
||||||
|
file_list_test,1000,0.11
|
||||||
|
file_list_single_test,1000,0.08
|
||||||
|
file_list_none_test,1000,0.03
|
||||||
|
file_delete_test,1000,0.14
|
||||||
|
file_mkdir_test,1000,0.14
|
||||||
|
file_rmdir_test,1000,0.12
|
||||||
|
file_create_test,2000,0.45
|
||||||
|
file_open_test,2000,0.19
|
||||||
|
file_overwrite_test,2000,0.38
|
||||||
|
file_attr_test,2000,0.17
|
||||||
|
file_list_test,2000,0.22
|
||||||
|
file_list_single_test,2000,0.16
|
||||||
|
file_list_none_test,2000,0.06
|
||||||
|
file_delete_test,2000,0.31
|
||||||
|
file_mkdir_test,2000,0.30
|
||||||
|
file_rmdir_test,2000,0.28
|
||||||
|
file_create_test,3000,0.64
|
||||||
|
file_open_test,3000,0.28
|
||||||
|
file_overwrite_test,3000,0.55
|
||||||
|
file_attr_test,3000,0.25
|
||||||
|
file_list_test,3000,0.36
|
||||||
|
file_list_single_test,3000,0.25
|
||||||
|
file_list_none_test,3000,0.08
|
||||||
|
file_delete_test,3000,0.50
|
||||||
|
file_mkdir_test,3000,0.47
|
||||||
|
file_rmdir_test,3000,0.42
|
||||||
|
file_create_test,4000,0.83
|
||||||
|
file_open_test,4000,0.36
|
||||||
|
file_overwrite_test,4000,0.73
|
||||||
|
file_attr_test,4000,0.33
|
||||||
|
file_list_test,4000,0.45
|
||||||
|
file_list_single_test,4000,0.33
|
||||||
|
file_list_none_test,4000,0.11
|
||||||
|
file_delete_test,4000,0.64
|
||||||
|
file_mkdir_test,4000,0.64
|
||||||
|
file_rmdir_test,4000,0.53
|
||||||
|
file_create_test,5000,1.03
|
||||||
|
file_open_test,5000,0.44
|
||||||
|
file_overwrite_test,5000,0.92
|
||||||
|
file_attr_test,5000,0.38
|
||||||
|
file_list_test,5000,0.56
|
||||||
|
file_list_single_test,5000,0.39
|
||||||
|
file_list_none_test,5000,0.14
|
||||||
|
file_delete_test,5000,0.80
|
||||||
|
file_mkdir_test,5000,0.73
|
||||||
|
file_rmdir_test,5000,0.64
|
||||||
|
iter.file_open_test,10,0.25
|
||||||
|
iter.file_attr_test,10,0.19
|
||||||
|
iter.file_list_single_test,10,0.34
|
||||||
|
iter.file_list_none_test,10,0.27
|
||||||
|
iter.file_open_test,20,0.42
|
||||||
|
iter.file_attr_test,20,0.33
|
||||||
|
iter.file_list_single_test,20,0.59
|
||||||
|
iter.file_list_none_test,20,0.53
|
||||||
|
iter.file_open_test,30,0.64
|
||||||
|
iter.file_attr_test,30,0.50
|
||||||
|
iter.file_list_single_test,30,0.95
|
||||||
|
iter.file_list_none_test,30,0.77
|
||||||
|
iter.file_open_test,40,0.78
|
||||||
|
iter.file_attr_test,40,0.61
|
||||||
|
iter.file_list_single_test,40,1.19
|
||||||
|
iter.file_list_none_test,40,1.03
|
||||||
|
iter.file_open_test,50,0.98
|
||||||
|
iter.file_attr_test,50,0.73
|
||||||
|
iter.file_list_single_test,50,1.47
|
||||||
|
iter.file_list_none_test,50,1.27
|
||||||
|
rdwr_cc_write_page_test,100,0.28
|
||||||
|
rdwr_cc_read_page_test,100,0.27
|
||||||
|
rdwr_cc_write_large_test,100,0.08
|
||||||
|
rdwr_cc_read_large_test,100,0.09
|
||||||
|
rdwr_cc_write_page_test,200,0.56
|
||||||
|
rdwr_cc_read_page_test,200,0.47
|
||||||
|
rdwr_cc_write_large_test,200,0.16
|
||||||
|
rdwr_cc_read_large_test,200,0.20
|
||||||
|
rdwr_cc_write_page_test,300,0.86
|
||||||
|
rdwr_cc_read_page_test,300,0.73
|
||||||
|
rdwr_cc_write_large_test,300,0.23
|
||||||
|
rdwr_cc_read_large_test,300,0.25
|
||||||
|
rdwr_cc_write_page_test,400,1.11
|
||||||
|
rdwr_cc_read_page_test,400,0.95
|
||||||
|
rdwr_cc_write_large_test,400,0.30
|
||||||
|
rdwr_cc_read_large_test,400,0.30
|
||||||
|
rdwr_cc_write_page_test,500,1.39
|
||||||
|
rdwr_cc_read_page_test,500,1.16
|
||||||
|
rdwr_cc_write_large_test,500,0.39
|
||||||
|
rdwr_cc_read_large_test,500,0.33
|
||||||
|
rdwr_nc_write_page_test,100,4.94
|
||||||
|
rdwr_nc_read_page_test,100,4.55
|
||||||
|
rdwr_nc_write_large_test,100,0.48
|
||||||
|
rdwr_nc_read_large_test,100,0.58
|
||||||
|
rdwr_nc_write_page_test,200,9.84
|
||||||
|
rdwr_nc_read_page_test,200,9.17
|
||||||
|
rdwr_nc_write_large_test,200,0.98
|
||||||
|
rdwr_nc_read_large_test,200,1.14
|
||||||
|
rdwr_nc_write_page_test,300,14.62
|
||||||
|
rdwr_nc_read_page_test,300,13.78
|
||||||
|
rdwr_nc_write_large_test,300,1.42
|
||||||
|
rdwr_nc_read_large_test,300,1.74
|
||||||
|
rdwr_nc_write_page_test,400,19.27
|
||||||
|
rdwr_nc_read_page_test,400,17.14
|
||||||
|
rdwr_nc_write_large_test,400,1.89
|
||||||
|
rdwr_nc_read_large_test,400,2.78
|
||||||
|
rdwr_nc_write_page_test,500,23.80
|
||||||
|
rdwr_nc_read_page_test,500,21.61
|
||||||
|
rdwr_nc_write_large_test,500,2.28
|
||||||
|
rdwr_nc_read_large_test,500,3.98
|
||||||
|
mmap_write_test,100,0.01
|
||||||
|
mmap_read_test,100,0.08
|
||||||
|
mmap_write_test,200,0.03
|
||||||
|
mmap_read_test,200,0.12
|
||||||
|
mmap_write_test,300,0.05
|
||||||
|
mmap_read_test,300,0.17
|
||||||
|
mmap_write_test,400,0.05
|
||||||
|
mmap_read_test,400,0.22
|
||||||
|
mmap_write_test,500,0.06
|
||||||
|
mmap_read_test,500,0.27
|
|
120
doc/WinFsp-Performance-Testing/ntfs-2.csv
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
file_create_test,1000,0.20
|
||||||
|
file_open_test,1000,0.09
|
||||||
|
file_overwrite_test,1000,0.17
|
||||||
|
file_attr_test,1000,0.08
|
||||||
|
file_list_test,1000,0.11
|
||||||
|
file_list_single_test,1000,0.08
|
||||||
|
file_list_none_test,1000,0.03
|
||||||
|
file_delete_test,1000,0.16
|
||||||
|
file_mkdir_test,1000,0.14
|
||||||
|
file_rmdir_test,1000,0.12
|
||||||
|
file_create_test,2000,0.42
|
||||||
|
file_open_test,2000,0.19
|
||||||
|
file_overwrite_test,2000,0.41
|
||||||
|
file_attr_test,2000,0.17
|
||||||
|
file_list_test,2000,0.22
|
||||||
|
file_list_single_test,2000,0.17
|
||||||
|
file_list_none_test,2000,0.06
|
||||||
|
file_delete_test,2000,0.34
|
||||||
|
file_mkdir_test,2000,0.33
|
||||||
|
file_rmdir_test,2000,0.28
|
||||||
|
file_create_test,3000,0.66
|
||||||
|
file_open_test,3000,0.30
|
||||||
|
file_overwrite_test,3000,0.59
|
||||||
|
file_attr_test,3000,0.27
|
||||||
|
file_list_test,3000,0.36
|
||||||
|
file_list_single_test,3000,0.28
|
||||||
|
file_list_none_test,3000,0.09
|
||||||
|
file_delete_test,3000,0.52
|
||||||
|
file_mkdir_test,3000,0.48
|
||||||
|
file_rmdir_test,3000,0.41
|
||||||
|
file_create_test,4000,0.89
|
||||||
|
file_open_test,4000,0.36
|
||||||
|
file_overwrite_test,4000,0.72
|
||||||
|
file_attr_test,4000,0.34
|
||||||
|
file_list_test,4000,0.47
|
||||||
|
file_list_single_test,4000,0.33
|
||||||
|
file_list_none_test,4000,0.11
|
||||||
|
file_delete_test,4000,0.66
|
||||||
|
file_mkdir_test,4000,0.61
|
||||||
|
file_rmdir_test,4000,0.56
|
||||||
|
file_create_test,5000,1.01
|
||||||
|
file_open_test,5000,0.44
|
||||||
|
file_overwrite_test,5000,0.89
|
||||||
|
file_attr_test,5000,0.39
|
||||||
|
file_list_test,5000,0.56
|
||||||
|
file_list_single_test,5000,0.39
|
||||||
|
file_list_none_test,5000,0.14
|
||||||
|
file_delete_test,5000,0.78
|
||||||
|
file_mkdir_test,5000,0.73
|
||||||
|
file_rmdir_test,5000,0.64
|
||||||
|
iter.file_open_test,10,0.25
|
||||||
|
iter.file_attr_test,10,0.19
|
||||||
|
iter.file_list_single_test,10,0.33
|
||||||
|
iter.file_list_none_test,10,0.25
|
||||||
|
iter.file_open_test,20,0.44
|
||||||
|
iter.file_attr_test,20,0.33
|
||||||
|
iter.file_list_single_test,20,0.61
|
||||||
|
iter.file_list_none_test,20,0.52
|
||||||
|
iter.file_open_test,30,0.59
|
||||||
|
iter.file_attr_test,30,0.47
|
||||||
|
iter.file_list_single_test,30,0.89
|
||||||
|
iter.file_list_none_test,30,0.81
|
||||||
|
iter.file_open_test,40,0.84
|
||||||
|
iter.file_attr_test,40,0.67
|
||||||
|
iter.file_list_single_test,40,1.17
|
||||||
|
iter.file_list_none_test,40,1.00
|
||||||
|
iter.file_open_test,50,0.97
|
||||||
|
iter.file_attr_test,50,0.73
|
||||||
|
iter.file_list_single_test,50,1.45
|
||||||
|
iter.file_list_none_test,50,1.28
|
||||||
|
rdwr_cc_write_page_test,100,0.25
|
||||||
|
rdwr_cc_read_page_test,100,0.23
|
||||||
|
rdwr_cc_write_large_test,100,0.06
|
||||||
|
rdwr_cc_read_large_test,100,0.08
|
||||||
|
rdwr_cc_write_page_test,200,0.50
|
||||||
|
rdwr_cc_read_page_test,200,0.45
|
||||||
|
rdwr_cc_write_large_test,200,0.12
|
||||||
|
rdwr_cc_read_large_test,200,0.14
|
||||||
|
rdwr_cc_write_page_test,300,0.73
|
||||||
|
rdwr_cc_read_page_test,300,0.70
|
||||||
|
rdwr_cc_write_large_test,300,0.19
|
||||||
|
rdwr_cc_read_large_test,300,0.25
|
||||||
|
rdwr_cc_write_page_test,400,0.98
|
||||||
|
rdwr_cc_read_page_test,400,0.91
|
||||||
|
rdwr_cc_write_large_test,400,0.27
|
||||||
|
rdwr_cc_read_large_test,400,0.34
|
||||||
|
rdwr_cc_write_page_test,500,1.22
|
||||||
|
rdwr_cc_read_page_test,500,1.14
|
||||||
|
rdwr_cc_write_large_test,500,0.33
|
||||||
|
rdwr_cc_read_large_test,500,0.30
|
||||||
|
rdwr_nc_write_page_test,100,4.78
|
||||||
|
rdwr_nc_read_page_test,100,4.28
|
||||||
|
rdwr_nc_write_large_test,100,0.48
|
||||||
|
rdwr_nc_read_large_test,100,0.59
|
||||||
|
rdwr_nc_write_page_test,200,9.44
|
||||||
|
rdwr_nc_read_page_test,200,8.78
|
||||||
|
rdwr_nc_write_large_test,200,0.94
|
||||||
|
rdwr_nc_read_large_test,200,1.16
|
||||||
|
rdwr_nc_write_page_test,300,14.53
|
||||||
|
rdwr_nc_read_page_test,300,13.44
|
||||||
|
rdwr_nc_write_large_test,300,1.50
|
||||||
|
rdwr_nc_read_large_test,300,1.73
|
||||||
|
rdwr_nc_write_page_test,400,19.16
|
||||||
|
rdwr_nc_read_page_test,400,17.14
|
||||||
|
rdwr_nc_write_large_test,400,1.86
|
||||||
|
rdwr_nc_read_large_test,400,2.66
|
||||||
|
rdwr_nc_write_page_test,500,23.55
|
||||||
|
rdwr_nc_read_page_test,500,21.91
|
||||||
|
rdwr_nc_write_large_test,500,2.39
|
||||||
|
rdwr_nc_read_large_test,500,3.36
|
||||||
|
mmap_write_test,100,0.01
|
||||||
|
mmap_read_test,100,0.06
|
||||||
|
mmap_write_test,200,0.03
|
||||||
|
mmap_read_test,200,0.12
|
||||||
|
mmap_write_test,300,0.05
|
||||||
|
mmap_read_test,300,0.19
|
||||||
|
mmap_write_test,400,0.05
|
||||||
|
mmap_read_test,400,0.23
|
||||||
|
mmap_write_test,500,0.08
|
||||||
|
mmap_read_test,500,0.28
|
|
120
doc/WinFsp-Performance-Testing/ntfs-3.csv
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
file_create_test,1000,0.20
|
||||||
|
file_open_test,1000,0.09
|
||||||
|
file_overwrite_test,1000,0.17
|
||||||
|
file_attr_test,1000,0.08
|
||||||
|
file_list_test,1000,0.11
|
||||||
|
file_list_single_test,1000,0.08
|
||||||
|
file_list_none_test,1000,0.03
|
||||||
|
file_delete_test,1000,0.14
|
||||||
|
file_mkdir_test,1000,0.14
|
||||||
|
file_rmdir_test,1000,0.14
|
||||||
|
file_create_test,2000,0.42
|
||||||
|
file_open_test,2000,0.19
|
||||||
|
file_overwrite_test,2000,0.38
|
||||||
|
file_attr_test,2000,0.19
|
||||||
|
file_list_test,2000,0.23
|
||||||
|
file_list_single_test,2000,0.17
|
||||||
|
file_list_none_test,2000,0.06
|
||||||
|
file_delete_test,2000,0.33
|
||||||
|
file_mkdir_test,2000,0.30
|
||||||
|
file_rmdir_test,2000,0.27
|
||||||
|
file_create_test,3000,0.64
|
||||||
|
file_open_test,3000,0.30
|
||||||
|
file_overwrite_test,3000,0.59
|
||||||
|
file_attr_test,3000,0.25
|
||||||
|
file_list_test,3000,0.36
|
||||||
|
file_list_single_test,3000,0.27
|
||||||
|
file_list_none_test,3000,0.08
|
||||||
|
file_delete_test,3000,0.48
|
||||||
|
file_mkdir_test,3000,0.47
|
||||||
|
file_rmdir_test,3000,0.42
|
||||||
|
file_create_test,4000,0.86
|
||||||
|
file_open_test,4000,0.38
|
||||||
|
file_overwrite_test,4000,0.73
|
||||||
|
file_attr_test,4000,0.33
|
||||||
|
file_list_test,4000,0.48
|
||||||
|
file_list_single_test,4000,0.33
|
||||||
|
file_list_none_test,4000,0.11
|
||||||
|
file_delete_test,4000,0.64
|
||||||
|
file_mkdir_test,4000,0.62
|
||||||
|
file_rmdir_test,4000,0.52
|
||||||
|
file_create_test,5000,1.03
|
||||||
|
file_open_test,5000,0.44
|
||||||
|
file_overwrite_test,5000,0.92
|
||||||
|
file_attr_test,5000,0.38
|
||||||
|
file_list_test,5000,0.58
|
||||||
|
file_list_single_test,5000,0.38
|
||||||
|
file_list_none_test,5000,0.14
|
||||||
|
file_delete_test,5000,0.80
|
||||||
|
file_mkdir_test,5000,0.73
|
||||||
|
file_rmdir_test,5000,0.69
|
||||||
|
iter.file_open_test,10,0.25
|
||||||
|
iter.file_attr_test,10,0.19
|
||||||
|
iter.file_list_single_test,10,0.33
|
||||||
|
iter.file_list_none_test,10,0.26
|
||||||
|
iter.file_open_test,20,0.44
|
||||||
|
iter.file_attr_test,20,0.34
|
||||||
|
iter.file_list_single_test,20,0.61
|
||||||
|
iter.file_list_none_test,20,0.52
|
||||||
|
iter.file_open_test,30,0.61
|
||||||
|
iter.file_attr_test,30,0.48
|
||||||
|
iter.file_list_single_test,30,0.88
|
||||||
|
iter.file_list_none_test,30,0.78
|
||||||
|
iter.file_open_test,40,0.77
|
||||||
|
iter.file_attr_test,40,0.61
|
||||||
|
iter.file_list_single_test,40,1.19
|
||||||
|
iter.file_list_none_test,40,1.03
|
||||||
|
iter.file_open_test,50,0.95
|
||||||
|
iter.file_attr_test,50,0.73
|
||||||
|
iter.file_list_single_test,50,1.42
|
||||||
|
iter.file_list_none_test,50,1.28
|
||||||
|
rdwr_cc_write_page_test,100,0.25
|
||||||
|
rdwr_cc_read_page_test,100,0.23
|
||||||
|
rdwr_cc_write_large_test,100,0.08
|
||||||
|
rdwr_cc_read_large_test,100,0.08
|
||||||
|
rdwr_cc_write_page_test,200,0.48
|
||||||
|
rdwr_cc_read_page_test,200,0.45
|
||||||
|
rdwr_cc_write_large_test,200,0.12
|
||||||
|
rdwr_cc_read_large_test,200,0.17
|
||||||
|
rdwr_cc_write_page_test,300,0.73
|
||||||
|
rdwr_cc_read_page_test,300,0.61
|
||||||
|
rdwr_cc_write_large_test,300,0.19
|
||||||
|
rdwr_cc_read_large_test,300,0.23
|
||||||
|
rdwr_cc_write_page_test,400,0.97
|
||||||
|
rdwr_cc_read_page_test,400,0.88
|
||||||
|
rdwr_cc_write_large_test,400,0.27
|
||||||
|
rdwr_cc_read_large_test,400,0.33
|
||||||
|
rdwr_cc_write_page_test,500,1.20
|
||||||
|
rdwr_cc_read_page_test,500,1.14
|
||||||
|
rdwr_cc_write_large_test,500,0.31
|
||||||
|
rdwr_cc_read_large_test,500,0.39
|
||||||
|
rdwr_nc_write_page_test,100,4.76
|
||||||
|
rdwr_nc_read_page_test,100,4.24
|
||||||
|
rdwr_nc_write_large_test,100,0.47
|
||||||
|
rdwr_nc_read_large_test,100,0.56
|
||||||
|
rdwr_nc_write_page_test,200,9.44
|
||||||
|
rdwr_nc_read_page_test,200,8.44
|
||||||
|
rdwr_nc_write_large_test,200,0.94
|
||||||
|
rdwr_nc_read_large_test,200,1.14
|
||||||
|
rdwr_nc_write_page_test,300,14.19
|
||||||
|
rdwr_nc_read_page_test,300,12.70
|
||||||
|
rdwr_nc_write_large_test,300,1.39
|
||||||
|
rdwr_nc_read_large_test,300,1.74
|
||||||
|
rdwr_nc_write_page_test,400,19.20
|
||||||
|
rdwr_nc_read_page_test,400,17.41
|
||||||
|
rdwr_nc_write_large_test,400,1.95
|
||||||
|
rdwr_nc_read_large_test,400,2.53
|
||||||
|
rdwr_nc_write_page_test,500,24.02
|
||||||
|
rdwr_nc_read_page_test,500,22.16
|
||||||
|
rdwr_nc_write_large_test,500,2.42
|
||||||
|
rdwr_nc_read_large_test,500,3.14
|
||||||
|
mmap_write_test,100,0.01
|
||||||
|
mmap_read_test,100,0.08
|
||||||
|
mmap_write_test,200,0.03
|
||||||
|
mmap_read_test,200,0.14
|
||||||
|
mmap_write_test,300,0.05
|
||||||
|
mmap_read_test,300,0.17
|
||||||
|
mmap_write_test,400,0.05
|
||||||
|
mmap_read_test,400,0.22
|
||||||
|
mmap_write_test,500,0.06
|
||||||
|
mmap_read_test,500,0.28
|
|
120
doc/WinFsp-Performance-Testing/ntptfs-1.csv
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
file_create_test,1000,0.28
|
||||||
|
file_open_test,1000,0.22
|
||||||
|
file_overwrite_test,1000,0.33
|
||||||
|
file_attr_test,1000,0.20
|
||||||
|
file_list_test,1000,0.19
|
||||||
|
file_list_single_test,1000,0.22
|
||||||
|
file_list_none_test,1000,0.17
|
||||||
|
file_delete_test,1000,0.30
|
||||||
|
file_mkdir_test,1000,0.23
|
||||||
|
file_rmdir_test,1000,0.28
|
||||||
|
file_create_test,2000,0.64
|
||||||
|
file_open_test,2000,0.45
|
||||||
|
file_overwrite_test,2000,0.73
|
||||||
|
file_attr_test,2000,0.42
|
||||||
|
file_list_test,2000,0.39
|
||||||
|
file_list_single_test,2000,0.52
|
||||||
|
file_list_none_test,2000,0.38
|
||||||
|
file_delete_test,2000,0.62
|
||||||
|
file_mkdir_test,2000,0.47
|
||||||
|
file_rmdir_test,2000,0.56
|
||||||
|
file_create_test,3000,0.94
|
||||||
|
file_open_test,3000,0.70
|
||||||
|
file_overwrite_test,3000,1.12
|
||||||
|
file_attr_test,3000,0.66
|
||||||
|
file_list_test,3000,0.62
|
||||||
|
file_list_single_test,3000,0.83
|
||||||
|
file_list_none_test,3000,0.55
|
||||||
|
file_delete_test,3000,0.98
|
||||||
|
file_mkdir_test,3000,0.72
|
||||||
|
file_rmdir_test,3000,0.84
|
||||||
|
file_create_test,4000,1.22
|
||||||
|
file_open_test,4000,0.90
|
||||||
|
file_overwrite_test,4000,1.45
|
||||||
|
file_attr_test,4000,0.84
|
||||||
|
file_list_test,4000,0.84
|
||||||
|
file_list_single_test,4000,1.14
|
||||||
|
file_list_none_test,4000,0.73
|
||||||
|
file_delete_test,4000,1.26
|
||||||
|
file_mkdir_test,4000,0.97
|
||||||
|
file_rmdir_test,4000,1.20
|
||||||
|
file_create_test,5000,1.53
|
||||||
|
file_open_test,5000,1.09
|
||||||
|
file_overwrite_test,5000,1.75
|
||||||
|
file_attr_test,5000,1.02
|
||||||
|
file_list_test,5000,1.02
|
||||||
|
file_list_single_test,5000,1.41
|
||||||
|
file_list_none_test,5000,0.91
|
||||||
|
file_delete_test,5000,1.62
|
||||||
|
file_mkdir_test,5000,1.19
|
||||||
|
file_rmdir_test,5000,1.45
|
||||||
|
iter.file_open_test,10,1.47
|
||||||
|
iter.file_attr_test,10,1.34
|
||||||
|
iter.file_list_single_test,10,1.28
|
||||||
|
iter.file_list_none_test,10,1.16
|
||||||
|
iter.file_open_test,20,2.84
|
||||||
|
iter.file_attr_test,20,2.61
|
||||||
|
iter.file_list_single_test,20,2.52
|
||||||
|
iter.file_list_none_test,20,2.27
|
||||||
|
iter.file_open_test,30,4.22
|
||||||
|
iter.file_attr_test,30,3.91
|
||||||
|
iter.file_list_single_test,30,3.77
|
||||||
|
iter.file_list_none_test,30,3.50
|
||||||
|
iter.file_open_test,40,5.61
|
||||||
|
iter.file_attr_test,40,5.22
|
||||||
|
iter.file_list_single_test,40,5.09
|
||||||
|
iter.file_list_none_test,40,4.64
|
||||||
|
iter.file_open_test,50,7.00
|
||||||
|
iter.file_attr_test,50,6.42
|
||||||
|
iter.file_list_single_test,50,6.16
|
||||||
|
iter.file_list_none_test,50,5.66
|
||||||
|
rdwr_cc_write_page_test,100,0.23
|
||||||
|
rdwr_cc_read_page_test,100,0.23
|
||||||
|
rdwr_cc_write_large_test,100,0.06
|
||||||
|
rdwr_cc_read_large_test,100,0.06
|
||||||
|
rdwr_cc_write_page_test,200,0.44
|
||||||
|
rdwr_cc_read_page_test,200,0.42
|
||||||
|
rdwr_cc_write_large_test,200,0.12
|
||||||
|
rdwr_cc_read_large_test,200,0.12
|
||||||
|
rdwr_cc_write_page_test,300,0.66
|
||||||
|
rdwr_cc_read_page_test,300,0.59
|
||||||
|
rdwr_cc_write_large_test,300,0.20
|
||||||
|
rdwr_cc_read_large_test,300,0.17
|
||||||
|
rdwr_cc_write_page_test,400,0.88
|
||||||
|
rdwr_cc_read_page_test,400,0.77
|
||||||
|
rdwr_cc_write_large_test,400,0.27
|
||||||
|
rdwr_cc_read_large_test,400,0.20
|
||||||
|
rdwr_cc_write_page_test,500,1.09
|
||||||
|
rdwr_cc_read_page_test,500,0.97
|
||||||
|
rdwr_cc_write_large_test,500,0.31
|
||||||
|
rdwr_cc_read_large_test,500,0.25
|
||||||
|
rdwr_nc_write_page_test,100,2.61
|
||||||
|
rdwr_nc_read_page_test,100,2.41
|
||||||
|
rdwr_nc_write_large_test,100,0.25
|
||||||
|
rdwr_nc_read_large_test,100,0.25
|
||||||
|
rdwr_nc_write_page_test,200,5.22
|
||||||
|
rdwr_nc_read_page_test,200,4.81
|
||||||
|
rdwr_nc_write_large_test,200,0.48
|
||||||
|
rdwr_nc_read_large_test,200,0.47
|
||||||
|
rdwr_nc_write_page_test,300,7.95
|
||||||
|
rdwr_nc_read_page_test,300,7.08
|
||||||
|
rdwr_nc_write_large_test,300,0.72
|
||||||
|
rdwr_nc_read_large_test,300,0.70
|
||||||
|
rdwr_nc_write_page_test,400,10.38
|
||||||
|
rdwr_nc_read_page_test,400,9.25
|
||||||
|
rdwr_nc_write_large_test,400,0.98
|
||||||
|
rdwr_nc_read_large_test,400,0.94
|
||||||
|
rdwr_nc_write_page_test,500,13.05
|
||||||
|
rdwr_nc_read_page_test,500,11.56
|
||||||
|
rdwr_nc_write_large_test,500,1.23
|
||||||
|
rdwr_nc_read_large_test,500,1.23
|
||||||
|
mmap_write_test,100,0.01
|
||||||
|
mmap_read_test,100,0.06
|
||||||
|
mmap_write_test,200,0.03
|
||||||
|
mmap_read_test,200,0.12
|
||||||
|
mmap_write_test,300,0.05
|
||||||
|
mmap_read_test,300,0.17
|
||||||
|
mmap_write_test,400,0.06
|
||||||
|
mmap_read_test,400,0.22
|
||||||
|
mmap_write_test,500,0.06
|
||||||
|
mmap_read_test,500,0.28
|
|
120
doc/WinFsp-Performance-Testing/ntptfs-2.csv
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
file_create_test,1000,0.30
|
||||||
|
file_open_test,1000,0.22
|
||||||
|
file_overwrite_test,1000,0.34
|
||||||
|
file_attr_test,1000,0.20
|
||||||
|
file_list_test,1000,0.19
|
||||||
|
file_list_single_test,1000,0.22
|
||||||
|
file_list_none_test,1000,0.17
|
||||||
|
file_delete_test,1000,0.31
|
||||||
|
file_mkdir_test,1000,0.22
|
||||||
|
file_rmdir_test,1000,0.27
|
||||||
|
file_create_test,2000,0.61
|
||||||
|
file_open_test,2000,0.44
|
||||||
|
file_overwrite_test,2000,0.69
|
||||||
|
file_attr_test,2000,0.44
|
||||||
|
file_list_test,2000,0.41
|
||||||
|
file_list_single_test,2000,0.53
|
||||||
|
file_list_none_test,2000,0.36
|
||||||
|
file_delete_test,2000,0.64
|
||||||
|
file_mkdir_test,2000,0.47
|
||||||
|
file_rmdir_test,2000,0.55
|
||||||
|
file_create_test,3000,0.97
|
||||||
|
file_open_test,3000,0.69
|
||||||
|
file_overwrite_test,3000,1.08
|
||||||
|
file_attr_test,3000,0.64
|
||||||
|
file_list_test,3000,0.64
|
||||||
|
file_list_single_test,3000,0.88
|
||||||
|
file_list_none_test,3000,0.56
|
||||||
|
file_delete_test,3000,0.97
|
||||||
|
file_mkdir_test,3000,0.73
|
||||||
|
file_rmdir_test,3000,0.80
|
||||||
|
file_create_test,4000,1.20
|
||||||
|
file_open_test,4000,0.91
|
||||||
|
file_overwrite_test,4000,1.49
|
||||||
|
file_attr_test,4000,0.83
|
||||||
|
file_list_test,4000,0.83
|
||||||
|
file_list_single_test,4000,1.19
|
||||||
|
file_list_none_test,4000,0.75
|
||||||
|
file_delete_test,4000,1.28
|
||||||
|
file_mkdir_test,4000,0.92
|
||||||
|
file_rmdir_test,4000,1.08
|
||||||
|
file_create_test,5000,1.44
|
||||||
|
file_open_test,5000,1.09
|
||||||
|
file_overwrite_test,5000,1.83
|
||||||
|
file_attr_test,5000,1.02
|
||||||
|
file_list_test,5000,1.03
|
||||||
|
file_list_single_test,5000,1.50
|
||||||
|
file_list_none_test,5000,0.94
|
||||||
|
file_delete_test,5000,1.58
|
||||||
|
file_mkdir_test,5000,1.12
|
||||||
|
file_rmdir_test,5000,1.42
|
||||||
|
iter.file_open_test,10,1.47
|
||||||
|
iter.file_attr_test,10,1.34
|
||||||
|
iter.file_list_single_test,10,1.31
|
||||||
|
iter.file_list_none_test,10,1.17
|
||||||
|
iter.file_open_test,20,2.84
|
||||||
|
iter.file_attr_test,20,2.61
|
||||||
|
iter.file_list_single_test,20,2.53
|
||||||
|
iter.file_list_none_test,20,2.31
|
||||||
|
iter.file_open_test,30,4.20
|
||||||
|
iter.file_attr_test,30,3.88
|
||||||
|
iter.file_list_single_test,30,3.78
|
||||||
|
iter.file_list_none_test,30,3.58
|
||||||
|
iter.file_open_test,40,5.59
|
||||||
|
iter.file_attr_test,40,5.12
|
||||||
|
iter.file_list_single_test,40,4.89
|
||||||
|
iter.file_list_none_test,40,4.62
|
||||||
|
iter.file_open_test,50,7.05
|
||||||
|
iter.file_attr_test,50,6.42
|
||||||
|
iter.file_list_single_test,50,6.22
|
||||||
|
iter.file_list_none_test,50,5.72
|
||||||
|
rdwr_cc_write_page_test,100,0.23
|
||||||
|
rdwr_cc_read_page_test,100,0.25
|
||||||
|
rdwr_cc_write_large_test,100,0.06
|
||||||
|
rdwr_cc_read_large_test,100,0.06
|
||||||
|
rdwr_cc_write_page_test,200,0.45
|
||||||
|
rdwr_cc_read_page_test,200,0.41
|
||||||
|
rdwr_cc_write_large_test,200,0.12
|
||||||
|
rdwr_cc_read_large_test,200,0.12
|
||||||
|
rdwr_cc_write_page_test,300,0.66
|
||||||
|
rdwr_cc_read_page_test,300,0.59
|
||||||
|
rdwr_cc_write_large_test,300,0.20
|
||||||
|
rdwr_cc_read_large_test,300,0.16
|
||||||
|
rdwr_cc_write_page_test,400,0.87
|
||||||
|
rdwr_cc_read_page_test,400,0.77
|
||||||
|
rdwr_cc_write_large_test,400,0.25
|
||||||
|
rdwr_cc_read_large_test,400,0.20
|
||||||
|
rdwr_cc_write_page_test,500,1.08
|
||||||
|
rdwr_cc_read_page_test,500,0.95
|
||||||
|
rdwr_cc_write_large_test,500,0.31
|
||||||
|
rdwr_cc_read_large_test,500,0.25
|
||||||
|
rdwr_nc_write_page_test,100,2.61
|
||||||
|
rdwr_nc_read_page_test,100,2.41
|
||||||
|
rdwr_nc_write_large_test,100,0.27
|
||||||
|
rdwr_nc_read_large_test,100,0.23
|
||||||
|
rdwr_nc_write_page_test,200,5.23
|
||||||
|
rdwr_nc_read_page_test,200,4.76
|
||||||
|
rdwr_nc_write_large_test,200,0.50
|
||||||
|
rdwr_nc_read_large_test,200,0.45
|
||||||
|
rdwr_nc_write_page_test,300,8.03
|
||||||
|
rdwr_nc_read_page_test,300,7.17
|
||||||
|
rdwr_nc_write_large_test,300,0.73
|
||||||
|
rdwr_nc_read_large_test,300,0.66
|
||||||
|
rdwr_nc_write_page_test,400,10.75
|
||||||
|
rdwr_nc_read_page_test,400,9.47
|
||||||
|
rdwr_nc_write_large_test,400,0.98
|
||||||
|
rdwr_nc_read_large_test,400,0.86
|
||||||
|
rdwr_nc_write_page_test,500,13.12
|
||||||
|
rdwr_nc_read_page_test,500,11.69
|
||||||
|
rdwr_nc_write_large_test,500,1.25
|
||||||
|
rdwr_nc_read_large_test,500,1.27
|
||||||
|
mmap_write_test,100,0.01
|
||||||
|
mmap_read_test,100,0.08
|
||||||
|
mmap_write_test,200,0.03
|
||||||
|
mmap_read_test,200,0.12
|
||||||
|
mmap_write_test,300,0.05
|
||||||
|
mmap_read_test,300,0.17
|
||||||
|
mmap_write_test,400,0.06
|
||||||
|
mmap_read_test,400,0.22
|
||||||
|
mmap_write_test,500,0.08
|
||||||
|
mmap_read_test,500,0.27
|
|
120
doc/WinFsp-Performance-Testing/ntptfs-3.csv
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
file_create_test,1000,0.28
|
||||||
|
file_open_test,1000,0.22
|
||||||
|
file_overwrite_test,1000,0.36
|
||||||
|
file_attr_test,1000,0.19
|
||||||
|
file_list_test,1000,0.17
|
||||||
|
file_list_single_test,1000,0.22
|
||||||
|
file_list_none_test,1000,0.19
|
||||||
|
file_delete_test,1000,0.31
|
||||||
|
file_mkdir_test,1000,0.23
|
||||||
|
file_rmdir_test,1000,0.28
|
||||||
|
file_create_test,2000,0.58
|
||||||
|
file_open_test,2000,0.52
|
||||||
|
file_overwrite_test,2000,0.84
|
||||||
|
file_attr_test,2000,0.52
|
||||||
|
file_list_test,2000,0.44
|
||||||
|
file_list_single_test,2000,0.56
|
||||||
|
file_list_none_test,2000,0.38
|
||||||
|
file_delete_test,2000,0.64
|
||||||
|
file_mkdir_test,2000,0.47
|
||||||
|
file_rmdir_test,2000,0.55
|
||||||
|
file_create_test,3000,0.92
|
||||||
|
file_open_test,3000,0.66
|
||||||
|
file_overwrite_test,3000,1.06
|
||||||
|
file_attr_test,3000,0.66
|
||||||
|
file_list_test,3000,0.64
|
||||||
|
file_list_single_test,3000,0.86
|
||||||
|
file_list_none_test,3000,0.56
|
||||||
|
file_delete_test,3000,1.00
|
||||||
|
file_mkdir_test,3000,0.77
|
||||||
|
file_rmdir_test,3000,0.86
|
||||||
|
file_create_test,4000,1.22
|
||||||
|
file_open_test,4000,0.89
|
||||||
|
file_overwrite_test,4000,1.44
|
||||||
|
file_attr_test,4000,0.81
|
||||||
|
file_list_test,4000,0.84
|
||||||
|
file_list_single_test,4000,1.12
|
||||||
|
file_list_none_test,4000,0.73
|
||||||
|
file_delete_test,4000,1.31
|
||||||
|
file_mkdir_test,4000,0.97
|
||||||
|
file_rmdir_test,4000,1.12
|
||||||
|
file_create_test,5000,1.53
|
||||||
|
file_open_test,5000,1.05
|
||||||
|
file_overwrite_test,5000,1.73
|
||||||
|
file_attr_test,5000,1.02
|
||||||
|
file_list_test,5000,1.03
|
||||||
|
file_list_single_test,5000,1.41
|
||||||
|
file_list_none_test,5000,0.94
|
||||||
|
file_delete_test,5000,1.61
|
||||||
|
file_mkdir_test,5000,1.20
|
||||||
|
file_rmdir_test,5000,1.36
|
||||||
|
iter.file_open_test,10,1.44
|
||||||
|
iter.file_attr_test,10,1.38
|
||||||
|
iter.file_list_single_test,10,1.26
|
||||||
|
iter.file_list_none_test,10,1.14
|
||||||
|
iter.file_open_test,20,2.89
|
||||||
|
iter.file_attr_test,20,2.61
|
||||||
|
iter.file_list_single_test,20,2.52
|
||||||
|
iter.file_list_none_test,20,2.45
|
||||||
|
iter.file_open_test,30,4.19
|
||||||
|
iter.file_attr_test,30,3.86
|
||||||
|
iter.file_list_single_test,30,3.77
|
||||||
|
iter.file_list_none_test,30,3.47
|
||||||
|
iter.file_open_test,40,5.64
|
||||||
|
iter.file_attr_test,40,5.17
|
||||||
|
iter.file_list_single_test,40,4.84
|
||||||
|
iter.file_list_none_test,40,4.55
|
||||||
|
iter.file_open_test,50,7.00
|
||||||
|
iter.file_attr_test,50,6.44
|
||||||
|
iter.file_list_single_test,50,6.12
|
||||||
|
iter.file_list_none_test,50,5.64
|
||||||
|
rdwr_cc_write_page_test,100,0.27
|
||||||
|
rdwr_cc_read_page_test,100,0.23
|
||||||
|
rdwr_cc_write_large_test,100,0.06
|
||||||
|
rdwr_cc_read_large_test,100,0.06
|
||||||
|
rdwr_cc_write_page_test,200,0.44
|
||||||
|
rdwr_cc_read_page_test,200,0.41
|
||||||
|
rdwr_cc_write_large_test,200,0.12
|
||||||
|
rdwr_cc_read_large_test,200,0.11
|
||||||
|
rdwr_cc_write_page_test,300,0.67
|
||||||
|
rdwr_cc_read_page_test,300,0.59
|
||||||
|
rdwr_cc_write_large_test,300,0.19
|
||||||
|
rdwr_cc_read_large_test,300,0.16
|
||||||
|
rdwr_cc_write_page_test,400,0.87
|
||||||
|
rdwr_cc_read_page_test,400,0.77
|
||||||
|
rdwr_cc_write_large_test,400,0.25
|
||||||
|
rdwr_cc_read_large_test,400,0.22
|
||||||
|
rdwr_cc_write_page_test,500,1.09
|
||||||
|
rdwr_cc_read_page_test,500,0.94
|
||||||
|
rdwr_cc_write_large_test,500,0.31
|
||||||
|
rdwr_cc_read_large_test,500,0.27
|
||||||
|
rdwr_nc_write_page_test,100,2.56
|
||||||
|
rdwr_nc_read_page_test,100,2.38
|
||||||
|
rdwr_nc_write_large_test,100,0.23
|
||||||
|
rdwr_nc_read_large_test,100,0.23
|
||||||
|
rdwr_nc_write_page_test,200,5.20
|
||||||
|
rdwr_nc_read_page_test,200,4.62
|
||||||
|
rdwr_nc_write_large_test,200,0.48
|
||||||
|
rdwr_nc_read_large_test,200,0.45
|
||||||
|
rdwr_nc_write_page_test,300,7.70
|
||||||
|
rdwr_nc_read_page_test,300,6.86
|
||||||
|
rdwr_nc_write_large_test,300,0.73
|
||||||
|
rdwr_nc_read_large_test,300,0.70
|
||||||
|
rdwr_nc_write_page_test,400,10.23
|
||||||
|
rdwr_nc_read_page_test,400,9.17
|
||||||
|
rdwr_nc_write_large_test,400,0.95
|
||||||
|
rdwr_nc_read_large_test,400,0.94
|
||||||
|
rdwr_nc_write_page_test,500,12.91
|
||||||
|
rdwr_nc_read_page_test,500,11.66
|
||||||
|
rdwr_nc_write_large_test,500,1.22
|
||||||
|
rdwr_nc_read_large_test,500,1.25
|
||||||
|
mmap_write_test,100,0.01
|
||||||
|
mmap_read_test,100,0.06
|
||||||
|
mmap_write_test,200,0.03
|
||||||
|
mmap_read_test,200,0.12
|
||||||
|
mmap_write_test,300,0.05
|
||||||
|
mmap_read_test,300,0.17
|
||||||
|
mmap_write_test,400,0.06
|
||||||
|
mmap_read_test,400,0.23
|
||||||
|
mmap_write_test,500,0.06
|
||||||
|
mmap_read_test,500,0.28
|
|
BIN
doc/WinFsp-Performance-Testing/rdwr_cc_read_large_test.png
Normal file
After Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 52 KiB |
BIN
doc/WinFsp-Performance-Testing/rdwr_cc_write_large_test.png
Normal file
After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 49 KiB |
BIN
doc/WinFsp-Performance-Testing/rdwr_nc_read_large_test.png
Normal file
After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 51 KiB |
BIN
doc/WinFsp-Performance-Testing/rdwr_nc_write_large_test.png
Normal file
After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 37 KiB |
@ -4,7 +4,7 @@ If you have a commercial WinFsp license and wish to produce a rebranded version
|
|||||||
|
|
||||||
== Overview
|
== Overview
|
||||||
|
|
||||||
The WinFsp build is controlled by the file `build\VStudio\version.properties`. The file contains properties that control the final build output in a number of ways. Some of the properties in this file control how the final build product is branded, others how it is versioned, etc.
|
The WinFsp build is controlled by the file `build\VStudio\build.version.props`. The file contains properties that control the final build output in a number of ways. Some of the properties in this file control how the final build product is branded, others how it is versioned, etc.
|
||||||
|
|
||||||
=== Branding
|
=== Branding
|
||||||
|
|
||||||
|
128
doc/WinFsp-Registry-Settings.md
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
# WinFsp Registry Settings
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
📁 <code>HKLM\SYSTEM\CurrentControlSet\Services\WinFsp</code>
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
|
||||||
|
Stores information about the WinFsp file system driver as required by the Windows OS.
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
📁 <code>HKLM\SYSTEM\CurrentControlSet\Services\WinFsp.Launcher</code>
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
|
||||||
|
Stores information about the WinFsp Launcher service as required by the Windows OS.
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
📁 <code>HKLM\SYSTEM\CurrentControlSet\Services\WinFsp.Np</code>
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
|
||||||
|
Stores information about the WinFsp network provider as required by the Windows OS.
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
📁 <code>HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Application\WinFsp</code>
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
|
||||||
|
Stores information about the WinFsp event source as required by the Windows OS.
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
📁 <code>HKLM\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order</code>
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
|
||||||
|
Stores information about the WinFsp network provider as required by the Windows OS.
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
📁 <code>HKLM\SOFTWARE\WinFsp</code>
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
|
||||||
|
Primary registry key used to store WinFsp settings. On a 64-bit system (x64 or ARM64) this key is stored in the 32-bit portion of the registry and its true location is `HKLM\SOFTWARE\WOW6432Node\WinFsp`.
|
||||||
|
|
||||||
|
* `InstallDir (REG_SZ)`: Contains the WinFsp installation directory.
|
||||||
|
|
||||||
|
* `SxsDir (REG_SZ)`: Contains the WinFsp Side-by-Side (SxS) directory. The SxS directory allows for multiple versions of WinFsp to be active at the same time and among other benefits it enables reinstalling WinFsp without reboot. The SxS directory contains primarily executable files.
|
||||||
|
|
||||||
|
* `DistinctPermsForSameOwnerGroup (REG_DWORD)`: Directs how WinFsp-FUSE should consider UNIX owner and group permissions in the case when the Windows owner and group SID are the same (for example, this can happen when someone uses a Microsoft account as their primary login). When this setting is 0 and the Windows owner and group SID are the same, WinFsp-FUSE combines the UNIX owner and group permissions (for example, user permission `rw-` and group permission `---` combine to `---`), which can result in inadvertent "access denied" errors. When this setting is 1 and even if the Windows owner and group SID are the same, WinFsp-FUSE looks at the UNIX owner permissions and the UNIX group permissions separately. The default value is 1 since v1.11B1 and was 0 in earlier versions.
|
||||||
|
|
||||||
|
* `MountBroadcastDriveChange (REG_DWORD)`: A value of 1 instructs WinFsp to broadcast an additional "drive change" message to all top-level windows during mounting and unmounting. The default value is 0. Normally the Windows infrastructure broadcasts a `WM_DEVICECHANGE` message whenever a drive gets added/removed. In some rare systems it is possible for this message to get lost or stalled. The workaround for these rare systems is to enable this registry setting, in which case WinFsp will broadcast the `WM_DEVICECHANGE` using a slightly different but more reliable method than the one Windows uses.
|
||||||
|
|
||||||
|
* `MountDoNotUseLauncher (REG_DWORD)`: A value of 1 disallows the use of the Launcher for drive mounting. The default value of 0 allows use of the Launcher for drive mounting when necessary. In general the Launcher is not necessary for mounting. However when running a file system in the Windows Service context (session 0) under an account that is not LocalSystem (e.g. `NT AUTHORITY\NETWORK SERVICE`), the Launcher is used to create global drives.
|
||||||
|
|
||||||
|
* `MountUseMountmgrFromFSD (REG_DWORD)`: A value of 1 instructs WinFsp to use the Mount Manager from the FSD (File System Driver) which runs in kernel mode. The default value of 0 instructs WinFsp to use the Mount Manager from the DLL which runs in user mode. Using the Mount Manager from user mode requires Administrator access and this setting allows a file system to circumvent the Administrator access requirement. This setting is not recommended for general use.
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
📁 <code>HKLM\SOFTWARE\WinFsp\Services\:SERVICE</code>
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
|
||||||
|
Registry key used to store information about the WinFsp service with name `:SERVICE`. WinFsp services are user mode file systems controlled by the Launcher; for more information see the [Service Architecture](WinFsp-Service-Architecture.asciidoc) document. On a 64-bit system (x64 or ARM64) this key is stored in the 32-bit portion of the registry and its true location is `HKLM\SOFTWARE\WOW6432Node\WinFsp\Services\:SERVICE`.
|
||||||
|
|
||||||
|
* `Agent (REG_SZ)`: UNDOCUMENTED (see source code).
|
||||||
|
|
||||||
|
* `Executable (REG_SZ)`: Contains the path to the executable to use when launching the service.
|
||||||
|
|
||||||
|
* `CommandLine (REG_SZ)`: Contains the command line to use when launching the service.
|
||||||
|
|
||||||
|
* `WorkDirectory (REG_SZ)`: Contains the working directory to use when launching the service.
|
||||||
|
|
||||||
|
* `RunAs (REG_SZ)`: Controls the account used when launching the service. Possible values are `LocalSystem` (default), `LocalService`, `NetworkService` and `.` (dot). The `.` (dot) value means that the service should be launched as the account that is launching the file system (e.g. via `net use` or Explorer's "Map Network Drive").
|
||||||
|
|
||||||
|
* `Security (REG_SZ)`: Controls which users can launch the service.
|
||||||
|
|
||||||
|
* `AuthPackage (REG_SZ)`: UNDOCUMENTED (see source code).
|
||||||
|
|
||||||
|
* `Stderr (REG_SZ)`: Specifies a path that the Launcher will redirect service error output to.
|
||||||
|
|
||||||
|
* `JobControl (REG_DWORD)`: Controls whether the service is running in the same job as the Launcher. The default value is 1.
|
||||||
|
|
||||||
|
* `Credentials (REG_DWORD)`: Controls whether the file system requires credentials.
|
||||||
|
|
||||||
|
* `AuthPackageId (REG_DWORD)`: UNDOCUMENTED (see source code).
|
||||||
|
|
||||||
|
* `Recovery (REG_DWORD)`: A value of 1 instructs the Launcher to restart a service that has crashed. The default value is 0.
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
📁 <code>HKLM\SOFTWARE\WinFsp\Fsext</code>
|
||||||
|
</summary>
|
||||||
|
<blockquote>
|
||||||
|
|
||||||
|
Registry key used to store WinFsp fsext provider information. Fsext providers are kernel mode file systems that interface with WinFsp; for more information see the [Kernel Mode File Systems](WinFsp-Kernel-Mode-File-Systems.asciidoc) document. On a 64-bit system (x64 or ARM64) this key is stored in the 32-bit portion of the registry and its true location is `HKLM\SOFTWARE\WOW6432Node\WinFsp\Fsext`.
|
||||||
|
|
||||||
|
* `:CTLCODE (REG_SZ)`: The `:CTLCODE` name is the string representation of the fsext provider's transact code in `%08lx` format and the value is the provider's driver name.
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
</details>
|
@ -11,9 +11,11 @@ endif::[]
|
|||||||
|
|
||||||
In this tutorial we describe the process of creating a simple user mode file system using WinFsp. The file system we will create is called "passthrough", because it simply passes through the file system operations requested by the kernel to an underlying file system (usually NTFS).
|
In this tutorial we describe the process of creating a simple user mode file system using WinFsp. The file system we will create is called "passthrough", because it simply passes through the file system operations requested by the kernel to an underlying file system (usually NTFS).
|
||||||
|
|
||||||
|
NOTE: The file system that we build in this tutorial is suitable for education purposes. If you are looking for a production quality pass through file system please see the `ntptfs` sample.
|
||||||
|
|
||||||
== Prerequisites
|
== Prerequisites
|
||||||
|
|
||||||
This tutorial assumes that you have WinFsp and Visual Studio 2015 installed. The WinFsp installer can be downloaded from the WinFsp GitHub repository: https://github.com/billziss-gh/winfsp. The Microsoft Visual Studio Community 2015 can be downloaded for free from Microsoft's web site.
|
This tutorial assumes that you have WinFsp and Visual Studio 2015 installed. The WinFsp installer can be downloaded from the WinFsp GitHub repository: https://github.com/winfsp/winfsp. The Microsoft Visual Studio Community 2015 can be downloaded for free from Microsoft's web site.
|
||||||
|
|
||||||
When installing WinFsp make sure to choose "Developer" to ensure that all necessary header and library files are included in the installation.
|
When installing WinFsp make sure to choose "Developer" to ensure that all necessary header and library files are included in the installation.
|
||||||
|
|
||||||
@ -536,7 +538,8 @@ static NTSTATUS GetFileInfoInternal(HANDLE Handle, FSP_FSCTL_FILE_INFO *FileInfo
|
|||||||
FileInfo->LastAccessTime = ((PLARGE_INTEGER)&ByHandleFileInfo.ftLastAccessTime)->QuadPart;
|
FileInfo->LastAccessTime = ((PLARGE_INTEGER)&ByHandleFileInfo.ftLastAccessTime)->QuadPart;
|
||||||
FileInfo->LastWriteTime = ((PLARGE_INTEGER)&ByHandleFileInfo.ftLastWriteTime)->QuadPart;
|
FileInfo->LastWriteTime = ((PLARGE_INTEGER)&ByHandleFileInfo.ftLastWriteTime)->QuadPart;
|
||||||
FileInfo->ChangeTime = FileInfo->LastWriteTime;
|
FileInfo->ChangeTime = FileInfo->LastWriteTime;
|
||||||
FileInfo->IndexNumber = 0;
|
FileInfo->IndexNumber =
|
||||||
|
((UINT64)ByHandleFileInfo.nFileIndexHigh << 32) | (UINT64)ByHandleFileInfo.nFileIndexLow;
|
||||||
FileInfo->HardLinks = 0;
|
FileInfo->HardLinks = 0;
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
|
40
doc/WinFsp-on-ARM64.asciidoc
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
= WinFsp on ARM64
|
||||||
|
|
||||||
|
This document summarizes the changes made to WinFsp to support Windows on ARM64. With these changes WinFsp runs natively in the ARM64 environment, while maintaining backwards compatibility.
|
||||||
|
|
||||||
|
== Build System
|
||||||
|
|
||||||
|
* Visual Studio 2019 or later is required to build WinFsp. Visual Studio 2015 builds are no longer possible because of lack of ARM64 support.
|
||||||
|
** The script `tools\gensrc\remove-build-arm64.bat` can be used to remove the ARM64 configuration from the project files. This allows WinFsp to be built with Visual Studio 2015, but without ARM64 support. This is a hack to support AppVeyor builds on Server 2012 images that have only Visual Studio 2015 installed.
|
||||||
|
* Build configuration is now done by the file `build.common.props` located in `build\VStudio`.
|
||||||
|
* Product configuration (`MyProductName`, etc.) is done by the file `build.version.props` located in `build\VStudio`. This file was previously named `version.properties`.
|
||||||
|
* Project files under `build\VStudio` have been updated to support ARM64 builds.
|
||||||
|
|
||||||
|
== Include Files
|
||||||
|
|
||||||
|
* The macros `FSP_FSCTL_PRODUCT_FULL_REGKEY` and `FSP_FSCTL_PRODUCT_FILE_ARCH` have been added to header file `inc\winfsp\fsctl.h`:
|
||||||
|
** `FSP_FSCTL_PRODUCT_FULL_REGKEY`: The full registry path for WinFsp.
|
||||||
|
** `FSP_FSCTL_PRODUCT_FILE_ARCH`: The expected computer architecture suffix to use for file names (`a64` for ARM64, `x64` for x64, `x86` for x86).
|
||||||
|
|
||||||
|
== File System Driver
|
||||||
|
|
||||||
|
* The `IoInitializeTimer`, `IoStartTimer` and `IoStopTimer` DDI's are missing from Windows on ARM64 (https://social.msdn.microsoft.com/Forums/en-US/e1f4dbbd-a3f1-40a4-8f8b-e12a04b1b074/is-iostarttimer-universal[link]). The same functionality is now implemented within WinFsp in file `src\sys\devtimer.c`
|
||||||
|
* The FSD (and other WinFsp components) used a number of memory barriers primarily for the purpose of lock-free access of certain variables. Most of these memory barriers have been removed and replaced with "interlocked" loads/stores so that any such accesses would continue to be correct under ARM64, which has weaker consistency guarantees than x86/x64. The new `FspInterlocked*` calls are implemented in `inc/winfsp/fsctl.h` and are used by both kernel and user mode code.
|
||||||
|
|
||||||
|
== Samples
|
||||||
|
|
||||||
|
* The sample project files have been updated to support ARM64 builds.
|
||||||
|
|
||||||
|
== Installer
|
||||||
|
|
||||||
|
* The installer has been retrofitted to support native installation on ARM64, x64 and x86 environments.
|
||||||
|
* The installer remains a single MSI file that supports all architectures.
|
||||||
|
** NOTE: The current technique for detecting OS architecture relies on reading the registry value `PROCESSOR_ARCHITECTURE` from key `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment`. This may be fragile and a better technique may be required.
|
||||||
|
* Files are installed in `\Program Files (x86)\WinFsp` on ARM64 and x64 Windows and `\Program Files` on x86 Windows.
|
||||||
|
* Registry settings are placed in `HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\WinFsp` on ARM64 and x64 Windows and `HKEY_LOCAL_MACHINE\SOFTWARE\WinFsp` on x86 Windows.
|
||||||
|
* Files for all architectures are always installed regardless of OS architecture. For example, all of `winfsp-a64.dll`, `winfsp-x64.dll` and `winfsp-x86.dll` are found in the `bin` subdirectory on ARM64, x64 and x86 Windows.
|
||||||
|
* WinFsp supports x86 file systems on x86 Windows, x86 and x64 file systems on x64 Windows and x86, x64 and ARM64 file systems on ARM64 Windows.
|
||||||
|
|
||||||
|
== License
|
||||||
|
|
||||||
|
* The special exception for FLOSS to GPLv3 has been updated to mention that linking to `winfsp-a64.dll` is also allowed.
|
@ -1,6 +1,169 @@
|
|||||||
= Changelog
|
= Changelog
|
||||||
|
|
||||||
|
|
||||||
|
v1.10 (2022)::
|
||||||
|
|
||||||
|
Changes since v1.9:
|
||||||
|
|
||||||
|
* [NEW] Official Windows 11 support.
|
||||||
|
|
||||||
|
* [NEW] Support for `FileDispositionInformationEx` and `FileRenameInformationEx` has been added. Native and .NET file systems must enable this support by setting `SupportsPosixUnlinkRename` in `FSP_FSCTL_VOLUME_PARAMS`. FUSE file systems have this support enabled by default, but they can disable it by using the `-o LegacyUnlinkRename` command line option.
|
||||||
|
|
||||||
|
* [NEW] WinFsp now supports rebranding of the build products. This is primarily useful to commercial licensees. See https://github.com/billziss-gh/winfsp/wiki/WinFsp-Rebranding for more information.
|
||||||
|
|
||||||
|
* [NEW] WinFsp-FUSE has a new capability `FSP_FUSE_CAP_DELETE_ACCESS`. If this capability is specified WinFsp will call the FUSE `access` method with the WinFsp-specific flag `FSP_FUSE_DELETE_OK` to check whether the deletion should be allowed. This can be used to disallow deletion of files and directories that would normally be allowed under the FUSE/POSIX model.
|
||||||
|
|
||||||
|
* [NEW] WinFsp-FUSE has a new method for determining file access in the case where the user's primary SID (Windows Security Identifier) and group SID are the same (for example, this can happen when someone uses a Microsoft account as their primary login).
|
||||||
|
** Previously when the user SID and group SID were the same WinFsp-FUSE looked at the UNIX permissions for the owner and the UNIX permissions for the group and used the MOST restrictive permissions, which often resulted in inadvertent "access denied" errors. (For example, if the owner permission was `rw-` and the group permission was `---` the result was `---` and therefore access denied).
|
||||||
|
** Going forward this behavior will change. The user and group mode permissions will not be considered together even in the case where the user SID and group SID are the same. This will resolve the access denied errors.
|
||||||
|
** However to preserve backward compatibility (there might be some file systems that rely on the old behavior) we will do so in stages. For release v1.10 (2021.1) there is a new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `DistinctPermsForSameOwnerGroup`, which if set to 1 will direct WinFsp-FUSE to use the new behavior. The default value is 0 which directs WinFsp-FUSE to use the old behavior. This default will change in a future release.
|
||||||
|
|
||||||
|
* [NEW] A new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `MountDoNotUseLauncher` has been introduced, which if set to 1 will disable the use of the Launcher during mounting. The default value is 0 which allows the use of the Launcher during mounting in those rare cases when necessary. (In general the Launcher is not necessary for mounting. However when running a file system in the Windows Service context (session 0) under an account that is not LocalSystem (e.g. `NT AUTHORITY\NETWORK SERVICE`), the Launcher is used to create global drives.)
|
||||||
|
|
||||||
|
* [NEW] A new sample memfs-fuse file system written in C++ has been added. This file system uses all FUSE2 features offered by WinFsp-FUSE, passes all file system tests (that can be passed by a FUSE2 file system) and will act as the reference WinFsp-FUSE file system going forward.
|
||||||
|
|
||||||
|
* [FIX] Fixed a problem with `FspFileSystemReadDirectoryBuffer` and file systems that support pattern matching (like passthrough). (GitHub issue #351.)
|
||||||
|
|
||||||
|
* [FIX] File share access when overwriting a file (e.g. when using `TRUNCATE_EXISTING`) is now done in a manner compatible with NTFS (previously there were cases when overwriting a file where behavior diverged from the NTFS one). (See GitHub issue #364.)
|
||||||
|
|
||||||
|
* [FIX] The FSD will now report a file's reparse tag in the `EaSize` field of `FILE_FULL_DIR_INFORMATION` and friends. This fixes problems such as `cmd.exe` not recognizing symlinks in a `dir` command. (See GitHub issue #380.)
|
||||||
|
|
||||||
|
* [FIX] Fixed a problem in the file system shutdown protocol which resolves an occasional access violation in the user mode file system process. Previously it was possible for a file system to crash when stopping itself using `FspFileSystemStopDispatcher`; this problem has been rectified. (See GitHub issue #369.)
|
||||||
|
|
||||||
|
* [FIX] Improved symlink support for FUSE file systems. Notably:
|
||||||
|
|
||||||
|
** FUSE file systems now support converting a directory to a symlink reparse point.
|
||||||
|
|
||||||
|
** The determination of whether a symlink is a file or directory (necessary because the Windows file system makes this distinction) is now possible for file systems that do not support slashdot (`/.`) queries. (A slashdot query is one like `getattr("/PATH/.")`; such queries are not normally expected to be resolved by FUSE file systems.)
|
||||||
|
|
||||||
|
* [FIX] Fixed a problem in the FUSE layer where in some rare circumstances the `release` operation could be called with an uninitialized `path` argument. (See GitHub issue billziss-gh/cgofuse#58 and commit f51bdef53427d1bba688fb6c768792fdc22ffc7b).
|
||||||
|
|
||||||
|
* [FIX] Fixed a potential problem when launching file system instances using the Launcher. (See GitHub issue #356.)
|
||||||
|
|
||||||
|
* [FIX] The `winfsp.h` header no longer defines `FILE_FULL_EA_INFORMATION` when compiled under mingw. This is because the mingw tool chain already includes a definition of this type. (GitHub PR #371. Thanks @ lemourin.)
|
||||||
|
|
||||||
|
|
||||||
|
v1.10B5 (2022 Beta5)::
|
||||||
|
|
||||||
|
Changes since v1.9:
|
||||||
|
|
||||||
|
* [NEW] Official Windows 11 support.
|
||||||
|
|
||||||
|
* [NEW] Support for `FileDispositionInformationEx` and `FileRenameInformationEx` has been added. Native and .NET file systems must enable this support by setting `SupportsPosixUnlinkRename` in `FSP_FSCTL_VOLUME_PARAMS`. FUSE file systems have this support enabled by default, but they can disable it by using the `-o LegacyUnlinkRename` command line option.
|
||||||
|
|
||||||
|
* [NEW] WinFsp now supports rebranding of the build products. This is primarily useful to commercial licensees. See https://github.com/billziss-gh/winfsp/wiki/WinFsp-Rebranding for more information.
|
||||||
|
|
||||||
|
* [NEW] WinFsp-FUSE has a new capability `FSP_FUSE_CAP_DELETE_ACCESS`. If this capability is specified WinFsp will call the FUSE `access` method with the WinFsp-specific flag `FSP_FUSE_DELETE_OK` to check whether the deletion should be allowed. This can be used to disallow deletion of files and directories that would normally be allowed under the FUSE/POSIX model.
|
||||||
|
|
||||||
|
* [NEW] WinFsp-FUSE has a new method for determining file access in the case where the user's primary SID (Windows Security Identifier) and group SID are the same (for example, this can happen when someone uses a Microsoft account as their primary login).
|
||||||
|
** Previously when the user SID and group SID were the same WinFsp-FUSE looked at the UNIX permissions for the owner and the UNIX permissions for the group and used the MOST restrictive permissions, which often resulted in inadvertent "access denied" errors. (For example, if the owner permission was `rw-` and the group permission was `---` the result was `---` and therefore access denied).
|
||||||
|
** Going forward this behavior will change. The user and group mode permissions will not be considered together even in the case where the user SID and group SID are the same. This will resolve the access denied errors.
|
||||||
|
** However to preserve backward compatibility (there might be some file systems that rely on the old behavior) we will do so in stages. For release v1.10 (2021.1) there is a new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `DistinctPermsForSameOwnerGroup`, which if set to 1 will direct WinFsp-FUSE to use the new behavior. The default value is 0 which directs WinFsp-FUSE to use the old behavior. This default will change in a future release.
|
||||||
|
|
||||||
|
* [NEW] A new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `MountDoNotUseLauncher` has been introduced, which if set to 1 will disable the use of the Launcher during mounting. The default value is 0 which allows the use of the Launcher during mounting in those rare cases when necessary. (In general the Launcher is not necessary for mounting. However when running a file system in the Windows Service context (session 0) under an account that is not LocalSystem (e.g. `NT AUTHORITY\NETWORK SERVICE`), the Launcher is used to create global drives.)
|
||||||
|
|
||||||
|
* [NEW] A new sample memfs-fuse file system written in C++ has been added. This file system uses all FUSE2 features offered by WinFsp-FUSE, passes all file system tests (that can be passed by a FUSE2 file system) and will act as the reference WinFsp-FUSE file system going forward.
|
||||||
|
|
||||||
|
* [FIX] Fixed a problem with `FspFileSystemReadDirectoryBuffer` and file systems that support pattern matching (like passthrough). (GitHub issue #351.)
|
||||||
|
|
||||||
|
* [FIX] File share access when overwriting a file (e.g. when using `TRUNCATE_EXISTING`) is now done in a manner compatible with NTFS (previously there were cases when overwriting a file where behavior diverged from the NTFS one). (See GitHub issue #364.)
|
||||||
|
|
||||||
|
* [FIX] The FSD will now report a file's reparse tag in the `EaSize` field of `FILE_FULL_DIR_INFORMATION` and friends. This fixes problems such as `cmd.exe` not recognizing symlinks in a `dir` command. (See GitHub issue #380.)
|
||||||
|
|
||||||
|
* [FIX] Fixed a problem in the file system shutdown protocol which resolves an occasional access violation in the user mode file system process. Previously it was possible for a file system to crash when stopping itself using `FspFileSystemStopDispatcher`; this problem has been rectified. (See GitHub issue #369.)
|
||||||
|
|
||||||
|
* [FIX] Improved symlink support for FUSE file systems. Notably:
|
||||||
|
|
||||||
|
** FUSE file systems now support converting a directory to a symlink reparse point.
|
||||||
|
|
||||||
|
** The determination of whether a symlink is a file or directory (necessary because the Windows file system makes this distinction) is now possible for file systems that do not support slashdot (`/.`) queries. (A slashdot query is one like `getattr("/PATH/.")`; such queries are not normally expected to be resolved by FUSE file systems.)
|
||||||
|
|
||||||
|
* [FIX] Fixed a problem in the FUSE layer where in some rare circumstances the `release` operation could be called with an uninitialized `path` argument. (See GitHub issue billziss-gh/cgofuse#58 and commit f51bdef53427d1bba688fb6c768792fdc22ffc7b).
|
||||||
|
|
||||||
|
* [FIX] Fixed a potential problem when launching file system instances using the Launcher. (See GitHub issue #356.)
|
||||||
|
|
||||||
|
* [FIX] The `winfsp.h` header no longer defines `FILE_FULL_EA_INFORMATION` when compiled under mingw. This is because the mingw tool chain already includes a definition of this type. (GitHub PR #371. Thanks @ lemourin.)
|
||||||
|
|
||||||
|
|
||||||
|
v1.10B4 (2022 Beta4)::
|
||||||
|
+
|
||||||
|
--
|
||||||
|
Changes since v1.10B3:
|
||||||
|
|
||||||
|
* The Delete functionality introduced in release 2021.1 Beta3 (v1.10B3) has been reverted. For more information see this thread: https://groups.google.com/g/winfsp/c/1VYgTp1JpSI
|
||||||
|
|
||||||
|
Changes since v1.9:
|
||||||
|
|
||||||
|
* [NEW] Official Windows 11 support.
|
||||||
|
|
||||||
|
* [NEW] Support for `FileDispositionInformationEx` and `FileRenameInformationEx` has been added.
|
||||||
|
|
||||||
|
* [NEW] WinFsp now supports rebranding of the build products. This is primarily useful to commercial licensees. See https://github.com/billziss-gh/winfsp/wiki/WinFsp-Rebranding for more information.
|
||||||
|
|
||||||
|
* [NEW] WinFsp-FUSE has a new capability `FSP_FUSE_CAP_DELETE_ACCESS`. If this capability is specified WinFsp will call the FUSE `access` method with the WinFsp-specific flag `FSP_FUSE_DELETE_OK` to check whether the deletion should be allowed. This can be used to disallow deletion of files and directories that would normally be allowed under the FUSE/POSIX model.
|
||||||
|
|
||||||
|
* [NEW] WinFsp-FUSE has a new method for determining file access in the case where the user's primary SID (Windows Security Identifier) and group SID are the same (for example, this can happen when someone uses a Microsoft account as their primary login).
|
||||||
|
** Previously when the user SID and group SID were the same WinFsp-FUSE looked at the UNIX permissions for the owner and the UNIX permissions for the group and used the MOST restrictive permissions, which often resulted in inadvertent "access denied" errors. (For example, if the owner permission was `rw-` and the group permission was `---` the result was `---` and therefore access denied).
|
||||||
|
** Going forward this behavior will change. The user and group mode permissions will not be considered together even in the case where the user SID and group SID are the same. This will resolve the access denied errors.
|
||||||
|
** However to preserve backward compatibility (there might be some file systems that rely on the old behavior) we will do so in stages. For release v1.10 (2021.1) there is a new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `DistinctPermsForSameOwnerGroup`, which if set to 1 will direct WinFsp-FUSE to use the new behavior. The default value is 0 which directs WinFsp-FUSE to use the old behavior. This default will change in a future release.
|
||||||
|
|
||||||
|
* [NEW] A new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `MountDoNotUseLauncher` has been introduced, which if set to 1 will disable the use of the Launcher during mounting. The default value is 0 which allows the use of the Launcher during mounting in those rare cases when necessary. (In general the Launcher is not necessary for mounting. However when running a file system in the Windows Service context (session 0) under an account that is not LocalSystem (e.g. `NT AUTHORITY\NETWORK SERVICE`), the Launcher is used to create global drives.)
|
||||||
|
|
||||||
|
* [NEW] A new sample memfs-fuse file system written in C++ has been added. This file system uses all FUSE2 features offered by WinFsp-FUSE, passes all file system tests (that can be passed by a FUSE2 file system) and will act as the reference WinFsp-FUSE file system going forward.
|
||||||
|
|
||||||
|
* [FIX] File share access when overwriting a file (e.g. when using `TRUNCATE_EXISTING`) is now done in a manner compatible with NTFS (previously there were cases when overwriting a file where behavior diverged from the NTFS one). (See GitHub issue #364.)
|
||||||
|
|
||||||
|
* [FIX] The FSD will now report a file's reparse tag in the `EaSize` field of `FILE_FULL_DIR_INFORMATION` and friends. This fixes problems such as `cmd.exe` not recognizing symlinks in a `dir` command. (See GitHub issue #380.)
|
||||||
|
|
||||||
|
* [FIX] Fixed a problem in the file system shutdown protocol which resolves an occasional access violation in the user mode file system process. Previously it was possible for a file system to crash when stopping itself using `FspFileSystemStopDispatcher`; this problem has been rectified. (See GitHub issue #369.)
|
||||||
|
|
||||||
|
* [FIX] Improved symlink support for FUSE file systems. Notably:
|
||||||
|
|
||||||
|
** FUSE file systems now support converting a directory to a symlink reparse point.
|
||||||
|
|
||||||
|
** The determination of whether a symlink is a file or directory (necessary because the Windows file system makes this distinction) is now possible for file systems that do not support slashdot (`/.`) queries. (A slashdot query is one like `getattr("/PATH/.")`; such queries are not normally expected to be resolved by FUSE file systems.)
|
||||||
|
|
||||||
|
* [FIX] Fixed a problem in the FUSE layer where in some rare circumstances the `release` operation could be called with an uninitialized `path` argument. (See GitHub issue billziss-gh/cgofuse#58 and commit f51bdef53427d1bba688fb6c768792fdc22ffc7b).
|
||||||
|
|
||||||
|
* [FIX] Fixed a potential problem when launching file system instances using the Launcher. (See GitHub issue #356.)
|
||||||
|
|
||||||
|
* [FIX] The `winfsp.h` header no longer defines `FILE_FULL_EA_INFORMATION` when compiled under mingw. This is because the mingw tool chain already includes a definition of this type. (GitHub PR #371. Thanks @lemourin.)
|
||||||
|
--
|
||||||
|
|
||||||
|
v1.10B3 (2021.1 Beta3)::
|
||||||
|
|
||||||
|
Changes since v1.9:
|
||||||
|
|
||||||
|
* [NEW] Official Windows 11 support.
|
||||||
|
|
||||||
|
* [NEW] WinFsp has had its Delete functionality redesigned in release 2021.1 Beta3. This redesign unifies all Windows file deletion semantics under a single file system operation that also supports the new POSIX semantics introduced in Windows 10 Redstone 1. The new Delete design is recommended for new file systems, however existing file systems will continue to work without any changes. See https://github.com/billziss-gh/winfsp/wiki/WinFsp-Delete-Redesign for more information.
|
||||||
|
|
||||||
|
* [NEW] Support for `FileDispositionInformationEx` and `FileRenameInformationEx` has been added (see above).
|
||||||
|
|
||||||
|
* [NEW] WinFsp now supports rebranding of the build products. This is primarily useful to commercial licensees. See https://github.com/billziss-gh/winfsp/wiki/WinFsp-Rebranding for more information.
|
||||||
|
|
||||||
|
* [NEW] WinFsp-FUSE has a new capability `FSP_FUSE_CAP_DELETE_ACCESS`. If this capability is specified WinFsp will call the FUSE `access` method with the WinFsp-specific flag `FSP_FUSE_DELETE_OK` to check whether the deletion should be allowed. This can be used to disallow deletion of files and directories that would normally be allowed under the FUSE/POSIX model.
|
||||||
|
|
||||||
|
* [NEW] WinFsp-FUSE has a new method for determining file access in the case where the user's primary SID (Windows Security Identifier) and group SID are the same (for example, this can happen when someone uses a Microsoft account as their primary login).
|
||||||
|
** Previously when the user SID and group SID were the same WinFsp-FUSE looked at the UNIX permissions for the owner and the UNIX permissions for the group and used the MOST restrictive permissions, which often resulted in inadvertent "access denied" errors. (For example, if the owner permission was `rw-` and the group permission was `---` the result was `---` and therefore access denied).
|
||||||
|
** Going forward this behavior will change. The user and group mode permissions will not be considered together even in the case where the user SID and group SID are the same. This will resolve the access denied errors.
|
||||||
|
** However to preserve backward compatibility (there might be some file systems that rely on the old behavior) we will do so in stages. For release v1.10 (2021.1) there is a new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `DistinctPermsForSameOwnerGroup`, which if set to 1 will direct WinFsp-FUSE to use the new behavior. The default value is 0 which directs WinFsp-FUSE to use the old behavior. This default will change in a future release.
|
||||||
|
|
||||||
|
* [NEW] A new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `MountDoNotUseLauncher` has been introduced, which if set to 1 will disable the use of the Launcher during mounting. The default value is 0 which allows the use of the Launcher during mounting in those rare cases when necessary. (In general the Launcher is not necessary for mounting. However when running a file system in the Windows Service context (session 0) under an account that is not LocalSystem (e.g. `NT AUTHORITY\NETWORK SERVICE`), the Launcher is used to create global drives.)
|
||||||
|
|
||||||
|
* [FIX] File share access when overwriting a file (e.g. when using `TRUNCATE_EXISTING`) is now done in a manner compatible with NTFS (previously there were cases when overwriting a file where behavior diverged from the NTFS one). (See GitHub issue #364.)
|
||||||
|
|
||||||
|
* [FIX] The FSD will now report a file's reparse tag in the `EaSize` field of `FILE_FULL_DIR_INFORMATION` and friends. This fixes problems such as `cmd.exe` not recognizing symlinks in a `dir` command. (See GitHub issue #380.)
|
||||||
|
|
||||||
|
* [FIX] Fixed a problem in the file system shutdown protocol which resolves an occasional access violation in the user mode file system process. Previously it was possible for a file system to crash when stopping itself using `FspFileSystemStopDispatcher`; this problem has been rectified. (See GitHub issue #369.)
|
||||||
|
|
||||||
|
* [FIX] Fixed a problem in the FUSE layer where in some rare circumstances the `release` operation could be called with an uninitialized `path` argument. (See GitHub issue billziss-gh/cgofuse#58 and commit f51bdef53427d1bba688fb6c768792fdc22ffc7b).
|
||||||
|
|
||||||
|
* [FIX] Fixed a potential problem when launching file system instances using the Launcher. (See GitHub issue #356.)
|
||||||
|
|
||||||
|
* [FIX] The `winfsp.h` header no longer defines `FILE_FULL_EA_INFORMATION` when compiled under mingw. This is because the mingw tool chain already includes a definition of this type. (GitHub PR #371. Thanks @lemourin.)
|
||||||
|
|
||||||
|
|
||||||
v1.10B2 (2021.1 Beta2)::
|
v1.10B2 (2021.1 Beta2)::
|
||||||
|
|
||||||
Changes since v1.9:
|
Changes since v1.9:
|
||||||
@ -12,6 +175,8 @@ Changes since v1.9:
|
|||||||
** Going forward this behavior will change. The user and group mode permissions will not be considered together even in the case where the user SID and group SID are the same. This will resolve the access denied errors.
|
** Going forward this behavior will change. The user and group mode permissions will not be considered together even in the case where the user SID and group SID are the same. This will resolve the access denied errors.
|
||||||
** However to preserve backward compatibility (there might be some file systems that rely on the old behavior) we will do so in stages. For release v1.10 (2021.1) there is a new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `DistinctPermsForSameOwnerGroup`, which if set to 1 will direct WinFsp-FUSE to use the new behavior. The default value is 0 which directs WinFsp-FUSE to use the old behavior. This default will change in a future release.
|
** However to preserve backward compatibility (there might be some file systems that rely on the old behavior) we will do so in stages. For release v1.10 (2021.1) there is a new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `DistinctPermsForSameOwnerGroup`, which if set to 1 will direct WinFsp-FUSE to use the new behavior. The default value is 0 which directs WinFsp-FUSE to use the old behavior. This default will change in a future release.
|
||||||
|
|
||||||
|
* [NEW] A new registry setting under `HKLM\SOFTWARE\WinFsp` (or `HKLM\SOFTWARE\WOW6432Node\WinFsp` on a 64-bit system) called `MountDoNotUseLauncher` has been introduced, which if set to 1 will disable the use of the Launcher during mounting. The default value is 0 which allows the use of the Launcher during mounting in those rare cases when necessary. (In general the Launcher is not necessary for mounting. However when running a file system in the Windows Service context (session 0) under an account that is not LocalSystem (e.g. `NT AUTHORITY\NETWORK SERVICE`), the Launcher is used to create global drives.)
|
||||||
|
|
||||||
* [FIX] File share access when overwriting a file (e.g. when using `TRUNCATE_EXISTING`) is now done in a manner compatible with NTFS (previously there were cases when overwriting a file where behavior diverged from the NTFS one). (See GitHub issue #364.)
|
* [FIX] File share access when overwriting a file (e.g. when using `TRUNCATE_EXISTING`) is now done in a manner compatible with NTFS (previously there were cases when overwriting a file where behavior diverged from the NTFS one). (See GitHub issue #364.)
|
||||||
|
|
||||||
* [FIX] Fixed a problem in the file system shutdown protocol which resolves an occasional access violation in the user mode file system process. Previously it was possible for a file system to crash when stopping itself using `FspFileSystemStopDispatcher`; this problem has been rectified. (See GitHub issue #369.)
|
* [FIX] Fixed a problem in the file system shutdown protocol which resolves an occasional access violation in the user mode file system process. Previously it was possible for a file system to crash when stopping itself using `FspFileSystemStopDispatcher`; this problem has been rectified. (See GitHub issue #369.)
|
126
doc/archive/WinFsp-Delete-Redesign.asciidoc
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
*INVALID: The information presented in this document is invalid and should not be used.*
|
||||||
|
|
||||||
|
= WinFsp Delete Redesign
|
||||||
|
|
||||||
|
WinFsp has had its Delete functionality redesigned in release 2021.1 Beta3. This redesign unifies all Windows file deletion semantics under a single file system operation that also supports the new POSIX semantics introduced in Windows 10 Redstone 1. The new Delete design is recommended for new file systems, however existing file systems will continue to work without any changes.
|
||||||
|
|
||||||
|
== Background
|
||||||
|
|
||||||
|
In this section we discuss how file deletion worked in Windows traditionally as well as the changes introduced in recent versions of Windows 10.
|
||||||
|
|
||||||
|
=== Traditional File Deletion
|
||||||
|
|
||||||
|
The traditional method for deleting a file or directory on Windows involves the following steps:
|
||||||
|
|
||||||
|
- Open the file using https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntopenfile[`NtOpenFile`] (or equivalent) with `DELETE` access.
|
||||||
|
- Set the "disposition" flag on the file handle using https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntsetinformationfile[`NtSetInformationFile`] with `FileDispositionInformation`. This only marks the file for deletion and does not delete the file.
|
||||||
|
- Close the file using https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntclose[`NtClose`] (or equivalent). Provided that there are no other open handles to the file, the file is actually deleted at this stage.
|
||||||
|
|
||||||
|
This is the method that https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-deletefilew[`DeleteFileW`] and https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-removedirectoryw[`RemoveDirectoryW`] use to delete a file or directory.
|
||||||
|
|
||||||
|
An alternative method involves the `FILE_DELETE_ON_CLOSE` flag:
|
||||||
|
|
||||||
|
- Open the file using https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntopenfile[`NtOpenFile`] (or equivalent) with the `FILE_DELETE_ON_CLOSE` option.
|
||||||
|
- Close the file using https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntclose[`NtClose`] (or equivalent). Provided that there are no other open handles to the file, the file is actually deleted at this stage.
|
||||||
|
|
||||||
|
This alternative method does not set the disposition flag and therefore does not have chance to perform any associated checks. An important disposition flag check is whether a directory is empty: attempting to remove a non-empty directory using `FILE_DELETE_ON_CLOSE` will fail silently, because there is no way to communicate a file deletion error from `NtClose`.
|
||||||
|
|
||||||
|
In order to better understand those scenarios let's examine what happens within the kernel and the file system driver (FSD).
|
||||||
|
|
||||||
|
When the kernel receives a file API call such as `NtOpenFile`, it packages the call arguments into a data structure called an "I/O Request Packet" (IRP) and forwards it to the appropriate FSD. Each IRP contains a field that describes its function, for example, `IRP_MJ_CREATE` for `NtOpenFile` and `IRP_MJ_SET_INFORMATION` for `NtSetInformationFile`.
|
||||||
|
|
||||||
|
With this knowledge we can now examine what happens in the `DeleteFileW` / `RemoveDirectoryW` scenario:
|
||||||
|
|
||||||
|
- Open the file using `NtOpenFile`: The kernel creates an https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/irp-mj-create[`IRP_MJ_CREATE`] IRP, places inside it a newly created https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_file_object[`FILE_OBJECT`] and forwards it to the FSD. If opening the file succeeds, the kernel will also create a `HANDLE` that is used to refer to this `FILE_OBJECT`; if opening the file fails, this `FILE_OBJECT` will be destroyed.
|
||||||
|
- Set the "disposition" flag on the file handle using `NtSetInformationFile` with `FileDispositionInformation`: The kernel creates an https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/irp-mj-set-information[`IRP_MJ_SET_INFORMATION`] IRP and passes the `FileDispositionInformation` information in it. The FSD performs some checks (e.g. if a directory is empty) and if they succeed it marks the file for deletion.
|
||||||
|
- Close the file using `NtClose`: The kernel creates an https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/irp-mj-cleanup[`IRP_MJ_CLEANUP`] IRP, which denotes that all ``HANDLE``s that refer to a `FILE_OBJECT` are closed. (It is possible to have multiple ``HANDLE``s to the same `FILE_OBJECT` by using an API such as https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-duplicatehandle[`DuplicateHandle`].) The FSD checks and if this is the last `FILE_OBJECT` cleaned up for the file and if the file is marked for deletion, it deletes the file. Traditionally there was no way to return an error from `IRP_MJ_CLEANUP`.
|
||||||
|
- Notice that while the file is closed from the perspective of user mode, it is not closed from the perspective of kernel mode. The kernel and the FSD maintain both a handle count and a reference count for the `FILE_OBJECT`. When the handle count goes to `0` then an `IRP_MJ_CLEANUP` IRP is issued (see above). When the reference count goes to `0` then a different https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/irp-mj-close[`IRP_MJ_CLOSE`] IRP is issued to the FSD. This signifies to the FSD that the `FILE_OBJECT` is going away and the file is fully closed (including from the kernel perspective). There is no way to return an error from `IRP_MJ_CLOSE`.
|
||||||
|
|
||||||
|
The situation is similar in the `FILE_DELETE_ON_CLOSE` scenario, with the important difference that the FSD marks the file for deletion immediately upon receiving the `IRP_MJ_CREATE` IRP and that it never receives the `IRP_MJ_SET_INFORMATION` IRP. As before the actual deletion happens in `IRP_MJ_CLEANUP` and only when the last `HANDLE` to the file is closed.
|
||||||
|
|
||||||
|
Some important takeaways:
|
||||||
|
|
||||||
|
- It is possible for a file to already be open when a `DeleteFileW` / `RemoveDirectoryW` (or equivalent sequence of `NtOpenFile`, `NtSetInformationFile`, `NtClose`, etc.) is executed. This means that the file may NOT be deleted upon return from the `DeleteFileW` / `RemoveDirectoryW` call even though these API's report success. **Traditionally a successful return from `DeleteFileW` / `RemoveDirectory` signifies only that the file or directory has been successfully marked for deletion and not that it has been deleted!**
|
||||||
|
- The `NtClose` call does not return error codes from `IRP_MJ_CLEANUP`. This means that it is impossible for user mode to know whether a file marked for deletion was deleted or not.
|
||||||
|
- The `FILE_OBJECT` remains valid even after a file has been deleted in `IRP_MJ_CLEANUP`. It is therefore possible to receive additional I/O (e.g. read/write) on the file. Many Windows file systems (including at least some versions of NTFS) do not handle this case very well.
|
||||||
|
|
||||||
|
=== File Deletion in Recent Versions of Windows 10
|
||||||
|
|
||||||
|
In Windows 10 Redstone 1 Microsoft introduced the `FileDispositionInformationEx` information class. This new information class can be used to request POSIX semantics for file deletion during the `NtSetInformationFile` call. POSIX semantics for file deletion mean that when a file is deleted any open handles to it remain valid and can be used for I/O such as read/write.
|
||||||
|
|
||||||
|
Some time later (unclear exactly when) Microsoft changed the `DeleteFileW` / `RemoveDirectoryW` API's to use the `FileDispositionInformationEx` information class and only if this fails (e.g. because the file system is not capable) fall back to the old `FileDispositionInformation` information class. With this change `DeleteFileW` and `RemoveDirectoryW` actually delete the file or directory rather than simply mark it for deletion. (This change is in general a good thing, but can create incompatibility problems for applications that expect the traditional behavior.)
|
||||||
|
|
||||||
|
Let's examine the `DeleteFileW` / `RemoveDirectoryW` scenario again:
|
||||||
|
|
||||||
|
- Open the file using `NtOpenFile`: The kernel creates an https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/irp-mj-create[`IRP_MJ_CREATE`] IRP, places inside it a newly created https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_file_object[`FILE_OBJECT`] and forwards it to the FSD. If opening the file succeeds, the kernel will also create a `HANDLE` that is used to refer to this `FILE_OBJECT`; if opening the file fails, this `FILE_OBJECT` will be destroyed.
|
||||||
|
- Intruct the file system to delete the file with POSIX semantics using `NtSetInformationFile` with `FileDispositionInformationEx`. The kernel creates an https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/irp-mj-set-information[`IRP_MJ_SET_INFORMATION`] IRP and passes the `FileDispositionInformationEx` information in it. The FSD performs some checks (e.g. if a directory is empty) and if they succeed it deletes the file or directory (as opposed to simply mark it for deletion).
|
||||||
|
- Close the file using `NtClose`. The kernel creates an https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/irp-mj-cleanup[`IRP_MJ_CLEANUP`] IRP, which denotes that all ``HANDLE``s that refer to a `FILE_OBJECT` are closed. The FSD has already deleted the file and does not need to do anything else.
|
||||||
|
- As before an `IRP_MJ_CLOSE` IRP will also be sent to the FSD eventually.
|
||||||
|
|
||||||
|
Notice that the actual file deletion happens during `NtSetInformationFile` and the return code from this API reports on the success or failure of the file deletion. Thus we no longer have the problems discussed earlier and `DeleteFileW` / `RemoveDirectoryW` correctly report whether the file was deleted or not.
|
||||||
|
|
||||||
|
== WinFsp Support for POSIX Unlink
|
||||||
|
|
||||||
|
WinFsp gained support for POSIX Unlink (`FileDispositionInformationEx`) and POSIX Rename (`FileRenameInformationEx`) in release 2021.1 Beta3. To enable this support a native or .NET file system must set the `SupportsPosixUnlinkRename` flag when the file system is created. FUSE file systems have this flag enabled by default (but can be disabled with the command line option `-o LegacyUnlinkRename`).
|
||||||
|
|
||||||
|
The POSIX Unlink support spurred some changes in the WinFsp native and .NET API's with regards to file deletion. The WinFsp FUSE layer transparently supports these changes.
|
||||||
|
|
||||||
|
Prior to release 2021.1 Beta3, user mode file systems handled file deletion by implementing `CanDelete` / `SetDelete` to check the file disposition flag and `Cleanup` with the `FspCleanupDelete` flag to perform the actual file deletion. From release 2021.1 Beta3 forward the recommended method is to use the new `Delete` file system operation to handle all aspects of file deletion.
|
||||||
|
|
||||||
|
The new `Delete` operation follows the general pattern below:
|
||||||
|
|
||||||
|
[source,c]
|
||||||
|
----
|
||||||
|
NTSTATUS Delete(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
PVOID FileContext, PWSTR FileName, ULONG Flags)
|
||||||
|
{
|
||||||
|
switch (Flags)
|
||||||
|
{
|
||||||
|
case FILE_DISPOSITION_DO_NOT_DELETE:
|
||||||
|
// set file disposition flag: do not delete file at Cleanup time
|
||||||
|
|
||||||
|
case FILE_DISPOSITION_DELETE:
|
||||||
|
// set file disposition flag: delete file at Cleanup time
|
||||||
|
|
||||||
|
case FILE_DISPOSITION_DELETE | FILE_DISPOSITION_POSIX_SEMANTICS:
|
||||||
|
// delete file now; open handles to file remain valid
|
||||||
|
|
||||||
|
case -1:
|
||||||
|
// delete file now; called during Cleanup time
|
||||||
|
|
||||||
|
default:
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
As can be seen the `Delete` operation handles marking (`FILE_DISPOSITION_DELETE`) and unmarking (`FILE_DISPOSITION_DO_NOT_DELETE`) a file for deletion, performing file deletion with POSIX semantics (`FILE_DISPOSITION_DELETE | FILE_DISPOSITION_POSIX_SEMANTICS`) and performing file deletion with traditional Windows semantics (`-1`). If the Delete operation is defined it is used instead of `CanDelete` / `SetDelete` and `Cleanup` with the `FspCleanupDelete` flag, even if these operations are also defined.
|
||||||
|
|
||||||
|
A sensible implementation of `Delete` might look something similar to the following:
|
||||||
|
|
||||||
|
[source,c]
|
||||||
|
----
|
||||||
|
NTSTATUS Delete(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
PVOID FileContext, PWSTR FileName, ULONG Flags)
|
||||||
|
{
|
||||||
|
switch (Flags)
|
||||||
|
{
|
||||||
|
case FILE_DISPOSITION_DO_NOT_DELETE:
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
|
case FILE_DISPOSITION_DELETE:
|
||||||
|
if (IsNotEmptyDirectory(FileSystem, FileContext))
|
||||||
|
return STATUS_DIRECTORY_NOT_EMPTY;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
|
case FILE_DISPOSITION_DELETE | FILE_DISPOSITION_POSIX_SEMANTICS:
|
||||||
|
case -1:
|
||||||
|
if (IsNotEmptyDirectory(FileSystem, FileContext))
|
||||||
|
return STATUS_DIRECTORY_NOT_EMPTY;
|
||||||
|
return RealDeleteFileOrDirectory(FileSystem, FileContext);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
----
|
192
doc/archive/WinFsp-Performance-Testing.asciidoc
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
= Performance Testing
|
||||||
|
:caption:
|
||||||
|
|
||||||
|
This document discusses performance testing for WinFsp. The goal of this performance testing is to discover optimization opportunities for WinFsp and compare its performance to that of NTFS and Dokany.
|
||||||
|
|
||||||
|
== Executive Summary
|
||||||
|
|
||||||
|
This performance testing shows that WinFsp has excellent performance in all tested scenarios. It outperforms NTFS in most scenarios (an unfair comparison as NTFS is a disk file system and WinFsp is tested with an in-memory file system). It also outperforms Dokany in all scenarios, often by an order of magnitude.
|
||||||
|
|
||||||
|
ifdef::env-browser[chart::bar[data-uri="WinFsp-Performance-Testing/file_tests.csv",file="WinFsp-Performance-Testing/file_tests.png",opt="y-label=time"]]
|
||||||
|
ifndef::env-browser[image::WinFsp-Performance-Testing/file_tests.png[]]
|
||||||
|
|
||||||
|
ifdef::env-browser[chart::bar[data-uri="WinFsp-Performance-Testing/rdwr_tests.csv",file="WinFsp-Performance-Testing/rdwr_tests.png",opt="y-label=time"]]
|
||||||
|
ifndef::env-browser[image::WinFsp-Performance-Testing/rdwr_tests.png[]]
|
||||||
|
|
||||||
|
== Fsbench
|
||||||
|
|
||||||
|
All testing was performed using a new performance test suite developed as part of WinFsp, called https://github.com/winfsp/winfsp/blob/master/tst/fsbench/fsbench.c[fsbench]. Fsbench was developed because it allows the creation of tests that are important to file system developers; for example, it can answer questions of the type: "how long does it take to delete 1000 files" or "how long does it take to list a directory with 10000 files in it".
|
||||||
|
|
||||||
|
Fsbench is based on the https://github.com/winfsp/winfsp/tree/master/ext/tlib[tlib] library, originally from the *secfs* project. Tlib is usually used to develop regression test suites in C/C++, but can be also used to create performance tests.
|
||||||
|
|
||||||
|
Fsbench currently includes the following tests:
|
||||||
|
|
||||||
|
[width="100%",cols="20%,60%,20%",options="header"]
|
||||||
|
|===
|
||||||
|
|Test |Measures performance of |Parameters
|
||||||
|
|file_create_test |CreateFileW(CREATE_NEW) / CloseHandle |file count
|
||||||
|
|file_open_test |CreateFileW(OPEN_EXISTING) / CloseHandle |file count
|
||||||
|
|file_overwrite_test|CreateFileW(CREATE_ALWAYS) / CloseHandle with existing files|file count
|
||||||
|
|file_list_test |FindFirstFileW / FindNextFile / FindClose |iterations
|
||||||
|
|file_delete_test |DeleteFileW |file count
|
||||||
|
|file_mkdir_test |CreateDirectoryW |file count
|
||||||
|
|file_rmdir_test |RemoveDirectoryW |file count
|
||||||
|
|rdwr_cc_write_page_test |WriteFile (1 page; cached) |iterations
|
||||||
|
|rdwr_cc_read_page_test |ReadFile (1 page; cached) |iterations
|
||||||
|
|rdwr_nc_write_page_test |WriteFile (1 page; non-cached) |iterations
|
||||||
|
|rdwr_nc_read_page_test |ReadFile (1 page; non-cached) |iterations
|
||||||
|
|rdwr_cc_write_large_test |WriteFile (16 pages; cached) |iterations
|
||||||
|
|rdwr_cc_read_large_test |ReadFile (16 pages; cached) |iterations
|
||||||
|
|rdwr_nc_write_large_test |WriteFile (16 pages; non-cached) |iterations
|
||||||
|
|rdwr_nc_read_large_test |ReadFile (16 pages; non-cached) |iterations
|
||||||
|
|mmap_write_test |Memory mapped write test |iterations
|
||||||
|
|mmap_write_test |Memory mapped read test |iterations
|
||||||
|
|===
|
||||||
|
|
||||||
|
== Tested File Systems
|
||||||
|
|
||||||
|
=== NTFS
|
||||||
|
|
||||||
|
The comparison to NTFS is very important to establish a baseline. It is also very misleading because NTFS is a disk file system and MEMFS (either the WinFsp or Dokany variants) is an in memory file system. The tests will show that MEMFS is faster than NTFS. This should not be taken to mean that we are trying to make the (obvious) claim that an in memory file system is faster than a disk file system, but to show that the approach of writing a file system in user mode is a valid proposition and can be efficient.
|
||||||
|
|
||||||
|
=== WinFsp/MEMFS
|
||||||
|
|
||||||
|
MEMFS is the file system used to test WinFsp and shipped as a sample bundled with the WinFsp installer. MEMFS is a simple in memory file system and as such is very fast under most conditions. This is desirable because our goal with this performance testing is to measure the speed of the WinFsp system components rather the performance of a complex user mode file system. MEMFS has minimal overhead and is ideal for this purpose.
|
||||||
|
|
||||||
|
WinFsp/MEMFS can be run in different configurations, which enable or disable WinFsp caching features. The tested configurations were:
|
||||||
|
|
||||||
|
- An infinite FileInfoTimeout, which enables caching of metadata and data.
|
||||||
|
- A FileInfoTimeout of 1s (second), which enables caching of metadata but disables caching of data.
|
||||||
|
- A FileInfoTimeout of 0, which completely disables caching.
|
||||||
|
|
||||||
|
The WinFsp git commit at the time of testing was d804f5674d76f11ea86d14f4bcb1157e6e40e719.
|
||||||
|
|
||||||
|
=== Dokany/MEMFS
|
||||||
|
|
||||||
|
To achieve fairness when comparing Dokany to WinFsp the MEMFS file system has been ported to Dokany. Substantial care was taken to ensure that WinFsp/MEMFS and Dokany/MEMFS perform equally well, so that the performance of the Dokany FSD and user-mode components can be measured and compared accurately.
|
||||||
|
|
||||||
|
The Dokany/MEMFS project has its own https://github.com/billziss-gh/memfs-dokany[repository]. The project comes without a license, which means that it may not be used for any purpose other than as a reference.
|
||||||
|
|
||||||
|
The Dokany version used for testing was 1.0.1. The Dokany/MEMFS git commit was 27a678d7c0d5ee2fb3fb2ecc8e38210857ae941c.
|
||||||
|
|
||||||
|
== Test Environment
|
||||||
|
|
||||||
|
Tests were performed on an idle computer/VM. There was a reboot of both the computer and VM before each file system was tested. Each test was run twice and the smaller time value chosen. The assumption is that even in a seemingly idle desktop system there is some activity which will affect the results; the smaller value is the preferred one to use because it reflects the time when there is less or no other activity.
|
||||||
|
|
||||||
|
The test environment was as follows:
|
||||||
|
----
|
||||||
|
MacBook Pro (Retina, 13-inch, Early 2015)
|
||||||
|
3.1 GHz Intel Core i7
|
||||||
|
16 GB 1867 MHz DDR3
|
||||||
|
500 GB SSD
|
||||||
|
|
||||||
|
VirtualBox Version 5.0.20 r106931
|
||||||
|
1 CPU
|
||||||
|
4 GB RAM
|
||||||
|
80 GB Dynamically allocated differencing storage
|
||||||
|
|
||||||
|
Windows 10 (64-bit) Version 1511 (OS Build 10586.420)
|
||||||
|
----
|
||||||
|
|
||||||
|
== Test Results
|
||||||
|
|
||||||
|
In the graphs below we use consistent coloring to quickly identify a file system. Red is used for NTFS, yellow for WinFsp/MEMFS with a FileInfoTimeout of 0, green for WinFsp/MEMFS with a FileInfoTimeout of 1, light blue for WinFsp/MEMFS with an infinite FileInfoTimeout and deep blue for Dokany/MEMFS.
|
||||||
|
|
||||||
|
In all tests lower times are better (the file system is faster).
|
||||||
|
|
||||||
|
=== File Tests
|
||||||
|
|
||||||
|
These tests measure the performance of creating, opening, overwriting and listing files and directories.
|
||||||
|
|
||||||
|
==== file_create_test
|
||||||
|
|
||||||
|
This test measures the performance of CreateFileW(CREATE_NEW) / CloseHandle. WinFsp has the best performance here. Dokany follows and NTFS is last as it has to actually update its data structures on disk.
|
||||||
|
|
||||||
|
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/file_create_test.csv",file="WinFsp-Performance-Testing/file_create_test.png",opt="x-label=file count,y-label=time"]]
|
||||||
|
ifndef::env-browser[image::WinFsp-Performance-Testing/file_create_test.png[]]
|
||||||
|
|
||||||
|
==== file_open_test
|
||||||
|
|
||||||
|
This test measures the performance of CreateFileW(OPEN_EXISTING) / CloseHandle. WinFsp again has the best (although uneven) performance, followed by NTFS and then Dokany.
|
||||||
|
|
||||||
|
WinFsp appears to have very uneven performance here. In particular notice that opening 1000 files is slower than opening 2000 files, which makes no sense! I suspect that the test observes an initial acquisition of resouces when the test first starts, which is not necessary when the test runs for 2000 files at a later time. This uneven performance should probably be investigated in the future.
|
||||||
|
|
||||||
|
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/file_open_test.csv",file="WinFsp-Performance-Testing/file_open_test.png",opt="x-label=file count,y-label=time"]]
|
||||||
|
ifndef::env-browser[image::WinFsp-Performance-Testing/file_open_test.png[]]
|
||||||
|
|
||||||
|
==== file_overwrite_test
|
||||||
|
|
||||||
|
This test measures the performance of CreateFileW(CREATE_ALWAYS) / CloseHandle. WinFsp is fastest, followed by NTFS and then Dokany.
|
||||||
|
|
||||||
|
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/file_overwrite_test.csv",file="WinFsp-Performance-Testing/file_overwrite_test.png",opt="x-label=file count,y-label=time"]]
|
||||||
|
ifndef::env-browser[image::WinFsp-Performance-Testing/file_overwrite_test.png[]]
|
||||||
|
|
||||||
|
==== file_list_test
|
||||||
|
|
||||||
|
This test measures the performance of FindFirstFileW / FindNextFile / FindClose. NTFS wins this scenario, likely because it can satisfy the list operation from cache. WinFsp has overall good performance. Dokany appears to show slightly quadratic performance in this scenario.
|
||||||
|
|
||||||
|
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/file_list_test.csv",file="WinFsp-Performance-Testing/file_list_test.png",opt="x-label=file count,y-label=time"]]
|
||||||
|
ifndef::env-browser[image::WinFsp-Performance-Testing/file_list_test.png[]]
|
||||||
|
|
||||||
|
==== file_delete_test
|
||||||
|
|
||||||
|
This test measures the performance of DeleteFileW. WinFsp has the best performance, followed by Dokany and NTFS with very similar performance.
|
||||||
|
|
||||||
|
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/file_delete_test.csv",file="WinFsp-Performance-Testing/file_delete_test.png",opt="x-label=file count,y-label=time"]]
|
||||||
|
ifndef::env-browser[image::WinFsp-Performance-Testing/file_delete_test.png[]]
|
||||||
|
|
||||||
|
=== Read/Write Tests
|
||||||
|
|
||||||
|
These tests measure the performance of cached, non-cached and memory-mapped I/O.
|
||||||
|
|
||||||
|
==== rdwr_cc_write_page_test
|
||||||
|
|
||||||
|
This test measures the performance of cached WriteFile with 1 page writes. NTFS and WinFsp with an infinite FileInfoTimeout have the best performance, with a clear edge to NTFS (likely because of its use of FastIO, which WinFsp does not currently support). WinFsp with a FileInfoTimeout of 0 or 1 performance is next, because WinFsp does not use the NTOS Cache Manager in this scenario. Dokany performance is last.
|
||||||
|
|
||||||
|
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/rdwr_cc_write_page_test.csv",file="WinFsp-Performance-Testing/rdwr_cc_write_page_test.png",opt="x-label=iterations,y-label=time"]]
|
||||||
|
ifndef::env-browser[image::WinFsp-Performance-Testing/rdwr_cc_write_page_test.png[]]
|
||||||
|
|
||||||
|
==== rdwr_cc_read_page_test
|
||||||
|
|
||||||
|
This test measures the performance of cached ReadFile with 1 page reads. The results here are very similar to the rdwr_cc_write_page_test case and similar comments apply.
|
||||||
|
|
||||||
|
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/rdwr_cc_read_page_test.csv",file="WinFsp-Performance-Testing/rdwr_cc_read_page_test.png",opt="x-label=iterations,y-label=time"]]
|
||||||
|
ifndef::env-browser[image::WinFsp-Performance-Testing/rdwr_cc_read_page_test.png[]]
|
||||||
|
|
||||||
|
==== rdwr_nc_write_page_test
|
||||||
|
|
||||||
|
This test measures the performance of non-cached WriteFile with 1 page writes. WinFsp has the best performance, followed by Dokany. NTFS shows bad performance, which of course make sense as we are asking it to write all data to the disk.
|
||||||
|
|
||||||
|
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/rdwr_nc_write_page_test.csv",file="WinFsp-Performance-Testing/rdwr_nc_write_page_test.png",opt="x-label=iterations,y-label=time"]]
|
||||||
|
ifndef::env-browser[image::WinFsp-Performance-Testing/rdwr_nc_write_page_test.png[]]
|
||||||
|
|
||||||
|
==== rdwr_nc_read_page_test
|
||||||
|
|
||||||
|
This test measures the performance of non-cached ReadFile with 1 page reads. The results here are very similar to the rdwr_nc_write_page_test case and similar comments apply.
|
||||||
|
|
||||||
|
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/rdwr_nc_read_page_test.csv",file="WinFsp-Performance-Testing/rdwr_nc_read_page_test.png",opt="x-label=iterations,y-label=time"]]
|
||||||
|
ifndef::env-browser[image::WinFsp-Performance-Testing/rdwr_nc_read_page_test.png[]]
|
||||||
|
|
||||||
|
==== mmap_write_test
|
||||||
|
|
||||||
|
This test measures the performance of memory mapped writes. NTFS and WinFsp seem to have identical performance here, which actually makes sense because memory mapped I/O is effectively always cached and most of the actual I/O is done asynchronously by the system.
|
||||||
|
|
||||||
|
There are no results for Dokany as it seems to (still) not support memory mapped files:
|
||||||
|
|
||||||
|
----
|
||||||
|
Y:\>c:\Users\billziss\Projects\winfsp\build\VStudio\build\Release\fsbench-x64.exe --mmap=100 mmap*
|
||||||
|
mmap_write_test........................ KO
|
||||||
|
ASSERT(0 != Mapping) failed at fsbench.c:226:mmap_dotest
|
||||||
|
----
|
||||||
|
|
||||||
|
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/mmap_write_test.csv",file="WinFsp-Performance-Testing/mmap_write_test.png",opt="x-label=iterations,y-label=time"]]
|
||||||
|
ifndef::env-browser[image::WinFsp-Performance-Testing/mmap_write_test.png[]]
|
||||||
|
|
||||||
|
==== mmap_read_test
|
||||||
|
|
||||||
|
This test measures the performance of memory mapped reads. Again NTFS and WinFsp seem to have identical performance here.
|
||||||
|
|
||||||
|
There are no results for Dokany as it faces the same issue as with mmap_write_test.
|
||||||
|
|
||||||
|
ifdef::env-browser[chart::line[data-uri="WinFsp-Performance-Testing/mmap_read_test.csv",file="WinFsp-Performance-Testing/mmap_read_test.png",opt="x-label=iterations,y-label=time"]]
|
||||||
|
ifndef::env-browser[image::WinFsp-Performance-Testing/mmap_read_test.png[]]
|