Skip to content

Commit

Permalink
Library - Merge DokanMapStandardToGenericAccess with DokanMapKernelTo…
Browse files Browse the repository at this point in the history
…UserCreateFileFlags
  • Loading branch information
Liryna committed Nov 19, 2017
1 parent 9fe7aa1 commit 0da7787
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 56 deletions.
75 changes: 36 additions & 39 deletions dokan/dokan.c
Original file line number Diff line number Diff line change
Expand Up @@ -851,46 +851,12 @@ BOOL WINAPI DllMain(HINSTANCE Instance, DWORD Reason, LPVOID Reserved) {
return TRUE;
}

// We are using DesiredAccess directly from the IRP_MJ_CREATE.
// This DesiredAccess has been converted from generic rights (user CreateFile request) to standard rights.
// https://msdn.microsoft.com/windows/hardware/drivers/ifs/access-mask
// TODO Merge it with DokanMapKernelToUserCreateFileFlags for Dokan 1.1.0 (break API)
ACCESS_MASK DOKANAPI
DokanMapStandardToGenericAccess(ACCESS_MASK DesiredAccess) {
BOOL genericRead = FALSE, genericWrite = FALSE, genericExecute = FALSE,
genericAll = FALSE;
if ((DesiredAccess & FILE_GENERIC_READ) == FILE_GENERIC_READ) {
DesiredAccess |= GENERIC_READ;
genericRead = TRUE;
}
if ((DesiredAccess & FILE_GENERIC_WRITE) == FILE_GENERIC_WRITE) {
DesiredAccess |= GENERIC_WRITE;
genericWrite = TRUE;
}
if ((DesiredAccess & FILE_GENERIC_EXECUTE) == FILE_GENERIC_EXECUTE) {
DesiredAccess |= GENERIC_EXECUTE;
genericExecute = TRUE;
}
if ((DesiredAccess & FILE_ALL_ACCESS) == FILE_ALL_ACCESS) {
DesiredAccess |= GENERIC_ALL;
genericAll = TRUE;
}

if (genericRead)
DesiredAccess &= ~FILE_GENERIC_READ;
if (genericWrite)
DesiredAccess &= ~FILE_GENERIC_WRITE;
if (genericExecute)
DesiredAccess &= ~FILE_GENERIC_EXECUTE;
if (genericAll)
DesiredAccess &= ~FILE_ALL_ACCESS;

return DesiredAccess;
}

