From a742b78777c5315039aa1bc62f4876b42bd9a76d Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sun, 10 Mar 2019 17:35:34 -0700 Subject: [PATCH] update README --- README.md | 25 +++++++++++++++++++++---- doc/architecture.png | Bin 21416 -> 21523 bytes doc/architecture.puml | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 40ae10f..528e0e0 100644 --- a/README.md +++ b/README.md @@ -31,9 +31,20 @@ Storage units support two primary operations: read and write, and two secondary - **Flush**: flush any cached block data at the specified LBA. - **Unmap**: unmap (deallocate) blocks at the specified LBA. This is like the well known TRIM command. +For a full tutorial on creating a user mode storage device see the [Tutorial](doc/WinSpd-Tutorial.asciidoc). + ## Design -WinSpd is implemented as a StorPort virtual miniport (a kernel driver) and a user mode DLL. User mode storage devices use the DLL to communicate with the driver via special IOCTL's. The driver creates a virtual SCSI disk for every storage unit, which it adds to the Windows storage stack. At that point the disk can be partitioned and formatted with any of the Windows file systems. +WinSpd consists of a number of software components with different responsibilities: + +- The core components are a kernel driver (implemented as a StorPort virtual miniport) and a user + mode DLL. User mode storage devices use the DLL to communicate with the driver via special + IOCTL's. +- A launcher service that is used to launch and control user mode storage devices. +- A shell extension that is used to implement the "mount" and "eject" functionalities available via + the Windows Explorer and Shell. + +![Archictecture diagram](doc/architecture.png) The WinSpd virtual miniport implements the following SCSI commands: @@ -57,11 +68,17 @@ The project source code is organized as follows: * :file_folder: [inc](inc): Public headers. * :file_folder: [inc/winspd](inc/winspd): Public headers for the WinSpd API. * :file_folder: [src](src): WinSpd source code. - * :file_folder: [src/dll](src/dll): Source code to the WinSpd DLL. + * :file_folder: [src/devsetup](src/devsetup): Source code to the devsetup utility. It is used + to add or remove the WinSpd device driver from the system. + * :file_folder: [src/dll](src/dll): Source code to the WinSpd DLL. It is used by user mode + storage devices to communicate with the WinSpd device driver. * :file_folder: [src/dotnet](src/dotnet): Source code to the .NET layer. - * :file_folder: [src/launcher](src/launcher): Source code to the launcher service and the launchctl utility. + * :file_folder: [src/launcher](src/launcher): Source code to the launcher service and the + launchctl utility. The launcher service is used to launch and control user mode storage devices. * :file_folder: [src/scsitool](src/scsitool): Source code to the scsitool command line utility. - * :file_folder: [src/shellex](src/shellex): Source code to the WinSpd shell extension. + * :file_folder: [src/shellex](src/shellex): Source code to the WinSpd shell extension. It is + used to implement the "mount" and "eject" functionalities available via the Windows Explorer + and the Shell. * :file_folder: [src/stgtest](src/stgtest): Source code to the stgtest storage testing tool. * :file_folder: [src/sys](src/sys): Source code to the WinSpd kernel driver. * :file_folder: [tst](tst): Source code to example user mode storage devices and test tools. diff --git a/doc/architecture.png b/doc/architecture.png index 992aadbb22c70a082c4a03a72a4354adae72e2ff..f9b4f50fafad009f36a11410f21cf161f538d6db 100644 GIT binary patch literal 21523 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 BPlNyf literal 21416 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 PA4tm6)z4*}Q$iB}^29Zj diff --git a/doc/architecture.puml b/doc/architecture.puml index db22c11..e301d1e 100644 --- a/doc/architecture.puml +++ b/doc/architecture.puml @@ -13,7 +13,7 @@ node "Windows Services Session" as svc { launcher ..> stgdev: <> } -shellex - launcher: mount / eject +shellex - launcher: " mount / eject " node Kernel as kernel { component "disk.sys" as disk