refer: http://www.aiseminar.cn/bbs/forum.php?mod=viewthread&tid=1825
Dokan Library 協助程式員在windows系統下輕鬆建立使用者級檔案系統,不需要寫裝置驅動,其與FUSE(Linux user mode file system)類似。
Dokan官網: http://dokan-dev.net/en/
一、Dokan Library
如果您想在Windows系統上建立一個新的檔案系統的話,例如:改進FAT或NTFS檔案系統,您就需要自己開發一個檔案系統驅動。在Windows系統上開發工作在核心模式的裝置驅動程式是一件極為困難的事情。使用Dokan庫(Dokan Library),您可以非常方便地建立自己的檔案系統而不需要編寫裝置驅動程式。Dokan庫類似於Linux下的FUSE使用者空間檔案系統,但是它工作在Windows下。
Dokan原理
Dokan Library包含以下部分:
- user-mode library (dokan.dll) LGPL
- driver (dokan.sys) LGPL
- control program (dokanctl.exe) MIT
- mount service (mouter.exe) MIT
- samples (mirror.c) MIT
Dokan庫包含一個使用者模式的DLL檔案(dokan.dll)以及一個核心模式檔案系統驅動(dokan.sys)。Dokan檔案系統驅動一旦安裝,您就可以在Windows上建立和普通檔案系統一樣的檔案系統。使用Dokan庫建立的檔案系統的應用程式稱為檔案系統應用程式。來自使用者程式的檔案操作請求(例如:CreateFile,ReadFile,WriteFile等)將被發送的 Windows輸入/輸出子系統(運行在核心模式),請求之後將被發送到Dokan檔案系統驅動程式(dokan.sys)。通過使用Dokan使用者模式庫檔案(dokan.dll)提供的函數,檔案系統應用程式能夠向檔案系統驅動程式註冊回呼函數。檔案系統驅動程式在收到請求後調用註冊的回呼函數常式來響應請求。回呼函數常式的處理結果將返回給使用者程式。例如:當Windows資源管理員請求建立一個目錄,請求“OpenDirectory”將發送到 Dokan檔案系統驅動程式,然後驅動程式將調用檔案系統應用程式提供的OpenDirectory回呼函數常式。函數常式的處理結果作為 OpenDirectory請求的響應返回給Windows資源總管。如此一來,Dokan檔案系統驅動程式就如同一個位於使用者程式和檔案系統程式之間的代理程式。使用Dokan庫的好處是,它允許程式員開發更安全也更容易調試的使用者空間檔案系統。
二、Dokan SSHFS
SSHFS(SSH檔案系統)是一個檔案系統用戶端程式,使用它可以將遠程伺服器上的目錄掛載在本地直接存取。先前的版本用於輸出SFTP提供的目錄和檔案,而當前的版本主要用於安裝有FUSE的系統上。在使用者訪問伺服器資源的過程中,資料通過SSH加密傳輸,安全而高效。
Dokan是FUSE的Windows實現,使用Dokan SSHFS可以將Linux伺服器上的目錄以網路盤的形式掛載到本地使用,類似於Samba。要使用Dokan SSHFS需要首先安裝Dokan Library,它們可以在Dokan官方網站下載。
三、利用Dokan建立檔案系統
與FUSE類似,我們的檔案系統程式需要實現一個結構體中的各個操作DOKAN_OPERATIONS(聲明在dokan.h中),然後該結構體作為參數調用DokanMain掛載檔案系統。這些函數的參數與Windows APIs 一致,但必須做到安全執行緒,因為有可能有多個線程調用。
這些函數有個典型的調用順序:
1. CreateFile(OpenDirectory, CreateFile)
2. Other functions
3. Cleanup
4. CloseFile
file creation functions (OpenDirectory, CreateFile,…)總是在file access operations (listing directory, reading file attributes, …)之前調用。當檔案被CloseFile Windows API關閉時,Cleanup程式總是被dokan.sys調用。傳回值為0時表示操作成功。
每個函數的最後一個參數是DOKAN_FILE_INFO structure
typedef struct _DOKAN_FILE_INFO
{
ULONG64 Context; //檔案系統程式維護,可作為檔案控制代碼
ULONG64 DokanContext; //Dokan Library維護
ULONG ProcessId; //操作ID
BOOL IsDirectory; //目錄= TRUE
} DOKAN_FILE_INFO, *PDOKAN_FILE_INFO; 複製代碼
每一個檔案控制代碼都與一個DOKAN_FILE_INFO struct對應。該結構建立在檔案被CreateFile系統調用開啟時,回收在檔案被CloseFile系統調用關閉時。
下面是幾個操作的聲明:
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); //注意設定IsDirectory = TRUE
//CloseHandle ( Windows API)執行之後調用,如果檔案控制代碼在
//CreateFile中建立,應該在此釋放,而不是在CloseFile。
//如果使用者在記憶體中緩衝了檔案,調用Cleanup之後還有可能調用讀寫
//操作。
int (*Cleanup) (
LPCWSTR, // FileName
PDOKAN_FILE_INFO);
//如果使用者調用CloseHandle後再開啟相同檔案,CreateFile之前可能
//不會再調用CloseFile,這可能會出共用錯誤。
int (*CloseFile) (
LPCWSTR, // FileName
PDOKAN_FILE_INFO);
int (*FindFiles) (
LPCWSTR, // PathName
PFillFindData, // call this function with PWIN32_FIND_DATAW
PDOKAN_FILE_INFO); // (see PFillFindData definition)
// You should implement either FindFiles or FindFilesWithPattern
int (*FindFilesWithPattern) (
LPCWSTR, // PathName
LPCWSTR, // SearchPattern
PFillFindData, // call this function with PWIN32_FIND_DATAW PDOKAN_FILE_INFO); 複製代碼
上面兩個函數是回應列目錄項操作請求的。對每一個目錄項,檔案系統程式都會調用函數FillFindData( &win32FindDataw, DokanFileInfo )。由於Windows的shell對於模式比對不支援,檔案系統程式就要執行通配模式。當檔案系統程式實現FindFiles,DokanLibrary會自動添加通配模式,我們也可以自己實現FindFilesWithPattern來加以控制。DokanIsNameInExpression (dokan.dll)函數就是用來實現模式比對的。
四、磁碟的掛載
可以調用DokanMain函數來掛載檔案系統,該程式會阻塞到檔案系統被卸載。我們的檔案系統要做兩件事,一是為Dokan運行庫填寫DokanOptions,二是填寫帶各個操作函數指標的DokanOperations作為DokanMain的參數。
int DOKANAPI DokanMain(
PDOKAN_OPTIONS DokanOptions,
PDOKAN_OPERATIONS DokanOperations);
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; 複製代碼
五、卸載
調用DokanUnmount進行檔案系統的卸載。使用者也可以使用 DokanCtl 像這樣進行卸載:
> dokanctl.exe /u DriveLetter
Refered to:
Dokan:Windows和Linux檔案分享權限設定新的途徑
http://www.cnblogs.com/dengke/archive/2010/02/22/1670858.html
利用dokan作虛擬磁碟開發
http://www.fqyy.org/sunu/archives/tag/dokan
Dokan(Windows FUSE)學習筆記
http://my.debugman.net/program-198.html