void DOKANAPI DokanMapKernelToUserCreateFileFlags(
ULONG FileAttributes, ULONG CreateOptions, ULONG CreateDisposition,
DWORD *outFileAttributesAndFlags, DWORD *outCreationDisposition) {
ACCESS_MASK DesiredAccess, ULONG FileAttributes, ULONG CreateOptions, ULONG CreateDisposition,
ACCESS_MASK* outDesiredAccess, DWORD *outFileAttributesAndFlags, DWORD *outCreationDisposition) {
BOOL genericRead = FALSE, genericWrite = FALSE, genericExecute = FALSE,
genericAll = FALSE;

if (outFileAttributesAndFlags) {

*outFileAttributesAndFlags = FileAttributes;
Expand Down Expand Up @@ -943,4 +909,35 @@ void DOKANAPI DokanMapKernelToUserCreateFileFlags(
break;
}
}

if (outDesiredAccess) {

*outDesiredAccess = DesiredAccess;

if ((*outDesiredAccess & FILE_GENERIC_READ) == FILE_GENERIC_READ) {
*outDesiredAccess |= GENERIC_READ;
genericRead = TRUE;
}
if ((*outDesiredAccess & FILE_GENERIC_WRITE) == FILE_GENERIC_WRITE) {
*outDesiredAccess |= GENERIC_WRITE;
genericWrite = TRUE;
}
if ((*outDesiredAccess & FILE_GENERIC_EXECUTE) == FILE_GENERIC_EXECUTE) {
*outDesiredAccess |= GENERIC_EXECUTE;
genericExecute = TRUE;
}
if ((*outDesiredAccess & FILE_ALL_ACCESS) == FILE_ALL_ACCESS) {
*outDesiredAccess |= GENERIC_ALL;
genericAll = TRUE;
}

if (genericRead)
*outDesiredAccess &= ~FILE_GENERIC_READ;
if (genericWrite)
*outDesiredAccess &= ~FILE_GENERIC_WRITE;
if (genericExecute)
*outDesiredAccess &= ~FILE_GENERIC_EXECUTE;
if (genericAll)
*outDesiredAccess &= ~FILE_ALL_ACCESS;
}
}
1 change: 0 additions & 1 deletion dokan/dokan.def
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,3 @@ DokanDebugMode
DokanMapKernelToUserCreateFileFlags
DokanGetMountPointList
DokanNtStatusFromWin32
DokanMapStandardToGenericAccess
20 changes: 8 additions & 12 deletions dokan/dokan.h
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,6 @@ typedef struct _DOKAN_OPERATIONS {
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
* \see <a href="https://msdn.microsoft.com/en-us/library/windows/hardware/ff566424(v=vs.85).aspx">See ZwCreateFile for more information about the parameters of this callback (MSDN).</a>
* \see DokanMapKernelToUserCreateFileFlags
* \see DokanMapStandardToGenericAccess
*/
NTSTATUS(DOKAN_CALLBACK *ZwCreateFile)(LPCWSTR FileName,
PDOKAN_IO_SECURITY_CONTEXT SecurityContext,
Expand Down Expand Up @@ -842,25 +841,22 @@ BOOL DOKANAPI DokanGetMountPointList(PDOKAN_CONTROL list, ULONG length,
/**
* \brief Convert \ref DOKAN_OPERATIONS.ZwCreateFile parameters to <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx">CreateFile</a> parameters.
*
* Dokan Kernel forward the DesiredAccess directly from the IRP_MJ_CREATE.
* This DesiredAccess has been converted from generic rights (user CreateFile request) to standard rights and will be converted back here.
* https://msdn.microsoft.com/windows/hardware/drivers/ifs/access-mask
*
* \param DesiredAccess DesiredAccess from \ref DOKAN_OPERATIONS.ZwCreateFile.
* \param FileAttributes FileAttributes from \ref DOKAN_OPERATIONS.ZwCreateFile.
* \param CreateOptions CreateOptions from \ref DOKAN_OPERATIONS.ZwCreateFile.
* \param CreateDisposition CreateDisposition from \ref DOKAN_OPERATIONS.ZwCreateFile.
* \param outDesiredAccess New <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx">CreateFile</a> dwDesiredAccess.
* \param outFileAttributesAndFlags New <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx">CreateFile</a> dwFlagsAndAttributes.
* \param outCreationDisposition New <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx">CreateFile</a> dwCreationDisposition.
* \see <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx">CreateFile function (MSDN)</a>
*/
void DOKANAPI DokanMapKernelToUserCreateFileFlags(
ULONG FileAttributes, ULONG CreateOptions, ULONG CreateDisposition,
DWORD *outFileAttributesAndFlags, DWORD *outCreationDisposition);

/**
* \brief Convert IRP_MJ_CREATE DesiredAccess to generic rights.
*
* \param DesiredAccess Standard rights to convert
* \return New DesiredAccess with generic rights.
* \see <a href="https://msdn.microsoft.com/windows/hardware/drivers/ifs/access-mask">Access Mask (MSDN)</a>
*/
ACCESS_MASK DOKANAPI DokanMapStandardToGenericAccess(ACCESS_MASK DesiredAccess);
ACCESS_MASK DesiredAccess, ULONG FileAttributes, ULONG CreateOptions, ULONG CreateDisposition,
ACCESS_MASK* outDesiredAccess, DWORD *outFileAttributesAndFlags, DWORD *outCreationDisposition);

/**
* \brief Convert WIN32 error to NTSTATUS
Expand Down
6 changes: 2 additions & 4 deletions samples/dokan_mirror/mirror.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,10 +216,8 @@ MirrorCreateFile(LPCWSTR FileName, PDOKAN_IO_SECURITY_CONTEXT SecurityContext,
securityAttrib.bInheritHandle = FALSE;

DokanMapKernelToUserCreateFileFlags(
FileAttributes, CreateOptions, CreateDisposition, &fileAttributesAndFlags,
&creationDisposition);

genericDesiredAccess = DokanMapStandardToGenericAccess(DesiredAccess);
DesiredAccess, FileAttributes, CreateOptions, CreateDisposition,
&genericDesiredAccess, &fileAttributesAndFlags, &creationDisposition);

GetFilePath(filePath, DOKAN_MAX_PATH, FileName);

Expand Down

0 comments on commit 0da7787

Please sign in to comment.