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( 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;
} }

View File

@ -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);