-
Notifications
You must be signed in to change notification settings - Fork 1
/
readme.txt
353 lines (277 loc) · 13.8 KB
/
readme.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
Dokan Libary
Copyright (c) Hiroki Asakawa http://dokan-dev.net/en
Copyright (c) AIXIV https://github.com/AIXIV/dokan
What is Dokan Library
=====================
When you want to create a new file system on Windows, for example to
improve FAT or NTFS, you need to develop a file system
driver. Developing a device driver that works in kernel mode on
windows is extremely difficult. By using Dokan library, you can create
your own file systems very easily without writing device driver. Dokan
library is similar to FUSE (Linux user mode file system) but works on
Windows.
Contributions by AIXIV
======================
Dokan was initially developed by Hiroki Asakawa but seems to be no
longer maintained. In the newer versions of Microsoft Windows, Dokan
experienced issues which were not fixed in the official repository.
For internal work, AIXIV addressed these issues and hopes the resulting
version is valuable for public use.
Licensing
=========
Dokan library contains LGPL, MIT licensed programs.
- user-mode library (dokan.dll, dokan64.dll) LGPL
- driver (dokan.sys) LGPL
- control program (dokanctl.exe) MIT
- mount service (dokanMountService.exe) MIT
For details, please check license files.
LGPL license.lgpl.txt
GPL license.gpl.txt
MIT license.mit.txt
You can obtain source files from http://dokan-dev.net/en/download
Environment
===========
The AIXIV-modified Dokan library works reliably on 32 and 64 bit versions
of Microsoft Windows 7, 8 and 8.1.
It may also work on Microsoft Windows XP (only 32 bit), Vista and
Microsoft Windows Server 2003 and 2008 but this is not guaranteed and
therefore currently not supported by the installer until further testing.
How it works
============
Dokan library contains a user mode DLL (dokan.dll) and a kernel mode
file system driver (dokan.sys). Once Dokan file system driver is
installed, you can create file systems which can be seen as normal
file systems in Windows. The application that creates file systems
using Dokan library is called file system application. File operation
requests from user programs (e.g., CreateFile, ReadFile, WriteFile,
...) will be sent to the Windows I/O subsystem (runs in kernel mode)
which will subsequently forward the requests to the Dokan file system
driver (dokan.sys). By using functions provided by the Dokan user mode
library (dokan.dll), file system applications are able to register
callback functions to the file system driver. The file system driver
will invoke these callback routines in order to response to the
requests it received. The results of the callback routines will be
sent back to the driver the user program. For example, when Windows Explorer
requests to open a directory, the OpenDirectory request will be sent
to Dokan file system driver and the driver will invoke the
OpenDirectory callback provided by the file system application. The
results of this routine are sent back to Windows Explorer as the
response to the OpenDirectory request. Therefore, the Dokan file
system driver acts as a proxy between user programs and file system
applications. The advantage of this approach is that it allows
programmers to develop file systems in user mode which is safe and
easy to debug.
Components of the Library and installation
==========================================
When the installer executes, it will install Dokan file system driver
(dokan.sys), register Dokan mount service (mouter.exe) and several
libraries. The detailed list of files installed is as follows:
SystemFolder\dokan.dll
Dokan user mode library
SystemFolder\drivers\dokan.sys
Dokan File System Driver
The following files are installed at a location of the user's choice
(defaulting to ProgramFilesFolder\DokanLibrary):
mounter.exe
Dokan mouter service
dokanctl.exe
Dokan control program
readme.txt
this file
license.*.txt
text files containing the licenses of the installed programs
(optional; user choice)
dokan.lib
Dokan import library
dokan.h
Dokan library header
You can use add/aemove programs in the control panel to remove Dokan.
It is required to restart your computer after uninstalling Dokan to
complete driver removal.
How to create your file systems
===============================
To create file system, an application needs to implement the functions
of the DOKAN_OPERATIONS structure (declared in dokan.h). Once implemented,
you can invoke DokanMain function with DOKAN_OPERATIONS as parameter
in order to mount the file system. The semantics of functions in
DOKAN_OPERATIONS is just similar to Windows APIs with the same
name. The parameters for these functions are therefore the same as for
the counterpart Windows APIs. These functions are called from many
threads so they need to be thread-safe, otherwise many problems may
occur.
These functions are typically invoked in this sequence:
1. CreateFile(OpenDirectory, OpenDirectory)
2. Other functions
3. Cleanup
4. CloseFile
Before file access operations (listing directory, reading file
attributes, ...), file creation functions (OpenDirectory, CreateFile,
...) are always invoked. On other hand, the function Cleanup always
get called by the Dokan file system driver when the file is closed by
the CloseFile Windows API. Each function should return 0 when the
operation succeeded, otherwise it should return a negative value
represents error code. The error codes are negated Windows System
Error Codes. For example, when CreateFile can't open a file, you
should return -2( -1 * ERROR_FILE_NOT_FOUND).
The last parameter of each function is a DOKAN_FILE_INFO structure :
typedef struct _DOKAN_FILE_INFO {
ULONG64 Context;
ULONG64 DokanContext;
ULONG ProcessId;
BOOL IsDirectory;
} DOKAN_FILE_INFO, *PDOKAN_FILE_INFO;
Each file handle from user mode is associated with a DOKAN_FILE_INFO
struct. Hence, the content of the struct does not change if the same
file handle is used. The struct is created when the file is opened by
CreateFile system call and destroyed when the file is closed (by
CloseFile system call). The meaning of each field in the struct is as
follows:
Context : a specific value assigned by the file system
application. File system application can freely use this variable to
store values that are constant in a file access session (the period
from CreateFile to CloseFile) such as file handle, etc.
DokanContext : reserved. Used by Dokan library.
ProcessId : Process ID of the process that opened the file.
IsDirectory : determine if the opened file is a directory, see
exceptions bellow.
File opening/creation callbacks:
int (*CreateFile) (
LPCWSTR, // FileName
DWORD, // DesiredAccess
DWORD, // ShareMode
DWORD, // CreationDisposition
DWORD, // FlagsAndAttributes
PDOKAN_FILE_INFO);
int (*OpenDirectory) (
LPCWSTR, // FileName
PDOKAN_FILE_INFO);
int (*CreateDirectory) (
LPCWSTR, // FileName
PDOKAN_FILE_INFO);
When the variable IsDirectory is set to TRUE, the file under the
operation is a directory. When it is FALSE, the file system
application programmers are required to set the variable to TRUE if
the current operation acts on a directory. If the value is FALSE and
the current operation is not acting on a directory, the programmers
should not change the variable. Note that setting the variable to TRUE
when a directory is accessed is very important for the Dokan
library. If it is not correctly set, the library does not know the
operation is acting on a directory and many problems may occur.
CreateFile should return ERROR_ALREADY_EXISTS (183) when the
CreationDisposition is CREATE_ALWAYS or OPEN_ALWAYS and the file under
question has already existed.
File closing/cleanup callbacks:
int (*Cleanup) (
LPCWSTR, // FileName
PDOKAN_FILE_INFO);
int (*CloseFile) (
LPCWSTR, // FileName
PDOKAN_FILE_INFO);
Cleanup is invoked when the function CloseHandle in Windows API is
executed. If the file system application stored file handle in the
Context variable when the function CreateFile is invoked, this should
be closed in the Cleanup function, not in CloseFile function. If the
user application calls CloseHandle and subsequently open the same
file, the CloseFile function of the file system application may not be
invoked before the CreateFile API is called. This may cause sharing
violation error. Note: when user uses memory mapped file, WriteFile
or ReadFile function may be invoked after Cleanup in order to complete
the I/O operations. The file system application should also properly
work in this case.
File lookup/listing callbacks:
int (*FindFiles) (
LPCWSTR, // PathName
PFillFindData, // call this function with PWIN32_FIND_DATAW
PDOKAN_FILE_INFO); // (see PFillFindData definition)
// You should implement either FindFires or FindFilesWithPattern
int (*FindFilesWithPattern) (
LPCWSTR, // PathName
LPCWSTR, // SearchPattern
PFillFindData, // call this function with PWIN32_FIND_DATAW
PDOKAN_FILE_INFO);
FindFiles or FindFilesWithPattern is called in order to response to
directory listing requests. You should implement either FielFiles or
FileFilesWithPttern. For each directory entry, file system
application should call the function FillFindData (passed as a
function pointer to FindFiles, FindFilesWithPattern) with the
WIN32_FIND_DATAW structure filled with directory information:
FillFindData( &win32FindDataw, DokanFileInfo ). It is the
responsibility of file systems to process wildcard patterns because
shells in Windows are not designed to work properly with pattern
matching. When file system application provides FindFiles, the
wildcard patterns are automatically processed by the Dokan
library. You can control wildcard matching by implementing
FindFilesWithPattern function. The function DokanIsNameInExpression
exported by the Dokan library (dokan.dll) can be used to process
wildcard matching.
Mounting
========
#define DOKAN_OPTION_DEBUG 1 // ouput debug message
#define DOKAN_OPTION_STDERR 2 // ouput debug message to stderr
#define DOKAN_OPTION_ALT_STREAM 4 // use alternate stream
#define DOKAN_OPTION_KEEP_ALIVE 8 // use auto unmount
#define DOKAN_OPTION_NETWORK 16 // use network drive,
//you need to install Dokan network provider.
#define DOKAN_OPTION_REMOVABLE 32 // use removable drive
typedef struct _DOKAN_OPTIONS {
USHORT Version; // Supported Dokan Version, ex. "530" (Dokan ver 0.5.3)
ULONG ThreadCount; // number of threads to be used
ULONG Options; // combination of DOKAN_OPTIONS_*
ULONG64 GlobalContext; // FileSystem can use this variable
LPCWSTR MountPoint; // mount point "M:\" (drive letter) or
// "C:\mount\dokan" (path in NTFS)
} DOKAN_OPTIONS, *PDOKAN_OPTIONS;
int DOKANAPI DokanMain(
PDOKAN_OPTIONS DokanOptions,
PDOKAN_OPERATIONS DokanOperations);
As stated above, the file system can be mounted by invoking DokanMain
function. The function blocks until the file system is unmounted. File
system applications should fill DokanOptions with options for Dokan
runtime library and DokanOperations with function pointers for file
system operations (such as CreateFile, ReadFile, CloseHandle, ...)
before passing these parameters to DokanMain function. Functions in
DokanOperations structure need to be thread-safe, because they are
called in several threads (not the thread invoked DokanMain) with
different execution contexts.
Dokan options are as follows:
Version :
The version of Dokan library. You have to set a supported version.
Dokan library may change the behavior based on this version number.
ie. 530 (Dokan 0.5.3)
ThreadCount :
The number of threads internaly used by the Dokan library.
If this value is set to 0, the default value will be used.
When debugging the file system, file system application should
set this value to 1 to avoid nondeterministic behaviors of
multithreading.
Options :
A Combination of DOKAN_OPTION_* constants.
GlobalContext :
Your filrsystem can use this variable to store a mount specific
structure.
MountPoint :
A mount point. "M:\" drive letter or "C:\mount\dokan" a directory
(needs empty) in NTFS
If the mount operation succeeded, the return value is DOKAN_SUCCESS,
otherwise, the following error code is returned.
#define DOKAN_SUCCESS 0
#define DOKAN_ERROR -1 /* General Error */
#define DOKAN_DRIVE_LETTER_ERROR -2 /* Bad Drive letter */
#define DOKAN_DRIVER_INSTALL_ERROR -3 /* Can't install driver */
#define DOKAN_START_ERROR -4 /* Driver something wrong */
#define DOKAN_MOUNT_ERROR -5 /* Can't assign a drive letter or mount point */
#define DOKAN_MOUNT_POINT_ERROR -6 /* Mount point is invalid */
Unmounting
==========
File system can be unmounted by calling the function DokanUnmount.
In most cases when the programs or shells use the file system freeze,
unmount operation will solve the problems by bringing the system to
the previous state when the file system is not mounted.
User may use DokanCtl to unmount a file system manually like this:
> dokanctl.exe /u DriveLetter
Misc
====
If there are bugs in Dokan library or file system applications which
use the library, you will get the Windows blue screen. Therefore, it
is strongly recommended to use Virtual Machine when you develop file
system applications.