mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 00:43:00 -05:00
tst: winfsp-tests: WIP
This commit is contained in:
parent
17056b4f3f
commit
ff7a446194
@ -103,6 +103,23 @@ static VOID PrepareFileName(PCWSTR FileName, PWSTR FileNameBuf)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VOID MaybeAdjustTraversePrivilege(BOOL Enable)
|
||||||
|
{
|
||||||
|
if (OptNoTraverseToken)
|
||||||
|
{
|
||||||
|
TOKEN_PRIVILEGES Privileges;
|
||||||
|
DWORD LastError = GetLastError();
|
||||||
|
|
||||||
|
Privileges.PrivilegeCount = 1;
|
||||||
|
Privileges.Privileges[0].Attributes = Enable ? SE_PRIVILEGE_ENABLED : 0;
|
||||||
|
Privileges.Privileges[0].Luid = OptNoTraverseLuid;
|
||||||
|
if (!AdjustTokenPrivileges(OptNoTraverseToken, FALSE, &Privileges, 0, 0, 0))
|
||||||
|
ABORT("cannot adjust traverse privilege");
|
||||||
|
|
||||||
|
SetLastError(LastError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HANDLE HookCreateFileW(
|
HANDLE HookCreateFileW(
|
||||||
LPCWSTR lpFileName,
|
LPCWSTR lpFileName,
|
||||||
DWORD dwDesiredAccess,
|
DWORD dwDesiredAccess,
|
||||||
@ -113,72 +130,28 @@ HANDLE HookCreateFileW(
|
|||||||
HANDLE hTemplateFile)
|
HANDLE hTemplateFile)
|
||||||
{
|
{
|
||||||
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
|
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
|
||||||
TOKEN_PRIVILEGES Privileges;
|
HANDLE Handle;
|
||||||
|
|
||||||
PrepareFileName(lpFileName, FileNameBuf);
|
PrepareFileName(lpFileName, FileNameBuf);
|
||||||
|
|
||||||
if (OptNoTraverseToken)
|
MaybeAdjustTraversePrivilege(FALSE);
|
||||||
{
|
Handle = (OptResilient ? ResilientCreateFileW : CreateFileW)(
|
||||||
Privileges.PrivilegeCount = 1;
|
|
||||||
Privileges.Privileges[0].Attributes = 0;
|
|
||||||
Privileges.Privileges[0].Luid = OptNoTraverseLuid;
|
|
||||||
if (!AdjustTokenPrivileges(OptNoTraverseToken, FALSE, &Privileges, 0, 0, 0))
|
|
||||||
ABORT("cannot disable traverse privilege");
|
|
||||||
}
|
|
||||||
|
|
||||||
HANDLE h;
|
|
||||||
if (!OptResilient)
|
|
||||||
h = CreateFileW(
|
|
||||||
FileNameBuf,
|
|
||||||
dwDesiredAccess,
|
|
||||||
dwShareMode,
|
|
||||||
lpSecurityAttributes,
|
|
||||||
dwCreationDisposition,
|
|
||||||
dwFlagsAndAttributes,
|
|
||||||
hTemplateFile);
|
|
||||||
else
|
|
||||||
h = ResilientCreateFileW(
|
|
||||||
FileNameBuf,
|
|
||||||
dwDesiredAccess,
|
|
||||||
dwShareMode,
|
|
||||||
lpSecurityAttributes,
|
|
||||||
dwCreationDisposition,
|
|
||||||
dwFlagsAndAttributes,
|
|
||||||
hTemplateFile);
|
|
||||||
DWORD LastError = GetLastError();
|
|
||||||
|
|
||||||
if (OptNoTraverseToken)
|
|
||||||
{
|
|
||||||
Privileges.PrivilegeCount = 1;
|
|
||||||
Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|
||||||
Privileges.Privileges[0].Luid = OptNoTraverseLuid;
|
|
||||||
if (!AdjustTokenPrivileges(OptNoTraverseToken, FALSE, &Privileges, 0, 0, 0))
|
|
||||||
ABORT("cannot enable traverse privilege");
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
FspDebugLog("CreateFileW(\"%S\", %#lx, %#lx, %p, %#lx, %#lx, %p) = %p[%#lx]\n",
|
|
||||||
FileNameBuf,
|
FileNameBuf,
|
||||||
dwDesiredAccess,
|
dwDesiredAccess,
|
||||||
dwShareMode,
|
dwShareMode,
|
||||||
lpSecurityAttributes,
|
lpSecurityAttributes,
|
||||||
dwCreationDisposition,
|
dwCreationDisposition,
|
||||||
dwFlagsAndAttributes,
|
dwFlagsAndAttributes,
|
||||||
hTemplateFile,
|
hTemplateFile);
|
||||||
h, INVALID_HANDLE_VALUE != h ? 0 : LastError);
|
MaybeAdjustTraversePrivilege(TRUE);
|
||||||
#endif
|
return Handle;
|
||||||
|
|
||||||
SetLastError(LastError);
|
|
||||||
return h;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL HookCloseHandle(
|
BOOL HookCloseHandle(
|
||||||
HANDLE hObject)
|
HANDLE hObject)
|
||||||
{
|
{
|
||||||
if (!OptResilient)
|
return (OptResilient ? ResilientCloseHandle : CloseHandle)(
|
||||||
return CloseHandle(hObject);
|
hObject);
|
||||||
else
|
|
||||||
return ResilientCloseHandle(hObject);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL HookCreateDirectoryW(
|
BOOL HookCreateDirectoryW(
|
||||||
@ -186,33 +159,43 @@ BOOL HookCreateDirectoryW(
|
|||||||
LPSECURITY_ATTRIBUTES lpSecurityAttributes)
|
LPSECURITY_ATTRIBUTES lpSecurityAttributes)
|
||||||
{
|
{
|
||||||
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
|
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
|
||||||
|
BOOL Success;
|
||||||
|
|
||||||
PrepareFileName(lpPathName, FileNameBuf);
|
PrepareFileName(lpPathName, FileNameBuf);
|
||||||
|
|
||||||
return CreateDirectoryW(FileNameBuf, lpSecurityAttributes);
|
MaybeAdjustTraversePrivilege(FALSE);
|
||||||
|
Success = CreateDirectoryW(FileNameBuf, lpSecurityAttributes);
|
||||||
|
MaybeAdjustTraversePrivilege(TRUE);
|
||||||
|
return Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL HookDeleteFileW(
|
BOOL HookDeleteFileW(
|
||||||
LPCWSTR lpFileName)
|
LPCWSTR lpFileName)
|
||||||
{
|
{
|
||||||
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
|
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
|
||||||
|
BOOL Success;
|
||||||
|
|
||||||
PrepareFileName(lpFileName, FileNameBuf);
|
PrepareFileName(lpFileName, FileNameBuf);
|
||||||
|
|
||||||
if (!OptResilient)
|
MaybeAdjustTraversePrivilege(FALSE);
|
||||||
return DeleteFileW(FileNameBuf);
|
Success = (OptResilient ? ResilientDeleteFileW : DeleteFileW)(
|
||||||
else
|
FileNameBuf);
|
||||||
return ResilientDeleteFileW(FileNameBuf);
|
MaybeAdjustTraversePrivilege(TRUE);
|
||||||
|
return Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL HookRemoveDirectoryW(
|
BOOL HookRemoveDirectoryW(
|
||||||
LPCWSTR lpPathName)
|
LPCWSTR lpPathName)
|
||||||
{
|
{
|
||||||
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
|
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
|
||||||
|
BOOL Success;
|
||||||
|
|
||||||
PrepareFileName(lpPathName, FileNameBuf);
|
PrepareFileName(lpPathName, FileNameBuf);
|
||||||
|
|
||||||
return RemoveDirectoryW(FileNameBuf);
|
MaybeAdjustTraversePrivilege(FALSE);
|
||||||
|
Success = RemoveDirectoryW(FileNameBuf);
|
||||||
|
MaybeAdjustTraversePrivilege(TRUE);
|
||||||
|
return Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL HookMoveFileExW(
|
BOOL HookMoveFileExW(
|
||||||
@ -222,11 +205,15 @@ BOOL HookMoveFileExW(
|
|||||||
{
|
{
|
||||||
WCHAR OldFileNameBuf[FILENAMEBUF_SIZE];
|
WCHAR OldFileNameBuf[FILENAMEBUF_SIZE];
|
||||||
WCHAR NewFileNameBuf[FILENAMEBUF_SIZE];
|
WCHAR NewFileNameBuf[FILENAMEBUF_SIZE];
|
||||||
|
BOOL Success;
|
||||||
|
|
||||||
PrepareFileName(lpExistingFileName, OldFileNameBuf);
|
PrepareFileName(lpExistingFileName, OldFileNameBuf);
|
||||||
PrepareFileName(lpNewFileName, NewFileNameBuf);
|
PrepareFileName(lpNewFileName, NewFileNameBuf);
|
||||||
|
|
||||||
return MoveFileExW(OldFileNameBuf, NewFileNameBuf, dwFlags);
|
MaybeAdjustTraversePrivilege(FALSE);
|
||||||
|
Success = MoveFileExW(OldFileNameBuf, NewFileNameBuf, dwFlags);
|
||||||
|
MaybeAdjustTraversePrivilege(TRUE);
|
||||||
|
return Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE HookFindFirstFileW(
|
HANDLE HookFindFirstFileW(
|
||||||
@ -234,8 +221,12 @@ HANDLE HookFindFirstFileW(
|
|||||||
LPWIN32_FIND_DATAW lpFindFileData)
|
LPWIN32_FIND_DATAW lpFindFileData)
|
||||||
{
|
{
|
||||||
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
|
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
|
||||||
|
HANDLE Handle;
|
||||||
|
|
||||||
PrepareFileName(lpFileName, FileNameBuf);
|
PrepareFileName(lpFileName, FileNameBuf);
|
||||||
|
|
||||||
return FindFirstFileW(FileNameBuf, lpFindFileData);
|
MaybeAdjustTraversePrivilege(FALSE);
|
||||||
|
Handle = FindFirstFileW(FileNameBuf, lpFindFileData);
|
||||||
|
MaybeAdjustTraversePrivilege(TRUE);
|
||||||
|
return Handle;
|
||||||
}
|
}
|
||||||
|
@ -215,16 +215,23 @@ void getfileinfo_name_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout)
|
|||||||
else
|
else
|
||||||
ASSERT(0 == wcscmp(OrigPath, FinalPath)); /* don't use mywcscmp */
|
ASSERT(0 == wcscmp(OrigPath, FinalPath)); /* don't use mywcscmp */
|
||||||
|
|
||||||
Result = GetFinalPathNameByHandleW(
|
if (!OptNoTraverseToken || -1 != Flags)
|
||||||
Handle, FinalPath, MAX_PATH - 1, VOLUME_NAME_NONE | FILE_NAME_NORMALIZED);
|
|
||||||
ASSERT(0 != Result && Result < MAX_PATH);
|
|
||||||
if (OptSharePrefixLength)
|
|
||||||
{
|
{
|
||||||
memmove(FinalPath,
|
/*
|
||||||
FinalPath + OptSharePrefixLength / sizeof(WCHAR),
|
* FILE_NAME_NORMALIZED fails without Traverse privilege on NTFS.
|
||||||
(wcslen(FinalPath) + 1) * sizeof(WCHAR) - OptSharePrefixLength);
|
* FILE_NAME_OPENED succeeds. Go figure!
|
||||||
|
*/
|
||||||
|
Result = GetFinalPathNameByHandleW(
|
||||||
|
Handle, FinalPath, MAX_PATH - 1, VOLUME_NAME_NONE | FILE_NAME_NORMALIZED);
|
||||||
|
ASSERT(0 != Result && Result < MAX_PATH);
|
||||||
|
if (OptSharePrefixLength)
|
||||||
|
{
|
||||||
|
memmove(FinalPath,
|
||||||
|
FinalPath + OptSharePrefixLength / sizeof(WCHAR),
|
||||||
|
(wcslen(FinalPath) + 1) * sizeof(WCHAR) - OptSharePrefixLength);
|
||||||
|
}
|
||||||
|
ASSERT(0 == wcscmp(OrigPath, FinalPath)); /* don't use mywcscmp */
|
||||||
}
|
}
|
||||||
ASSERT(0 == wcscmp(OrigPath, FinalPath)); /* don't use mywcscmp */
|
|
||||||
|
|
||||||
CloseHandle(Handle);
|
CloseHandle(Handle);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user