mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-29 19:18:39 -05:00 
			
		
		
		
	tst: winfsp-tests: ResilientNtCreateFile
This commit is contained in:
		| @@ -19,6 +19,15 @@ | |||||||
|  * associated repository. |  * associated repository. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | #define WIN32_NO_STATUS | ||||||
|  | #include <windows.h> | ||||||
|  | #undef WIN32_NO_STATUS | ||||||
|  | #include <winternl.h> | ||||||
|  | #pragma warning(push) | ||||||
|  | #pragma warning(disable:4005)           /* macro redefinition */ | ||||||
|  | #include <ntstatus.h> | ||||||
|  | #pragma warning(pop) | ||||||
|  |  | ||||||
| #define WINFSP_TESTS_NO_HOOKS | #define WINFSP_TESTS_NO_HOOKS | ||||||
| #include "winfsp-tests.h" | #include "winfsp-tests.h" | ||||||
| #include <winfsp/winfsp.h> | #include <winfsp/winfsp.h> | ||||||
| @@ -266,6 +275,40 @@ static VOID MaybeAdjustTraversePrivilege(BOOL Enable) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | NTSTATUS NTAPI HookNtCreateFile( | ||||||
|  |     PHANDLE FileHandle, | ||||||
|  |     ACCESS_MASK DesiredAccess, | ||||||
|  |     POBJECT_ATTRIBUTES ObjectAttributes, | ||||||
|  |     PIO_STATUS_BLOCK IoStatusBlock, | ||||||
|  |     PLARGE_INTEGER AllocationSize, | ||||||
|  |     ULONG FileAttributes, | ||||||
|  |     ULONG ShareAccess, | ||||||
|  |     ULONG CreateDisposition, | ||||||
|  |     ULONG CreateOptions, | ||||||
|  |     PVOID EaBuffer, | ||||||
|  |     ULONG EaLength) | ||||||
|  | { | ||||||
|  |     return (OptResilient ? ResilientNtCreateFile : NtCreateFile)( | ||||||
|  |         FileHandle, | ||||||
|  |         DesiredAccess, | ||||||
|  |         ObjectAttributes, | ||||||
|  |         IoStatusBlock, | ||||||
|  |         AllocationSize, | ||||||
|  |         FileAttributes, | ||||||
|  |         ShareAccess, | ||||||
|  |         CreateDisposition, | ||||||
|  |         CreateOptions, | ||||||
|  |         EaBuffer, | ||||||
|  |         EaLength); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | NTSTATUS NTAPI HookNtClose( | ||||||
|  |     HANDLE Handle) | ||||||
|  | { | ||||||
|  |     return (OptResilient ? ResilientNtClose : NtClose)( | ||||||
|  |         Handle); | ||||||
|  | } | ||||||
|  |  | ||||||
| HANDLE WINAPI HookCreateFileW( | HANDLE WINAPI HookCreateFileW( | ||||||
|     LPCWSTR lpFileName, |     LPCWSTR lpFileName, | ||||||
|     DWORD dwDesiredAccess, |     DWORD dwDesiredAccess, | ||||||
|   | |||||||
| @@ -19,13 +19,94 @@ | |||||||
|  * associated repository. |  * associated repository. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | #define WIN32_NO_STATUS | ||||||
| #include <windows.h> | #include <windows.h> | ||||||
|  | #undef WIN32_NO_STATUS | ||||||
|  | #include <winternl.h> | ||||||
|  | #pragma warning(push) | ||||||
|  | #pragma warning(disable:4005)           /* macro redefinition */ | ||||||
|  | #include <ntstatus.h> | ||||||
|  | #pragma warning(pop) | ||||||
|  |  | ||||||
| #define DeleteMaxTries                  30 | #define DeleteMaxTries                  30 | ||||||
| #define DeleteSleepTimeout              300 | #define DeleteSleepTimeout              300 | ||||||
|  |  | ||||||
| static VOID WaitDeletePending(PCWSTR FileName); | static VOID WaitDeletePending(PCWSTR FileName); | ||||||
|  |  | ||||||
|  | NTSTATUS NTAPI ResilientNtCreateFile( | ||||||
|  |     PHANDLE PFileHandle, | ||||||
|  |     ACCESS_MASK DesiredAccess, | ||||||
|  |     POBJECT_ATTRIBUTES ObjectAttributes, | ||||||
|  |     PIO_STATUS_BLOCK IoStatusBlock, | ||||||
|  |     PLARGE_INTEGER AllocationSize, | ||||||
|  |     ULONG FileAttributes, | ||||||
|  |     ULONG ShareAccess, | ||||||
|  |     ULONG CreateDisposition, | ||||||
|  |     ULONG CreateOptions, | ||||||
|  |     PVOID EaBuffer, | ||||||
|  |     ULONG EaLength) | ||||||
|  | { | ||||||
|  |     DWORD LastError = GetLastError(); /* preserve last error */ | ||||||
|  |     NTSTATUS Result; | ||||||
|  |  | ||||||
|  |     Result = NtCreateFile( | ||||||
|  |         PFileHandle, | ||||||
|  |         DesiredAccess, | ||||||
|  |         ObjectAttributes, | ||||||
|  |         IoStatusBlock, | ||||||
|  |         AllocationSize, | ||||||
|  |         FileAttributes, | ||||||
|  |         ShareAccess, | ||||||
|  |         CreateDisposition, | ||||||
|  |         CreateOptions, | ||||||
|  |         EaBuffer, | ||||||
|  |         EaLength); | ||||||
|  |  | ||||||
|  |     if (NT_SUCCESS(Result) && | ||||||
|  |         (FILE_DELETE_ON_CLOSE & CreateOptions)) | ||||||
|  |     { | ||||||
|  |         /* HACK: remember FILE_DELETE_ON_CLOSE through HANDLE_FLAG_PROTECT_FROM_CLOSE */ | ||||||
|  |         SetHandleInformation(*PFileHandle, | ||||||
|  |             HANDLE_FLAG_PROTECT_FROM_CLOSE, HANDLE_FLAG_PROTECT_FROM_CLOSE); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     SetLastError(LastError); | ||||||
|  |     return Result; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | NTSTATUS NTAPI ResilientNtClose( | ||||||
|  |     HANDLE Handle) | ||||||
|  | { | ||||||
|  |     DWORD LastError = GetLastError(); /* preserve last error */ | ||||||
|  |     NTSTATUS Result; | ||||||
|  |     DWORD HandleFlags = 0, FileNameLen; | ||||||
|  |     WCHAR FileNameBuf[sizeof "\\\\?\\GLOBALROOT" - 1 + 1024] = L"\\\\?\\GLOBALROOT"; | ||||||
|  |  | ||||||
|  |     if (GetHandleInformation(Handle, &HandleFlags) && | ||||||
|  |         (HANDLE_FLAG_PROTECT_FROM_CLOSE & HandleFlags)) | ||||||
|  |     { | ||||||
|  |         SetHandleInformation(Handle, | ||||||
|  |             HANDLE_FLAG_PROTECT_FROM_CLOSE, 0); | ||||||
|  |         FileNameLen = GetFinalPathNameByHandle(Handle, | ||||||
|  |             FileNameBuf + sizeof "\\\\?\\GLOBALROOT" - 1, 1023, | ||||||
|  |             FILE_NAME_OPENED | VOLUME_NAME_NT); | ||||||
|  |         if (0 == FileNameLen || FileNameLen >= 1024) | ||||||
|  |             HandleFlags = 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     Result = NtClose( | ||||||
|  |         Handle); | ||||||
|  |  | ||||||
|  |     if (NT_SUCCESS(Result)) | ||||||
|  |     { | ||||||
|  |         if (HANDLE_FLAG_PROTECT_FROM_CLOSE & HandleFlags) | ||||||
|  |             WaitDeletePending(FileNameBuf); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     SetLastError(LastError); | ||||||
|  |     return Result; | ||||||
|  | } | ||||||
|  |  | ||||||
| HANDLE WINAPI ResilientCreateFileW( | HANDLE WINAPI ResilientCreateFileW( | ||||||
|     LPCWSTR lpFileName, |     LPCWSTR lpFileName, | ||||||
|     DWORD dwDesiredAccess, |     DWORD dwDesiredAccess, | ||||||
|   | |||||||
| @@ -32,6 +32,22 @@ | |||||||
| #define testalpha(c)                    ('a' <= ((c) | 0x20) && ((c) | 0x20) <= 'z') | #define testalpha(c)                    ('a' <= ((c) | 0x20) && ((c) | 0x20) <= 'z') | ||||||
| #define togglealpha(c)                  ((c) ^ 0x20) | #define togglealpha(c)                  ((c) ^ 0x20) | ||||||
|  |  | ||||||
|  | #if defined (_WINTERNL_) | ||||||
|  | NTSTATUS NTAPI HookNtCreateFile( | ||||||
|  |     PHANDLE FileHandle, | ||||||
|  |     ACCESS_MASK DesiredAccess, | ||||||
|  |     POBJECT_ATTRIBUTES ObjectAttributes, | ||||||
|  |     PIO_STATUS_BLOCK IoStatusBlock, | ||||||
|  |     PLARGE_INTEGER AllocationSize, | ||||||
|  |     ULONG FileAttributes, | ||||||
|  |     ULONG ShareAccess, | ||||||
|  |     ULONG CreateDisposition, | ||||||
|  |     ULONG CreateOptions, | ||||||
|  |     PVOID EaBuffer, | ||||||
|  |     ULONG EaLength); | ||||||
|  | NTSTATUS NTAPI HookNtClose( | ||||||
|  |     HANDLE Handle); | ||||||
|  | #endif | ||||||
| HANDLE WINAPI HookCreateFileW( | HANDLE WINAPI HookCreateFileW( | ||||||
|     LPCWSTR lpFileName, |     LPCWSTR lpFileName, | ||||||
|     DWORD dwDesiredAccess, |     DWORD dwDesiredAccess, | ||||||
| @@ -106,6 +122,8 @@ BOOL WINAPI HookCreateProcessW( | |||||||
|     LPSTARTUPINFOW lpStartupInfo, |     LPSTARTUPINFOW lpStartupInfo, | ||||||
|     LPPROCESS_INFORMATION lpProcessInformation); |     LPPROCESS_INFORMATION lpProcessInformation); | ||||||
| #if !defined(WINFSP_TESTS_NO_HOOKS) | #if !defined(WINFSP_TESTS_NO_HOOKS) | ||||||
|  | #define NtCreateFile HookNtCreateFile | ||||||
|  | #define NtClose HookNtClose | ||||||
| #define CreateFileW HookCreateFileW | #define CreateFileW HookCreateFileW | ||||||
| #define CloseHandle HookCloseHandle | #define CloseHandle HookCloseHandle | ||||||
| #define SetFileAttributesW HookSetFileAttributesW | #define SetFileAttributesW HookSetFileAttributesW | ||||||
| @@ -122,6 +140,22 @@ BOOL WINAPI HookCreateProcessW( | |||||||
| #define CreateProcessW HookCreateProcessW | #define CreateProcessW HookCreateProcessW | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #if defined (_WINTERNL_) | ||||||
|  | NTSTATUS NTAPI ResilientNtCreateFile( | ||||||
|  |     PHANDLE FileHandle, | ||||||
|  |     ACCESS_MASK DesiredAccess, | ||||||
|  |     POBJECT_ATTRIBUTES ObjectAttributes, | ||||||
|  |     PIO_STATUS_BLOCK IoStatusBlock, | ||||||
|  |     PLARGE_INTEGER AllocationSize, | ||||||
|  |     ULONG FileAttributes, | ||||||
|  |     ULONG ShareAccess, | ||||||
|  |     ULONG CreateDisposition, | ||||||
|  |     ULONG CreateOptions, | ||||||
|  |     PVOID EaBuffer, | ||||||
|  |     ULONG EaLength); | ||||||
|  | NTSTATUS NTAPI ResilientNtClose( | ||||||
|  |     HANDLE Handle); | ||||||
|  | #endif | ||||||
| HANDLE WINAPI ResilientCreateFileW( | HANDLE WINAPI ResilientCreateFileW( | ||||||
|     LPCWSTR lpFileName, |     LPCWSTR lpFileName, | ||||||
|     DWORD dwDesiredAccess, |     DWORD dwDesiredAccess, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user