dokan.h
Go to the documentation of this file.
1 /*
2  Dokan : user-mode file system library for Windows
3 
4  Copyright (C) 2020 - 2025 Google, Inc.
5  Copyright (C) 2015 - 2019 Adrien J. <liryna.stark@gmail.com> and Maxime C. <maxime@islog.com>
6  Copyright (C) 2007 - 2011 Hiroki Asakawa <info@dokan-dev.net>
7 
8  http://dokan-dev.github.io
9 
10 This program is free software; you can redistribute it and/or modify it under
11 the terms of the GNU Lesser General Public License as published by the Free
12 Software Foundation; either version 3 of the License, or (at your option) any
13 later version.
14 
15 This program is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
18 
19 You should have received a copy of the GNU Lesser General Public License along
20 with this program. If not, see <http://www.gnu.org/licenses/>.
21 */
22 
23 #ifndef DOKAN_H_
24 #define DOKAN_H_
25 
27 #define WIN32_NO_STATUS
28 #include <windows.h>
29 #undef WIN32_NO_STATUS
30 #include <ntstatus.h>
31 
32 #include "fileinfo.h"
33 #include "public.h"
34 
35 #ifdef _EXPORTING
36 
37 #define DOKANAPI __stdcall
38 #else
39 
40 #define DOKANAPI __declspec(dllimport) __stdcall
41 #endif
42 
44 #define DOKAN_CALLBACK __stdcall
45 
46 #ifdef __cplusplus
47 extern "C" {
48 #endif
49 
59 #define DOKAN_VERSION 230
60 
61 #define DOKAN_MINIMUM_COMPATIBLE_VERSION 200
62 
63 #define DOKAN_DRIVER_NAME L"dokan" DOKAN_MAJOR_API_VERSION L".sys"
64 
65 #define DOKAN_NP_NAME L"Dokan" DOKAN_MAJOR_API_VERSION
66 
77 #define DOKAN_OPTION_DEBUG 1
78 
79 #define DOKAN_OPTION_STDERR (1 << 1)
80 
85 #define DOKAN_OPTION_ALT_STREAM (1 << 2)
86 
87 #define DOKAN_OPTION_WRITE_PROTECT (1 << 3)
88 
89 #define DOKAN_OPTION_NETWORK (1 << 4)
90 
96 #define DOKAN_OPTION_REMOVABLE (1 << 5)
97 
104 #define DOKAN_OPTION_MOUNT_MANAGER (1 << 6)
105 
111 #define DOKAN_OPTION_CURRENT_SESSION (1 << 7)
112 
113 #define DOKAN_OPTION_FILELOCK_USER_MODE (1 << 8)
114 
120 #define DOKAN_OPTION_CASE_SENSITIVE (1 << 9)
121 
122 #define DOKAN_OPTION_ENABLE_UNMOUNT_NETWORK_DRIVE (1 << 10)
123 
127 #define DOKAN_OPTION_DISPATCH_DRIVER_LOGS (1 << 11)
128 
133 #define DOKAN_OPTION_ALLOW_IPC_BATCHING (1 << 12)
134 
137 typedef VOID *DOKAN_HANDLE, **PDOKAN_HANDLE;
138 
144 typedef struct _DOKAN_OPTIONS {
146  USHORT Version;
148  BOOLEAN SingleThread;
150  ULONG Options;
152  ULONG64 GlobalContext;
154  LPCWSTR MountPoint;
159  LPCWSTR UNCName;
166  ULONG Timeout;
170  ULONG SectorSize;
174  CHAR VolumeSecurityDescriptor[VOLUME_SECURITY_DESCRIPTOR_MAX_SIZE];
175 } DOKAN_OPTIONS, *PDOKAN_OPTIONS;
176 
181 typedef struct _DOKAN_FILE_INFO {
187  ULONG64 Context;
189  ULONG64 DokanContext;
191  PDOKAN_OPTIONS DokanOptions;
201  ULONG ProcessId;
206  UCHAR IsDirectory;
216  UCHAR PagingIo;
220  UCHAR Nocache;
223 } DOKAN_FILE_INFO, *PDOKAN_FILE_INFO;
224 
225 #define DOKAN_EXCEPTION_NOT_INITIALIZED 0x0f0ff0ff
226 #define DOKAN_EXCEPTION_INITIALIZATION_FAILED 0x0fbadbad
227 #define DOKAN_EXCEPTION_SHUTDOWN_FAILED 0x0fbadf00
228 
233 typedef int(WINAPI *PFillFindData)(PWIN32_FIND_DATAW, PDOKAN_FILE_INFO);
234 
239 typedef BOOL(WINAPI *PFillFindStreamData)(PWIN32_FIND_STREAM_DATA, PVOID);
240 
241 // clang-format off
242 
257 typedef struct _DOKAN_OPERATIONS {
289  NTSTATUS(DOKAN_CALLBACK *ZwCreateFile)(LPCWSTR FileName,
290  PDOKAN_IO_SECURITY_CONTEXT SecurityContext,
291  ACCESS_MASK DesiredAccess,
292  ULONG FileAttributes,
293  ULONG ShareAccess,
294  ULONG CreateDisposition,
295  ULONG CreateOptions,
296  PDOKAN_FILE_INFO DokanFileInfo);
297 
313  void(DOKAN_CALLBACK *Cleanup)(LPCWSTR FileName,
314  PDOKAN_FILE_INFO DokanFileInfo);
315 
327  void(DOKAN_CALLBACK *CloseFile)(LPCWSTR FileName,
328  PDOKAN_FILE_INFO DokanFileInfo);
329 
349  NTSTATUS(DOKAN_CALLBACK *ReadFile)(LPCWSTR FileName,
350  LPVOID Buffer,
351  DWORD BufferLength,
352  LPDWORD ReadLength,
353  LONGLONG Offset,
354  PDOKAN_FILE_INFO DokanFileInfo);
355 
377  NTSTATUS(DOKAN_CALLBACK *WriteFile)(LPCWSTR FileName,
378  LPCVOID Buffer,
379  DWORD NumberOfBytesToWrite,
380  LPDWORD NumberOfBytesWritten,
381  LONGLONG Offset,
382  PDOKAN_FILE_INFO DokanFileInfo);
383 
393  NTSTATUS(DOKAN_CALLBACK *FlushFileBuffers)(LPCWSTR FileName,
394  PDOKAN_FILE_INFO DokanFileInfo);
395 
406  NTSTATUS(DOKAN_CALLBACK *GetFileInformation)(LPCWSTR FileName,
407  LPBY_HANDLE_FILE_INFORMATION Buffer,
408  PDOKAN_FILE_INFO DokanFileInfo);
409 
424  NTSTATUS(DOKAN_CALLBACK *FindFiles)(LPCWSTR FileName,
425  PFillFindData FillFindData,
426  PDOKAN_FILE_INFO DokanFileInfo);
427 
447  NTSTATUS(DOKAN_CALLBACK *FindFilesWithPattern)(LPCWSTR PathName,
448  LPCWSTR SearchPattern,
449  PFillFindData FillFindData,
450  PDOKAN_FILE_INFO DokanFileInfo);
451 
462  NTSTATUS(DOKAN_CALLBACK *SetFileAttributes)(LPCWSTR FileName,
463  DWORD FileAttributes,
464  PDOKAN_FILE_INFO DokanFileInfo);
465 
478  NTSTATUS(DOKAN_CALLBACK *SetFileTime)(LPCWSTR FileName,
479  CONST FILETIME *CreationTime,
480  CONST FILETIME *LastAccessTime,
481  CONST FILETIME *LastWriteTime,
482  PDOKAN_FILE_INFO DokanFileInfo);
483 
508  NTSTATUS(DOKAN_CALLBACK *DeleteFile)(LPCWSTR FileName,
509  PDOKAN_FILE_INFO DokanFileInfo);
510 
536  NTSTATUS(DOKAN_CALLBACK *DeleteDirectory)(LPCWSTR FileName,
537  PDOKAN_FILE_INFO DokanFileInfo);
538 
550  NTSTATUS(DOKAN_CALLBACK *MoveFile)(LPCWSTR FileName,
551  LPCWSTR NewFileName,
552  BOOL ReplaceIfExisting,
553  PDOKAN_FILE_INFO DokanFileInfo);
554 
566  NTSTATUS(DOKAN_CALLBACK *SetEndOfFile)(LPCWSTR FileName,
567  LONGLONG ByteOffset,
568  PDOKAN_FILE_INFO DokanFileInfo);
569 
581  NTSTATUS(DOKAN_CALLBACK *SetAllocationSize)(LPCWSTR FileName,
582  LONGLONG AllocSize,
583  PDOKAN_FILE_INFO DokanFileInfo);
584 
598  NTSTATUS(DOKAN_CALLBACK *LockFile)(LPCWSTR FileName,
599  LONGLONG ByteOffset,
600  LONGLONG Length,
601  PDOKAN_FILE_INFO DokanFileInfo);
602 
616  NTSTATUS(DOKAN_CALLBACK *UnlockFile)(LPCWSTR FileName,
617  LONGLONG ByteOffset,
618  LONGLONG Length,
619  PDOKAN_FILE_INFO DokanFileInfo);
620 
641  NTSTATUS(DOKAN_CALLBACK *GetDiskFreeSpace)(PULONGLONG FreeBytesAvailable,
642  PULONGLONG TotalNumberOfBytes,
643  PULONGLONG TotalNumberOfFreeBytes,
644  PDOKAN_FILE_INFO DokanFileInfo);
645 
680  NTSTATUS(DOKAN_CALLBACK *GetVolumeInformation)(LPWSTR VolumeNameBuffer,
681  DWORD VolumeNameSize,
682  LPDWORD VolumeSerialNumber,
683  LPDWORD MaximumComponentLength,
684  LPDWORD FileSystemFlags,
685  LPWSTR FileSystemNameBuffer,
686  DWORD FileSystemNameSize,
687  PDOKAN_FILE_INFO DokanFileInfo);
688 
702  NTSTATUS(DOKAN_CALLBACK *Mounted)(LPCWSTR MountPoint, PDOKAN_FILE_INFO DokanFileInfo);
703 
713  NTSTATUS(DOKAN_CALLBACK *Unmounted)(PDOKAN_FILE_INFO DokanFileInfo);
714 
734  NTSTATUS(DOKAN_CALLBACK *GetFileSecurity)(LPCWSTR FileName,
735  PSECURITY_INFORMATION SecurityInformation,
736  PSECURITY_DESCRIPTOR SecurityDescriptor,
737  ULONG BufferLength,
738  PULONG LengthNeeded,
739  PDOKAN_FILE_INFO DokanFileInfo);
740 
756  NTSTATUS(DOKAN_CALLBACK *SetFileSecurity)(LPCWSTR FileName,
757  PSECURITY_INFORMATION SecurityInformation,
758  PSECURITY_DESCRIPTOR SecurityDescriptor,
759  ULONG BufferLength,
760  PDOKAN_FILE_INFO DokanFileInfo);
761 
775  NTSTATUS(DOKAN_CALLBACK *FindStreams)(LPCWSTR FileName,
776  PFillFindStreamData FillFindStreamData,
777  PVOID FindStreamContext,
778  PDOKAN_FILE_INFO DokanFileInfo);
779 
780 } DOKAN_OPERATIONS, *PDOKAN_OPERATIONS;
781 
782 // clang-format on
783 
791 #define DOKAN_SUCCESS 0
792 
793 #define DOKAN_ERROR -1
794 
795 #define DOKAN_DRIVE_LETTER_ERROR -2
796 
797 #define DOKAN_DRIVER_INSTALL_ERROR -3
798 
799 #define DOKAN_START_ERROR -4
800 
805 #define DOKAN_MOUNT_ERROR -5
806 
810 #define DOKAN_MOUNT_POINT_ERROR -6
811 
815 #define DOKAN_VERSION_ERROR -7
816 
830 VOID DOKANAPI DokanInit();
831 
838 VOID DOKANAPI DokanShutdown();
839 
852 int DOKANAPI DokanMain(PDOKAN_OPTIONS DokanOptions,
853  PDOKAN_OPERATIONS DokanOperations);
854 
870 int DOKANAPI DokanCreateFileSystem(_In_ PDOKAN_OPTIONS DokanOptions,
871  _In_ PDOKAN_OPERATIONS DokanOperations,
872  _Out_ DOKAN_HANDLE *DokanInstance);
873 
880 BOOL DOKANAPI DokanIsFileSystemRunning(_In_ DOKAN_HANDLE DokanInstance);
881 
889 DWORD DOKANAPI DokanWaitForFileSystemClosed(_In_ DOKAN_HANDLE DokanInstance,
890  _In_ DWORD dwMilliseconds);
891 
903  _In_ DOKAN_HANDLE DokanInstance, _Out_ PHANDLE WaitHandle,
904  _In_ WAITORTIMERCALLBACKFUNC Callback, _In_ PVOID Context,
905  ULONG dwMilliseconds);
906 
914 BOOL DOKANAPI DokanUnregisterWaitForFileSystemClosed(_In_ HANDLE WaitHandle,
915  BOOL WaitForCallbacks);
916 
924 VOID DOKANAPI DokanCloseHandle(_In_ DOKAN_HANDLE DokanInstance);
925 
932 BOOL DOKANAPI DokanUnmount(WCHAR DriveLetter);
933 
940 BOOL DOKANAPI DokanRemoveMountPoint(LPCWSTR MountPoint);
941 
960 BOOL DOKANAPI DokanIsNameInExpression(LPCWSTR Expression, LPCWSTR Name,
961  BOOL IgnoreCase);
962 
968 ULONG DOKANAPI DokanVersion();
969 
976 
984 BOOL DOKANAPI DokanResetTimeout(ULONG Timeout, PDOKAN_FILE_INFO DokanFileInfo);
985 
996 HANDLE DOKANAPI DokanOpenRequestorToken(PDOKAN_FILE_INFO DokanFileInfo);
997 
1007 PDOKAN_MOUNT_POINT_INFO DOKANAPI DokanGetMountPointList(BOOL uncOnly, PULONG nbRead);
1008 
1018 VOID DOKANAPI DokanReleaseMountPointList(PDOKAN_MOUNT_POINT_INFO list);
1019 
1037  ACCESS_MASK DesiredAccess, ULONG FileAttributes, ULONG CreateOptions,
1038  ULONG CreateDisposition, ACCESS_MASK *outDesiredAccess,
1039  DWORD *outFileAttributesAndFlags, DWORD *outCreationDisposition);
1040 
1069 BOOL DOKANAPI DokanNotifyCreate(_In_ DOKAN_HANDLE DokanInstance,
1070  _In_ LPCWSTR FilePath, _In_ BOOL IsDirectory);
1071 
1080 BOOL DOKANAPI DokanNotifyDelete(_In_ DOKAN_HANDLE DokanInstance,
1081  _In_ LPCWSTR FilePath, _In_ BOOL IsDirectory);
1082 
1090 BOOL DOKANAPI DokanNotifyUpdate(_In_ DOKAN_HANDLE DokanInstance,
1091  _In_ LPCWSTR FilePath);
1092 
1100 BOOL DOKANAPI DokanNotifyXAttrUpdate(_In_ DOKAN_HANDLE DokanInstance,
1101  _In_ LPCWSTR FilePath);
1102 
1114 BOOL DOKANAPI DokanNotifyRename(_In_ DOKAN_HANDLE DokanInstance,
1115  _In_ LPCWSTR OldPath, _In_ LPCWSTR NewPath,
1116  _In_ BOOL IsDirectory,
1117  _In_ BOOL IsInSameDirectory);
1118 
1129 NTSTATUS DOKANAPI DokanNtStatusFromWin32(DWORD Error);
1130 
1133 #ifdef __cplusplus
1134 }
1135 #endif
1136 
1137 #endif // DOKAN_H_
#define DOKAN_CALLBACK
Definition: dokan.h:44
HANDLE DokanOpenRequestorToken(PDOKAN_FILE_INFO DokanFileInfo)
Get the handle to Access Token.
Definition: access.c:26
PDOKAN_OPTIONS DokanOptions
Definition: dokan.h:191
BOOL DokanIsFileSystemRunning(_In_ DOKAN_HANDLE DokanInstance)
Check if the FileSystem is still running or not.
Definition: dokan.c:609
VOID DokanShutdown()
Release all allocated resources by DokanInit when they are no longer needed.
Definition: dokan.c:1422
USHORT Version
Definition: dokan.h:146
PDOKAN_MOUNT_POINT_INFO DokanGetMountPointList(BOOL uncOnly, PULONG nbRead)
Get active Dokan mount points.
Definition: dokan.c:1236
LPCWSTR MountPoint
Definition: dokan.h:154
BOOL DokanUnregisterWaitForFileSystemClosed(_In_ HANDLE WaitHandle, BOOL WaitForCallbacks)
Unregister callback for FileSystem unmount.
Definition: dokan.c:640
ULONG64 GlobalContext
Definition: dokan.h:152
ULONG ProcessId
Definition: dokan.h:201
BOOL DokanRemoveMountPoint(LPCWSTR MountPoint)
Unmount a Dokan device from a mount point.
Definition: mount.c:649
BOOL DokanResetTimeout(ULONG Timeout, PDOKAN_FILE_INFO DokanFileInfo)
Extends the timeout of the current IO operation in driver.
Definition: timeout.c:26
#define DOKANAPI
Definition: dokan.h:40
UCHAR Nocache
Definition: dokan.h:220
ULONG Timeout
Definition: dokan.h:166
VOID DokanReleaseMountPointList(PDOKAN_MOUNT_POINT_INFO list)
Release Mount point list resources from DokanGetMountPointList.
Definition: dokan.c:1284
UCHAR WriteToEndOfFile
Definition: dokan.h:222
BOOL DokanNotifyXAttrUpdate(_In_ DOKAN_HANDLE DokanInstance, _In_ LPCWSTR FilePath)
Notify dokan that file or directory extended attributes have changed.
Definition: dokan.c:1506
DWORD DokanWaitForFileSystemClosed(_In_ DOKAN_HANDLE DokanInstance, _In_ DWORD dwMilliseconds)
Wait until the FileSystem is unmount.
Definition: dokan.c:618
UCHAR SynchronousIo
Definition: dokan.h:218
BOOL DokanNotifyDelete(_In_ DOKAN_HANDLE DokanInstance, _In_ LPCWSTR FilePath, _In_ BOOL IsDirectory)
Notify dokan that a file or a directory has been deleted.
Definition: dokan.c:1492
NTSTATUS DokanNtStatusFromWin32(DWORD Error)
Convert WIN32 error to NTSTATUS.
Definition: ntstatus.c:25
LPCWSTR UNCName
Definition: dokan.h:159
BOOL DokanRegisterWaitForFileSystemClosed(_In_ DOKAN_HANDLE DokanInstance, _Out_ PHANDLE WaitHandle, _In_ WAITORTIMERCALLBACKFUNC Callback, _In_ PVOID Context, ULONG dwMilliseconds)
Register callback for FileSystem unmount.
Definition: dokan.c:627
Dokan mount options used to describe Dokan device behavior.
Definition: dokan.h:144
BOOL DokanNotifyCreate(_In_ DOKAN_HANDLE DokanInstance, _In_ LPCWSTR FilePath, _In_ BOOL IsDirectory)
Notify dokan that a file or a directory has been created.
Definition: dokan.c:1484
int(WINAPI * PFillFindData)(PWIN32_FIND_DATAW, PDOKAN_FILE_INFO)
FillFindData Used to add an entry in FindFiles operation.
Definition: dokan.h:233
BOOL(WINAPI * PFillFindStreamData)(PWIN32_FIND_STREAM_DATA, PVOID)
FillFindStreamData Used to add an entry in FindStreams.
Definition: dokan.h:239
int DokanCreateFileSystem(_In_ PDOKAN_OPTIONS DokanOptions, _In_ PDOKAN_OPERATIONS DokanOperations, _Out_ DOKAN_HANDLE *DokanInstance)
Mount a new Dokan Volume.
Definition: dokan.c:674
ULONG DokanVersion()
Get the version of Dokan. The returned ULONG is the version number without the dots.
Definition: version.c:26
Dokan file information on the current operation.
Definition: dokan.h:181
ULONG SectorSize
Definition: dokan.h:170
BOOLEAN SingleThread
Definition: dokan.h:148
VOID DokanMapKernelToUserCreateFileFlags(ACCESS_MASK DesiredAccess, ULONG FileAttributes, ULONG CreateOptions, ULONG CreateDisposition, ACCESS_MASK *outDesiredAccess, DWORD *outFileAttributesAndFlags, DWORD *outCreationDisposition)
Convert DOKAN_OPERATIONS::ZwCreateFile parameters to CreateFile parameters.
Definition: dokan.c:1305
ULONG DokanDriverVersion()
Get the version of the Dokan driver. The returned ULONG is the version number without the dots...
Definition: version.c:28
ULONG64 Context
Definition: dokan.h:187
UCHAR PagingIo
Definition: dokan.h:216
UCHAR IsDirectory
Definition: dokan.h:206
BOOL DokanIsNameInExpression(LPCWSTR Expression, LPCWSTR Name, BOOL IgnoreCase)
Checks whether Name matches Expression.
Definition: directory.c:748
VOID DokanCloseHandle(_In_ DOKAN_HANDLE DokanInstance)
Unmount the Dokan instance.
Definition: dokan.c:646
ULONG AllocationUnitSize
Definition: dokan.h:168
BOOL DokanNotifyUpdate(_In_ DOKAN_HANDLE DokanInstance, _In_ LPCWSTR FilePath)
Notify dokan that file or directory attributes have changed.
Definition: dokan.c:1500
UCHAR DeletePending
Definition: dokan.h:214
BOOL DokanUnmount(WCHAR DriveLetter)
Unmount a Dokan device from a driver letter.
Definition: mount.c:296
int DokanMain(PDOKAN_OPTIONS DokanOptions, PDOKAN_OPERATIONS DokanOperations)
Mount a new Dokan Volume.
Definition: dokan.c:660
Dokan API callbacks interface.
Definition: dokan.h:257
ULONG64 DokanContext
Definition: dokan.h:189
VOID DokanInit()
Initialize all required Dokan internal resources.
Definition: dokan.c:1397
BOOL DokanNotifyRename(_In_ DOKAN_HANDLE DokanInstance, _In_ LPCWSTR OldPath, _In_ LPCWSTR NewPath, _In_ BOOL IsDirectory, _In_ BOOL IsInSameDirectory)
Notify dokan that a file or a directory has been renamed. This method supports in-place rename for fi...
Definition: dokan.c:1512
ULONG VolumeSecurityDescriptorLength
Definition: dokan.h:172
PVOID ProcessingContext
Definition: dokan.h:197
ULONG Options
Definition: dokan.h:150