= WinFsp Building

This document provides instructions on building WinFsp and describes the WinFsp project structure.

== Building

In order to build WinFsp you will need the following:

* Visual Studio 2019
* Windows Driver Kit (WDK)
* https://wixtoolset.org[Wix toolset]

Use the command `tools\build.bat Release` to produce a full build (including the installer). However the resulting product will not be properly signed and Windows will refuse to load the WinFsp driver, unless you enable testsigning with `bcdedit -set testsigning on`.

Producing a fully functional build requires an EV certificate and a Partner Center for Windows Hardware account. Assuming you have those, the steps to produce a full build are as follows:

* Produce a build signed with your EV certificate using `tools\build.bat Release`.
* Upload the signed `driver.cab` file to Microsoft for "attestation signing".
* Download the now Microsoft-signed `driver.cab` file and extract it into a folder (e.g. `signed-drivers`).
* Re-run the build using `tools\build.bat Release PATH\TO\signed-drivers`

== Versioning

WinFsp versioning (and branding) is controlled by the file `build\VStudio\build.version.props`. See the link:WinFsp-Rebranding.asciidoc[WinFsp Rebranding] document for details.

== Project Structure

The WinFsp project is structured as follows:

* 📁 https://github.com/winfsp/winfsp/tree/master/art[art]: Project logo and other art.
* 📁 https://github.com/winfsp/winfsp/tree/master/build[build]: Project build files.
** 📁 https://github.com/winfsp/winfsp/tree/master/build/choco[choco]: Chocolatey package files.
** 📁 https://github.com/winfsp/winfsp/tree/master/build/VStudio[VStudio]: Visual Studio solution and project files.
* 📁 https://github.com/winfsp/winfsp/tree/master/doc[doc]: Project documentation.
* 📁 https://github.com/winfsp/winfsp/tree/master/ext[ext]: External dependencies.
** 📁 https://github.com/winfsp/winfsp/tree/master/ext/tlib[tlib]: Test library for C originally from the secfs project.
** 📁 https://github.com/winfsp/winfsp/tree/master/ext/test[test]: Submodule containing additional file system testing tools.
* 📁 https://github.com/winfsp/winfsp/tree/master/inc[inc]: Public headers.
** 📁 https://github.com/winfsp/winfsp/tree/master/inc/fuse[fuse]: Public headers for the FUSE compatibility layer.
** 📁 https://github.com/winfsp/winfsp/tree/master/inc/fuse3[fuse3]: Public headers for the FUSE3 compatibility layer.
** 📁 https://github.com/winfsp/winfsp/tree/master/inc/winfsp[winfsp]: Public headers for the WinFsp API.
* 📁 https://github.com/winfsp/winfsp/tree/master/opt[opt]: Additional source code and files.
** 📁 https://github.com/winfsp/winfsp/tree/master/opt/cygfuse[cygfuse]: Source code for the FUSE for Cygwin package.
** 📁 https://github.com/winfsp/winfsp/tree/master/opt/fsext[fsext]: Source code for the fsext package.
* 📁 https://github.com/winfsp/winfsp/tree/master/src[src]: Project source code.
** 📁 https://github.com/winfsp/winfsp/tree/master/src/dll[dll]: Source code for the WinFsp DLL.
*** 📁 https://github.com/winfsp/winfsp/tree/master/src/dll/fuse[fuse]: Source code for the FUSE compatibility layer.
*** 📁 https://github.com/winfsp/winfsp/tree/master/src/dll/fuse3[fuse3]: Source code for the FUSE3 compatibility layer.
** 📁 https://github.com/winfsp/winfsp/tree/master/src/dotnet[dotnet]: Source code for the .NET layer.
** 📁 https://github.com/winfsp/winfsp/tree/master/src/fsptool[fsptool]: Source code for the fsptool command line utility.
** 📁 https://github.com/winfsp/winfsp/tree/master/src/launcher[launcher]: Source code for the launcher and the launchctl utility.
** 📁 https://github.com/winfsp/winfsp/tree/master/src/shared[shared]: Shared source code.
*** 📁 https://github.com/winfsp/winfsp/tree/master/src/shared/ku[ku]: Shared source code for kernel and user mode.
*** 📁 https://github.com/winfsp/winfsp/tree/master/src/shared/um[um]: Shared source code for user mode only.
** 📁 https://github.com/winfsp/winfsp/tree/master/src/sys[sys]: Source code for the WinFsp FSD.
* 📁 https://github.com/winfsp/winfsp/tree/master/tools[tools]: Tools for building and testing WinFsp.
* 📁 https://github.com/winfsp/winfsp/tree/master/tst[tst]: Source code for example file systems and test suites.
** 📁 https://github.com/winfsp/winfsp/tree/master/tst/memfs[memfs]: The MEMFS reference file system.
** 📁 https://github.com/winfsp/winfsp/tree/master/tst/winfsp-tests[winfsp-tests]: The primary WinFsp test suite.
