
    Dokan Cu

 Copyright(c) Hiroki Asakawa http://dokan-dev.net


 DokanCuƂ

WindowsŃt@CVXeCႦ FAT  NTFS ̉ǃo[W쐬
悤ƎvƂɂ́Ct@CVXehCo쐬Kv܂D
WindowsŃJ[l[hœ삷CfoCXhCo쐬͔̂
CȒPɍ쐬邱Ƃo܂DDokanCugp邱Ƃ
foCXhCoȂĂCVt@CVXe쐬邱Ƃ
o܂DFUSE  Windows łƂ郉CułD


 CZXɂ

DokanCũ͕CZX̃vO\Ă܂D

[U[hCu (dokan.dll) LGPL
hCo (dokan.sys)               LGPL
⏕vO (dokanctl.exe)      MIT
}EgT[rX (mounter.exe)     MIT

ꂼ̃CZX̏ڍׂ́C
LGPL license.lgpl.txt
GPL  license.gpl.txt
MIT  license.mit.txt
QƂĉD
\[XR[h http://dokan-dev.net/download ł܂D

 

Windowx XP,2003,Vista,2008,7 x86ŁCWindows 2003,Vista,2008,7 x64łœ삵܂D


 ̎dg

DokanCúC[U[h̃Cuł dokan.dll ƃt@C
VXehCoł dokan.sys \Ă܂Ddokan.sysC
Xg[邱ƂŁCWindows ͒ʏ̃t@CVXe݂悤
ɂɌ܂Ddokant@CVXeɑ΂ANZXƁC[U[
hɃR[obN܂DႦ΁CGNXv[ŃfBNgJ
ƂɁCWindows̓t@CVXeɑ΂āCfBNgꗗv܂D
̗vCdokan.dll ɃR[obN܂D̗vɑ΂āCK
fBNgꗗt@CVXeɖ߂ƁCdokant@CVXéC
WindowsɕԂ܂DDokant@CVXevLVƂĉ邱
ŁC[U[h̒ʏvOƂăt@CVXeł킯
łD


 Cu̍\ƃCXg[

CXg[[sƕWł͈ȉ̃t@CCXg[C
hCo[ƃT[rXvOVXeɓo^܂D

SystemFolder\dokan.dll
    Dokan[U[hCu

SystemFolder\drivers\dokan.sys
    Dokant@CVXehCo

ProgramFilesFolder\Dokan\DokanLibrary\mounter.exe
    Dokan}gT[rX

ProgramFilesFolder\Dokan\DokanLibrary\dokanctl.exe
    DokanRg[vO

ProgramFilesFolder\Dokan\DokanLibrary\dokan.lib
    DokanC|[gCu

ProgramFilesFolder\Dokan\DokanLibrary\dokan.h
    DokanCuwb_[

ProgramFilesFolder\Dokan\DokanLibrary\readme.txt
    ̃t@C


ACXg[̓Rg[pl̃AvP[V̒ǉƍ폜
sĂDACXg[ăCXg[ɂ͍ċNKv
Ȃ܂D(KċNĂ)


 t@CVXe̍

dokan.h  DOKAN_OPERATIONS ̊e֐CDokanMain ɓnƂŃ}
Eg܂Dꂼ̊֐WindowsAPÏ܂De֐̂
܂Ȏdl͓WindowsAPIƂقړłD
DOKAN_OPERATIONS ̊e֐́CCӂ̃XbhĂ΂܂DXbhZ[
tłȂAvP[VŖɂȂꍇ܂D

̏ŌĂ΂܂

1. CreateFile(OpenDirectory, OpenDirectory)
2. ̑̊֐
3. Cleanup
4. CloseFile

t@Cɑ΂ANZX(fBNgꗗCt@C̑̎擾Ȃǁj
̏߂ɁCȂ炸CreateFilen̊֐Ă΂Ct@CnhN[
YƂ(WindowsAPICloseFileĂ΂ꂽƂ)CleanupĂ΂C
̌CloseFile Ă΂܂D

ꂼ̊֐͐IꍇC0CG[ꍇ́CWindows
G[R[h -1{̂ԂĂD

ꂼ̊֐̍Ō̈ɂ DOKAN_FILE_INFO n܂D̍\
́Ĉ悤ɒ`Ă܂D

    typedef struct _DOKAN_FILE_INFO {

        ULONG64 Context; 
        ULONG64 DokanContext;
        ULONG   ProcessId;
        BOOL    IsDirectory;

    } DOKAN_FILE_INFO, *PDOKAN_FILE_INFO;

[U[h瓯t@Cnh𗘗pẴANZXɂẮC
 DOKAN_FILE_INFO ֐ɓnĂ܂D̍\̂́CCreateFile
ŐCCloseFileŉ܂DDokanFileInfo->Context ̓t@C
VXeRɎgpłϐłDÃt@CANZXɑ΂āC
̂ŁCt@CnhȂǂۑ̂ɗpł܂D
DokanFileInfo->DokanContext ͓płDȂłD
DokanFileInfo->ProcessId  IONGXg𐶐vZXIDłD
DokanFileInfo->IsDirectory ̓fBNgɑ΂ANZX TRUE Zb
gĂ܂(Oq)D

    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);

CreateFile t@C̐VK쐬CJȂOpenDirectory fBNgJ
CreateDirectory fBNg쐬邻ꂼ̊֐́Ct@Cւ̃A
NZXJnɌĂ΂܂D֐̎dĺCWindowsAPIɎĂ܂D
CreateFile DesiredAccess ShareMode CreationDisposition
FlagsAndAttributes ɂẮCMSDN  CreateFile QƂĂD
fBNgɑ΂ANZX̎ɂ́COpenDirectory ܂́C
CreateDirectory Ă΂܂D̏ꍇCDokanFileInfo->IsDirectory 
TRUE ɂȂĂ܂DfBNgɑ΂ANZXŗL̂ɂւ炸C
CreateFile Ă΂邱Ƃ܂D̏ꍇ́C
DokanFileInfo->IsDirectory  FALSE ZbgĂ܂DfBNg
̑擾ꍇȂǂ OpenDirectory ł͂ȂCCreateFileĂ΂
悤łDfBNgɑ΂ANZXȂ̂ɂւ炸CCreateFile 
΂ꂽꍇ́CK DokanFileInfo->IsDirectory TRUEZbgĂ
returnĂDZbgĂȂƁCDokanCúC
ANZXfBNgɑ΂ANZXǂfłCDokant@C
VXe Windows ɑ΂ĐmȏԂƂoȂȂ܂D

CreateFile  CreationDisposition  CREATE_ALWAYS 
OPEN_ALWAYS ̏ꍇŁCt@Cłɑ݂Ăꍇ́C0ł͂ȂC
ERROR_ALREADY_EXISTS(183) (̒l) ԂĂD


    int (*Cleanup) (
        LPCWSTR,      // FileName
        PDOKAN_FILE_INFO);

    int (*CloseFile) (
        LPCWSTR,      // FileName
        PDOKAN_FILE_INFO);

Cleanup ̓[U WindowsAPI  CloseHandle Ă񂾂ƂɌĂ΂܂D
CreateFile ̎ɁCt@CJCt@CnhႦ΁C
DokanFileInfo->Context ɕۑĂꍇCCloseFileł͂ȂC
Cleanupɂ̃t@CnhׂłD[U WindowsAPI 
CloseHandle ĂŁČ㓯t@CJꍇCCleanup Ă΂
Ă CloseFile VɃt@CJOɌĂ΂Ȃꍇ܂Dt@
CVXet@CJ܂܂ɂĂꍇCt@C̋Lᔽ
ēxJȂȂ邩܂DyӁz[Ut@C}bv
ht@CƂĊJĂꍇCCleanup Ă΂ꂽ WriteFile 
ReadFile Ă΂ꍇ܂D̏ꍇɂɓǂݍݏ݂
ł悤ɂׂłD


    int (*FindFiles) (
        LPCWSTR,           // PathName
        PFillFindData,     // call this function with PWIN32_FIND_DATAW
        PDOKAN_FILE_INFO); //  (see PFillFindData definition)


    // You should implement FindFires or FindFilesWithPattern
    int (*FindFilesWithPattern) (
        LPCWSTR,           // PathName
        LPCWSTR,           // SearchPattern
        PFillFindData,     // call this function with PWIN32_FIND_DATAW
        PDOKAN_FILE_INFO);


FindFiles  FindFilesWithPattern ̓fBNgꗗ擾ƂɌ
΂܂DfBNg WIN32_FIND_DATAW Ɋi[Cɓn
FillFindData ֐|C^ʂāCFillFindData(&win32FindDataw,
DokanFileInfo) PGgƂɌĂяoĂD
FindFilesWithPattern ̓fBNǧp^[tŌĂяo܂D
Windows ́CChJ[h̓WJVFł͂ȂCt@CVXeōs
܂DChJ[hWJ𐧌䂵ꍇ́CFindFilesWithPattern 
`ĂDFindFiles ̓ChJ[h DokanCus
܂Ddokan.dll  DokanIsNameInExpression GNX|[gĂCC
hJ[h̃}b`Oɗpł܂D


 }Eg

    typedef struct _DOKAN_OPTIONS {
        WCHAR   DriveLetter; // driver letter to be mounted
        ULONG   ThreadCount; // number of threads to be used
        UCHAR   DebugMode; // ouput debug message
        UCHAR   UseStdErr; // ouput debug message to stderr
        UCHAR   UseAltStream; // use alternate stream

    } DOKAN_OPTIONS, *PDOKAN_OPTIONS;

    int DOKANAPI DokanMain(
        PDOKAN_OPTIONS    DokanOptions,
        PDOKAN_OPERATIONS DokanOperations);

DokanOptions ɂ́CDokan ̎sIvVCDokanOptions ɊefBXpb`
֐̊֐|C^w肵āCDokanMain Ăт܂DDokanMain ̓A}E
g܂ŐԂ܂D܂CefBXpb`֐́CDokanMain 
񂾃XbhReLXgƈقȂ镡̃XbhReLXgĂ΂܂D
fBXpb`֐́CXbhZ[tɂȂ悤ɂĉD

DOKAN_OPTIONS
   DriveLetter: }EghCu
   ThreadCount: Dokan CuŎgpXbȟD0w肷
                ΃ftHglg܂DfobO 1 w肷
                ƃfobO₷Ȃ܂D
   DebugMode  : 1 ɃZbgƁCfobObZ[WfobOo͂ɏo
                ܂D
   UseStdErr  : 1 ɃZbgƁCfobObZ[WWG[o͂ɏo
                ͂܂D
   UseAltStream : փXg[(alternate stream, Xg[)gp
                  ܂D

DokanMain ̓}EgɎsƎ̂悤ȃG[R[hԂ܂D

    #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 */



 A}Eg

DokanUnmount Ăׂ΃A}Egł܂DvOnOꍇC
GNXv[nOꍇ́CA}EgsΑ̏ꍇɖ
܂D

    > dokanctl.exe /u DriveLetter

 unmount s܂D



 ̂ق

DokanCúC̃Cu𗘗pč쐬t@CVXe
̕s̂߂ɁCu[XN[ɂȂ邱Ƃ܂Dt@CVX
e̊Jɂ́CVirtual Machine𗘗p邱Ƃ߂܂D
