1 // Copyright 2016-2018 Keybase Inc. All rights reserved.
2 // Use of this source code is governed by a BSD
3 // license that can be found in the LICENSE file.
4
5 #if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__)
6
7 #include "bridge.h"
8
9 uintptr_t kbfsLibdokanPtr_RemoveMountPoint;
10 uintptr_t kbfsLibdokanPtr_OpenRequestorToken;
11 uintptr_t kbfsLibdokanPtr_Main;
12
13 extern NTSTATUS kbfsLibdokanCreateFile(LPCWSTR FileName,
14 PDOKAN_IO_SECURITY_CONTEXT psec,
15 ACCESS_MASK DesiredAccess,
16 ULONG FileAttributes,
17 ULONG ShareAccess,
18 ULONG CreateDisposition,
19 ULONG CreateOptions,
20 PDOKAN_FILE_INFO pfi);
21
kbfsLibdokanC_CreateFile(LPCWSTR FileName,PDOKAN_IO_SECURITY_CONTEXT psec,ACCESS_MASK DesiredAccess,ULONG FileAttributes,ULONG ShareAccess,ULONG CreateDisposition,ULONG CreateOptions,PDOKAN_FILE_INFO pfi)22 extern DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_CreateFile(LPCWSTR FileName,
23 PDOKAN_IO_SECURITY_CONTEXT psec,
24 ACCESS_MASK DesiredAccess,
25 ULONG FileAttributes,
26 ULONG ShareAccess,
27 ULONG CreateDisposition,
28 ULONG CreateOptions,
29 PDOKAN_FILE_INFO pfi) {
30 return kbfsLibdokanCreateFile(FileName,psec,DesiredAccess,FileAttributes,ShareAccess,CreateDisposition,CreateOptions,pfi);
31 }
32
33 extern void kbfsLibdokanCleanup(LPCWSTR FileName, PDOKAN_FILE_INFO FileInfo);
34
kbfsLibdokanC_Cleanup(LPCWSTR FileName,PDOKAN_FILE_INFO FileInfo)35 static DOKAN_CALLBACK void kbfsLibdokanC_Cleanup(LPCWSTR FileName, PDOKAN_FILE_INFO FileInfo) {
36 kbfsLibdokanCleanup(FileName,FileInfo);
37 }
38
39 extern void kbfsLibdokanCloseFile(LPCWSTR FileName, PDOKAN_FILE_INFO FileInfo);
40
kbfsLibdokanC_CloseFile(LPCWSTR FileName,PDOKAN_FILE_INFO FileInfo)41 static DOKAN_CALLBACK void kbfsLibdokanC_CloseFile(LPCWSTR FileName, PDOKAN_FILE_INFO FileInfo) {
42 kbfsLibdokanCloseFile(FileName,FileInfo);
43 }
44
45 extern NTSTATUS kbfsLibdokanReadFile(LPCWSTR FileName,
46 LPVOID Buffer,
47 DWORD NumberOfBytesToRead,
48 LPDWORD NumberOfBytesRead,
49 LONGLONG Offset,
50 PDOKAN_FILE_INFO FileInfo);
51
kbfsLibdokanC_ReadFile(LPCWSTR FileName,LPVOID Buffer,DWORD NumberOfBytesToRead,LPDWORD NumberOfBytesRead,LONGLONG Offset,PDOKAN_FILE_INFO FileInfo)52 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_ReadFile(LPCWSTR FileName,
53 LPVOID Buffer,
54 DWORD NumberOfBytesToRead,
55 LPDWORD NumberOfBytesRead,
56 LONGLONG Offset,
57 PDOKAN_FILE_INFO FileInfo) {
58 return kbfsLibdokanReadFile(FileName, Buffer, NumberOfBytesToRead, NumberOfBytesRead, Offset, FileInfo);
59 }
60
61 extern NTSTATUS kbfsLibdokanWriteFile(LPCWSTR FileName,
62 LPCVOID Buffer,
63 DWORD NumberOfBytesToWrite,
64 LPDWORD NumberOfBytesWritten,
65 LONGLONG Offset,
66 PDOKAN_FILE_INFO FileInfo);
67
kbfsLibdokanC_WriteFile(LPCWSTR FileName,LPCVOID Buffer,DWORD NumberOfBytesToWrite,LPDWORD NumberOfBytesWritten,LONGLONG Offset,PDOKAN_FILE_INFO FileInfo)68 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_WriteFile(LPCWSTR FileName,
69 LPCVOID Buffer,
70 DWORD NumberOfBytesToWrite,
71 LPDWORD NumberOfBytesWritten,
72 LONGLONG Offset,
73 PDOKAN_FILE_INFO FileInfo) {
74 return kbfsLibdokanWriteFile(FileName, Buffer, NumberOfBytesToWrite, NumberOfBytesWritten, Offset, FileInfo);
75 }
76
77 extern NTSTATUS kbfsLibdokanFlushFileBuffers(LPCWSTR FileName, PDOKAN_FILE_INFO FileInfo);
78
kbfsLibdokanC_FlushFileBuffers(LPCWSTR FileName,PDOKAN_FILE_INFO FileInfo)79 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_FlushFileBuffers(LPCWSTR FileName, PDOKAN_FILE_INFO FileInfo) {
80 return kbfsLibdokanFlushFileBuffers(FileName, FileInfo);
81 }
82
83 extern NTSTATUS kbfsLibdokanGetFileInformation(LPCWSTR FileName,
84 LPBY_HANDLE_FILE_INFORMATION Buffer,
85 PDOKAN_FILE_INFO FileInfo);
86
kbfsLibdokanC_GetFileInformation(LPCWSTR FileName,LPBY_HANDLE_FILE_INFORMATION Buffer,PDOKAN_FILE_INFO FileInfo)87 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_GetFileInformation(LPCWSTR FileName,
88 LPBY_HANDLE_FILE_INFORMATION Buffer,
89 PDOKAN_FILE_INFO FileInfo) {
90 return kbfsLibdokanGetFileInformation(FileName, Buffer, FileInfo);
91 }
92
93 extern NTSTATUS kbfsLibdokanFindFiles(LPCWSTR PathName,
94 PFillFindData FindData, // call this function with PWIN32_FIND_DATAW
95 PDOKAN_FILE_INFO FileInfo);
96
kbfsLibdokanC_FindFiles(LPCWSTR PathName,PFillFindData FindData,PDOKAN_FILE_INFO FileInfo)97 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_FindFiles(LPCWSTR PathName,
98 PFillFindData FindData, // call this function with PWIN32_FIND_DATAW
99 PDOKAN_FILE_INFO FileInfo) {
100 return kbfsLibdokanFindFiles(PathName, FindData, FileInfo);
101 }
102
103 extern NTSTATUS kbfsLibdokanFindFilesWithPattern(LPCWSTR PathName,
104 LPCWSTR SearchPattern,
105 PFillFindData FindData, // call this function with PWIN32_FIND_DATAW
106 PDOKAN_FILE_INFO FileInfo);
kbfsLibdokanC_FindFilesWithPattern(LPCWSTR PathName,LPCWSTR SearchPattern,PFillFindData FindData,PDOKAN_FILE_INFO FileInfo)107 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_FindFilesWithPattern(LPCWSTR PathName,
108 LPCWSTR SearchPattern,
109 PFillFindData FindData, // call this function with PWIN32_FIND_DATAW
110 PDOKAN_FILE_INFO FileInfo) {
111 return kbfsLibdokanFindFilesWithPattern(PathName, SearchPattern, FindData, FileInfo);
112 }
113
114 extern NTSTATUS kbfsLibdokanSetFileAttributes(LPCWSTR FileName,
115 DWORD FileAttributes,
116 PDOKAN_FILE_INFO FileInfo);
kbfsLibdokanC_SetFileAttributes(LPCWSTR FileName,DWORD FileAttributes,PDOKAN_FILE_INFO FileInfo)117 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_SetFileAttributes(LPCWSTR FileName,
118 DWORD FileAttributes,
119 PDOKAN_FILE_INFO FileInfo) {
120 return kbfsLibdokanSetFileAttributes(FileName, FileAttributes, FileInfo);
121 }
122
123 extern NTSTATUS kbfsLibdokanSetFileTime(LPCWSTR FileName,
124 CONST FILETIME* CreationTime,
125 CONST FILETIME* LastAccessTime,
126 CONST FILETIME* LastWriteTime,
127 PDOKAN_FILE_INFO FileInfo);
kbfsLibdokanC_SetFileTime(LPCWSTR FileName,CONST FILETIME * CreationTime,CONST FILETIME * LastAccessTime,CONST FILETIME * LastWriteTime,PDOKAN_FILE_INFO FileInfo)128 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_SetFileTime(LPCWSTR FileName,
129 CONST FILETIME* CreationTime,
130 CONST FILETIME* LastAccessTime,
131 CONST FILETIME* LastWriteTime,
132 PDOKAN_FILE_INFO FileInfo) {
133 return kbfsLibdokanSetFileTime(FileName, CreationTime, LastAccessTime, LastWriteTime, FileInfo);
134 }
135
136 extern NTSTATUS kbfsLibdokanDeleteFile(LPCWSTR FileName, PDOKAN_FILE_INFO FileInfo);
137
kbfsLibdokanC_DeleteFile(LPCWSTR FileName,PDOKAN_FILE_INFO FileInfo)138 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_DeleteFile(LPCWSTR FileName, PDOKAN_FILE_INFO FileInfo) {
139 return kbfsLibdokanDeleteFile(FileName, FileInfo);
140 }
141
142 extern NTSTATUS kbfsLibdokanDeleteDirectory(LPCWSTR FileName, PDOKAN_FILE_INFO FileInfo);
143
kbfsLibdokanC_DeleteDirectory(LPCWSTR FileName,PDOKAN_FILE_INFO FileInfo)144 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_DeleteDirectory(LPCWSTR FileName, PDOKAN_FILE_INFO FileInfo) {
145 return kbfsLibdokanDeleteDirectory(FileName, FileInfo);
146 }
147
148 extern NTSTATUS kbfsLibdokanMoveFile(LPCWSTR ExistingFileName,
149 LPCWSTR NewFileName,
150 BOOL ReplaceExisiting,
151 PDOKAN_FILE_INFO FileInfo);
kbfsLibdokanC_MoveFile(LPCWSTR ExistingFileName,LPCWSTR NewFileName,BOOL ReplaceExisiting,PDOKAN_FILE_INFO FileInfo)152 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_MoveFile(LPCWSTR ExistingFileName,
153 LPCWSTR NewFileName,
154 BOOL ReplaceExisiting,
155 PDOKAN_FILE_INFO FileInfo) {
156 return kbfsLibdokanMoveFile(ExistingFileName, NewFileName, ReplaceExisiting, FileInfo);
157 }
158
159 extern NTSTATUS kbfsLibdokanSetEndOfFile(LPCWSTR FileName,
160 LONGLONG Length,
161 PDOKAN_FILE_INFO FileInfo);
kbfsLibdokanC_SetEndOfFile(LPCWSTR FileName,LONGLONG Length,PDOKAN_FILE_INFO FileInfo)162 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_SetEndOfFile(LPCWSTR FileName,
163 LONGLONG Length,
164 PDOKAN_FILE_INFO FileInfo) {
165 return kbfsLibdokanSetEndOfFile(FileName, Length, FileInfo);
166 }
167
168 extern NTSTATUS kbfsLibdokanSetAllocationSize(LPCWSTR FileName,
169 LONGLONG Length,
170 PDOKAN_FILE_INFO FileInfo);
kbfsLibdokanC_SetAllocationSize(LPCWSTR FileName,LONGLONG Length,PDOKAN_FILE_INFO FileInfo)171 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_SetAllocationSize(LPCWSTR FileName,
172 LONGLONG Length,
173 PDOKAN_FILE_INFO FileInfo) {
174 return kbfsLibdokanSetAllocationSize(FileName, Length, FileInfo);
175 }
176
177 extern NTSTATUS kbfsLibdokanLockFile(LPCWSTR FileName,
178 LONGLONG ByteOffset,
179 LONGLONG Length,
180 PDOKAN_FILE_INFO FileInfo);
181
kbfsLibdokanC_LockFile(LPCWSTR FileName,LONGLONG ByteOffset,LONGLONG Length,PDOKAN_FILE_INFO FileInfo)182 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_LockFile(LPCWSTR FileName,
183 LONGLONG ByteOffset,
184 LONGLONG Length,
185 PDOKAN_FILE_INFO FileInfo) {
186 return kbfsLibdokanLockFile(FileName, ByteOffset, Length, FileInfo);
187 }
188
189 extern NTSTATUS kbfsLibdokanUnlockFile(LPCWSTR FileName,
190 LONGLONG ByteOffset,
191 LONGLONG Length,
192 PDOKAN_FILE_INFO FileInfo);
kbfsLibdokanC_UnlockFile(LPCWSTR FileName,LONGLONG ByteOffset,LONGLONG Length,PDOKAN_FILE_INFO FileInfo)193 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_UnlockFile(LPCWSTR FileName,
194 LONGLONG ByteOffset,
195 LONGLONG Length,
196 PDOKAN_FILE_INFO FileInfo) {
197 return kbfsLibdokanUnlockFile(FileName, ByteOffset, Length, FileInfo);
198 }
199
200
201 // see Win32 API GetDiskFreeSpaceEx
202 extern NTSTATUS kbfsLibdokanGetDiskFreeSpace(ULONGLONG* FreeBytesAvailable,
203 ULONGLONG* TotalNumberOfBytes,
204 ULONGLONG* TotalNumberOfFreeBytes,
205 PDOKAN_FILE_INFO FileInfo);
kbfsLibdokanC_GetDiskFreeSpace(PULONGLONG FreeBytesAvailable,PULONGLONG TotalNumberOfBytes,PULONGLONG TotalNumberOfFreeBytes,PDOKAN_FILE_INFO FileInfo)206 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_GetDiskFreeSpace(PULONGLONG FreeBytesAvailable,
207 PULONGLONG TotalNumberOfBytes,
208 PULONGLONG TotalNumberOfFreeBytes,
209 PDOKAN_FILE_INFO FileInfo) {
210 return kbfsLibdokanGetDiskFreeSpace((ULONGLONG*)FreeBytesAvailable, (ULONGLONG*)TotalNumberOfBytes, (ULONGLONG*)TotalNumberOfFreeBytes, FileInfo);
211 }
212
213 // see Win32 API GetVolumeInformation
214 extern NTSTATUS kbfsLibdokanGetVolumeInformation(LPWSTR VolumeNameBuffer,
215 DWORD VolumeNameSize, // in num of chars
216 LPDWORD VolumeSerialNumber,
217 LPDWORD MaximumComponentLength, // in num of chars
218 LPDWORD FileSystemFlags,
219 LPWSTR FileSystemNameBuffer,
220 DWORD FileSystemNameSize, // in num of chars
221 PDOKAN_FILE_INFO FileInfo);
kbfsLibdokanC_GetVolumeInformation(LPWSTR VolumeNameBuffer,DWORD VolumeNameSize,LPDWORD VolumeSerialNumber,LPDWORD MaximumComponentLength,LPDWORD FileSystemFlags,LPWSTR FileSystemNameBuffer,DWORD FileSystemNameSize,PDOKAN_FILE_INFO FileInfo)222 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_GetVolumeInformation(LPWSTR VolumeNameBuffer,
223 DWORD VolumeNameSize, // in num of chars
224 LPDWORD VolumeSerialNumber,
225 LPDWORD MaximumComponentLength, // in num of chars
226 LPDWORD FileSystemFlags,
227 LPWSTR FileSystemNameBuffer,
228 DWORD FileSystemNameSize, // in num of chars
229 PDOKAN_FILE_INFO FileInfo) {
230 return kbfsLibdokanGetVolumeInformation(VolumeNameBuffer, VolumeNameSize, VolumeSerialNumber, MaximumComponentLength, FileSystemFlags, FileSystemNameBuffer, FileSystemNameSize, FileInfo);
231 }
232
233 extern NTSTATUS kbfsLibdokanMounted(PDOKAN_FILE_INFO FileInfo);
kbfsLibdokanC_Mounted(PDOKAN_FILE_INFO FileInfo)234 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_Mounted(PDOKAN_FILE_INFO FileInfo) {
235 return kbfsLibdokanMounted(FileInfo);
236 }
237
238 extern NTSTATUS kbfsLibdokanGetFileSecurity(LPCWSTR FileName,
239 //A pointer to SECURITY_INFORMATION value being requested
240 PSECURITY_INFORMATION input,
241 // A pointer to SECURITY_DESCRIPTOR buffer to be filled
242 PSECURITY_DESCRIPTOR output,
243 ULONG outlen,// length of Security descriptor buffer
244 PULONG LengthNeeded,
245 PDOKAN_FILE_INFO FileInfo);
kbfsLibdokanC_GetFileSecurity(LPCWSTR FileName,PSECURITY_INFORMATION input,PSECURITY_DESCRIPTOR output,ULONG outlen,PULONG LengthNeeded,PDOKAN_FILE_INFO FileInfo)246 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_GetFileSecurity(LPCWSTR FileName,
247 //A pointer to SECURITY_INFORMATION value being requested
248 PSECURITY_INFORMATION input,
249 // A pointer to SECURITY_DESCRIPTOR buffer to be filled
250 PSECURITY_DESCRIPTOR output,
251 ULONG outlen,// length of Security descriptor buffer
252 PULONG LengthNeeded,
253 PDOKAN_FILE_INFO FileInfo) {
254 return kbfsLibdokanGetFileSecurity(FileName, input, output, outlen, LengthNeeded, FileInfo);
255 }
256
257 extern NTSTATUS kbfsLibdokanSetFileSecurity(LPCWSTR FileName,
258 PSECURITY_INFORMATION SecurityInformation,
259 PSECURITY_DESCRIPTOR SecurityDescriptor,
260 ULONG SecurityDescriptorLength,
261 PDOKAN_FILE_INFO FileInfo);
kbfsLibdokanC_SetFileSecurity(LPCWSTR FileName,PSECURITY_INFORMATION SecurityInformation,PSECURITY_DESCRIPTOR SecurityDescriptor,ULONG SecurityDescriptorLength,PDOKAN_FILE_INFO FileInfo)262 static DOKAN_CALLBACK NTSTATUS kbfsLibdokanC_SetFileSecurity(LPCWSTR FileName,
263 PSECURITY_INFORMATION SecurityInformation,
264 PSECURITY_DESCRIPTOR SecurityDescriptor,
265 ULONG SecurityDescriptorLength,
266 PDOKAN_FILE_INFO FileInfo) {
267 return kbfsLibdokanSetFileSecurity(FileName, SecurityInformation, SecurityDescriptor, SecurityDescriptorLength, FileInfo);
268 }
269
270 /*
271 extern NTSTATUS kbfsLibdokanFindStreams(LPCWSTR FileName,
272 // call this function with PWIN32_FIND_STREAM_DATA
273 PFillFindStreamData FindStreamData,
274 PDOKAN_FILE_INFO FileInfo);
275 */
276
277
278
kbfsLibdokanAllocCtx(ULONG64 slot)279 struct kbfsLibdokanCtx* kbfsLibdokanAllocCtx(ULONG64 slot) {
280 struct kbfsLibdokanCtx *ctx = malloc(sizeof(struct kbfsLibdokanCtx));
281 if(!ctx)
282 return ctx;
283 memset(ctx, 0, sizeof(struct kbfsLibdokanCtx));
284 ctx->dokan_options.Version = DOKAN_VERSION;
285 // Dokan timeout 10 minutes... Disables - was related to dokan crashes!
286 // ctx->dokan_options.Timeout = 600 * 1000;
287 ctx->dokan_options.GlobalContext = slot;
288
289 ctx->dokan_operations.ZwCreateFile = kbfsLibdokanC_CreateFile;
290 ctx->dokan_operations.Cleanup = kbfsLibdokanC_Cleanup;
291 ctx->dokan_operations.CloseFile = kbfsLibdokanC_CloseFile;
292 ctx->dokan_operations.ReadFile = kbfsLibdokanC_ReadFile;
293 ctx->dokan_operations.WriteFile = kbfsLibdokanC_WriteFile;
294 ctx->dokan_operations.FlushFileBuffers = kbfsLibdokanC_FlushFileBuffers;
295 ctx->dokan_operations.GetFileInformation = kbfsLibdokanC_GetFileInformation;
296 ctx->dokan_operations.FindFiles = kbfsLibdokanC_FindFiles;
297 ctx->dokan_operations.SetFileAttributes = kbfsLibdokanC_SetFileAttributes;
298 ctx->dokan_operations.SetFileTime = kbfsLibdokanC_SetFileTime;
299 ctx->dokan_operations.DeleteFile = kbfsLibdokanC_DeleteFile;
300 ctx->dokan_operations.DeleteDirectory = kbfsLibdokanC_DeleteDirectory;
301 ctx->dokan_operations.MoveFile = kbfsLibdokanC_MoveFile;
302 ctx->dokan_operations.SetEndOfFile = kbfsLibdokanC_SetEndOfFile;
303 ctx->dokan_operations.SetAllocationSize = kbfsLibdokanC_SetAllocationSize;
304 ctx->dokan_operations.LockFile = kbfsLibdokanC_LockFile;
305 ctx->dokan_operations.UnlockFile = kbfsLibdokanC_UnlockFile;
306 ctx->dokan_operations.GetDiskFreeSpace = kbfsLibdokanC_GetDiskFreeSpace;
307 ctx->dokan_operations.GetVolumeInformation = kbfsLibdokanC_GetVolumeInformation;
308 ctx->dokan_operations.Mounted = kbfsLibdokanC_Mounted;
309 ctx->dokan_operations.GetFileSecurity = kbfsLibdokanC_GetFileSecurity;
310 ctx->dokan_operations.SetFileSecurity = kbfsLibdokanC_SetFileSecurity;
311 // FIXME: Multiple streams per file for e.g. resource forks
312 // ctx->dokan_operations.FindStreams = kbfsLibdokanC_FindStreams;
313 return ctx;
314 }
315
kbfsLibdokanSet_path(struct kbfsLibdokanCtx * ctx,void * ptr)316 void kbfsLibdokanSet_path(struct kbfsLibdokanCtx* ctx, void* ptr) {
317 if(ctx->dokan_options.MountPoint)
318 free((void*)ctx->dokan_options.MountPoint);
319 ctx->dokan_options.MountPoint = wcsdup(ptr);
320 }
321
kbfsLibdokanFree(struct kbfsLibdokanCtx * ctx)322 error_t kbfsLibdokanFree(struct kbfsLibdokanCtx* ctx) {
323 if(ctx) {
324 if(ctx->dokan_options.MountPoint)
325 free((void*)ctx->dokan_options.MountPoint);
326 free(ctx);
327 }
328 return 0;
329 }
330
kbfsLibdokanRun(struct kbfsLibdokanCtx * ctx)331 error_t kbfsLibdokanRun(struct kbfsLibdokanCtx* ctx) {
332 int __stdcall (*dokanMain)(PDOKAN_OPTIONS DokanOptions, PDOKAN_OPERATIONS DokanOperations) = (void*)kbfsLibdokanPtr_Main;
333 if(!dokanMain)
334 return kbfsLibDokan_DLL_LOAD_ERROR;
335 if((ctx->dokan_options.Options & kbfsLibdokanUseFindFilesWithPattern) != 0) {
336 ctx->dokan_options.Options &= ~kbfsLibdokanUseFindFilesWithPattern;
337 ctx->dokan_operations.FindFilesWithPattern = kbfsLibdokanC_FindFilesWithPattern;
338 }
339 int status = (*dokanMain)(&ctx->dokan_options, &ctx->dokan_operations);
340 return status;
341 }
342
kbfsLibdokanFill_find(PFillFindData fptr,PWIN32_FIND_DATAW a1,PDOKAN_FILE_INFO a2)343 int kbfsLibdokanFill_find(PFillFindData fptr, PWIN32_FIND_DATAW a1, PDOKAN_FILE_INFO a2) {
344 return fptr(a1, a2);
345 }
346
kbfsLibdokan_RemoveMountPoint(LPCWSTR MountPoint)347 BOOL kbfsLibdokan_RemoveMountPoint(LPCWSTR MountPoint) {
348 BOOL __stdcall (*removeMountPoint)(LPCWSTR MountPoint) = (void*)kbfsLibdokanPtr_RemoveMountPoint;
349 if(!removeMountPoint)
350 return 0;
351 return (*removeMountPoint)(MountPoint);
352 }
353
354
kbfsLibdokan_OpenRequestorToken(PDOKAN_FILE_INFO DokanFileInfo)355 HANDLE kbfsLibdokan_OpenRequestorToken(PDOKAN_FILE_INFO DokanFileInfo) {
356 HANDLE __stdcall (*openRequestorToken)(PDOKAN_FILE_INFO DokanFileInfo) = (void*)kbfsLibdokanPtr_OpenRequestorToken;
357 if(!openRequestorToken)
358 return INVALID_HANDLE_VALUE;
359 return (*openRequestorToken)(DokanFileInfo);
360 }
361
kbfsLibDokan_GetVersion(uintptr_t proc)362 ULONG kbfsLibDokan_GetVersion(uintptr_t proc) {
363 if(!proc)
364 return 0;
365 ULONG __stdcall (*fun)() = (void*)proc;
366 return fun();
367 }
368
369
370 #endif /* windows check */
371