2015年2月5日木曜日

共有アクセスモードの取り扱い

DokanNetでは、CreateFileに渡されるFileAccessが限定されています。Read, Write, ReadWrite

実はもっと沢山有って、DokanNetのCreateFileProxyから渡される情報を鵜呑みにしたのでは、はまってしまいます。

Generic Access Rights
https://msdn.microsoft.com/en-us/library/windows/desktop/aa446632(v=vs.85).aspx

File Access Rights Constants
https://msdn.microsoft.com/en-us/library/windows/desktop/gg258116(v=vs.85).aspx

詳しくはDokanNetのソースコードを見れば早いのですが、Query専用で開くCreateFileに対応できていません。

(FileAccess)0  ← これが欠けています。代わりにReadが来るので、場合によっては、共有違反扱いになります。
Read
Write
ReadWrite

例えば、GetFileSizeの実装として、CreateFileを使うと思うのですが、場合によっては、共有違反になり、ファイルを開くことができません。

できませんので、アプリによっては、とんでもない結果を招いたりします。例えば、WindowsのZipフォルダ機能では、Zipファイルが壊れたりします。。。

ファイル→新規作成で、盾フォルダだけになる件

DokanNetの場合、GetFileSecurityを実装すれば、通常フォルダのように、ファイル項目が出るようになります。

因みにFAT32のドライブに対してSDDLを調査した所、O:WDG:WDでした。ACL非対応といいつつも、さり気無くGetFileSecurityへ応答している所が。。。

O:WDG:WD

Owner = Everyone
Group = Everyone
DACL なし?
SACL なし?