소스 검색

NTDirectoryFileSystem: CreateFile: Workaround for using FILE_NO_INTERMEDIATE_BUFFERING and FILE_APPEND_DATA together

Tal Aloni 7 년 전
부모
커밋
fdaafdfa9c
1개의 변경된 파일8개의 추가작업 그리고 0개의 파일을 삭제
  1. 8 0
      SMBLibrary/Win32/NTFileStore/NTDirectoryFileSystem.cs

+ 8 - 0
SMBLibrary/Win32/NTFileStore/NTDirectoryFileSystem.cs

@@ -161,6 +161,14 @@ namespace SMBLibrary.Win32
             createOptions &= ~CreateOptions.FILE_SYNCHRONOUS_IO_NONALERT;
             createOptions |= CreateOptions.FILE_SYNCHRONOUS_IO_ALERT;
 
+            if ((createOptions & CreateOptions.FILE_NO_INTERMEDIATE_BUFFERING) > 0 &&
+                (desiredAccess.File & FileAccessMask.FILE_APPEND_DATA) > 0)
+            {
+                // FILE_NO_INTERMEDIATE_BUFFERING is incompatible with FILE_APPEND_DATA
+                // [MS-SMB2] 3.3.5.9 suggests setting FILE_APPEND_DATA to zero in this case.
+                desiredAccess = (AccessMask)((uint)desiredAccess & (uint)~FileAccessMask.FILE_APPEND_DATA);
+            }
+
             NTStatus status = CreateFile(out fileHandle, out fileStatus, nativePath, desiredAccess, 0, fileAttributes, shareAccess, createDisposition, createOptions);
             handle = fileHandle;
             return status;