tst: winfsp-tests: WIP

This commit is contained in:
Bill Zissimopoulos 2016-10-26 13:16:27 -07:00
parent 17056b4f3f
commit ff7a446194
2 changed files with 66 additions and 68 deletions

View File

@ -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(
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
@ -113,22 +130,12 @@ HANDLE HookCreateFileW(
HANDLE hTemplateFile)
{
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
TOKEN_PRIVILEGES Privileges;
HANDLE Handle;
PrepareFileName(lpFileName, FileNameBuf);
if (OptNoTraverseToken)
{
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(
MaybeAdjustTraversePrivilege(FALSE);
Handle = (OptResilient ? ResilientCreateFileW : CreateFileW)(
FileNameBuf,
dwDesiredAccess,
dwShareMode,
@ -136,49 +143,15 @@ HANDLE HookCreateFileW(
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,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile,
h, INVALID_HANDLE_VALUE != h ? 0 : LastError);
#endif
SetLastError(LastError);
return h;
MaybeAdjustTraversePrivilege(TRUE);
return Handle;
}
BOOL HookCloseHandle(
HANDLE hObject)
{
if (!OptResilient)
return CloseHandle(hObject);
else
return ResilientCloseHandle(hObject);
return (OptResilient ? ResilientCloseHandle : CloseHandle)(
hObject);
}
BOOL HookCreateDirectoryW(
@ -186,33 +159,43 @@ BOOL HookCreateDirectoryW(
LPSECURITY_ATTRIBUTES lpSecurityAttributes)
{
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
BOOL Success;
PrepareFileName(lpPathName, FileNameBuf);
return CreateDirectoryW(FileNameBuf, lpSecurityAttributes);
MaybeAdjustTraversePrivilege(FALSE);
Success = CreateDirectoryW(FileNameBuf, lpSecurityAttributes);
MaybeAdjustTraversePrivilege(TRUE);
return Success;
}
BOOL HookDeleteFileW(
LPCWSTR lpFileName)
{
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
BOOL Success;
PrepareFileName(lpFileName, FileNameBuf);
if (!OptResilient)
return DeleteFileW(FileNameBuf);
else
return ResilientDeleteFileW(FileNameBuf);
MaybeAdjustTraversePrivilege(FALSE);
Success = (OptResilient ? ResilientDeleteFileW : DeleteFileW)(
FileNameBuf);
MaybeAdjustTraversePrivilege(TRUE);
return Success;
}
BOOL HookRemoveDirectoryW(
LPCWSTR lpPathName)
{
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
BOOL Success;
PrepareFileName(lpPathName, FileNameBuf);
return RemoveDirectoryW(FileNameBuf);
MaybeAdjustTraversePrivilege(FALSE);
Success = RemoveDirectoryW(FileNameBuf);
MaybeAdjustTraversePrivilege(TRUE);
return Success;
}
BOOL HookMoveFileExW(
@ -222,11 +205,15 @@ BOOL HookMoveFileExW(
{
WCHAR OldFileNameBuf[FILENAMEBUF_SIZE];
WCHAR NewFileNameBuf[FILENAMEBUF_SIZE];
BOOL Success;
PrepareFileName(lpExistingFileName, OldFileNameBuf);
PrepareFileName(lpNewFileName, NewFileNameBuf);
return MoveFileExW(OldFileNameBuf, NewFileNameBuf, dwFlags);
MaybeAdjustTraversePrivilege(FALSE);
Success = MoveFileExW(OldFileNameBuf, NewFileNameBuf, dwFlags);
MaybeAdjustTraversePrivilege(TRUE);
return Success;
}
HANDLE HookFindFirstFileW(
@ -234,8 +221,12 @@ HANDLE HookFindFirstFileW(
LPWIN32_FIND_DATAW lpFindFileData)
{
WCHAR FileNameBuf[FILENAMEBUF_SIZE];
HANDLE Handle;
PrepareFileName(lpFileName, FileNameBuf);
return FindFirstFileW(FileNameBuf, lpFindFileData);
MaybeAdjustTraversePrivilege(FALSE);
Handle = FindFirstFileW(FileNameBuf, lpFindFileData);
MaybeAdjustTraversePrivilege(TRUE);
return Handle;
}

View File

@ -215,6 +215,12 @@ void getfileinfo_name_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout)
else
ASSERT(0 == wcscmp(OrigPath, FinalPath)); /* don't use mywcscmp */
if (!OptNoTraverseToken || -1 != Flags)
{
/*
* FILE_NAME_NORMALIZED fails without Traverse privilege on NTFS.
* 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);
@ -225,6 +231,7 @@ void getfileinfo_name_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout)
(wcslen(FinalPath) + 1) * sizeof(WCHAR) - OptSharePrefixLength);
}
ASSERT(0 == wcscmp(OrigPath, FinalPath)); /* don't use mywcscmp */
}
CloseHandle(Handle);