mirror of
https://github.com/winfsp/winfsp.git
synced 2025-07-03 01:12:58 -05:00
Compare commits
186 Commits
release/1.
...
v1.1B3
Author | SHA1 | Date | |
---|---|---|---|
8320160d73 | |||
ce057b49b8 | |||
a60c989089 | |||
0f6371f0d8 | |||
1a4bbbe09a | |||
4e891dc2a8 | |||
18a77d63c3 | |||
4ea9c6e362 | |||
9d77c192a8 | |||
6d5401d911 | |||
330d6e79f8 | |||
ed58b7a63c | |||
f6853114c1 | |||
8ec7285d32 | |||
c183c0fe89 | |||
38ad8fd27d | |||
de85070e73 | |||
5b8ebd6e1d | |||
db530cb5e5 | |||
7cd4d4faab | |||
2560a513dc | |||
1ee95be5d7 | |||
bd7546559c | |||
d18a2c8b75 | |||
0ebae0adc1 | |||
d70c49ccd0 | |||
5846939116 | |||
f124e74f01 | |||
05abb93e4b | |||
5839d46b7a | |||
bce0d63f7d | |||
14b9f5affc | |||
035a430470 | |||
0af9e46e76 | |||
c4530f1252 | |||
9f78a17583 | |||
eea0b1bc79 | |||
8338a6e066 | |||
ddba49dbea | |||
a6ff8a87de | |||
bf64bcf9ba | |||
8c5d9bda20 | |||
f1ac28b0aa | |||
ff725f931d | |||
31519ba416 | |||
0bca8f851c | |||
acf175da60 | |||
23eac24c84 | |||
0f9ef3bd51 | |||
2bdd54536e | |||
060ebcca0d | |||
b38a89e485 | |||
b5bfeee027 | |||
f36cacaf84 | |||
4278cec465 | |||
151627091b | |||
2ee3f02928 | |||
d77d3ccccf | |||
1e0c91658e | |||
568096b560 | |||
b2e175a991 | |||
757c4f151d | |||
8b71e18972 | |||
4e7f988371 | |||
eb04d7ab90 | |||
d6c3b7304d | |||
1ee563cd13 | |||
8787f2c528 | |||
4c102ab57c | |||
bf87c539fd | |||
d5802f3a5f | |||
c144d4d303 | |||
9770efde14 | |||
197ce7c30a | |||
5d8384a508 | |||
8bb46a5f86 | |||
a3087cb696 | |||
92b1a8c00d | |||
bbf641e721 | |||
539ab9ce63 | |||
a29390412b | |||
739eb80cfb | |||
f9a470a0f0 | |||
44358e118c | |||
2a7ee146f1 | |||
0ddeb02235 | |||
26d8ea1c1c | |||
fa4aaf2fb7 | |||
7645a0185b | |||
dcf38cdf08 | |||
c7ca500dd5 | |||
d9fcc8ca1c | |||
259f2bf1c1 | |||
67711082b0 | |||
f2d98bbf25 | |||
e40505adb5 | |||
ac7b7f4a1b | |||
aa53b1e5ef | |||
c4b73c8eda | |||
332bce6322 | |||
5ef1de2647 | |||
de60e76b1d | |||
8f8e8fe086 | |||
0ac9a83026 | |||
b8c97caec0 | |||
f9b8bfc020 | |||
f938bf5e3f | |||
a0df9babf9 | |||
0d9d8ef5a2 | |||
668948ebc1 | |||
83c9351d38 | |||
aa1e32494c | |||
6365a553dc | |||
1245a29be6 | |||
c79785c2db | |||
f117a89697 | |||
33f5b8c05b | |||
9a02a46cf4 | |||
4d6fc3c848 | |||
964f2eed69 | |||
b45cff2881 | |||
f219885939 | |||
0cfc730745 | |||
a3643f8b02 | |||
de61eaf6b8 | |||
075a2b6e4c | |||
37affbf572 | |||
20b3ecd0cd | |||
c782c4d668 | |||
d545b8df26 | |||
08e520e0ec | |||
a5db7a2cca | |||
74c2494bbd | |||
858f77cdf7 | |||
30dae34700 | |||
36d50facd7 | |||
55dd8797d8 | |||
27114184d2 | |||
1980f511ce | |||
4cbee05849 | |||
f2391d99d5 | |||
fa9ff37de9 | |||
39b60c1348 | |||
5bc15a7e54 | |||
81bc200fe7 | |||
89324d2327 | |||
47b81a8025 | |||
02cec420e7 | |||
8e7e959d8a | |||
fc51b7cc22 | |||
ff5850847f | |||
ab462fb546 | |||
a5eadc50a7 | |||
afe7f8d728 | |||
c137d49dcd | |||
b70337bac3 | |||
c9b5f25ffc | |||
96f6c28885 | |||
deb8aed91f | |||
fac270e596 | |||
0189adac8f | |||
af772d7a86 | |||
96554cc0ca | |||
ddb3698c89 | |||
9657ae31c3 | |||
0795774e9e | |||
763f256e1f | |||
367f450e30 | |||
7afdee7c01 | |||
87c5f19ce1 | |||
00d1a3176e | |||
6318e7b0ef | |||
5d23b1fef8 | |||
44fe02d2fd | |||
1f0de20b7f | |||
bfd2e106ac | |||
b1848e963f | |||
a29611fa2a | |||
8a369bd48a | |||
9ca7424d27 | |||
4f640755bc | |||
c085a91991 | |||
83cd3cab99 | |||
67dff84a13 | |||
c702a86fbf | |||
f335a990af |
@ -1,5 +1,18 @@
|
||||
= Changelog
|
||||
|
||||
v1.1B3 (2017.1 B3)::
|
||||
|
||||
v1.1B2 (2017.1 B2)::
|
||||
|
||||
v1.1B1 (2017.1 BETA)::
|
||||
|
||||
This release brings some major new components and improvements.
|
||||
|
||||
- A .NET layer that allows the creation of file systems in managed mode. This is contained in the new `winfsp-msil.dll`. The new .NET layer is being tested with the WinFsp test suites and Microsoft's ifstest.
|
||||
- A simple C++ layer can be found in `inc/winfsp/winfsp.hpp`.
|
||||
- FUSE for Cygwin is now included with the installer.
|
||||
- FUSE now has a `-ovolname=VOLNAME` parameter that allows setting the volume label. Thanks @samkelly.
|
||||
|
||||
|
||||
v1.0::
|
||||
|
||||
|
@ -54,5 +54,6 @@ This CONTRIBUTOR AGREEMENT applies to any contribution that you make to the WinF
|
||||
CONTRIBUTOR LIST
|
||||
----------------
|
||||
|===
|
||||
|Bill Zissimopoulos |billziss at navimatics.com
|
||||
|Bill Zissimopoulos |billziss at navimatics.com
|
||||
|Sam Kelly (DuroSoft Technologies LLC, https://durosoft.com) |sam at durosoft.com
|
||||
|===
|
||||
|
@ -6,7 +6,7 @@ permissions to Free/Libre and Open Source Software ("FLOSS") without requiring
|
||||
that such software is covered by the GPLv3.
|
||||
|
||||
1. Permission to link with a platform specific version of the WinFsp DLL
|
||||
(currently winfsp-x64.dll or winfsp-x86.dll).
|
||||
(one of: winfsp-x64.dll, winfsp-x86.dll, winfsp-msil.dll).
|
||||
|
||||
2. Permission to distribute unmodified binary releases of the WinFsp
|
||||
installer (as released by the WinFsp project).
|
||||
|
11
README.md
11
README.md
@ -3,7 +3,9 @@
|
||||

|
||||
|
||||
|
||||
<a href="https://github.com/billziss-gh/winfsp/releases"><img src="http://www.secfs.net/winfsp/resources/Download-WinFsp.png" alt="Download WinFsp Installer" width="244" height="34"></a>
|
||||
<a href="https://github.com/billziss-gh/winfsp/releases/latest"><img src="http://www.secfs.net/winfsp/resources/Download-WinFsp.png" alt="Download WinFsp Installer" width="244" height="34"></a>
|
||||
 
|
||||
<a href="https://chocolatey.org/packages/winfsp"><img src="http://www.secfs.net/winfsp/resources/Choco-WinFsp.png" alt="choco install winfsp" width="244" height="34"></a>
|
||||
|
||||
|
||||
|
||||
@ -16,6 +18,7 @@ Some of the benefits of using WinFsp are listed below:
|
||||
* Strives for compatibility with NTFS. Read about its [Compatibility](doc/NTFS-Compatibility.asciidoc ).
|
||||
* Easy to understand but comprehensive API. Consult the [API Reference](http://www.secfs.net/winfsp/apiref/). There is also a simple [Tutorial](doc/WinFsp-Tutorial.asciidoc).
|
||||
* FUSE compatibility layer for native Windows and Cygwin. See [fuse.h](inc/fuse/fuse.h).
|
||||
* .NET layer for managed development. See [src/dotnet](src/dotnet).
|
||||
* Signed drivers provided on every release.
|
||||
* Available under the [GPLv3](License.txt) license with a special exception for Free/Libre and Open Source Software.
|
||||
|
||||
@ -35,10 +38,12 @@ The project source code is organized as follows:
|
||||
* inc/fuse: Public headers for the FUSE compatibility layer.
|
||||
* src/dll: Source code to the WinFsp DLL.
|
||||
* src/dll/fuse: Source code to the FUSE compatibility layer.
|
||||
* src/dotnet: Source code to the .NET layer.
|
||||
* src/launcher: Source code to the launcher service and the launchctl utility.
|
||||
* src/sys: Source code to the WinFsp FSD.
|
||||
* opt/cygfuse: Source code for the Cygwin FUSE package.
|
||||
* tst/memfs: Source code to an example file system written in C++ (memfs).
|
||||
* tst/memfs*: Source code to an example file system written in C/C++ (memfs) or C# (memfs-dotnet).
|
||||
* tst/passthrough*: Source code to additional example file systems.
|
||||
* tst/winfsp-tests: WinFsp test suite.
|
||||
|
||||
## Building and Running
|
||||
@ -68,7 +73,7 @@ WinFsp is designed to run on Windows 7 and above. It has been tested on the foll
|
||||
I am looking for help in the following areas:
|
||||
|
||||
* 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.
|
||||
* If you are working with a language other than C/C++ (e.g. Delphi, C#, etc.) and you are interested in porting/wrapping WinFsp I would love to hear from you.
|
||||
* 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.
|
||||
|
1
build/VStudio/.gitignore
vendored
1
build/VStudio/.gitignore
vendored
@ -3,3 +3,4 @@ build
|
||||
*.suo
|
||||
*.vcproj.*
|
||||
*.vcxproj.user
|
||||
*.csproj.user
|
||||
|
113
build/VStudio/dotnet/winfsp.net.csproj
Normal file
113
build/VStudio/dotnet/winfsp.net.csproj
Normal file
@ -0,0 +1,113 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="..\version.properties" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{94580219-CC8D-4FE5-A3BE-437B0B3481E1}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<ProjectName>winfsp.net</ProjectName>
|
||||
<RootNamespace>Fsp</RootNamespace>
|
||||
<AssemblyName>winfsp-msil</AssemblyName>
|
||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
||||
<BaseIntermediateOutputPath>$(SolutionDir)build\$(ProjectName).build\</BaseIntermediateOutputPath>
|
||||
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<DocumentationFile>$(BaseIntermediateOutputPath)$(Configuration)\winfsp-msil.xml</DocumentationFile>
|
||||
<NoWarn>1591</NoWarn>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
||||
<BaseIntermediateOutputPath>$(SolutionDir)build\$(ProjectName).build\</BaseIntermediateOutputPath>
|
||||
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<DocumentationFile>$(BaseIntermediateOutputPath)$(Configuration)\winfsp-msil.xml</DocumentationFile>
|
||||
<NoWarn>1591</NoWarn>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<SignAssembly>true</SignAssembly>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<AssemblyOriginatorKeyFile>winfsp.net.snk</AssemblyOriginatorKeyFile>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="..\..\..\src\dotnet\FileSystemBase+Const.cs">
|
||||
<Link>FileSystemBase+Const.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\..\..\src\dotnet\FileSystemBase.cs">
|
||||
<Link>FileSystemBase.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\..\..\src\dotnet\FileSystemHost.cs">
|
||||
<Link>FileSystemHost.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\..\..\src\dotnet\Interop.cs">
|
||||
<Link>Interop.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\..\..\src\dotnet\Service.cs">
|
||||
<Link>Service.cs</Link>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="winfsp.net.snk" />
|
||||
</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="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
<Target Name="BeforeBuild">
|
||||
<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>
|
||||
<MakeDir Directories="$(IntermediateOutputPath)" />
|
||||
<WriteLinesToFile File="$(IntermediateOutputPath)AssemblyInfo.cs" Lines="@(AssemblyInfo)" Overwrite="true" />
|
||||
<ItemGroup>
|
||||
<Compile Include="$(IntermediateOutputPath)AssemblyInfo.cs" />
|
||||
<FileWrites Include="$(IntermediateOutputPath)AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
</Target>
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>exit /b 0
|
||||
|
||||
set TargetName=$(TargetName)
|
||||
set MyAssemblyPolicyVersion=$(MyAssemblyPolicyVersion)
|
||||
set MyAssemblyVersion=$(MyAssemblyVersion)
|
||||
|
||||
setlocal EnableDelayedExpansion
|
||||
if exist $(OutDir)policy.$(MyAssemblyPolicyVersion).$(TargetName).config del $(OutDir)policy.$(MyAssemblyPolicyVersion).$(TargetName).config
|
||||
for /f "delims=" %25%25l in ($(ProjectDir)winfsp.net.policy.config) do (
|
||||
set line=%25%25l
|
||||
echo !line! >>$(OutDir)policy.$(MyAssemblyPolicyVersion).$(TargetName).config
|
||||
)
|
||||
|
||||
"$(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>
|
||||
</PropertyGroup>
|
||||
</Project>
|
10
build/VStudio/dotnet/winfsp.net.policy.config
Normal file
10
build/VStudio/dotnet/winfsp.net.policy.config
Normal file
@ -0,0 +1,10 @@
|
||||
<configuration>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="!TargetName!" publicKeyToken="b099876d8fa9b1f3" culture="neutral" />
|
||||
<bindingRedirect oldVersion="!MyAssemblyPolicyVersion!.0.0-!MyAssemblyVersion!" newVersion="!MyAssemblyVersion!" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
BIN
build/VStudio/dotnet/winfsp.net.snk
Normal file
BIN
build/VStudio/dotnet/winfsp.net.snk
Normal file
Binary file not shown.
@ -39,6 +39,7 @@
|
||||
<Directory Id="BINDIR" Name="bin" />
|
||||
<Directory Id="INCDIR" Name="inc" />
|
||||
<Directory Id="LIBDIR" Name="lib" />
|
||||
<Directory Id="OPTDIR" Name="opt" />
|
||||
<Directory Id="SMPDIR" Name="samples" />
|
||||
<Directory Id="SYMDIR" Name="sym" />
|
||||
</Directory>
|
||||
@ -87,6 +88,23 @@
|
||||
<Condition>NOT VersionNT64</Condition>
|
||||
</Component>
|
||||
|
||||
<!-- install assembly -->
|
||||
<Component Id="C.winfsp_msil.dll" Guid="0D8BA6AE-9F87-402B-AE1A-95B0AE3BE179">
|
||||
<File Id="FILE.winfsp_msil.dll" Name="winfsp-msil.dll" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="C.winfsp_msil.xml" Guid="1657F707-C112-454C-91AE-0FDEBBF454AB">
|
||||
<File Id="FILE.winfsp_msil.xml" Name="winfsp-msil.xml" KeyPath="yes" />
|
||||
</Component>
|
||||
<!--
|
||||
<Component Id="C.winfsp_msil.dll.GAC" Guid="6469467D-8C90-4889-8138-4028F9DA6E85">
|
||||
<File Id="FILE.winfsp_msil.dll.GAC" Name="winfsp-msil.dll" KeyPath="yes" Assembly=".net" />
|
||||
</Component>
|
||||
<Component Id="C.policy.winfsp_msil.dll.GAC">
|
||||
<File Name="policy.1.0.winfsp-msil.dll" KeyPath="yes" Assembly=".net" />
|
||||
<File Name="policy.1.0.winfsp-msil.config" KeyPath="no" />
|
||||
</Component>
|
||||
-->
|
||||
|
||||
<!-- On Win64 ServiceInstall launcher-x64.exe -->
|
||||
<Component Id="C.launcher_x64.exe.svcinst">
|
||||
<File Id="launcher_x64.exe.svcinst" Name="launcher-x64.exe" KeyPath="yes" />
|
||||
@ -199,6 +217,32 @@
|
||||
</RegistryKey>
|
||||
</RegistryKey>
|
||||
</Component>
|
||||
<Component Id="C.memfs_dotnet_msil.exe">
|
||||
<File Name="memfs-dotnet-msil.exe" KeyPath="yes" />
|
||||
<RegistryKey
|
||||
Root="HKLM"
|
||||
Key="[P.LauncherRegistryKey]">
|
||||
<RegistryKey
|
||||
Key="memfs-dotnet">
|
||||
<RegistryValue
|
||||
Type="string"
|
||||
Name="Executable"
|
||||
Value="[BINDIR]memfs-dotnet-msil.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>
|
||||
</DirectoryRef>
|
||||
<DirectoryRef Id="INCDIR" FileSource="..\..\..\inc">
|
||||
<Directory Id="INCDIR.winfsp" Name="winfsp">
|
||||
@ -208,6 +252,9 @@
|
||||
<Component Id="C.winfsp.h">
|
||||
<File Name="winfsp.h" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="C.winfsp.hpp">
|
||||
<File Name="winfsp.hpp" KeyPath="yes" />
|
||||
</Component>
|
||||
</Directory>
|
||||
<Directory Id="INCDIR.fuse" Name="fuse">
|
||||
<Component Id="C.fuse.h">
|
||||
@ -252,6 +299,26 @@
|
||||
<Condition>NOT VersionNT64</Condition>
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
<DirectoryRef Id="OPTDIR">
|
||||
<Directory Id="OPTDIR.cygfuse" Name="cygfuse" FileSource="..\..\..\opt\cygfuse\dist">
|
||||
<Directory Id="OPTDIR.cygfuse.x64" Name="x64">
|
||||
<Component Id="C.fuse.tar.xz.x64">
|
||||
<File Id="FILE.fuse.tar.xz.x64" Name="fuse-2.8-5.tar.xz" KeyPath="yes" />
|
||||
</Component>
|
||||
</Directory>
|
||||
<Directory Id="OPTDIR.cygfuse.x86" Name="x86">
|
||||
<Component Id="C.fuse.tar.xz.x86">
|
||||
<File Id="FILE.fuse.tar.xz.x86" Name="fuse-2.8-5.tar.xz" KeyPath="yes" />
|
||||
</Component>
|
||||
</Directory>
|
||||
<Component Id="C.fuse.install.sh">
|
||||
<File Name="install.sh" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="C.fuse.uninstall.sh">
|
||||
<File Name="uninstall.sh" KeyPath="yes" />
|
||||
</Component>
|
||||
</Directory>
|
||||
</DirectoryRef>
|
||||
<DirectoryRef Id="SMPDIR" FileSource="..\..\..\tst">
|
||||
<Directory Id="SMPDIR.memfs" Name="memfs">
|
||||
<Component Id="C.memfs.h">
|
||||
@ -264,6 +331,11 @@
|
||||
<File Name="memfs-main.c" KeyPath="yes" />
|
||||
</Component>
|
||||
</Directory>
|
||||
<Directory Id="SMPDIR.memfs_dotnet" Name="memfs-dotnet">
|
||||
<Component Id="C.memfs_dotnet.Program.cs">
|
||||
<File Id="FILE.memfs_dotnet.Program.cs" Name="Program.cs" KeyPath="yes" />
|
||||
</Component>
|
||||
</Directory>
|
||||
<Directory Id="SMPDIR.passthrough" Name="passthrough">
|
||||
<Component Id="C.passthrough.c">
|
||||
<File Name="passthrough.c" KeyPath="yes" />
|
||||
@ -278,6 +350,20 @@
|
||||
<File Name="passthrough.vcxproj.filters" KeyPath="yes" />
|
||||
</Component>
|
||||
</Directory>
|
||||
<Directory Id="SMPDIR.passthrough_cpp" Name="passthrough-cpp">
|
||||
<Component Id="C.passthrough_cpp.cpp">
|
||||
<File Name="passthrough-cpp.cpp" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="C.passthrough_cpp.sln">
|
||||
<File Name="passthrough-cpp.sln" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="C.passthrough_cpp.vcxproj">
|
||||
<File Name="passthrough-cpp.vcxproj" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="C.passthrough_cpp.vcxproj.filters">
|
||||
<File Name="passthrough-cpp.vcxproj.filters" KeyPath="yes" />
|
||||
</Component>
|
||||
</Directory>
|
||||
<Directory Id="SMPDIR.passthrough_fuse" Name="passthrough-fuse">
|
||||
<Component Id="C.passthrough_fuse.c">
|
||||
<File Name="passthrough-fuse.c" KeyPath="yes" />
|
||||
@ -304,6 +390,17 @@
|
||||
<File Name="README.md" KeyPath="yes" />
|
||||
</Component>
|
||||
</Directory>
|
||||
<Directory Id="SMPDIR.passthrough_dotnet" Name="passthrough-dotnet">
|
||||
<Component Id="C.passthrough_dotnet.Program.cs">
|
||||
<File Id="FILE.passthrough_dotnet.Program.cs" Name="Program.cs" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="C.passthrough_dotnet.sln">
|
||||
<File Name="passthrough-dotnet.sln" KeyPath="yes" />
|
||||
</Component>
|
||||
<Component Id="C.passthrough_dotnet.csproj">
|
||||
<File Name="passthrough-dotnet.csproj" KeyPath="yes" />
|
||||
</Component>
|
||||
</Directory>
|
||||
</DirectoryRef>
|
||||
<DirectoryRef Id="SYMDIR">
|
||||
<Component Id="C.winfsp_x64.sys.pdb">
|
||||
@ -357,6 +454,7 @@
|
||||
<ComponentGroup Id="C.WinFsp.inc">
|
||||
<ComponentRef Id="C.fsctl.h" />
|
||||
<ComponentRef Id="C.winfsp.h" />
|
||||
<ComponentRef Id="C.winfsp.hpp" />
|
||||
<ComponentRef Id="C.fuse.h" />
|
||||
<ComponentRef Id="C.fuse_common.h" />
|
||||
<ComponentRef Id="C.fuse_opt.h" />
|
||||
@ -368,6 +466,12 @@
|
||||
<ComponentRef Id="C.fuse_x64.pc" />
|
||||
<ComponentRef Id="C.fuse_x86.pc" />
|
||||
</ComponentGroup>
|
||||
<ComponentGroup Id="C.WinFsp.opt.fuse">
|
||||
<ComponentRef Id="C.fuse.tar.xz.x64" />
|
||||
<ComponentRef Id="C.fuse.tar.xz.x86" />
|
||||
<ComponentRef Id="C.fuse.install.sh" />
|
||||
<ComponentRef Id="C.fuse.uninstall.sh" />
|
||||
</ComponentGroup>
|
||||
<ComponentGroup Id="C.WinFsp.smp">
|
||||
<ComponentRef Id="C.memfs_x64.exe" />
|
||||
<ComponentRef Id="C.memfs_x86.exe" />
|
||||
@ -378,6 +482,10 @@
|
||||
<ComponentRef Id="C.passthrough.sln" />
|
||||
<ComponentRef Id="C.passthrough.vcxproj" />
|
||||
<ComponentRef Id="C.passthrough.vcxproj.filters" />
|
||||
<ComponentRef Id="C.passthrough_cpp.cpp" />
|
||||
<ComponentRef Id="C.passthrough_cpp.sln" />
|
||||
<ComponentRef Id="C.passthrough_cpp.vcxproj" />
|
||||
<ComponentRef Id="C.passthrough_cpp.vcxproj.filters" />
|
||||
<ComponentRef Id="C.passthrough_fuse.c" />
|
||||
<ComponentRef Id="C.passthrough_fuse.winposix.c" />
|
||||
<ComponentRef Id="C.passthrough_fuse.winposix.h" />
|
||||
@ -399,6 +507,21 @@
|
||||
<ComponentRef Id="C.memfs_x64.pdb" />
|
||||
<ComponentRef Id="C.memfs_x86.pdb" />
|
||||
</ComponentGroup>
|
||||
<ComponentGroup Id="C.WinFsp.net">
|
||||
<ComponentRef Id="C.winfsp_msil.dll" />
|
||||
<ComponentRef Id="C.winfsp_msil.xml" />
|
||||
<!--
|
||||
<ComponentRef Id="C.winfsp_msil.dll.GAC" />
|
||||
<ComponentRef Id="C.policy.winfsp_msil.dll.GAC" />
|
||||
-->
|
||||
</ComponentGroup>
|
||||
<ComponentGroup Id="C.WinFsp.smp.net">
|
||||
<ComponentRef Id="C.memfs_dotnet_msil.exe" />
|
||||
<ComponentRef Id="C.memfs_dotnet.Program.cs" />
|
||||
<ComponentRef Id="C.passthrough_dotnet.Program.cs" />
|
||||
<ComponentRef Id="C.passthrough_dotnet.sln" />
|
||||
<ComponentRef Id="C.passthrough_dotnet.csproj" />
|
||||
</ComponentGroup>
|
||||
|
||||
<Feature
|
||||
Id="F.Main"
|
||||
@ -421,7 +544,20 @@
|
||||
InstallDefault="local"
|
||||
Absent="disallow">
|
||||
<ComponentGroupRef Id="C.WinFsp.bin" />
|
||||
<ComponentGroupRef Id="C.WinFsp.net" />
|
||||
</Feature>
|
||||
<!--
|
||||
<Feature
|
||||
Id="F.Net"
|
||||
Level="10"
|
||||
Title=".NET"
|
||||
Description="The managed $(var.MyProductName) files."
|
||||
AllowAdvertise="no"
|
||||
InstallDefault="local"
|
||||
Absent="allow">
|
||||
<ComponentGroupRef Id="C.WinFsp.net" />
|
||||
</Feature>
|
||||
-->
|
||||
<Feature
|
||||
Id="F.Developer"
|
||||
Level="1000"
|
||||
@ -433,8 +569,19 @@
|
||||
<ComponentGroupRef Id="C.WinFsp.inc" />
|
||||
<ComponentGroupRef Id="C.WinFsp.lib" />
|
||||
<ComponentGroupRef Id="C.WinFsp.smp" />
|
||||
<ComponentGroupRef Id="C.WinFsp.smp.net" />
|
||||
<ComponentGroupRef Id="C.WinFsp.sym" />
|
||||
</Feature>
|
||||
<Feature
|
||||
Id="F.Cygfuse"
|
||||
Level="1000"
|
||||
Title="FUSE for Cygwin"
|
||||
Description="From a Cygwin prompt change to <InstallDir>/opt/cygfuse and run install.sh."
|
||||
AllowAdvertise="no"
|
||||
InstallDefault="local"
|
||||
Absent="allow">
|
||||
<ComponentGroupRef Id="C.WinFsp.opt.fuse" />
|
||||
</Feature>
|
||||
</Feature>
|
||||
|
||||
<WixVariable Id="WixUIBannerBmp" Value="wixbanner.bmp" />
|
||||
|
63
build/VStudio/testing/memfs-dotnet.csproj
Normal file
63
build/VStudio/testing/memfs-dotnet.csproj
Normal file
@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{4920E350-D496-4652-AE98-6C4208AEC1D8}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<ProjectName>memfs-dotnet</ProjectName>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>memfs</RootNamespace>
|
||||
<AssemblyName>memfs-dotnet-msil</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
||||
<BaseIntermediateOutputPath>$(SolutionDir)build\$(ProjectName).build\</BaseIntermediateOutputPath>
|
||||
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
||||
<BaseIntermediateOutputPath>$(SolutionDir)build\$(ProjectName).build\</BaseIntermediateOutputPath>
|
||||
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="..\..\..\tst\memfs-dotnet\Program.cs">
|
||||
<Link>Program.cs</Link>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<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>
|
@ -15,14 +15,17 @@
|
||||
<MyCompanyName>Navimatics Corporation</MyCompanyName>
|
||||
<MyCopyright>2015-$([System.DateTime]::Now.ToString(`yyyy`)) Bill Zissimopoulos</MyCopyright>
|
||||
|
||||
<MyCanonicalVersion>1.0</MyCanonicalVersion>
|
||||
<MyCanonicalVersion>1.1</MyCanonicalVersion>
|
||||
|
||||
<MyProductVersion>2017</MyProductVersion>
|
||||
<MyProductStage>Gold</MyProductStage>
|
||||
<MyProductVersion>2017.1 B3</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>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemDefinitionGroup>
|
||||
|
@ -53,146 +53,238 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fscrash", "testing\fscrash.
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fsbench", "testing\fsbench.vcxproj", "{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "winfsp.net", "dotnet\winfsp.net.csproj", "{94580219-CC8D-4FE5-A3BE-437B0B3481E1}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB} = {4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332} = {C85C26BA-8C22-4D30-83DA-46C3548E6332}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dotnet", "dotnet", "{A998CEC4-4B34-43DC-8457-F7761228BA67}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "memfs-dotnet", "testing\memfs-dotnet.csproj", "{4920E350-D496-4652-AE98-6C4208AEC1D8}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Installer.Debug|Any CPU = Installer.Debug|Any CPU
|
||||
Installer.Debug|x64 = Installer.Debug|x64
|
||||
Installer.Debug|x86 = Installer.Debug|x86
|
||||
Installer.Release|Any CPU = Installer.Release|Any CPU
|
||||
Installer.Release|x64 = Installer.Release|x64
|
||||
Installer.Release|x86 = Installer.Release|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Debug|x64.Build.0 = Debug|x64
|
||||
{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}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|x64.ActiveCfg = Release|x64
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|x64.Build.0 = Release|x64
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|x86.ActiveCfg = Release|Win32
|
||||
{4A7C0B21-9E10-4C81-92DE-1493EFCF24EB}.Release|x86.Build.0 = Release|Win32
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Debug|x64.Build.0 = Debug|x64
|
||||
{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}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|x64.ActiveCfg = Release|x64
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|x64.Build.0 = Release|x64
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|x86.ActiveCfg = Release|Win32
|
||||
{C85C26BA-8C22-4D30-83DA-46C3548E6332}.Release|x86.Build.0 = Release|Win32
|
||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Debug|x64.Build.0 = Debug|x64
|
||||
{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}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|x64.ActiveCfg = Release|x64
|
||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|x64.Build.0 = Release|x64
|
||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|x86.ActiveCfg = Release|Win32
|
||||
{262DF8CC-E7A8-4460-A22C-683CBA322C32}.Release|x86.Build.0 = Release|Win32
|
||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Debug|x64.Build.0 = Debug|x64
|
||||
{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}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|x64.ActiveCfg = Release|x64
|
||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|x64.Build.0 = Release|x64
|
||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|x86.ActiveCfg = Release|Win32
|
||||
{AA7190E8-877F-4827-8CDD-E0D85F83C8C1}.Release|x86.Build.0 = Release|Win32
|
||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Debug|Any CPU.ActiveCfg = Debug|x86
|
||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Debug|x64.ActiveCfg = Debug|x86
|
||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|Any CPU.ActiveCfg = Release|x86
|
||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|Any CPU.Build.0 = Release|x86
|
||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|x64.ActiveCfg = Release|x86
|
||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Debug|x64.Build.0 = Release|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.Release|Any CPU.ActiveCfg = Release|x86
|
||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|Any CPU.Build.0 = Release|x86
|
||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|x64.ActiveCfg = Release|x86
|
||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Installer.Release|x64.Build.0 = 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}.Release|Any CPU.ActiveCfg = Release|x86
|
||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Release|x64.ActiveCfg = Release|x86
|
||||
{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Release|x86.ActiveCfg = Release|x86
|
||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|Any CPU.Build.0 = Release|Win32
|
||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|x64.ActiveCfg = Release|Win32
|
||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Debug|x64.Build.0 = Release|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.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|Any CPU.Build.0 = Release|Win32
|
||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|x64.ActiveCfg = Release|Win32
|
||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Installer.Release|x64.Build.0 = 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}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Release|x64.ActiveCfg = Release|Win32
|
||||
{95C223E6-B5F1-4FD0-9376-41CDBC824445}.Release|x86.ActiveCfg = Release|Win32
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Debug|x64.Build.0 = Debug|x64
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Debug|x86.Build.0 = Debug|Win32
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Release|x64.ActiveCfg = Release|x64
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Release|x64.Build.0 = Release|x64
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Release|x86.ActiveCfg = Release|Win32
|
||||
{A5EFD487-0140-4184-8C54-FFAEC2F85E35}.Release|x86.Build.0 = Release|Win32
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Debug|x64.Build.0 = Debug|x64
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Debug|x86.Build.0 = Debug|Win32
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Release|x64.ActiveCfg = Release|x64
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Release|x64.Build.0 = Release|x64
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Release|x86.ActiveCfg = Release|Win32
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4}.Release|x86.Build.0 = Release|Win32
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Debug|x64.Build.0 = Debug|x64
|
||||
{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}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Debug|x64.Build.0 = Debug|x64
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Debug|x86.Build.0 = Debug|Win32
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Release|x64.Build.0 = Release|x64
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Installer.Release|x86.Build.0 = Release|Win32
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Release|x64.ActiveCfg = Release|x64
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Release|x64.Build.0 = Release|x64
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Release|x86.ActiveCfg = Release|Win32
|
||||
{10757011-749D-4954-873B-AE38D8145472}.Release|x86.Build.0 = Release|Win32
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Debug|x64.Build.0 = Debug|x64
|
||||
{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}.Installer.Debug|Any CPU.ActiveCfg = Release|Win32
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Debug|x64.ActiveCfg = Debug|x64
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Debug|x64.Build.0 = Debug|x64
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Debug|x86.Build.0 = Debug|Win32
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Release|x64.ActiveCfg = Release|x64
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Release|x64.Build.0 = Release|x64
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Release|x86.ActiveCfg = Release|Win32
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Installer.Release|x86.Build.0 = Release|Win32
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|x64.ActiveCfg = Release|x64
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|x64.Build.0 = Release|x64
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|x86.ActiveCfg = Release|Win32
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB}.Release|x86.Build.0 = Release|Win32
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Debug|x64.Build.0 = 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}.Installer.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Installer.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1}.Release|x64.Build.0 = 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
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Debug|x64.Build.0 = 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}.Installer.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Release|x64.Build.0 = Release|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Installer.Release|x86.Build.0 = Release|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8}.Release|x64.Build.0 = 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
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@ -206,5 +298,7 @@ Global
|
||||
{73EAAEDA-557B-48D5-A137-328934720FB4} = {FD28A504-431E-49B9-BB8C-DCA0E7019F66}
|
||||
{10757011-749D-4954-873B-AE38D8145472} = {69439FD1-C07D-4BF1-98DC-3CCFECE53A49}
|
||||
{C4E1E9E5-0959-488E-8C6A-C327CC81BEFB} = {69439FD1-C07D-4BF1-98DC-3CCFECE53A49}
|
||||
{94580219-CC8D-4FE5-A3BE-437B0B3481E1} = {A998CEC4-4B34-43DC-8457-F7761228BA67}
|
||||
{4920E350-D496-4652-AE98-6C4208AEC1D8} = {69439FD1-C07D-4BF1-98DC-3CCFECE53A49}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
@ -26,6 +26,7 @@
|
||||
<ClInclude Include="..\..\inc\fuse\winfsp_fuse.h" />
|
||||
<ClInclude Include="..\..\inc\winfsp\fsctl.h" />
|
||||
<ClInclude Include="..\..\inc\winfsp\winfsp.h" />
|
||||
<ClInclude Include="..\..\inc\winfsp\winfsp.hpp" />
|
||||
<ClInclude Include="..\..\src\dll\fuse\library.h" />
|
||||
<ClInclude Include="..\..\src\dll\library.h" />
|
||||
<ClInclude Include="..\..\src\shared\minimal.h" />
|
||||
|
@ -50,6 +50,9 @@
|
||||
<ClInclude Include="..\..\src\dll\fuse\library.h">
|
||||
<Filter>Source\fuse</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\inc\winfsp\winfsp.hpp">
|
||||
<Filter>Include\winfsp</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\src\dll\library.c">
|
||||
|
4
build/choco/LICENSE.txt
Normal file
4
build/choco/LICENSE.txt
Normal file
@ -0,0 +1,4 @@
|
||||
From: https://github.com/billziss-gh/winfsp/blob/master/License.txt
|
||||
|
||||
LICENSE
|
||||
|
15
build/choco/VERIFICATION.txt
Normal file
15
build/choco/VERIFICATION.txt
Normal file
@ -0,0 +1,15 @@
|
||||
VERIFICATION
|
||||
Verification is intended to assist the Chocolatey moderators and community
|
||||
in verifying that this package's contents are trustworthy.
|
||||
|
||||
WinFsp GitHub repository: https://github.com/billziss-gh/winfsp
|
||||
WinFsp MSI releases : https://github.com/billziss-gh/winfsp/releases
|
||||
|
||||
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.
|
||||
For example, for WinFsp version 1.0.17072 the command line to use is:
|
||||
|
||||
certutil -hashfile winfsp-1.0.17072.msi SHA256
|
||||
|
||||
The certutil output of the MSI in this package is included below.
|
||||
|
@ -1,13 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>winfsp</id>
|
||||
<version>$version$</version>
|
||||
<packageSourceUrl>https://github.com/billziss-gh/winfsp/tree/master/build/choco</packageSourceUrl>
|
||||
<owners>Bill Zissimopoulos <billziss at navimatics.com></owners>
|
||||
<owners>Bill Zissimopoulos</owners>
|
||||
|
||||
<title>WinFsp</title>
|
||||
<authors>Bill Zissimopoulos <billziss at navimatics.com></authors>
|
||||
<authors>Bill Zissimopoulos</authors>
|
||||
<projectUrl>https://github.com/billziss-gh/winfsp</projectUrl>
|
||||
<iconUrl>https://github.com/billziss-gh/winfsp/raw/master/art/winfsp-solid.png</iconUrl>
|
||||
<copyright>Bill Zissimopoulos</copyright>
|
||||
@ -31,6 +31,13 @@ Some of the benefits of using WinFsp are listed below:
|
||||
* FUSE compatibility layer for native Windows and Cygwin.
|
||||
* Signed drivers provided on every release.
|
||||
* Available under the GPLv3 license with a special exception for Free/Libre and Open Source Software.
|
||||
|
||||
To verify installation:
|
||||
|
||||
* For 64-bit Windows: `net use m: \\memfs64\share` from the command prompt.
|
||||
* For 32-bit Windows: `net use m: \\memfs32\share`
|
||||
* For Cygwin: `net use m: '\\memfs64\share'`
|
||||
* To delete the drive: `net use m: /delete`
|
||||
</description>
|
||||
<releaseNotes>https://github.com/billziss-gh/winfsp/blob/master/Changelog.asciidoc</releaseNotes>
|
||||
|
||||
@ -40,6 +47,8 @@ Some of the benefits of using WinFsp are listed below:
|
||||
</metadata>
|
||||
|
||||
<files>
|
||||
<file src="LICENSE.txt" target="tools" />
|
||||
<file src="VERIFICATION.txt" target="tools" />
|
||||
<file src="chocolateyInstall.ps1" target="tools" />
|
||||
<file src="chocolateyBeforeModify.ps1" target="tools" />
|
||||
<file src="winfsp-$version$.msi" target="tools" />
|
||||
|
51
doc/Frequently-Asked-Questions.asciidoc
Normal file
51
doc/Frequently-Asked-Questions.asciidoc
Normal file
@ -0,0 +1,51 @@
|
||||
= Frequently Asked Questions
|
||||
|
||||
== General
|
||||
|
||||
[qanda]
|
||||
|
||||
I am running Windows 7 and I am finding that the installed driver is not signed. [@efeat]::
|
||||
|
||||
Your Windows 7 OS is missing SHA-2 Code Signing Support. You need to install the following security advisory that will rectify the problem:
|
||||
https://technet.microsoft.com/en-us/library/security/3033929.aspx
|
||||
|
||||
|
||||
Why is the DLL not installed in the Windows system directories? [@netheril96]::
|
||||
|
||||
It is true that this would make it convenient to load the DLL, because the Windows loader looks into the Windows system directories when it loads DLL's. However, in the opinion of the WinFsp author, software that does not ship with the OS should not be installing components in the system directories.
|
||||
+
|
||||
There are a few alternative methods to overcome this problem. WinFsp recommends marking the WinFsp DLL as "delay load" and then using `FspLoad` to dynamically load the DLL during process initialization. For more information see the WinFsp Tutorial.
|
||||
|
||||
|
||||
Does WinFsp provide debugging symbols? [@netheril96]::
|
||||
|
||||
Public debugging symbols are already included in the installer. You need to install the "Developer" feature; the symbols can be found in the `sym` directory under the WinFsp installation directory.
|
||||
|
||||
|
||||
Is there a maximum number of concurrent file systems? [@efeat]::
|
||||
|
||||
WinFsp does not have a hard limit of how many file systems can be created or how many processes can create file systems.
|
||||
+
|
||||
As of the commits required to fix issue #55, there is however a hash table inside the FSD that uses PID's (Process ID's) as keys. This hash table currently expects that in general there will not be more than 50 processes creating file systems. However this is not a hard limit.
|
||||
|
||||
|
||||
== FUSE
|
||||
|
||||
[qanda]
|
||||
|
||||
Which version of FUSE does WinFsp-FUSE support?::
|
||||
|
||||
Currently it supports FUSE 2.8.
|
||||
|
||||
|
||||
FUSE on UNIX systems mounts file systems over an existing directory. When mounting a WinFsp-FUSE file system on a directory, the directory is created and later deleted when the file system goes away. What is the reason for this incompatibility? [@efeat]::
|
||||
|
||||
It would be preferrable if WinFsp-FUSE behaved like FUSE on UNIX in this instance. However there are a number of reasons that this is not the case.
|
||||
+
|
||||
When mounting over directories in Windows, WinFsp-FUSE uses a special construct called a reparse point. Reparse points are a general mechanism for adding special behavior to files and directories. One of the possible reparse points is the "mountpoint" reparse point (often called "junction"), which converts a directory into a mount point.
|
||||
+
|
||||
With this in mind here are the reasons for the current WinFsp-FUSE behavior:
|
||||
+
|
||||
- Symmetry with mounting on a drive. On Windows drives are created when the file system comes into existence and deleted when it is gone.
|
||||
- Inability to mount over a non-empty directory on Windows. On FUSE/UNIX this is possible, but not on Windows because NTFS disallows the creation of (mountpoint) reparse points on non-empty directories.
|
||||
- Most importantly: inability to guarantee that the mount point will cease to exist if the file system crashes. WinFsp attempts to guarantee that all resources used by a file system will get cleaned up. This is certainly true for the kernel-mode FSD, but an attempt is made to do so also in user mode. For this reason, drive symbolic links are marked as temporary and (importantly for our discussion) mount directories are opened with `FILE_FLAG_DELETE_ON_CLOSE`. There is no way to guarantee the removal of a reparse point in the same way.
|
32
doc/Home.md
Normal file
32
doc/Home.md
Normal file
@ -0,0 +1,32 @@
|
||||
# WinFsp - Windows File System Proxy
|
||||
|
||||
[[WinFsp-Icon.png]]
|
||||
|
||||
Developing file systems is a challenging proposition. Developing file systems for Windows is an order of magnitude more difficult. WinFsp eases the task of writing a new file system for Windows. WinFsp file systems are user mode programs and they can be written in a variety of languages and frameworks.
|
||||
|
||||
The documentation available here discusses various aspects of WinFsp.
|
||||
|
||||
## Programming
|
||||
|
||||
- The [[Tutorial|WinFsp-Tutorial]] describes how to create a simple, but complete file system in C/C++.
|
||||
- The [[API Reference|winfsp.h]] describes the native WinFsp API. This external [[link|http://www.secfs.net/winfsp/apiref/]] may be easier to browse for some people.
|
||||
- There is also a FUSE compatibility layer for native Windows and Cygwin. See fuse.h in the source repository.
|
||||
- This [[document|Native-API-vs-FUSE]] discusses the need for both a native API and FUSE and gives some pointers on which one to choose.
|
||||
|
||||
## Design
|
||||
|
||||
- The [[Design|WinFsp-Design]] document describes the high-level design of WinFsp.
|
||||
- The [[IPC|WinFsp-as-an-IPC-Mechanism]] document offers insights into the WinFsp Inter-Process Communication mechanism.
|
||||
- The [[Service Architecture|WinFsp-Service-Architecture]] document discusses how to intergrate a file system into Windows as a service and the reasons to do so.
|
||||
- The [[SSHFS Port Case Study|SSHFS-Port-Case-Study]] document chronicles the creation of the WinFsp-FUSE compatibility layer and the decisions that led to its design.
|
||||
|
||||
## Testing
|
||||
|
||||
- The [[Testing|WinFsp-Testing]] document discusses the WinFsp testing strategy and how WinFsp achieves correctness and stability.
|
||||
- The [[Performance|WinFsp-Performance-Testing]] document compares WinFsp performance against other file systems.
|
||||
|
||||
## Compatibility
|
||||
|
||||
- The [[Compatibility|NTFS-Compatibility]] document discusses current WinFsp compatibility with NTFS.
|
||||
|
||||
WinFsp is available under the GPLv3 license with a special exception for Free/Libre and Open Source Software.
|
20
doc/Known-File-Systems.asciidoc
Normal file
20
doc/Known-File-Systems.asciidoc
Normal file
@ -0,0 +1,20 @@
|
||||
= Known File Systems and File System Libraries
|
||||
|
||||
This document contains a list of known file systems and file system libraries that run on WinFsp. Please contact the WinFsp project to have your file system solution added to this list.
|
||||
|
||||
== File Systems
|
||||
|
||||
- https://github.com/billziss-gh/nfs-win[nfs-win] - NFS for Windows
|
||||
- https://github.com/ncw/rclone[rclone] - rsync for cloud storage
|
||||
- https://github.com/hasse69/rar2fs[rar2fs] - FUSE file system for reading RAR archives
|
||||
- https://github.com/billziss-gh/redditfs[redditfs] - ls -l /r/programming
|
||||
- https://github.com/netheril96/securefs[securefs] - Filesystem in userspace (FUSE) with transparent authenticated encryption
|
||||
- https://github.com/billziss-gh/sshfs-win[sshfs-win] - SSHFS for Windows
|
||||
|
||||
== File System Libraries
|
||||
|
||||
- https://github.com/billziss-gh/cgofuse[cgofuse] - Cross-platform FUSE library for Go
|
||||
- https://github.com/DuroSoft/fuse-bindings[fuse-bindings] - Fully maintained FUSE bindings for Node that aims to cover the entire FUSE api
|
||||
- https://github.com/ui4j/fuse-jna[fuse-jna] - No-nonsense, actually-working Java bindings to FUSE using JNA
|
||||
- https://github.com/billziss-gh/fusepy[fusepy] - Simple ctypes bindings for FUSE
|
||||
- https://github.com/yogendersolanki91/winfsp[WinFsp fork with .NET Layer] - by @yogendersolanki91
|
BIN
doc/WinFsp-Icon.png
Normal file
BIN
doc/WinFsp-Icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
@ -118,6 +118,8 @@ FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_loop_mt)(struct fsp_fuse_env *env,
|
||||
struct fuse *f);
|
||||
FSP_FUSE_API void FSP_FUSE_API_NAME(fsp_fuse_exit)(struct fsp_fuse_env *env,
|
||||
struct fuse *f);
|
||||
FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_exited)(struct fsp_fuse_env *env,
|
||||
struct fuse *f);
|
||||
FSP_FUSE_API struct fuse_context *FSP_FUSE_API_NAME(fsp_fuse_get_context)(struct fsp_fuse_env *env);
|
||||
|
||||
FSP_FUSE_SYM(
|
||||
@ -171,6 +173,13 @@ void fuse_exit(struct fuse *f),
|
||||
(fsp_fuse_env(), f);
|
||||
})
|
||||
|
||||
FSP_FUSE_SYM(
|
||||
int fuse_exited(struct fuse *f),
|
||||
{
|
||||
return FSP_FUSE_API_CALL(fsp_fuse_exited)
|
||||
(fsp_fuse_env(), f);
|
||||
})
|
||||
|
||||
FSP_FUSE_SYM(
|
||||
struct fuse_context *fuse_get_context(void),
|
||||
{
|
||||
|
@ -178,6 +178,7 @@ struct fuse_flock
|
||||
fsp_fuse_daemonize, \
|
||||
fsp_fuse_set_signal_handlers, \
|
||||
0/*conv_to_win_path*/, \
|
||||
{ 0 }, \
|
||||
}
|
||||
#else
|
||||
#define FSP_FUSE_ENV_INIT \
|
||||
@ -187,6 +188,7 @@ struct fuse_flock
|
||||
fsp_fuse_daemonize, \
|
||||
fsp_fuse_set_signal_handlers, \
|
||||
0/*conv_to_win_path*/, \
|
||||
{ 0 }, \
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -229,6 +231,7 @@ struct fuse_flock
|
||||
fsp_fuse_daemonize, \
|
||||
fsp_fuse_set_signal_handlers, \
|
||||
fsp_fuse_conv_to_win_path, \
|
||||
{ 0 }, \
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -961,11 +961,14 @@ FSP_API VOID FspFileSystemSendResponse(FSP_FILE_SYSTEM *FileSystem,
|
||||
* The current operation context.
|
||||
*/
|
||||
FSP_API FSP_FILE_SYSTEM_OPERATION_CONTEXT *FspFileSystemGetOperationContext(VOID);
|
||||
FSP_API PWSTR FspFileSystemMountPointF(FSP_FILE_SYSTEM *FileSystem);
|
||||
static inline
|
||||
PWSTR FspFileSystemMountPoint(FSP_FILE_SYSTEM *FileSystem)
|
||||
{
|
||||
return FileSystem->MountPoint;
|
||||
}
|
||||
FSP_API NTSTATUS FspFileSystemEnterOperationF(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||
static inline
|
||||
NTSTATUS FspFileSystemEnterOperation(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||
@ -975,6 +978,8 @@ NTSTATUS FspFileSystemEnterOperation(FSP_FILE_SYSTEM *FileSystem,
|
||||
|
||||
return FileSystem->EnterOperation(FileSystem, Request, Response);
|
||||
}
|
||||
FSP_API NTSTATUS FspFileSystemLeaveOperationF(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response);
|
||||
static inline
|
||||
NTSTATUS FspFileSystemLeaveOperation(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||
@ -984,6 +989,9 @@ NTSTATUS FspFileSystemLeaveOperation(FSP_FILE_SYSTEM *FileSystem,
|
||||
|
||||
return FileSystem->LeaveOperation(FileSystem, Request, Response);
|
||||
}
|
||||
FSP_API VOID FspFileSystemSetOperationGuardF(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FILE_SYSTEM_OPERATION_GUARD *EnterOperation,
|
||||
FSP_FILE_SYSTEM_OPERATION_GUARD *LeaveOperation);
|
||||
static inline
|
||||
VOID FspFileSystemSetOperationGuard(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FILE_SYSTEM_OPERATION_GUARD *EnterOperation,
|
||||
@ -1002,12 +1010,17 @@ VOID FspFileSystemSetOperationGuard(FSP_FILE_SYSTEM *FileSystem,
|
||||
* @see
|
||||
* FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY
|
||||
*/
|
||||
FSP_API VOID FspFileSystemSetOperationGuardStrategyF(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY GuardStrategy);
|
||||
static inline
|
||||
VOID FspFileSystemSetOperationGuardStrategy(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY GuardStrategy)
|
||||
{
|
||||
FileSystem->OpGuardStrategy = GuardStrategy;
|
||||
}
|
||||
FSP_API VOID FspFileSystemSetOperationF(FSP_FILE_SYSTEM *FileSystem,
|
||||
ULONG Index,
|
||||
FSP_FILE_SYSTEM_OPERATION *Operation);
|
||||
static inline
|
||||
VOID FspFileSystemSetOperation(FSP_FILE_SYSTEM *FileSystem,
|
||||
ULONG Index,
|
||||
@ -1015,6 +1028,8 @@ VOID FspFileSystemSetOperation(FSP_FILE_SYSTEM *FileSystem,
|
||||
{
|
||||
FileSystem->Operations[Index] = Operation;
|
||||
}
|
||||
FSP_API VOID FspFileSystemGetDispatcherResultF(FSP_FILE_SYSTEM *FileSystem,
|
||||
NTSTATUS *PDispatcherResult);
|
||||
static inline
|
||||
VOID FspFileSystemGetDispatcherResult(FSP_FILE_SYSTEM *FileSystem,
|
||||
NTSTATUS *PDispatcherResult)
|
||||
@ -1023,6 +1038,8 @@ VOID FspFileSystemGetDispatcherResult(FSP_FILE_SYSTEM *FileSystem,
|
||||
*PDispatcherResult = FileSystem->DispatcherResult;
|
||||
MemoryBarrier();
|
||||
}
|
||||
FSP_API VOID FspFileSystemSetDispatcherResultF(FSP_FILE_SYSTEM *FileSystem,
|
||||
NTSTATUS DispatcherResult);
|
||||
static inline
|
||||
VOID FspFileSystemSetDispatcherResult(FSP_FILE_SYSTEM *FileSystem,
|
||||
NTSTATUS DispatcherResult)
|
||||
@ -1031,12 +1048,15 @@ VOID FspFileSystemSetDispatcherResult(FSP_FILE_SYSTEM *FileSystem,
|
||||
return;
|
||||
InterlockedCompareExchange(&FileSystem->DispatcherResult, DispatcherResult, 0);
|
||||
}
|
||||
FSP_API VOID FspFileSystemSetDebugLogF(FSP_FILE_SYSTEM *FileSystem,
|
||||
UINT32 DebugLog);
|
||||
static inline
|
||||
VOID FspFileSystemSetDebugLog(FSP_FILE_SYSTEM *FileSystem,
|
||||
UINT32 DebugLog)
|
||||
{
|
||||
FileSystem->DebugLog = DebugLog;
|
||||
}
|
||||
FSP_API BOOLEAN FspFileSystemIsOperationCaseSensitiveF(VOID);
|
||||
static inline
|
||||
BOOLEAN FspFileSystemIsOperationCaseSensitive(VOID)
|
||||
{
|
||||
|
1308
inc/winfsp/winfsp.hpp
Normal file
1308
inc/winfsp/winfsp.hpp
Normal file
File diff suppressed because it is too large
Load Diff
@ -18,3 +18,11 @@ cygport:
|
||||
> opt/cygfuse/winfsp-work.tar.gz\
|
||||
)
|
||||
CYGPORT_SRC_URI=winfsp-work.tar.gz CYGPORT_SRC_DIR=winfsp-work cygport fuse.cygport download prep compile install package
|
||||
|
||||
dist: cygport
|
||||
case $(shell uname -m) in \
|
||||
x86_64)\
|
||||
cp fuse-*/dist/fuse/fuse-*[0-9].tar.xz dist/x64 ;;\
|
||||
*)\
|
||||
cp fuse-*/dist/fuse/fuse-*[0-9].tar.xz dist/x86 ;;\
|
||||
esac
|
||||
|
@ -17,22 +17,39 @@
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/cygwin.h>
|
||||
|
||||
static void *cygfuse_init_slow(int force);
|
||||
static void *cygfuse_init_winfsp();
|
||||
static void *cygfuse_init_fail();
|
||||
|
||||
static pthread_mutex_t cygfuse_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
static void *cygfuse_handle = 0;
|
||||
|
||||
static inline void cygfuse_init(int force)
|
||||
static inline void *cygfuse_init_fast(void)
|
||||
{
|
||||
void *handle = cygfuse_handle;
|
||||
__sync_synchronize(); /* memory barrier */
|
||||
if (0 == handle)
|
||||
handle = cygfuse_init_slow(0);
|
||||
return handle;
|
||||
}
|
||||
|
||||
static void *cygfuse_init_slow(int force)
|
||||
{
|
||||
void *handle;
|
||||
pthread_mutex_lock(&cygfuse_mutex);
|
||||
if (force || 0 == cygfuse_handle)
|
||||
cygfuse_handle = cygfuse_init_winfsp();
|
||||
handle = cygfuse_handle;
|
||||
if (force || 0 == handle)
|
||||
{
|
||||
handle = cygfuse_init_winfsp();
|
||||
__sync_synchronize(); /* memory barrier */
|
||||
cygfuse_handle = handle;
|
||||
}
|
||||
pthread_mutex_unlock(&cygfuse_mutex);
|
||||
return handle;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -50,7 +67,7 @@ static inline int cygfuse_daemon(int nochdir, int noclose)
|
||||
return -1;
|
||||
|
||||
/* force reload of WinFsp DLL to workaround fork() problems */
|
||||
cygfuse_init(1);
|
||||
cygfuse_init_slow(1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -58,7 +75,7 @@ static inline int cygfuse_daemon(int nochdir, int noclose)
|
||||
|
||||
#define FSP_FUSE_API static
|
||||
#define FSP_FUSE_API_NAME(api) (* pfn_ ## api)
|
||||
#define FSP_FUSE_API_CALL(api) (cygfuse_init(0), pfn_ ## api)
|
||||
#define FSP_FUSE_API_CALL(api) (cygfuse_init_fast(), pfn_ ## api)
|
||||
#define FSP_FUSE_SYM(proto, ...) __attribute__ ((visibility("default"))) proto { __VA_ARGS__ }
|
||||
#include <fuse_common.h>
|
||||
#include <fuse.h>
|
||||
@ -74,6 +91,7 @@ static inline int cygfuse_daemon(int nochdir, int noclose)
|
||||
if (0 == (*(void **)&(pfn_ ## n) = dlsym(h, #n)))\
|
||||
return cygfuse_init_fail();
|
||||
|
||||
static void *cygfuse_init_fail();
|
||||
static void *cygfuse_init_winfsp()
|
||||
{
|
||||
void *h;
|
||||
@ -125,6 +143,7 @@ static void *cygfuse_init_winfsp()
|
||||
CYGFUSE_GET_API(h, fsp_fuse_loop);
|
||||
CYGFUSE_GET_API(h, fsp_fuse_loop_mt);
|
||||
CYGFUSE_GET_API(h, fsp_fuse_exit);
|
||||
CYGFUSE_GET_API(h, fsp_fuse_exited);
|
||||
CYGFUSE_GET_API(h, fsp_fuse_get_context);
|
||||
|
||||
/* fuse_opt.h */
|
||||
@ -141,6 +160,7 @@ static void *cygfuse_init_winfsp()
|
||||
|
||||
static void *cygfuse_init_fail()
|
||||
{
|
||||
abort();
|
||||
fprintf(stderr, "cygfuse: initialization failed: " CYGFUSE_WINFSP_NAME " not found\n");
|
||||
exit(1);
|
||||
return 0;
|
||||
}
|
||||
|
8
opt/cygfuse/dist/install.sh
vendored
Normal file
8
opt/cygfuse/dist/install.sh
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
cd "$(dirname "$0")"
|
||||
case $(uname -m) in
|
||||
x86_64)
|
||||
tar -C/ -xaf x64/fuse-2.8-*.tar.xz ;;
|
||||
*)
|
||||
tar -C/ -xaf x86/fuse-2.8-*.tar.xz ;;
|
||||
esac
|
||||
echo FUSE for Cygwin installed.
|
8
opt/cygfuse/dist/uninstall.sh
vendored
Normal file
8
opt/cygfuse/dist/uninstall.sh
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
cd "$(dirname "$0")"
|
||||
case $(uname -m) in
|
||||
x86_64)
|
||||
tar -taf x64/fuse-2.8-*.tar.xz | sed -e '/\/$/d' -e 's/.*/\/&/' | xargs rm -f ;;
|
||||
*)
|
||||
tar -taf x86/fuse-2.8-*.tar.xz | sed -e '/\/$/d' -e 's/.*/\/&/' | xargs rm -f ;;
|
||||
esac
|
||||
echo FUSE for Cygwin uninstalled.
|
BIN
opt/cygfuse/dist/x64/fuse-2.8-5.tar.xz
vendored
Normal file
BIN
opt/cygfuse/dist/x64/fuse-2.8-5.tar.xz
vendored
Normal file
Binary file not shown.
BIN
opt/cygfuse/dist/x86/fuse-2.8-5.tar.xz
vendored
Normal file
BIN
opt/cygfuse/dist/x86/fuse-2.8-5.tar.xz
vendored
Normal file
Binary file not shown.
@ -1,6 +1,6 @@
|
||||
NAME="fuse"
|
||||
VERSION=2.8
|
||||
RELEASE=4
|
||||
RELEASE=5
|
||||
CATEGORY="Utils"
|
||||
SUMMARY="WinFsp-FUSE compatibility layer"
|
||||
DESCRIPTION="WinFsp-FUSE enables FUSE file systems to be run on Cygwin."
|
||||
|
64
src/dll/fs.c
64
src/dll/fs.c
@ -619,3 +619,67 @@ FSP_API FSP_FILE_SYSTEM_OPERATION_CONTEXT *FspFileSystemGetOperationContext(VOID
|
||||
{
|
||||
return (FSP_FILE_SYSTEM_OPERATION_CONTEXT *)TlsGetValue(FspFileSystemTlsKey);
|
||||
}
|
||||
|
||||
/*
|
||||
* Out-of-Line
|
||||
*/
|
||||
|
||||
FSP_API PWSTR FspFileSystemMountPointF(FSP_FILE_SYSTEM *FileSystem)
|
||||
{
|
||||
return FspFileSystemMountPoint(FileSystem);
|
||||
}
|
||||
|
||||
FSP_API NTSTATUS FspFileSystemEnterOperationF(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||
{
|
||||
return FspFileSystemEnterOperation(FileSystem, Request, Response);
|
||||
}
|
||||
|
||||
FSP_API NTSTATUS FspFileSystemLeaveOperationF(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)
|
||||
{
|
||||
return FspFileSystemLeaveOperation(FileSystem, Request, Response);
|
||||
}
|
||||
|
||||
FSP_API VOID FspFileSystemSetOperationGuardF(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FILE_SYSTEM_OPERATION_GUARD *EnterOperation,
|
||||
FSP_FILE_SYSTEM_OPERATION_GUARD *LeaveOperation)
|
||||
{
|
||||
FspFileSystemSetOperationGuard(FileSystem, EnterOperation, LeaveOperation);
|
||||
}
|
||||
|
||||
FSP_API VOID FspFileSystemSetOperationGuardStrategyF(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY GuardStrategy)
|
||||
{
|
||||
FspFileSystemSetOperationGuardStrategy(FileSystem, GuardStrategy);
|
||||
}
|
||||
|
||||
FSP_API VOID FspFileSystemSetOperationF(FSP_FILE_SYSTEM *FileSystem,
|
||||
ULONG Index,
|
||||
FSP_FILE_SYSTEM_OPERATION *Operation)
|
||||
{
|
||||
FspFileSystemSetOperation(FileSystem, Index, Operation);
|
||||
}
|
||||
|
||||
FSP_API VOID FspFileSystemGetDispatcherResultF(FSP_FILE_SYSTEM *FileSystem,
|
||||
NTSTATUS *PDispatcherResult)
|
||||
{
|
||||
FspFileSystemGetDispatcherResult(FileSystem, PDispatcherResult);
|
||||
}
|
||||
|
||||
FSP_API VOID FspFileSystemSetDispatcherResultF(FSP_FILE_SYSTEM *FileSystem,
|
||||
NTSTATUS DispatcherResult)
|
||||
{
|
||||
FspFileSystemSetDispatcherResult(FileSystem, DispatcherResult);
|
||||
}
|
||||
|
||||
FSP_API VOID FspFileSystemSetDebugLogF(FSP_FILE_SYSTEM *FileSystem,
|
||||
UINT32 DebugLog)
|
||||
{
|
||||
FspFileSystemSetDebugLog(FileSystem, DebugLog);
|
||||
}
|
||||
|
||||
FSP_API BOOLEAN FspFileSystemIsOperationCaseSensitiveF(VOID)
|
||||
{
|
||||
return FspFileSystemIsOperationCaseSensitive();
|
||||
}
|
||||
|
@ -355,10 +355,18 @@ static NTSTATUS FspFsctlFixServiceSecurity(HANDLE SvcHandle)
|
||||
{
|
||||
LastError = GetEffectiveRightsFromAclW(Dacl, &AccessEntry.Trustee, &AccessRights);
|
||||
if (0 != LastError)
|
||||
{
|
||||
Result = FspNtStatusFromWin32(LastError);
|
||||
goto exit;
|
||||
}
|
||||
/*
|
||||
* Apparently GetEffectiveRightsFromAclW can fail with ERROR_CIRCULAR_DEPENDENCY
|
||||
* in some rare circumstances. Calling GetEffectiveRightsFromAclW is not essential
|
||||
* in this instance. It is only done to check whether the "Everyone/World" SID
|
||||
* already has the access required to start the FSD; if it does not have those
|
||||
* rights already they are added. It is probably safe to just assume that the
|
||||
* required rights are not there if GetEffectiveRightsFromAclW fails; the worst
|
||||
* that can happen is that the rights get added twice (which is benign).
|
||||
*
|
||||
* See https://github.com/billziss-gh/winfsp/issues/62
|
||||
*/
|
||||
AccessRights = 0;
|
||||
}
|
||||
|
||||
/* do we have the required access rights? */
|
||||
|
@ -40,7 +40,12 @@ struct fsp_fuse_core_opt_data
|
||||
rellinks;
|
||||
int set_FileInfoTimeout;
|
||||
FSP_FSCTL_VOLUME_PARAMS VolumeParams;
|
||||
UINT16 VolumeLabelLength;
|
||||
WCHAR VolumeLabel[sizeof ((FSP_FSCTL_VOLUME_INFO *)0)->VolumeLabel / sizeof(WCHAR)];
|
||||
};
|
||||
FSP_FSCTL_STATIC_ASSERT(
|
||||
sizeof ((struct fuse *)0)->VolumeLabel == sizeof ((struct fsp_fuse_core_opt_data *)0)->VolumeLabel,
|
||||
"fuse::VolumeLabel and fsp_fuse_core_opt_data::VolumeLabel: sizeof must be same.");
|
||||
|
||||
static struct fuse_opt fsp_fuse_core_opts[] =
|
||||
{
|
||||
@ -82,6 +87,7 @@ static struct fuse_opt fsp_fuse_core_opts[] =
|
||||
FSP_FUSE_CORE_OPT("norellinks", rellinks, 0),
|
||||
|
||||
FUSE_OPT_KEY("fstypename=", 'F'),
|
||||
FUSE_OPT_KEY("volname=", 'v'),
|
||||
|
||||
FSP_FUSE_CORE_OPT("SectorSize=%hu", VolumeParams.SectorSize, 4096),
|
||||
FSP_FUSE_CORE_OPT("SectorsPerAllocationUnit=%hu", VolumeParams.SectorsPerAllocationUnit, 1),
|
||||
@ -90,8 +96,11 @@ static struct fuse_opt fsp_fuse_core_opts[] =
|
||||
FSP_FUSE_CORE_OPT("VolumeSerialNumber=%lx", VolumeParams.VolumeSerialNumber, 0),
|
||||
FSP_FUSE_CORE_OPT("FileInfoTimeout=", set_FileInfoTimeout, 1),
|
||||
FSP_FUSE_CORE_OPT("FileInfoTimeout=%d", VolumeParams.FileInfoTimeout, 0),
|
||||
FUSE_OPT_KEY("UNC=", 'U'),
|
||||
FUSE_OPT_KEY("--UNC=", 'U'),
|
||||
FUSE_OPT_KEY("VolumePrefix=", 'U'),
|
||||
FUSE_OPT_KEY("--VolumePrefix=", 'U'),
|
||||
FUSE_OPT_KEY("FileSystemName=", 'F'),
|
||||
FUSE_OPT_KEY("--FileSystemName=", 'F'),
|
||||
|
||||
FUSE_OPT_END,
|
||||
@ -451,17 +460,26 @@ static int fsp_fuse_core_opt_proc(void *opt_data0, const char *arg, int key,
|
||||
default:
|
||||
return 1;
|
||||
case 'h':
|
||||
/* Note: The limit on FspServiceLog messages is 1024 bytes. This is getting close. */
|
||||
FspServiceLog(EVENTLOG_ERROR_TYPE, L""
|
||||
FSP_FUSE_LIBRARY_NAME " options:\n"
|
||||
" -o DebugLog=FILE debug log file (deflt: stderr)\n"
|
||||
" -o umask=MASK set file permissions (octal)\n"
|
||||
" -o uid=N set file owner (-1 for mounting user id)\n"
|
||||
" -o gid=N set file group (-1 for mounting user group)\n"
|
||||
" -o rellinks interpret absolute symlinks as volume relative\n"
|
||||
" -o volname=NAME set volume label\n"
|
||||
" -o VolumePrefix=UNC set UNC prefix (\\Server\\Share)\n"
|
||||
" -o FileSystemName=NAME set file system name\n"
|
||||
" -o DebugLog=FILE debug log file (requires -d)\n"
|
||||
"\n"
|
||||
FSP_FUSE_LIBRARY_NAME " advanced options:\n"
|
||||
" -o FileInfoTimeout=N metadata timeout (millis, -1 for data caching)\n"
|
||||
" -o SectorSize=N sector size for Windows (512-4096, deflt: 4096)\n"
|
||||
" -o SectorsPerAllocationUnit=N sectors per allocation unit (deflt: 1)\n"
|
||||
" -o MaxComponentLength=N max file name component length (deflt: 255)\n"
|
||||
" -o VolumeCreationTime=T volume creation time (FILETIME hex format)\n"
|
||||
" -o VolumeSerialNumber=N 32-bit wide\n"
|
||||
" -o FileInfoTimeout=N FileInfo/Security/VolumeInfo timeout (millisec)\n"
|
||||
" --UNC=U --VolumePrefix=U UNC prefix (\\Server\\Share)\n"
|
||||
" --FileSystemName=FSN Name of user mode file system\n");
|
||||
" -o VolumeSerialNumber=N volume serial number (32-bit wide)\n"
|
||||
);
|
||||
opt_data->help = 1;
|
||||
return 1;
|
||||
case 'V':
|
||||
@ -482,8 +500,12 @@ static int fsp_fuse_core_opt_proc(void *opt_data0, const char *arg, int key,
|
||||
0);
|
||||
return 0;
|
||||
case 'U':
|
||||
if ('U' == arg[2])
|
||||
if ('U' == arg[0])
|
||||
arg += sizeof "UNC=" - 1;
|
||||
else if ('U' == arg[2])
|
||||
arg += sizeof "--UNC=" - 1;
|
||||
else if ('V' == arg[0])
|
||||
arg += sizeof "VolumePrefix=" - 1;
|
||||
else if ('V' == arg[2])
|
||||
arg += sizeof "--VolumePrefix=" - 1;
|
||||
if (0 == MultiByteToWideChar(CP_UTF8, 0, arg, -1,
|
||||
@ -495,16 +517,26 @@ static int fsp_fuse_core_opt_proc(void *opt_data0, const char *arg, int key,
|
||||
case 'F':
|
||||
if ('f' == arg[0])
|
||||
arg += sizeof "fstypename=" - 1;
|
||||
else if ('F' == arg[0])
|
||||
arg += sizeof "FileSystemName=" - 1;
|
||||
else if ('F' == arg[2])
|
||||
arg += sizeof "--FileSystemName=" - 1;
|
||||
if (0 == MultiByteToWideChar(CP_UTF8, 0, arg, -1,
|
||||
opt_data->VolumeParams.FileSystemName + 5,
|
||||
sizeof opt_data->VolumeParams.FileSystemName / sizeof(WCHAR)) - 5)
|
||||
sizeof opt_data->VolumeParams.FileSystemName / sizeof(WCHAR) - 5))
|
||||
return -1;
|
||||
opt_data->VolumeParams.FileSystemName
|
||||
[sizeof opt_data->VolumeParams.FileSystemName / sizeof(WCHAR) - 1] = L'\0';
|
||||
memcpy(opt_data->VolumeParams.FileSystemName, L"FUSE-", 5 * sizeof(WCHAR));
|
||||
return 0;
|
||||
case 'v':
|
||||
arg += sizeof "volname=" - 1;
|
||||
opt_data->VolumeLabelLength = (UINT16)(sizeof(WCHAR) *
|
||||
MultiByteToWideChar(CP_UTF8, 0, arg, lstrlenA(arg),
|
||||
opt_data->VolumeLabel, sizeof opt_data->VolumeLabel / sizeof(WCHAR)));
|
||||
if (0 == opt_data->VolumeLabelLength)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -589,6 +621,8 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
|
||||
f->data = data;
|
||||
f->DebugLog = opt_data.debug ? -1 : 0;
|
||||
memcpy(&f->VolumeParams, &opt_data.VolumeParams, sizeof opt_data.VolumeParams);
|
||||
f->VolumeLabelLength = opt_data.VolumeLabelLength;
|
||||
memcpy(&f->VolumeLabel, &opt_data.VolumeLabel, opt_data.VolumeLabelLength);
|
||||
|
||||
Size = (lstrlenW(ch->MountPoint) + 1) * sizeof(WCHAR);
|
||||
f->MountPoint = fsp_fuse_obj_alloc(env, Size);
|
||||
@ -671,6 +705,13 @@ FSP_FUSE_API void fsp_fuse_exit(struct fsp_fuse_env *env,
|
||||
{
|
||||
if (0 != f->Service)
|
||||
FspServiceStop(f->Service);
|
||||
f->exited = 1;
|
||||
}
|
||||
|
||||
FSP_FUSE_API int FSP_FUSE_API_NAME(fsp_fuse_exited)(struct fsp_fuse_env *env,
|
||||
struct fuse *f)
|
||||
{
|
||||
return f->exited;
|
||||
}
|
||||
|
||||
FSP_FUSE_API struct fuse_context *fsp_fuse_get_context(struct fsp_fuse_env *env)
|
||||
|
@ -646,8 +646,8 @@ static NTSTATUS fsp_fuse_intf_GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem,
|
||||
|
||||
VolumeInfo->TotalSize = (UINT64)stbuf.f_blocks * (UINT64)stbuf.f_frsize;
|
||||
VolumeInfo->FreeSize = (UINT64)stbuf.f_bfree * (UINT64)stbuf.f_frsize;
|
||||
VolumeInfo->VolumeLabelLength = 0;
|
||||
VolumeInfo->VolumeLabel[0] = L'\0';
|
||||
VolumeInfo->VolumeLabelLength = f->VolumeLabelLength;
|
||||
memcpy(&VolumeInfo->VolumeLabel, &f->VolumeLabel, f->VolumeLabelLength);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -45,9 +45,12 @@ struct fuse
|
||||
UINT32 DebugLog;
|
||||
FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY OpGuardStrategy;
|
||||
FSP_FSCTL_VOLUME_PARAMS VolumeParams;
|
||||
UINT16 VolumeLabelLength;
|
||||
WCHAR VolumeLabel[sizeof ((FSP_FSCTL_VOLUME_INFO *)0)->VolumeLabel / sizeof(WCHAR)];
|
||||
PWSTR MountPoint;
|
||||
FSP_FILE_SYSTEM *FileSystem;
|
||||
FSP_SERVICE *Service; /* weak */
|
||||
volatile int exited;
|
||||
};
|
||||
|
||||
struct fsp_fuse_context_header
|
||||
|
@ -79,7 +79,7 @@ FSP_API ULONG FspServiceRunEx(PWSTR ServiceName,
|
||||
if (!NT_SUCCESS(Result))
|
||||
{
|
||||
FspServiceLog(EVENTLOG_ERROR_TYPE,
|
||||
L"The service %s cannot be created (Status=%lx).", Service->ServiceName, Result);
|
||||
L"The service %s cannot be created (Status=%lx).", ServiceName, Result);
|
||||
return FspWin32FromNtStatus(Result);
|
||||
}
|
||||
Service->UserContext = UserContext;
|
||||
@ -92,7 +92,7 @@ FSP_API ULONG FspServiceRunEx(PWSTR ServiceName,
|
||||
if (!NT_SUCCESS(Result))
|
||||
{
|
||||
FspServiceLog(EVENTLOG_ERROR_TYPE,
|
||||
L"The service %s has failed to run (Status=%lx).", Service->ServiceName, Result);
|
||||
L"The service %s has failed to run (Status=%lx).", ServiceName, Result);
|
||||
return FspWin32FromNtStatus(Result);
|
||||
}
|
||||
|
||||
|
@ -175,6 +175,8 @@ FSP_API NTSTATUS FspVersion(PUINT32 PVersion)
|
||||
* Two threads competing to read the version will read
|
||||
* the same value from the Version resource.
|
||||
*/
|
||||
*PVersion = 0;
|
||||
|
||||
extern HINSTANCE DllInstance;
|
||||
WCHAR ModuleFileName[MAX_PATH];
|
||||
PVOID VersionInfo;
|
||||
|
2364
src/dotnet/FileSystemBase+Const.cs
Normal file
2364
src/dotnet/FileSystemBase+Const.cs
Normal file
File diff suppressed because it is too large
Load Diff
1153
src/dotnet/FileSystemBase.cs
Normal file
1153
src/dotnet/FileSystemBase.cs
Normal file
File diff suppressed because it is too large
Load Diff
1029
src/dotnet/FileSystemHost.cs
Normal file
1029
src/dotnet/FileSystemHost.cs
Normal file
File diff suppressed because it is too large
Load Diff
1081
src/dotnet/Interop.cs
Normal file
1081
src/dotnet/Interop.cs
Normal file
File diff suppressed because it is too large
Load Diff
187
src/dotnet/Service.cs
Normal file
187
src/dotnet/Service.cs
Normal file
@ -0,0 +1,187 @@
|
||||
/*
|
||||
* dotnet/Service.cs
|
||||
*
|
||||
* Copyright 2015-2017 Bill Zissimopoulos
|
||||
*/
|
||||
/*
|
||||
* This file is part of WinFsp.
|
||||
*
|
||||
* You can redistribute it and/or modify it under the terms of the GNU
|
||||
* General Public License version 3 as published by the Free Software
|
||||
* Foundation.
|
||||
*
|
||||
* Licensees holding a valid commercial license may use this file in
|
||||
* accordance with the commercial license agreement provided with the
|
||||
* software.
|
||||
*/
|
||||
|
||||
using System;
|
||||
|
||||
using Fsp.Interop;
|
||||
|
||||
namespace Fsp
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Provides the base class for a process that can be run as a service,
|
||||
/// command line application or under the control of the WinFsp launcher.
|
||||
/// </summary>
|
||||
public class Service
|
||||
{
|
||||
/* const */
|
||||
public const UInt32 EVENTLOG_ERROR_TYPE = 0x0001;
|
||||
public const UInt32 EVENTLOG_WARNING_TYPE = 0x0002;
|
||||
public const UInt32 EVENTLOG_INFORMATION_TYPE = 0x0004;
|
||||
|
||||
/* ctor/dtor */
|
||||
/// <summary>
|
||||
/// Creates an instance of the Service class.
|
||||
/// </summary>
|
||||
/// <param name="ServiceName">The name of the service.</param>
|
||||
public Service(String ServiceName)
|
||||
{
|
||||
Api.FspServiceCreate(ServiceName, _OnStart, _OnStop, null, out _ServicePtr);
|
||||
if (IntPtr.Zero != _ServicePtr)
|
||||
Api.SetUserContext(_ServicePtr, this);
|
||||
}
|
||||
~Service()
|
||||
{
|
||||
if (IntPtr.Zero != _ServicePtr)
|
||||
{
|
||||
Api.DisposeUserContext(_ServicePtr);
|
||||
Api.FspServiceDelete(_ServicePtr);
|
||||
}
|
||||
}
|
||||
|
||||
/* control */
|
||||
/// <summary>
|
||||
/// Runs a service.
|
||||
/// </summary>
|
||||
/// <returns>Service process exit code.</returns>
|
||||
public int Run()
|
||||
{
|
||||
if (IntPtr.Zero == _ServicePtr)
|
||||
{
|
||||
const Int32 STATUS_INSUFFICIENT_RESOURCES = unchecked((Int32)0xc000009a);
|
||||
Log(EVENTLOG_ERROR_TYPE,
|
||||
String.Format("The service {0} cannot be created (Status={1:X}).",
|
||||
GetType().FullName, STATUS_INSUFFICIENT_RESOURCES));
|
||||
return (int)Api.FspWin32FromNtStatus(STATUS_INSUFFICIENT_RESOURCES);
|
||||
}
|
||||
Api.FspServiceAllowConsoleMode(_ServicePtr);
|
||||
Int32 Result = Api.FspServiceLoop(_ServicePtr);
|
||||
int ExitCode = (int)Api.FspServiceGetExitCode(_ServicePtr);
|
||||
if (0 > Result)
|
||||
{
|
||||
Log(EVENTLOG_ERROR_TYPE,
|
||||
String.Format("The service {0} has failed to run (Status={1:X}).",
|
||||
GetType().FullName, Result));
|
||||
return (int)Api.FspWin32FromNtStatus(Result);
|
||||
}
|
||||
return ExitCode;
|
||||
}
|
||||
/// <summary>
|
||||
/// Stops a running service.
|
||||
/// </summary>
|
||||
public void Stop()
|
||||
{
|
||||
if (IntPtr.Zero == _ServicePtr)
|
||||
throw new InvalidOperationException();
|
||||
Api.FspServiceStop(_ServicePtr);
|
||||
}
|
||||
public void RequestTime(UInt32 Time)
|
||||
{
|
||||
if (IntPtr.Zero == _ServicePtr)
|
||||
throw new InvalidOperationException();
|
||||
Api.FspServiceRequestTime(_ServicePtr, Time);
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets or sets the service process exit code.
|
||||
/// </summary>
|
||||
public int ExitCode
|
||||
{
|
||||
get
|
||||
{
|
||||
if (IntPtr.Zero == _ServicePtr)
|
||||
throw new InvalidOperationException();
|
||||
return (int)Api.FspServiceGetExitCode(_ServicePtr);
|
||||
}
|
||||
set
|
||||
{
|
||||
if (IntPtr.Zero == _ServicePtr)
|
||||
throw new InvalidOperationException();
|
||||
Api.FspServiceSetExitCode(_ServicePtr, (UInt32)value);
|
||||
}
|
||||
}
|
||||
public IntPtr ServiceHandle
|
||||
{
|
||||
get { return _ServicePtr; }
|
||||
}
|
||||
public static void Log(UInt32 Type, String Message)
|
||||
{
|
||||
Api.FspServiceLog(Type, "%s", Message);
|
||||
}
|
||||
|
||||
/* start/stop */
|
||||
/// <summary>
|
||||
/// Provides a means to customize the returned status code when an exception happens.
|
||||
/// </summary>
|
||||
/// <param name="ex"></param>
|
||||
/// <returns>STATUS_SUCCESS or error code.</returns>
|
||||
protected virtual Int32 ExceptionHandler(Exception ex)
|
||||
{
|
||||
return unchecked((Int32)0xE0434f4D)/*STATUS_CLR_EXCEPTION*/;
|
||||
}
|
||||
/// <summary>
|
||||
/// Occurs when the service starts.
|
||||
/// </summary>
|
||||
/// <param name="Args">Command line arguments passed to the service.</param>
|
||||
protected virtual void OnStart(String[] Args)
|
||||
{
|
||||
}
|
||||
/// <summary>
|
||||
/// Occurs when the service stops.
|
||||
/// </summary>
|
||||
protected virtual void OnStop()
|
||||
{
|
||||
}
|
||||
|
||||
/* callbacks */
|
||||
private static Int32 OnStart(
|
||||
IntPtr Service,
|
||||
UInt32 Argc,
|
||||
String[] Argv)
|
||||
{
|
||||
Service self = (Service)Api.GetUserContext(Service);
|
||||
try
|
||||
{
|
||||
self.OnStart(
|
||||
Argv);
|
||||
return 0/*STATUS_SUCCESS*/;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return self.ExceptionHandler(ex);
|
||||
}
|
||||
}
|
||||
private static Int32 OnStop(
|
||||
IntPtr Service)
|
||||
{
|
||||
Service self = (Service)Api.GetUserContext(Service);
|
||||
try
|
||||
{
|
||||
self.OnStop();
|
||||
return 0/*STATUS_SUCCESS*/;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return self.ExceptionHandler(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static Api.Proto.ServiceStart _OnStart = OnStart;
|
||||
private static Api.Proto.ServiceStop _OnStop = OnStop;
|
||||
private IntPtr _ServicePtr;
|
||||
}
|
||||
|
||||
}
|
@ -12,20 +12,26 @@ if X!ProjDir!==X (echo usage: build-sample Config Arch Sample ProjDir >&2 & goto
|
||||
|
||||
call "%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat" x64
|
||||
|
||||
set RegKey="HKLM\SOFTWARE\WinFsp"
|
||||
set RegVal="InstallDir"
|
||||
reg query !RegKey! /v !RegVal! /reg:32 >nul 2>&1
|
||||
if !ERRORLEVEL! equ 0 (
|
||||
for /f "tokens=2,*" %%i in ('reg query !RegKey! /v !RegVal! /reg:32 ^| findstr !RegVal!') do (
|
||||
set InstallDir=%%j
|
||||
)
|
||||
if X!FSP_SAMPLE_DIR!==X (
|
||||
set RegKey="HKLM\SOFTWARE\WinFsp"
|
||||
set RegVal="InstallDir"
|
||||
reg query !RegKey! /v !RegVal! /reg:32 >nul 2>&1
|
||||
if !ERRORLEVEL! equ 0 (
|
||||
for /f "tokens=2,*" %%i in ('reg query !RegKey! /v !RegVal! /reg:32 ^| findstr !RegVal!') do (
|
||||
set InstallDir=%%j
|
||||
)
|
||||
)
|
||||
if not exist "!InstallDir!" (echo cannot find WinFsp installation >&2 & goto fail)
|
||||
if not exist "!InstallDir!samples\!Sample!" (echo cannot find WinFsp sample !Sample! >&2 & goto fail)
|
||||
|
||||
set SampleDir=!InstallDir!samples
|
||||
) else (
|
||||
set SampleDir=!FSP_SAMPLE_DIR!
|
||||
)
|
||||
if not exist "!InstallDir!" (echo cannot find WinFsp installation >&2 & goto fail)
|
||||
if not exist "!InstallDir!samples\!Sample!" (echo cannot find WinFsp sample !Sample! >&2 & goto fail)
|
||||
|
||||
if exist "!ProjDir!" rmdir /s/q "!ProjDir!"
|
||||
mkdir "!ProjDir!"
|
||||
xcopy /s/e/q/y "!InstallDir!samples\!Sample!" "!ProjDir!"
|
||||
xcopy /s/e/q/y "!SampleDir!\!Sample!" "!ProjDir!"
|
||||
|
||||
devenv "!ProjDir!\!Sample!.sln" /build "!Config!|!Arch!"
|
||||
if !ERRORLEVEL! neq 0 goto :fail
|
||||
|
@ -89,6 +89,8 @@ if %ERRORLEVEL% equ 0 (
|
||||
set Version=!Version:winfsp-=!
|
||||
|
||||
copy ..\choco\* build\%Configuration%
|
||||
copy ..\choco\LICENSE.TXT /B + ..\..\License.txt /B build\%Configuration%\LICENSE.txt /B
|
||||
certutil -hashfile build\%Configuration%\winfsp-!Version!.msi SHA256 >>build\%Configuration%\VERIFICATION.txt
|
||||
choco pack build\%Configuration%\winfsp.nuspec --version=!Version! --outputdirectory=build\%Configuration%
|
||||
if errorlevel 1 goto fail
|
||||
)
|
||||
|
@ -17,12 +17,16 @@ launchctl-x64 start memfs64 testdsk "" M: >nul
|
||||
launchctl-x64 start memfs64 testnet \memfs64\test N: >nul
|
||||
launchctl-x64 start memfs32 testdsk "" O: >nul
|
||||
launchctl-x64 start memfs32 testnet \memfs32\test P: >nul
|
||||
launchctl-x64 start memfs-dotnet testdsk "" Q: >nul
|
||||
launchctl-x64 start memfs-dotnet testnet \memfs-dotnet\test R: >nul
|
||||
rem Cannot use timeout under cygwin/mintty: "Input redirection is not supported"
|
||||
waitfor 7BF47D72F6664550B03248ECFE77C7DD /t 3 2>nul
|
||||
cd M: >nul 2>nul || (echo === Unable to find drive M: >&2 & goto fail)
|
||||
cd N: >nul 2>nul || (echo === Unable to find drive N: >&2 & goto fail)
|
||||
cd O: >nul 2>nul || (echo === Unable to find drive O: >&2 & goto fail)
|
||||
cd P: >nul 2>nul || (echo === Unable to find drive P: >&2 & goto fail)
|
||||
cd Q: >nul 2>nul || (echo === Unable to find drive Q: >&2 & goto fail)
|
||||
cd R: >nul 2>nul || (echo === Unable to find drive R: >&2 & goto fail)
|
||||
|
||||
set dfl_tests=^
|
||||
winfsp-tests-x64 ^
|
||||
@ -31,6 +35,7 @@ set dfl_tests=^
|
||||
winfsp-tests-x64-mountpoint-dir ^
|
||||
winfsp-tests-x64-no-traverse ^
|
||||
winfsp-tests-x64-oplock ^
|
||||
winfsp-tests-x64-external ^
|
||||
winfsp-tests-x64-external-share ^
|
||||
fsx-memfs-x64-disk ^
|
||||
fsx-memfs-x64-net ^
|
||||
@ -46,6 +51,7 @@ set dfl_tests=^
|
||||
winfsp-tests-x86-mountpoint-dir ^
|
||||
winfsp-tests-x86-no-traverse ^
|
||||
winfsp-tests-x86-oplock ^
|
||||
winfsp-tests-x86-external ^
|
||||
winfsp-tests-x86-external-share ^
|
||||
fsx-memfs-x86-disk ^
|
||||
fsx-memfs-x86-net ^
|
||||
@ -54,14 +60,24 @@ set dfl_tests=^
|
||||
net-use-memfs-x86 ^
|
||||
winfstest-memfs-x86-disk ^
|
||||
winfstest-memfs-x86-net ^
|
||||
fscrash-x86
|
||||
fscrash-x86 ^
|
||||
winfsp-tests-dotnet-external ^
|
||||
winfsp-tests-dotnet-external-share ^
|
||||
fsx-memfs-dotnet-disk ^
|
||||
fsx-memfs-dotnet-net ^
|
||||
winfstest-memfs-dotnet-disk ^
|
||||
winfstest-memfs-dotnet-net
|
||||
set opt_tests=^
|
||||
ifstest-memfs-x64-disk ^
|
||||
ifstest-memfs-x86-disk ^
|
||||
ifstest-memfs-dotnet-disk ^
|
||||
sample-passthrough-x64 ^
|
||||
sample-passthrough-x86 ^
|
||||
sample-passthrough-cpp-x64 ^
|
||||
sample-passthrough-cpp-x86 ^
|
||||
sample-passthrough-fuse-x64 ^
|
||||
sample-passthrough-fuse-x86
|
||||
sample-passthrough-fuse-x86 ^
|
||||
sample-passthrough-dotnet
|
||||
|
||||
set tests=
|
||||
for %%f in (%dfl_tests%) do (
|
||||
@ -118,6 +134,8 @@ launchctl-x64 stop memfs64 testdsk >nul
|
||||
launchctl-x64 stop memfs64 testnet >nul
|
||||
launchctl-x64 stop memfs32 testdsk >nul
|
||||
launchctl-x64 stop memfs32 testnet >nul
|
||||
launchctl-x64 stop memfs-dotnet testdsk >nul
|
||||
launchctl-x64 stop memfs-dotnet testnet >nul
|
||||
rem Cannot use timeout under cygwin/mintty: "Input redirection is not supported"
|
||||
waitfor 7BF47D72F6664550B03248ECFE77C7DD /t 3 2>nul
|
||||
|
||||
@ -192,6 +210,12 @@ winfsp-tests-x86 --oplock=filter --resilient
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:winfsp-tests-x64-external
|
||||
M:
|
||||
"%ProjRoot%\build\VStudio\build\%Configuration%\winfsp-tests-x64.exe" --external --resilient
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:winfsp-tests-x64-external-share
|
||||
M:
|
||||
"%ProjRoot%\build\VStudio\build\%Configuration%\winfsp-tests-x64.exe" --external --share=winfsp-tests-share=M:\ --resilient ^
|
||||
@ -239,6 +263,12 @@ net use L: /delete
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:winfsp-tests-x86-external
|
||||
O:
|
||||
"%ProjRoot%\build\VStudio\build\%Configuration%\winfsp-tests-x86.exe" --external --resilient
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:winfsp-tests-x86-external-share
|
||||
O:
|
||||
"%ProjRoot%\build\VStudio\build\%Configuration%\winfsp-tests-x86.exe" --external --share=winfsp-tests-share=O:\ --resilient ^
|
||||
@ -348,6 +378,47 @@ fscrash-x86 --huge-alloc-size --cached >nul 2>&1
|
||||
if !ERRORLEVEL! neq 1 goto fail
|
||||
exit /b 0
|
||||
|
||||
:winfsp-tests-dotnet-external
|
||||
Q:
|
||||
"%ProjRoot%\build\VStudio\build\%Configuration%\winfsp-tests-x64.exe" --external --resilient
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:winfsp-tests-dotnet-external-share
|
||||
Q:
|
||||
"%ProjRoot%\build\VStudio\build\%Configuration%\winfsp-tests-x64.exe" --external --share=winfsp-tests-share=Q:\ --resilient ^
|
||||
-reparse_symlink*
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:fsx-memfs-dotnet-disk
|
||||
Q:
|
||||
"%ProjRoot%\ext\test\fstools\src\fsx\fsx.exe" -N 5000 test xxxxxx
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
"%ProjRoot%\ext\test\fstools\src\fsx\fsx.exe" -f foo -N 5000 test xxxxxx
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:fsx-memfs-dotnet-net
|
||||
R:
|
||||
"%ProjRoot%\ext\test\fstools\src\fsx\fsx.exe" -N 5000 test xxxxxx
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
"%ProjRoot%\ext\test\fstools\src\fsx\fsx.exe" -f foo -N 5000 test xxxxxx
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:winfstest-memfs-dotnet-disk
|
||||
Q:
|
||||
call "%ProjRoot%\ext\test\winfstest\run-winfstest.bat"
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:winfstest-memfs-dotnet-net
|
||||
R:
|
||||
call "%ProjRoot%\ext\test\winfstest\run-winfstest.bat"
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:ifstest-memfs-x64-disk
|
||||
call :__ifstest-memfs M: \Device\WinFsp.Disk C:
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
@ -358,23 +429,28 @@ call :__ifstest-memfs O: \Device\WinFsp.Disk C:
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:ifstest-memfs-dotnet-disk
|
||||
call :__ifstest-memfs Q: \Device\WinFsp.Disk C:
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:__ifstest-memfs
|
||||
%1
|
||||
set IfsTestDirectories=^
|
||||
securit^
|
||||
opcreatg^
|
||||
opcreatp^
|
||||
closedel^
|
||||
volinfo^
|
||||
fileinfo^
|
||||
dirinfo^
|
||||
filelock^
|
||||
oplocks^
|
||||
chgnotif^
|
||||
readwr^
|
||||
seccache^
|
||||
reparspt^
|
||||
estream
|
||||
securit^
|
||||
opcreatg^
|
||||
opcreatp^
|
||||
closedel^
|
||||
volinfo^
|
||||
fileinfo^
|
||||
dirinfo^
|
||||
filelock^
|
||||
oplocks^
|
||||
chgnotif^
|
||||
readwr^
|
||||
seccache^
|
||||
reparspt^
|
||||
estream
|
||||
set IfsTestMemfsExit=0
|
||||
call :__ifstest %1 /g Security
|
||||
if !ERRORLEVEL! neq 0 set IfsTestMemfsExit=1
|
||||
@ -418,7 +494,7 @@ rem StreamEnhancements.StreamNotifyNameTest: WinFsp does not notify when streams
|
||||
call :__ifstest %1 /g StreamEnhancements -t StreamRenameTest -t StreamNotifyNameTest
|
||||
if !ERRORLEVEL! neq 0 set IfsTestMemfsExit=1
|
||||
for %%d in (!IfsTestDirectories!) do (
|
||||
if exist %%d (echo :ifstest directory %%d still exists & set IfsTestMemfsExit=1)
|
||||
if exist %%d (echo :ifstest directory %%d still exists & set IfsTestMemfsExit=1)
|
||||
)
|
||||
exit /b !IfsTestMemfsExit!
|
||||
|
||||
@ -482,82 +558,94 @@ if not X!IfsTestFound!==XYES set IfsTestExit=1
|
||||
exit /b !IfsTestExit!
|
||||
|
||||
:sample-passthrough-x64
|
||||
call :__sample-passthrough x64
|
||||
call :__run_sample_test passthrough x64 passthrough-x64 winfsp-tests-x64
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:sample-passthrough-x86
|
||||
call :__sample-passthrough x86
|
||||
call :__run_sample_test passthrough x86 passthrough-x86 winfsp-tests-x86
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:__sample-passthrough
|
||||
set SamplePassthroughExit=0
|
||||
call %ProjRoot%\tools\build-sample %Configuration% %1 passthrough "%TMP%\passthrough-%1"
|
||||
:sample-passthrough-cpp-x64
|
||||
call :__run_sample_test passthrough-cpp x64 passthrough-cpp-x64 winfsp-tests-x64
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
mkdir "%TMP%\passthrough-%1\test"
|
||||
call "%ProjRoot%\tools\fsreg" passthrough "%TMP%\passthrough-%1\build\%Configuration%\passthrough-%1.exe" "-u %%%%1 -m %%%%2" "D:P(A;;RPWPLC;;;WD)"
|
||||
echo net use L: "\\passthrough\%TMP::=$%\passthrough-%1\test"
|
||||
net use L: "\\passthrough\%TMP::=$%\passthrough-%1\test"
|
||||
exit /b 0
|
||||
|
||||
:sample-passthrough-cpp-x86
|
||||
call :__run_sample_test passthrough-cpp x86 passthrough-cpp-x86 winfsp-tests-x86
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
echo net use ^| findstr L:
|
||||
net use | findstr L:
|
||||
pushd >nul
|
||||
cd L: >nul 2>nul || (echo Unable to find drive L: >&2 & goto fail)
|
||||
L:
|
||||
exit /b 0
|
||||
|
||||
"%ProjRoot%\build\VStudio\build\%Configuration%\winfsp-tests-%1.exe" ^
|
||||
--external --resilient --case-insensitive-cmp --share-prefix="\passthrough\%TMP::=$%\passthrough-%1\test" ^
|
||||
-create_allocation_test -getfileinfo_name_test -rename_flipflop_test -rename_mmap_test -exec_rename_dir_test ^
|
||||
-reparse* -stream*
|
||||
if !ERRORLEVEL! neq 0 set SamplePassthroughExit=1
|
||||
|
||||
popd
|
||||
echo net use L: /delete
|
||||
net use L: /delete
|
||||
call "%ProjRoot%\tools\fsreg" -u passthrough
|
||||
rmdir /s/q "%TMP%\passthrough-%1"
|
||||
exit /b !SamplePassthroughExit!
|
||||
:sample-passthrough-dotnet
|
||||
call :__run_sample_test passthrough-dotnet anycpu passthrough-dotnet winfsp-tests-x64 ^
|
||||
"-create_backup_test -create_restore_test -create_namelen_test -delete_access_test"
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:sample-passthrough-fuse-x64
|
||||
call :__sample-passthrough-fuse x64
|
||||
call :__run_sample_fuse_test passthrough-fuse x64 passthrough-fuse-x64 winfsp-tests-x64
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:sample-passthrough-fuse-x86
|
||||
call :__sample-passthrough-fuse x86
|
||||
call :__run_sample_fuse_test passthrough-fuse x86 passthrough-fuse-x86 winfsp-tests-x86
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
exit /b 0
|
||||
|
||||
:__sample-passthrough-fuse
|
||||
set SamplePassthroughExit=0
|
||||
call %ProjRoot%\tools\build-sample %Configuration% %1 passthrough-fuse "%TMP%\passthrough-fuse-%1"
|
||||
:__run_sample_test
|
||||
set RunSampleTestExit=0
|
||||
call %ProjRoot%\tools\build-sample %Configuration% %2 %1 "%TMP%\%1"
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
mkdir "%TMP%\passthrough-fuse-%1\test"
|
||||
call "%ProjRoot%\tools\fsreg" passthrough-fuse "%TMP%\passthrough-fuse-%1\build\%Configuration%\passthrough-fuse-%1.exe" ^
|
||||
"-ouid=65792,gid=65792 --VolumePrefix=%%%%1 %%%%2" "D:P(A;;RPWPLC;;;WD)"
|
||||
echo net use L: "\\passthrough-fuse\%TMP::=$%\passthrough-fuse-%1\test"
|
||||
net use L: "\\passthrough-fuse\%TMP::=$%\passthrough-fuse-%1\test"
|
||||
mkdir "%TMP%\%1\test"
|
||||
call "%ProjRoot%\tools\fsreg" %1 "%TMP%\%1\build\%Configuration%\%3.exe" "-u %%%%1 -m %%%%2" "D:P(A;;RPWPLC;;;WD)"
|
||||
echo net use L: "\\%1\%TMP::=$%\%1\test"
|
||||
net use L: "\\%1\%TMP::=$%\%1\test"
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
echo net use ^| findstr L:
|
||||
net use | findstr L:
|
||||
pushd >nul
|
||||
cd L: >nul 2>nul || (echo Unable to find drive L: >&2 & goto fail)
|
||||
L:
|
||||
|
||||
"%ProjRoot%\build\VStudio\build\%Configuration%\winfsp-tests-%1.exe" ^
|
||||
--external --resilient --case-insensitive-cmp --share-prefix="\passthrough-fuse\%TMP::=$%\passthrough-fuse-%1\test" ^
|
||||
-create_allocation_test -create_notraverse_test -create_backup_test -create_restore_test -create_namelen_test ^
|
||||
-getfileinfo_name_test -setfileinfo_test -delete_access_test -delete_mmap_test -rename_flipflop_test -rename_mmap_test -setsecurity_test -exec_rename_dir_test ^
|
||||
-reparse* -stream*
|
||||
if !ERRORLEVEL! neq 0 set SamplePassthroughExit=1
|
||||
|
||||
"%ProjRoot%\build\VStudio\build\%Configuration%\%4.exe" ^
|
||||
--external --resilient --case-insensitive-cmp --share-prefix="\%1\%TMP::=$%\%1\test" ^
|
||||
-create_allocation_test -getfileinfo_name_test -rename_flipflop_test -rename_mmap_test -exec_rename_dir_test ^
|
||||
-reparse* -stream* %~5
|
||||
if !ERRORLEVEL! neq 0 set RunSampleTestExit=1
|
||||
popd
|
||||
echo net use L: /delete
|
||||
net use L: /delete
|
||||
call "%ProjRoot%\tools\fsreg" -u passthrough-fuse
|
||||
rmdir /s/q "%TMP%\passthrough-fuse-%1"
|
||||
exit /b !SamplePassthroughExit!
|
||||
call "%ProjRoot%\tools\fsreg" -u %1
|
||||
rmdir /s/q "%TMP%\%1"
|
||||
exit /b !RunSampleTestExit!
|
||||
|
||||
:__run_sample_fuse_test
|
||||
set RunSampleTestExit=0
|
||||
call %ProjRoot%\tools\build-sample %Configuration% %2 %1 "%TMP%\%1"
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
mkdir "%TMP%\%1\test"
|
||||
call "%ProjRoot%\tools\fsreg" %1 "%TMP%\%1\build\%Configuration%\%3.exe" ^
|
||||
"-ouid=11,gid=65792 --VolumePrefix=%%%%1 %%%%2" "D:P(A;;RPWPLC;;;WD)"
|
||||
echo net use L: "\\%1\%TMP::=$%\%1\test"
|
||||
net use L: "\\%1\%TMP::=$%\%1\test"
|
||||
if !ERRORLEVEL! neq 0 goto fail
|
||||
echo net use ^| findstr L:
|
||||
net use | findstr L:
|
||||
pushd >nul
|
||||
cd L: >nul 2>nul || (echo Unable to find drive L: >&2 & goto fail)
|
||||
L:
|
||||
"%ProjRoot%\build\VStudio\build\%Configuration%\%4.exe" ^
|
||||
--external --resilient --case-insensitive-cmp --share-prefix="\%1\%TMP::=$%\%1\test" ^
|
||||
-create_allocation_test -create_notraverse_test -create_backup_test -create_restore_test -create_namelen_test ^
|
||||
-getfileinfo_name_test -setfileinfo_test -delete_access_test -delete_mmap_test -rename_flipflop_test -rename_mmap_test -setsecurity_test -exec_rename_dir_test ^
|
||||
-reparse* -stream*
|
||||
if !ERRORLEVEL! neq 0 set RunSampleTestExit=1
|
||||
popd
|
||||
echo net use L: /delete
|
||||
net use L: /delete
|
||||
call "%ProjRoot%\tools\fsreg" -u %1
|
||||
rmdir /s/q "%TMP%\%1"
|
||||
exit /b !RunSampleTestExit!
|
||||
|
||||
:leak-test
|
||||
for /F "tokens=1,2 delims=:" %%i in ('verifier /query ^| findstr ^
|
||||
|
15
tools/version-info.bat
Executable file
15
tools/version-info.bat
Executable file
@ -0,0 +1,15 @@
|
||||
@echo off
|
||||
|
||||
setlocal
|
||||
setlocal EnableDelayedExpansion
|
||||
|
||||
for %%f in (%*) do (
|
||||
set file="%%~f"
|
||||
if exist !file! (
|
||||
echo version-info: !file!
|
||||
powershell -command "[System.Diagnostics.FileVersionInfo]::GetVersionInfo(""!file!"") | fl -property ProductName, ProductVersion, ProductVersionRaw, LegalCopyright, CompanyName, FileDescription, FileVersionRaw, FileVersion"
|
||||
powershell -command "try { [System.Reflection.AssemblyName]::GetAssemblyName(""!file!"") | fl -property FullName, Version } catch {}"
|
||||
) else (
|
||||
echo version-info: file !file! not found
|
||||
)
|
||||
)
|
1156
tst/memfs-dotnet/Program.cs
Normal file
1156
tst/memfs-dotnet/Program.cs
Normal file
File diff suppressed because it is too large
Load Diff
5
tst/passthrough-cpp/.gitignore
vendored
Normal file
5
tst/passthrough-cpp/.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
build
|
||||
*.ncb
|
||||
*.suo
|
||||
*.vcproj.*
|
||||
*.vcxproj.user
|
1016
tst/passthrough-cpp/passthrough-cpp.cpp
Normal file
1016
tst/passthrough-cpp/passthrough-cpp.cpp
Normal file
File diff suppressed because it is too large
Load Diff
28
tst/passthrough-cpp/passthrough-cpp.sln
Normal file
28
tst/passthrough-cpp/passthrough-cpp.sln
Normal file
@ -0,0 +1,28 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 14
|
||||
VisualStudioVersion = 14.0.25420.1
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "passthrough-cpp", "passthrough-cpp.vcxproj", "{E8A4060D-E6A4-42CC-9BCA-DC82E6EDB2C5}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{E8A4060D-E6A4-42CC-9BCA-DC82E6EDB2C5}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{E8A4060D-E6A4-42CC-9BCA-DC82E6EDB2C5}.Debug|x64.Build.0 = Debug|x64
|
||||
{E8A4060D-E6A4-42CC-9BCA-DC82E6EDB2C5}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{E8A4060D-E6A4-42CC-9BCA-DC82E6EDB2C5}.Debug|x86.Build.0 = Debug|Win32
|
||||
{E8A4060D-E6A4-42CC-9BCA-DC82E6EDB2C5}.Release|x64.ActiveCfg = Release|x64
|
||||
{E8A4060D-E6A4-42CC-9BCA-DC82E6EDB2C5}.Release|x64.Build.0 = Release|x64
|
||||
{E8A4060D-E6A4-42CC-9BCA-DC82E6EDB2C5}.Release|x86.ActiveCfg = Release|Win32
|
||||
{E8A4060D-E6A4-42CC-9BCA-DC82E6EDB2C5}.Release|x86.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
178
tst/passthrough-cpp/passthrough-cpp.vcxproj
Normal file
178
tst/passthrough-cpp/passthrough-cpp.vcxproj
Normal file
@ -0,0 +1,178 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{E8A4060D-E6A4-42CC-9BCA-DC82E6EDB2C5}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>passthroughcpp</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<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|Win32'">
|
||||
<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)'=='Debug|x64'">
|
||||
<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'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<OutDir>$(SolutionDir)build\$(Configuration)\</OutDir>
|
||||
<IntDir>$(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\</IntDir>
|
||||
<TargetName>$(ProjectName)-$(PlatformTarget)</TargetName>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>$(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<DelayLoadDLLs>winfsp-$(PlatformTarget).dll</DelayLoadDLLs>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>$(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<DelayLoadDLLs>winfsp-$(PlatformTarget).dll</DelayLoadDLLs>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>$(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<DelayLoadDLLs>winfsp-$(PlatformTarget).dll</DelayLoadDLLs>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>$(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<DelayLoadDLLs>winfsp-$(PlatformTarget).dll</DelayLoadDLLs>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="passthrough-cpp.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
14
tst/passthrough-cpp/passthrough-cpp.vcxproj.filters
Normal file
14
tst/passthrough-cpp/passthrough-cpp.vcxproj.filters
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="passthrough-cpp.cpp">
|
||||
<Filter>Source</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
6
tst/passthrough-dotnet/.gitignore
vendored
Normal file
6
tst/passthrough-dotnet/.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
build
|
||||
*.ncb
|
||||
*.suo
|
||||
*.vcproj.*
|
||||
*.vcxproj.user
|
||||
*.csproj.user
|
845
tst/passthrough-dotnet/Program.cs
Normal file
845
tst/passthrough-dotnet/Program.cs
Normal file
@ -0,0 +1,845 @@
|
||||
/**
|
||||
* @file Program.cs
|
||||
*
|
||||
* @copyright 2015-2017 Bill Zissimopoulos
|
||||
*/
|
||||
/*
|
||||
* This file is part of WinFsp.
|
||||
*
|
||||
* You can redistribute it and/or modify it under the terms of the GNU
|
||||
* General Public License version 3 as published by the Free Software
|
||||
* Foundation.
|
||||
*
|
||||
* Licensees holding a valid commercial license may use this file in
|
||||
* accordance with the commercial license agreement provided with the
|
||||
* software.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security.AccessControl;
|
||||
|
||||
using Fsp;
|
||||
using VolumeInfo = Fsp.Interop.VolumeInfo;
|
||||
using FileInfo = Fsp.Interop.FileInfo;
|
||||
|
||||
namespace passthrough
|
||||
{
|
||||
class Ptfs : FileSystemBase
|
||||
{
|
||||
protected const int ALLOCATION_UNIT = 4096;
|
||||
|
||||
protected static void ThrowIoExceptionWithHResult(Int32 HResult)
|
||||
{
|
||||
throw new IOException(null, HResult);
|
||||
}
|
||||
protected static void ThrowIoExceptionWithWin32(Int32 Error)
|
||||
{
|
||||
ThrowIoExceptionWithHResult(unchecked((Int32)(0x80070000 | Error)));
|
||||
}
|
||||
protected static void ThrowIoExceptionWithNtStatus(Int32 Status)
|
||||
{
|
||||
ThrowIoExceptionWithWin32((Int32)Win32FromNtStatus(Status));
|
||||
}
|
||||
|
||||
protected class FileDesc
|
||||
{
|
||||
public FileStream Stream;
|
||||
public DirectoryInfo DirInfo;
|
||||
public DictionaryEntry[] FileSystemInfos;
|
||||
|
||||
public FileDesc(FileStream Stream)
|
||||
{
|
||||
this.Stream = Stream;
|
||||
}
|
||||
public FileDesc(DirectoryInfo DirInfo)
|
||||
{
|
||||
this.DirInfo = DirInfo;
|
||||
}
|
||||
public static void GetFileInfoFromFileSystemInfo(
|
||||
FileSystemInfo Info,
|
||||
out FileInfo FileInfo)
|
||||
{
|
||||
FileInfo.FileAttributes = (UInt32)Info.Attributes;
|
||||
FileInfo.ReparseTag = 0;
|
||||
FileInfo.FileSize = Info is System.IO.FileInfo ?
|
||||
(UInt64)((System.IO.FileInfo)Info).Length : 0;
|
||||
FileInfo.AllocationSize = (FileInfo.FileSize + ALLOCATION_UNIT - 1)
|
||||
/ ALLOCATION_UNIT * ALLOCATION_UNIT;
|
||||
FileInfo.CreationTime = (UInt64)Info.CreationTimeUtc.ToFileTimeUtc();
|
||||
FileInfo.LastAccessTime = (UInt64)Info.LastAccessTimeUtc.ToFileTimeUtc();
|
||||
FileInfo.LastWriteTime = (UInt64)Info.LastWriteTimeUtc.ToFileTimeUtc();
|
||||
FileInfo.ChangeTime = FileInfo.LastWriteTime;
|
||||
FileInfo.IndexNumber = 0;
|
||||
FileInfo.HardLinks = 0;
|
||||
}
|
||||
public Int32 GetFileInfo(out FileInfo FileInfo)
|
||||
{
|
||||
if (null != Stream)
|
||||
{
|
||||
BY_HANDLE_FILE_INFORMATION Info;
|
||||
if (!GetFileInformationByHandle(Stream.SafeFileHandle.DangerousGetHandle(),
|
||||
out Info))
|
||||
ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error());
|
||||
FileInfo.FileAttributes = Info.dwFileAttributes;
|
||||
FileInfo.ReparseTag = 0;
|
||||
FileInfo.FileSize = (UInt64)Stream.Length;
|
||||
FileInfo.AllocationSize = (FileInfo.FileSize + ALLOCATION_UNIT - 1)
|
||||
/ ALLOCATION_UNIT * ALLOCATION_UNIT;
|
||||
FileInfo.CreationTime = Info.ftCreationTime;
|
||||
FileInfo.LastAccessTime = Info.ftLastAccessTime;
|
||||
FileInfo.LastWriteTime = Info.ftLastWriteTime;
|
||||
FileInfo.ChangeTime = FileInfo.LastWriteTime;
|
||||
FileInfo.IndexNumber = 0;
|
||||
FileInfo.HardLinks = 0;
|
||||
}
|
||||
else
|
||||
GetFileInfoFromFileSystemInfo(DirInfo, out FileInfo);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
public void SetBasicInfo(
|
||||
UInt32 FileAttributes,
|
||||
UInt64 CreationTime,
|
||||
UInt64 LastAccessTime,
|
||||
UInt64 LastWriteTime)
|
||||
{
|
||||
if (0 == FileAttributes)
|
||||
FileAttributes = (UInt32)System.IO.FileAttributes.Normal;
|
||||
if (null != Stream)
|
||||
{
|
||||
FILE_BASIC_INFO Info = default(FILE_BASIC_INFO);
|
||||
if (unchecked((UInt32)(-1)) != FileAttributes)
|
||||
Info.FileAttributes = FileAttributes;
|
||||
if (0 != CreationTime)
|
||||
Info.CreationTime = CreationTime;
|
||||
if (0 != LastAccessTime)
|
||||
Info.LastAccessTime = LastAccessTime;
|
||||
if (0 != LastWriteTime)
|
||||
Info.LastWriteTime = LastWriteTime;
|
||||
if (!SetFileInformationByHandle(Stream.SafeFileHandle.DangerousGetHandle(),
|
||||
0/*FileBasicInfo*/, ref Info, (UInt32)Marshal.SizeOf(Info)))
|
||||
ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (unchecked((UInt32)(-1)) != FileAttributes)
|
||||
DirInfo.Attributes = (System.IO.FileAttributes)FileAttributes;
|
||||
if (0 != CreationTime)
|
||||
DirInfo.CreationTimeUtc = DateTime.FromFileTimeUtc((Int64)CreationTime);
|
||||
if (0 != LastAccessTime)
|
||||
DirInfo.LastAccessTimeUtc = DateTime.FromFileTimeUtc((Int64)LastAccessTime);
|
||||
if (0 != LastWriteTime)
|
||||
DirInfo.LastWriteTimeUtc = DateTime.FromFileTimeUtc((Int64)LastWriteTime);
|
||||
}
|
||||
}
|
||||
public UInt32 GetFileAttributes()
|
||||
{
|
||||
FileInfo FileInfo;
|
||||
GetFileInfo(out FileInfo);
|
||||
return FileInfo.FileAttributes;
|
||||
}
|
||||
public void SetFileAttributes(UInt32 FileAttributes)
|
||||
{
|
||||
SetBasicInfo(FileAttributes, 0, 0, 0);
|
||||
}
|
||||
public Byte[] GetSecurityDescriptor()
|
||||
{
|
||||
if (null != Stream)
|
||||
return Stream.GetAccessControl().GetSecurityDescriptorBinaryForm();
|
||||
else
|
||||
return DirInfo.GetAccessControl().GetSecurityDescriptorBinaryForm();
|
||||
}
|
||||
public void SetSecurityDescriptor(AccessControlSections Sections, Byte[] SecurityDescriptor)
|
||||
{
|
||||
Int32 SecurityInformation = 0;
|
||||
if (0 != (Sections & AccessControlSections.Owner))
|
||||
SecurityInformation |= 1/*OWNER_SECURITY_INFORMATION*/;
|
||||
if (0 != (Sections & AccessControlSections.Group))
|
||||
SecurityInformation |= 2/*GROUP_SECURITY_INFORMATION*/;
|
||||
if (0 != (Sections & AccessControlSections.Access))
|
||||
SecurityInformation |= 4/*DACL_SECURITY_INFORMATION*/;
|
||||
if (0 != (Sections & AccessControlSections.Audit))
|
||||
SecurityInformation |= 8/*SACL_SECURITY_INFORMATION*/;
|
||||
if (null != Stream)
|
||||
{
|
||||
if (!SetKernelObjectSecurity(Stream.SafeFileHandle.DangerousGetHandle(),
|
||||
SecurityInformation, SecurityDescriptor))
|
||||
ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!SetFileSecurityW(DirInfo.FullName,
|
||||
SecurityInformation, SecurityDescriptor))
|
||||
ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error());
|
||||
}
|
||||
}
|
||||
public void SetDisposition(Boolean Safe)
|
||||
{
|
||||
if (null != Stream)
|
||||
{
|
||||
FILE_DISPOSITION_INFO Info;
|
||||
Info.DeleteFile = true;
|
||||
if (!SetFileInformationByHandle(Stream.SafeFileHandle.DangerousGetHandle(),
|
||||
4/*FileDispositionInfo*/, ref Info, (UInt32)Marshal.SizeOf(Info)))
|
||||
if (!Safe)
|
||||
ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error());
|
||||
}
|
||||
else
|
||||
try
|
||||
{
|
||||
DirInfo.Delete();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (!Safe)
|
||||
ThrowIoExceptionWithHResult(ex.HResult);
|
||||
}
|
||||
}
|
||||
public static void Rename(String FileName, String NewFileName, Boolean ReplaceIfExists)
|
||||
{
|
||||
if (!MoveFileExW(FileName, NewFileName, ReplaceIfExists ? 1U/*MOVEFILE_REPLACE_EXISTING*/ : 0))
|
||||
ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error());
|
||||
}
|
||||
|
||||
/* interop */
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 4)]
|
||||
private struct BY_HANDLE_FILE_INFORMATION
|
||||
{
|
||||
public UInt32 dwFileAttributes;
|
||||
public UInt64 ftCreationTime;
|
||||
public UInt64 ftLastAccessTime;
|
||||
public UInt64 ftLastWriteTime;
|
||||
public UInt32 dwVolumeSerialNumber;
|
||||
public UInt32 nFileSizeHigh;
|
||||
public UInt32 nFileSizeLow;
|
||||
public UInt32 nNumberOfLinks;
|
||||
public UInt32 nFileIndexHigh;
|
||||
public UInt32 nFileIndexLow;
|
||||
}
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
private struct FILE_BASIC_INFO
|
||||
{
|
||||
public UInt64 CreationTime;
|
||||
public UInt64 LastAccessTime;
|
||||
public UInt64 LastWriteTime;
|
||||
public UInt64 ChangeTime;
|
||||
public UInt32 FileAttributes;
|
||||
}
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
private struct FILE_DISPOSITION_INFO
|
||||
{
|
||||
public Boolean DeleteFile;
|
||||
}
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
private static extern Boolean GetFileInformationByHandle(
|
||||
IntPtr hFile,
|
||||
out BY_HANDLE_FILE_INFORMATION lpFileInformation);
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
private static extern Boolean SetFileInformationByHandle(
|
||||
IntPtr hFile,
|
||||
Int32 FileInformationClass,
|
||||
ref FILE_BASIC_INFO lpFileInformation,
|
||||
UInt32 dwBufferSize);
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
private static extern Boolean SetFileInformationByHandle(
|
||||
IntPtr hFile,
|
||||
Int32 FileInformationClass,
|
||||
ref FILE_DISPOSITION_INFO lpFileInformation,
|
||||
UInt32 dwBufferSize);
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
private static extern Boolean MoveFileExW(
|
||||
[MarshalAs(UnmanagedType.LPWStr)] String lpExistingFileName,
|
||||
[MarshalAs(UnmanagedType.LPWStr)] String lpNewFileName,
|
||||
UInt32 dwFlags);
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
private static extern Boolean SetFileSecurityW(
|
||||
[MarshalAs(UnmanagedType.LPWStr)] String FileName,
|
||||
Int32 SecurityInformation,
|
||||
Byte[] SecurityDescriptor);
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
private static extern Boolean SetKernelObjectSecurity(
|
||||
IntPtr Handle,
|
||||
Int32 SecurityInformation,
|
||||
Byte[] SecurityDescriptor);
|
||||
}
|
||||
|
||||
private class DirectoryEntryComparer : IComparer
|
||||
{
|
||||
public int Compare(object x, object y)
|
||||
{
|
||||
return String.Compare(
|
||||
(String)((DictionaryEntry)x).Key,
|
||||
(String)((DictionaryEntry)y).Key);
|
||||
}
|
||||
}
|
||||
private static DirectoryEntryComparer _DirectoryEntryComparer =
|
||||
new DirectoryEntryComparer();
|
||||
|
||||
public Ptfs(String Path0)
|
||||
{
|
||||
_Path = Path.GetFullPath(Path0);
|
||||
if (_Path.EndsWith("\\"))
|
||||
_Path = _Path.Substring(0, _Path.Length - 1);
|
||||
}
|
||||
public String ConcatPath(String FileName)
|
||||
{
|
||||
return _Path + FileName;
|
||||
}
|
||||
public override Int32 ExceptionHandler(Exception ex)
|
||||
{
|
||||
Int32 HResult = ex.HResult; /* needs Framework 4.5 */
|
||||
if (0x80070000 == (HResult & 0xFFFF0000))
|
||||
return NtStatusFromWin32((UInt32)HResult & 0xFFFF);
|
||||
return STATUS_UNEXPECTED_IO_ERROR;
|
||||
}
|
||||
public override Int32 Init(Object Host0)
|
||||
{
|
||||
FileSystemHost Host = (FileSystemHost)Host0;
|
||||
Host.SectorSize = ALLOCATION_UNIT;
|
||||
Host.SectorsPerAllocationUnit = 1;
|
||||
Host.MaxComponentLength = 255;
|
||||
Host.FileInfoTimeout = 1000;
|
||||
Host.CaseSensitiveSearch = false;
|
||||
Host.CasePreservedNames = true;
|
||||
Host.UnicodeOnDisk = true;
|
||||
Host.PersistentAcls = true;
|
||||
Host.PostCleanupWhenModifiedOnly = true;
|
||||
Host.PassQueryDirectoryPattern = true;
|
||||
Host.VolumeCreationTime = (UInt64)File.GetCreationTimeUtc(_Path).ToFileTimeUtc();
|
||||
Host.VolumeSerialNumber = 0;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
public override Int32 GetVolumeInfo(
|
||||
out VolumeInfo VolumeInfo)
|
||||
{
|
||||
VolumeInfo = default(VolumeInfo);
|
||||
try
|
||||
{
|
||||
DriveInfo Info = new DriveInfo(_Path);
|
||||
VolumeInfo.TotalSize = (UInt64)Info.TotalSize;
|
||||
VolumeInfo.FreeSize = (UInt64)Info.TotalFreeSpace;
|
||||
}
|
||||
catch (ArgumentException)
|
||||
{
|
||||
/*
|
||||
* DriveInfo only supports drives and does not support UNC paths.
|
||||
* It would be better to use GetDiskFreeSpaceEx here.
|
||||
*/
|
||||
}
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
public override Int32 GetSecurityByName(
|
||||
String FileName,
|
||||
out UInt32 FileAttributes/* or ReparsePointIndex */,
|
||||
ref Byte[] SecurityDescriptor)
|
||||
{
|
||||
FileName = ConcatPath(FileName);
|
||||
System.IO.FileInfo Info = new System.IO.FileInfo(FileName);
|
||||
FileAttributes = (UInt32)Info.Attributes;
|
||||
if (null != SecurityDescriptor)
|
||||
SecurityDescriptor = Info.GetAccessControl().GetSecurityDescriptorBinaryForm();
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
public override Int32 Create(
|
||||
String FileName,
|
||||
UInt32 CreateOptions,
|
||||
UInt32 GrantedAccess,
|
||||
UInt32 FileAttributes,
|
||||
Byte[] SecurityDescriptor,
|
||||
UInt64 AllocationSize,
|
||||
out Object FileNode,
|
||||
out Object FileDesc0,
|
||||
out FileInfo FileInfo,
|
||||
out String NormalizedName)
|
||||
{
|
||||
FileDesc FileDesc = null;
|
||||
try
|
||||
{
|
||||
FileName = ConcatPath(FileName);
|
||||
if (0 == (CreateOptions & FILE_DIRECTORY_FILE))
|
||||
{
|
||||
FileSecurity Security = null;
|
||||
if (null != SecurityDescriptor)
|
||||
{
|
||||
Security = new FileSecurity();
|
||||
Security.SetSecurityDescriptorBinaryForm(SecurityDescriptor);
|
||||
}
|
||||
FileDesc = new FileDesc(
|
||||
new FileStream(
|
||||
FileName,
|
||||
FileMode.CreateNew,
|
||||
(FileSystemRights)GrantedAccess | FileSystemRights.WriteAttributes,
|
||||
FileShare.Read | FileShare.Write | FileShare.Delete,
|
||||
4096,
|
||||
0,
|
||||
Security));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Directory.Exists(FileName))
|
||||
ThrowIoExceptionWithNtStatus(STATUS_OBJECT_NAME_COLLISION);
|
||||
DirectorySecurity Security = null;
|
||||
if (null != SecurityDescriptor)
|
||||
{
|
||||
Security = new DirectorySecurity();
|
||||
Security.SetSecurityDescriptorBinaryForm(SecurityDescriptor);
|
||||
}
|
||||
FileDesc = new FileDesc(
|
||||
Directory.CreateDirectory(FileName, Security));
|
||||
}
|
||||
FileDesc.SetFileAttributes(FileAttributes);
|
||||
FileNode = default(Object);
|
||||
FileDesc0 = FileDesc;
|
||||
NormalizedName = default(String);
|
||||
return FileDesc.GetFileInfo(out FileInfo);
|
||||
}
|
||||
catch
|
||||
{
|
||||
if (null != FileDesc && null != FileDesc.Stream)
|
||||
FileDesc.Stream.Dispose();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
public override Int32 Open(
|
||||
String FileName,
|
||||
UInt32 CreateOptions,
|
||||
UInt32 GrantedAccess,
|
||||
out Object FileNode,
|
||||
out Object FileDesc0,
|
||||
out FileInfo FileInfo,
|
||||
out String NormalizedName)
|
||||
{
|
||||
FileDesc FileDesc = null;
|
||||
try
|
||||
{
|
||||
FileName = ConcatPath(FileName);
|
||||
if (!Directory.Exists(FileName))
|
||||
{
|
||||
FileDesc = new FileDesc(
|
||||
new FileStream(
|
||||
FileName,
|
||||
FileMode.Open,
|
||||
(FileSystemRights)GrantedAccess,
|
||||
FileShare.Read | FileShare.Write | FileShare.Delete,
|
||||
4096,
|
||||
0));
|
||||
}
|
||||
else
|
||||
{
|
||||
FileDesc = new FileDesc(
|
||||
new DirectoryInfo(FileName));
|
||||
}
|
||||
FileNode = default(Object);
|
||||
FileDesc0 = FileDesc;
|
||||
NormalizedName = default(String);
|
||||
return FileDesc.GetFileInfo(out FileInfo);
|
||||
}
|
||||
catch
|
||||
{
|
||||
if (null != FileDesc && null != FileDesc.Stream)
|
||||
FileDesc.Stream.Dispose();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
public override Int32 Overwrite(
|
||||
Object FileNode,
|
||||
Object FileDesc0,
|
||||
UInt32 FileAttributes,
|
||||
Boolean ReplaceFileAttributes,
|
||||
UInt64 AllocationSize,
|
||||
out FileInfo FileInfo)
|
||||
{
|
||||
FileDesc FileDesc = (FileDesc)FileDesc0;
|
||||
if (ReplaceFileAttributes)
|
||||
FileDesc.SetFileAttributes(FileAttributes);
|
||||
else if (0 != FileAttributes)
|
||||
FileDesc.SetFileAttributes(FileDesc.GetFileAttributes() | FileAttributes);
|
||||
FileDesc.Stream.SetLength(0);
|
||||
return FileDesc.GetFileInfo(out FileInfo);
|
||||
}
|
||||
public override void Cleanup(
|
||||
Object FileNode,
|
||||
Object FileDesc0,
|
||||
String FileName,
|
||||
UInt32 Flags)
|
||||
{
|
||||
FileDesc FileDesc = (FileDesc)FileDesc0;
|
||||
if (0 != (Flags & CleanupDelete))
|
||||
{
|
||||
FileDesc.SetDisposition(true);
|
||||
if (null != FileDesc.Stream)
|
||||
FileDesc.Stream.Dispose();
|
||||
}
|
||||
}
|
||||
public override void Close(
|
||||
Object FileNode,
|
||||
Object FileDesc0)
|
||||
{
|
||||
FileDesc FileDesc = (FileDesc)FileDesc0;
|
||||
if (null != FileDesc.Stream)
|
||||
FileDesc.Stream.Dispose();
|
||||
}
|
||||
public override Int32 Read(
|
||||
Object FileNode,
|
||||
Object FileDesc0,
|
||||
IntPtr Buffer,
|
||||
UInt64 Offset,
|
||||
UInt32 Length,
|
||||
out UInt32 PBytesTransferred)
|
||||
{
|
||||
FileDesc FileDesc = (FileDesc)FileDesc0;
|
||||
if (Offset >= (UInt64)FileDesc.Stream.Length)
|
||||
ThrowIoExceptionWithNtStatus(STATUS_END_OF_FILE);
|
||||
Byte[] Bytes = new byte[Length];
|
||||
FileDesc.Stream.Seek((Int64)Offset, SeekOrigin.Begin);
|
||||
PBytesTransferred = (UInt32)FileDesc.Stream.Read(Bytes, 0, Bytes.Length);
|
||||
Marshal.Copy(Bytes, 0, Buffer, Bytes.Length);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
public override Int32 Write(
|
||||
Object FileNode,
|
||||
Object FileDesc0,
|
||||
IntPtr Buffer,
|
||||
UInt64 Offset,
|
||||
UInt32 Length,
|
||||
Boolean WriteToEndOfFile,
|
||||
Boolean ConstrainedIo,
|
||||
out UInt32 PBytesTransferred,
|
||||
out FileInfo FileInfo)
|
||||
{
|
||||
FileDesc FileDesc = (FileDesc)FileDesc0;
|
||||
if (ConstrainedIo)
|
||||
{
|
||||
if (Offset >= (UInt64)FileDesc.Stream.Length)
|
||||
{
|
||||
PBytesTransferred = default(UInt32);
|
||||
FileInfo = default(FileInfo);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
if (Offset + Length > (UInt64)FileDesc.Stream.Length)
|
||||
Length = (UInt32)((UInt64)FileDesc.Stream.Length - Offset);
|
||||
}
|
||||
Byte[] Bytes = new byte[Length];
|
||||
Marshal.Copy(Buffer, Bytes, 0, Bytes.Length);
|
||||
if (!WriteToEndOfFile)
|
||||
FileDesc.Stream.Seek((Int64)Offset, SeekOrigin.Begin);
|
||||
FileDesc.Stream.Write(Bytes, 0, Bytes.Length);
|
||||
PBytesTransferred = (UInt32)Bytes.Length;
|
||||
return FileDesc.GetFileInfo(out FileInfo);
|
||||
}
|
||||
public override Int32 Flush(
|
||||
Object FileNode,
|
||||
Object FileDesc0,
|
||||
out FileInfo FileInfo)
|
||||
{
|
||||
FileDesc FileDesc = (FileDesc)FileDesc0;
|
||||
if (null == FileDesc)
|
||||
{
|
||||
/* we do not flush the whole volume, so just return SUCCESS */
|
||||
FileInfo = default(FileInfo);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
FileDesc.Stream.Flush(true);
|
||||
return FileDesc.GetFileInfo(out FileInfo);
|
||||
}
|
||||
public override Int32 GetFileInfo(
|
||||
Object FileNode,
|
||||
Object FileDesc0,
|
||||
out FileInfo FileInfo)
|
||||
{
|
||||
FileDesc FileDesc = (FileDesc)FileDesc0;
|
||||
return FileDesc.GetFileInfo(out FileInfo);
|
||||
}
|
||||
public override Int32 SetBasicInfo(
|
||||
Object FileNode,
|
||||
Object FileDesc0,
|
||||
UInt32 FileAttributes,
|
||||
UInt64 CreationTime,
|
||||
UInt64 LastAccessTime,
|
||||
UInt64 LastWriteTime,
|
||||
UInt64 ChangeTime,
|
||||
out FileInfo FileInfo)
|
||||
{
|
||||
FileDesc FileDesc = (FileDesc)FileDesc0;
|
||||
FileDesc.SetBasicInfo(FileAttributes, CreationTime, LastAccessTime, LastWriteTime);
|
||||
return FileDesc.GetFileInfo(out FileInfo);
|
||||
}
|
||||
public override Int32 SetFileSize(
|
||||
Object FileNode,
|
||||
Object FileDesc0,
|
||||
UInt64 NewSize,
|
||||
Boolean SetAllocationSize,
|
||||
out FileInfo FileInfo)
|
||||
{
|
||||
FileDesc FileDesc = (FileDesc)FileDesc0;
|
||||
if (!SetAllocationSize || (UInt64)FileDesc.Stream.Length > NewSize)
|
||||
{
|
||||
/*
|
||||
* "FileInfo.FileSize > NewSize" explanation:
|
||||
* Ptfs does not support allocation size. However if the new AllocationSize
|
||||
* is less than the current FileSize we must truncate the file.
|
||||
*/
|
||||
FileDesc.Stream.SetLength((Int64)NewSize);
|
||||
}
|
||||
return FileDesc.GetFileInfo(out FileInfo);
|
||||
}
|
||||
public override Int32 CanDelete(
|
||||
Object FileNode,
|
||||
Object FileDesc0,
|
||||
String FileName)
|
||||
{
|
||||
FileDesc FileDesc = (FileDesc)FileDesc0;
|
||||
FileDesc.SetDisposition(false);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
public override Int32 Rename(
|
||||
Object FileNode,
|
||||
Object FileDesc0,
|
||||
String FileName,
|
||||
String NewFileName,
|
||||
Boolean ReplaceIfExists)
|
||||
{
|
||||
FileName = ConcatPath(FileName);
|
||||
NewFileName = ConcatPath(NewFileName);
|
||||
FileDesc.Rename(FileName, NewFileName, ReplaceIfExists);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
public override Int32 GetSecurity(
|
||||
Object FileNode,
|
||||
Object FileDesc0,
|
||||
ref Byte[] SecurityDescriptor)
|
||||
{
|
||||
FileDesc FileDesc = (FileDesc)FileDesc0;
|
||||
SecurityDescriptor = FileDesc.GetSecurityDescriptor();
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
public override Int32 SetSecurity(
|
||||
Object FileNode,
|
||||
Object FileDesc0,
|
||||
AccessControlSections Sections,
|
||||
Byte[] SecurityDescriptor)
|
||||
{
|
||||
FileDesc FileDesc = (FileDesc)FileDesc0;
|
||||
FileDesc.SetSecurityDescriptor(Sections, SecurityDescriptor);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
public override Boolean ReadDirectoryEntry(
|
||||
Object FileNode,
|
||||
Object FileDesc0,
|
||||
String Pattern,
|
||||
String Marker,
|
||||
ref Object Context,
|
||||
out String FileName,
|
||||
out FileInfo FileInfo)
|
||||
{
|
||||
FileDesc FileDesc = (FileDesc)FileDesc0;
|
||||
if (null == FileDesc.FileSystemInfos)
|
||||
{
|
||||
IEnumerable Enum = FileDesc.DirInfo.EnumerateFileSystemInfos(
|
||||
null != Pattern ? Pattern : "*");
|
||||
SortedList List = new SortedList();
|
||||
List.Add(".", FileDesc.DirInfo);
|
||||
List.Add("..", FileDesc.DirInfo.Parent);
|
||||
foreach (FileSystemInfo Info in Enum)
|
||||
List.Add(Info.Name, Info);
|
||||
FileDesc.FileSystemInfos = new DictionaryEntry[List.Count];
|
||||
List.CopyTo(FileDesc.FileSystemInfos, 0);
|
||||
}
|
||||
int Index;
|
||||
if (null == Context)
|
||||
{
|
||||
Index = 0;
|
||||
if (null != Marker)
|
||||
{
|
||||
Index = Array.BinarySearch(FileDesc.FileSystemInfos,
|
||||
new DictionaryEntry(Marker, null),
|
||||
_DirectoryEntryComparer);
|
||||
if (0 <= Index)
|
||||
Index++;
|
||||
else
|
||||
Index = ~Index;
|
||||
}
|
||||
}
|
||||
else
|
||||
Index = (int)Context;
|
||||
if (FileDesc.FileSystemInfos.Length > Index)
|
||||
{
|
||||
Context = Index + 1;
|
||||
FileName = (String)FileDesc.FileSystemInfos[Index].Key;
|
||||
FileDesc.GetFileInfoFromFileSystemInfo(
|
||||
(FileSystemInfo)FileDesc.FileSystemInfos[Index].Value,
|
||||
out FileInfo);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
FileName = default(String);
|
||||
FileInfo = default(FileInfo);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private String _Path;
|
||||
}
|
||||
|
||||
class PtfsService : Service
|
||||
{
|
||||
private class CommandLineUsageException : Exception
|
||||
{
|
||||
public CommandLineUsageException(String Message = null) : base(Message)
|
||||
{
|
||||
HasMessage = null != Message;
|
||||
}
|
||||
|
||||
public bool HasMessage;
|
||||
}
|
||||
|
||||
private const String PROGNAME = "passthrough-dotnet";
|
||||
|
||||
public PtfsService() : base("PtfsService")
|
||||
{
|
||||
}
|
||||
|
||||
protected override void OnStart(String[] Args)
|
||||
{
|
||||
try
|
||||
{
|
||||
String DebugLogFile = null;
|
||||
UInt32 DebugFlags = 0;
|
||||
String VolumePrefix = null;
|
||||
String PassThrough = null;
|
||||
String MountPoint = null;
|
||||
IntPtr DebugLogHandle = (IntPtr)(-1);
|
||||
FileSystemHost Host = null;
|
||||
Ptfs Ptfs = null;
|
||||
int I;
|
||||
|
||||
for (I = 1; Args.Length > I; I++)
|
||||
{
|
||||
String Arg = Args[I];
|
||||
if ('-' != Arg[0])
|
||||
break;
|
||||
switch (Arg[1])
|
||||
{
|
||||
case '?':
|
||||
throw new CommandLineUsageException();
|
||||
case 'd':
|
||||
argtol(Args, ref I, ref DebugFlags);
|
||||
break;
|
||||
case 'D':
|
||||
argtos(Args, ref I, ref DebugLogFile);
|
||||
break;
|
||||
case 'm':
|
||||
argtos(Args, ref I, ref MountPoint);
|
||||
break;
|
||||
case 'p':
|
||||
argtos(Args, ref I, ref PassThrough);
|
||||
break;
|
||||
case 'u':
|
||||
argtos(Args, ref I, ref VolumePrefix);
|
||||
break;
|
||||
default:
|
||||
throw new CommandLineUsageException();
|
||||
}
|
||||
}
|
||||
|
||||
if (Args.Length > I)
|
||||
throw new CommandLineUsageException();
|
||||
|
||||
if (null == PassThrough && null != VolumePrefix)
|
||||
{
|
||||
I = VolumePrefix.IndexOf('\\');
|
||||
if (-1 != I && VolumePrefix.Length > I && '\\' != VolumePrefix[I + 1])
|
||||
{
|
||||
I = VolumePrefix.IndexOf('\\', I + 1);
|
||||
if (-1 != I &&
|
||||
VolumePrefix.Length > I + 1 &&
|
||||
(
|
||||
('A' <= VolumePrefix[I + 1] && VolumePrefix[I + 1] <= 'Z') ||
|
||||
('a' <= VolumePrefix[I + 1] && VolumePrefix[I + 1] <= 'z')
|
||||
) &&
|
||||
'$' == VolumePrefix[I + 2])
|
||||
{
|
||||
PassThrough = String.Format("{0}:{1}", VolumePrefix[I + 1], VolumePrefix.Substring(I + 3));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (null == PassThrough || null == MountPoint)
|
||||
throw new CommandLineUsageException();
|
||||
|
||||
if (null != DebugLogFile)
|
||||
if (0 > FileSystemHost.SetDebugLogFile(DebugLogFile))
|
||||
throw new CommandLineUsageException("cannot open debug log file");
|
||||
|
||||
Host = new FileSystemHost(Ptfs = new Ptfs(PassThrough));
|
||||
Host.Prefix = VolumePrefix;
|
||||
if (0 > Host.Mount(MountPoint, null, true, DebugFlags))
|
||||
throw new IOException("cannot mount file system");
|
||||
MountPoint = Host.MountPoint();
|
||||
_Host = Host;
|
||||
|
||||
Log(EVENTLOG_INFORMATION_TYPE, String.Format("{0}{1}{2} -p {3} -m {4}",
|
||||
PROGNAME,
|
||||
null != VolumePrefix && 0 < VolumePrefix.Length ? " -u " : "",
|
||||
null != VolumePrefix && 0 < VolumePrefix.Length ? VolumePrefix : "",
|
||||
PassThrough,
|
||||
MountPoint));
|
||||
}
|
||||
catch (CommandLineUsageException ex)
|
||||
{
|
||||
Log(EVENTLOG_ERROR_TYPE, String.Format(
|
||||
"{0}" +
|
||||
"usage: {1} OPTIONS\n" +
|
||||
"\n" +
|
||||
"options:\n" +
|
||||
" -d DebugFlags [-1: enable all debug logs]\n" +
|
||||
" -D DebugLogFile [file path; use - for stderr]\n" +
|
||||
" -u \\Server\\Share [UNC prefix (single backslash)]\n" +
|
||||
" -p Directory [directory to expose as pass through file system]\n" +
|
||||
" -m MountPoint [X:|*|directory]\n",
|
||||
ex.HasMessage ? ex.Message + "\n" : "",
|
||||
PROGNAME));
|
||||
throw;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log(EVENTLOG_ERROR_TYPE, String.Format("{0}", ex.Message));
|
||||
throw;
|
||||
}
|
||||
}
|
||||
protected override void OnStop()
|
||||
{
|
||||
_Host.Unmount();
|
||||
_Host = null;
|
||||
}
|
||||
|
||||
private static void argtos(String[] Args, ref int I, ref String V)
|
||||
{
|
||||
if (Args.Length > ++I)
|
||||
V = Args[I];
|
||||
else
|
||||
throw new CommandLineUsageException();
|
||||
}
|
||||
private static void argtol(String[] Args, ref int I, ref UInt32 V)
|
||||
{
|
||||
Int32 R;
|
||||
if (Args.Length > ++I)
|
||||
V = Int32.TryParse(Args[I], out R) ? (UInt32)R : V;
|
||||
else
|
||||
throw new CommandLineUsageException();
|
||||
}
|
||||
|
||||
private FileSystemHost _Host;
|
||||
}
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
Environment.ExitCode = new PtfsService().Run();
|
||||
}
|
||||
}
|
||||
}
|
84
tst/passthrough-dotnet/passthrough-dotnet.csproj
Normal file
84
tst/passthrough-dotnet/passthrough-dotnet.csproj
Normal file
@ -0,0 +1,84 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{6EC13EBC-BD7E-4997-9B29-49D5F06103A6}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<RootNamespace>passthrough</RootNamespace>
|
||||
<AssemblyName>passthrough-dotnet</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
||||
<BaseIntermediateOutputPath>$(SolutionDir)build\$(ProjectName).build\</BaseIntermediateOutputPath>
|
||||
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
|
||||
<BaseIntermediateOutputPath>$(SolutionDir)build\$(ProjectName).build\</BaseIntermediateOutputPath>
|
||||
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="winfsp-msil, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b099876d8fa9b1f3, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>$(MSBuildProgramFiles32)\WinFsp\bin\winfsp-msil.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Program.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include=".NETFramework,Version=v4.5.2">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Microsoft .NET Framework 4.5.2 %28x86 and x64%29</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
</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>
|
22
tst/passthrough-dotnet/passthrough-dotnet.sln
Normal file
22
tst/passthrough-dotnet/passthrough-dotnet.sln
Normal file
@ -0,0 +1,22 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 14
|
||||
VisualStudioVersion = 14.0.25420.1
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "passthrough-dotnet", "passthrough-dotnet.csproj", "{6EC13EBC-BD7E-4997-9B29-49D5F06103A6}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{6EC13EBC-BD7E-4997-9B29-49D5F06103A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{6EC13EBC-BD7E-4997-9B29-49D5F06103A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{6EC13EBC-BD7E-4997-9B29-49D5F06103A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{6EC13EBC-BD7E-4997-9B29-49D5F06103A6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
@ -316,6 +316,9 @@ static void dirbuf_fill_test(void)
|
||||
|
||||
void dirbuf_tests(void)
|
||||
{
|
||||
if (OptExternal)
|
||||
return;
|
||||
|
||||
TEST(dirbuf_empty_test);
|
||||
TEST(dirbuf_dots_test);
|
||||
TEST(dirbuf_fill_test);
|
||||
|
@ -31,5 +31,8 @@ void eventlog_test(void)
|
||||
|
||||
void eventlog_tests(void)
|
||||
{
|
||||
if (OptExternal)
|
||||
return;
|
||||
|
||||
TEST_OPT(eventlog_test);
|
||||
}
|
||||
|
@ -370,5 +370,8 @@ void fuse_opt_parse_test(void)
|
||||
|
||||
void fuse_opt_tests(void)
|
||||
{
|
||||
if (OptExternal)
|
||||
return;
|
||||
|
||||
TEST(fuse_opt_parse_test);
|
||||
}
|
||||
|
@ -102,5 +102,8 @@ void memfs_test(void)
|
||||
|
||||
void memfs_tests(void)
|
||||
{
|
||||
if (OptExternal)
|
||||
return;
|
||||
|
||||
TEST(memfs_test);
|
||||
}
|
||||
|
@ -336,7 +336,7 @@ void mount_preflight_test(void)
|
||||
|
||||
void mount_tests(void)
|
||||
{
|
||||
if (NtfsTests || OptOplock)
|
||||
if (OptExternal || OptOplock)
|
||||
return;
|
||||
|
||||
TEST_OPT(mount_invalid_test);
|
||||
|
@ -126,6 +126,9 @@ void path_suffix_test(void)
|
||||
|
||||
void path_tests(void)
|
||||
{
|
||||
if (OptExternal)
|
||||
return;
|
||||
|
||||
TEST(path_prefix_test);
|
||||
TEST(path_suffix_test);
|
||||
}
|
||||
|
@ -265,6 +265,9 @@ void posix_map_path_test(void)
|
||||
|
||||
void posix_tests(void)
|
||||
{
|
||||
if (OptExternal)
|
||||
return;
|
||||
|
||||
TEST(posix_map_sid_test);
|
||||
TEST(posix_map_sd_test);
|
||||
TEST(posix_map_path_test);
|
||||
|
@ -262,7 +262,7 @@ void timeout_transact_test(void)
|
||||
|
||||
void timeout_tests(void)
|
||||
{
|
||||
if (NtfsTests || OptOplock)
|
||||
if (OptExternal || OptOplock)
|
||||
return;
|
||||
|
||||
TEST_OPT(timeout_pending_test);
|
||||
|
@ -38,5 +38,8 @@ static void version_test(void)
|
||||
|
||||
void version_tests(void)
|
||||
{
|
||||
if (OptExternal)
|
||||
return;
|
||||
|
||||
TEST(version_test);
|
||||
}
|
||||
|
@ -28,6 +28,7 @@ int NtfsTests = 0;
|
||||
int WinFspDiskTests = 1;
|
||||
int WinFspNetTests = 1;
|
||||
|
||||
BOOLEAN OptExternal = FALSE;
|
||||
BOOLEAN OptResilient = FALSE;
|
||||
BOOLEAN OptCaseInsensitiveCmp = FALSE;
|
||||
BOOLEAN OptCaseInsensitive = FALSE;
|
||||
@ -211,6 +212,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
if (0 == strcmp("--ntfs", a) || 0 == strcmp("--external", a))
|
||||
{
|
||||
OptExternal = TRUE;
|
||||
NtfsTests = 1;
|
||||
WinFspDiskTests = 0;
|
||||
WinFspNetTests = 0;
|
||||
|
@ -149,6 +149,7 @@ extern int NtfsTests;
|
||||
extern int WinFspDiskTests;
|
||||
extern int WinFspNetTests;
|
||||
|
||||
extern BOOLEAN OptExternal;
|
||||
extern BOOLEAN OptResilient;
|
||||
extern BOOLEAN OptCaseInsensitiveCmp;
|
||||
extern BOOLEAN OptCaseInsensitive;
|
||||
|
Reference in New Issue
Block a user