From dfbda03f6cc94cc825c3e47c88357ed68f0f92a2 Mon Sep 17 00:00:00 2001 From: Tal Aloni Date: Thu, 31 Aug 2017 15:58:43 +0300 Subject: [PATCH] NTDirectoryFileSystem: Pass-through LockFile / UnlockFile requests --- SMBLibrary/Enums/NTStatus.cs | 2 ++ .../Win32/NTFileStore/NTDirectoryFileSystem.cs | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/SMBLibrary/Enums/NTStatus.cs b/SMBLibrary/Enums/NTStatus.cs index 353a3a0..9080b77 100644 --- a/SMBLibrary/Enums/NTStatus.cs +++ b/SMBLibrary/Enums/NTStatus.cs @@ -32,6 +32,7 @@ namespace SMBLibrary STATUS_DATA_ERROR = 0xC000003E, // IO error STATUS_SHARING_VIOLATION = 0xC0000043, STATUS_FILE_LOCK_CONFLICT = 0xC0000054, + STATUS_LOCK_NOT_GRANTED = 0xC0000055, STATUS_PRIVILEGE_NOT_HELD = 0xC0000061, STATUS_LOGON_FAILURE = 0xC000006D, // Authentication failure. STATUS_ACCOUNT_RESTRICTION = 0xC000006E, // The user has an empty password, which is not allowed @@ -39,6 +40,7 @@ namespace SMBLibrary STATUS_INVALID_WORKSTATION = 0xC0000070, STATUS_PASSWORD_EXPIRED = 0xC0000071, STATUS_ACCOUNT_DISABLED = 0xC0000072, + STATUS_RANGE_NOT_LOCKED = 0xC000007E, STATUS_DISK_FULL = 0xC000007F, STATUS_INSUFFICIENT_RESOURCES = 0xC000009A, STATUS_MEDIA_WRITE_PROTECTED = 0xC00000A2, diff --git a/SMBLibrary/Win32/NTFileStore/NTDirectoryFileSystem.cs b/SMBLibrary/Win32/NTFileStore/NTDirectoryFileSystem.cs index 32af00d..5a3ad26 100644 --- a/SMBLibrary/Win32/NTFileStore/NTDirectoryFileSystem.cs +++ b/SMBLibrary/Win32/NTFileStore/NTDirectoryFileSystem.cs @@ -73,7 +73,7 @@ namespace SMBLibrary.Win32 [DllImport("ntdll.dll", ExactSpelling = true, SetLastError = false)] private static extern NTStatus NtClose(IntPtr handle); - + [DllImport("ntdll.dll", ExactSpelling = true, SetLastError = false)] private static extern NTStatus NtReadFile(IntPtr handle, IntPtr evt, IntPtr apcRoutine, IntPtr apcContext, out IO_STATUS_BLOCK ioStatusBlock, byte[] buffer, uint length, ref long byteOffset, IntPtr key); @@ -82,7 +82,13 @@ namespace SMBLibrary.Win32 [DllImport("ntdll.dll", ExactSpelling = true, SetLastError = false)] private static extern NTStatus NtFlushBuffersFile(IntPtr handle, out IO_STATUS_BLOCK ioStatusBlock); - + + [DllImport("ntdll.dll", ExactSpelling = true, SetLastError = false)] + private static extern NTStatus NtLockFile(IntPtr handle, IntPtr evt, IntPtr apcRoutine, IntPtr apcContext, out IO_STATUS_BLOCK ioStatusBlock, ref long byteOffset, ref long length, uint key, bool failImmediately, bool exclusiveLock); + + [DllImport("ntdll.dll", ExactSpelling = true, SetLastError = false)] + private static extern NTStatus NtUnlockFile(IntPtr handle, out IO_STATUS_BLOCK ioStatusBlock, ref long byteOffset, ref long length, uint key); + [DllImport("ntdll.dll", ExactSpelling = true, SetLastError = false)] private static extern NTStatus NtQueryDirectoryFile(IntPtr handle, IntPtr evt, IntPtr apcRoutine, IntPtr apcContext, out IO_STATUS_BLOCK ioStatusBlock, byte[] fileInformation, uint length, uint fileInformationClass, bool returnSingleEntry, ref UNICODE_STRING fileName, bool restartScan); @@ -227,12 +233,14 @@ namespace SMBLibrary.Win32 public NTStatus LockFile(object handle, long byteOffset, long length, bool exclusiveLock) { - return NTStatus.STATUS_NOT_SUPPORTED; + IO_STATUS_BLOCK ioStatusBlock; + return NtLockFile((IntPtr)handle, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, out ioStatusBlock, ref byteOffset, ref length, 0, true, exclusiveLock); } public NTStatus UnlockFile(object handle, long byteOffset, long length) { - return NTStatus.STATUS_NOT_SUPPORTED; + IO_STATUS_BLOCK ioStatusBlock; + return NtUnlockFile((IntPtr)handle, out ioStatusBlock, ref byteOffset, ref length, 0); } public NTStatus QueryDirectory(out List result, object handle, string fileName, FileInformationClass informationClass)