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,22 +130,12 @@ 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, FileNameBuf,
dwDesiredAccess, dwDesiredAccess,
dwShareMode, dwShareMode,
@ -136,49 +143,15 @@ HANDLE HookCreateFileW(
dwCreationDisposition, dwCreationDisposition,
dwFlagsAndAttributes, dwFlagsAndAttributes,
hTemplateFile); hTemplateFile);
else MaybeAdjustTraversePrivilege(TRUE);
h = ResilientCreateFileW( return Handle;
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;
} }
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,6 +215,12 @@ 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 */
if (!OptNoTraverseToken || -1 != Flags)
{
/*
* FILE_NAME_NORMALIZED fails without Traverse privilege on NTFS.
* FILE_NAME_OPENED succeeds. Go figure!
*/
Result = GetFinalPathNameByHandleW( Result = GetFinalPathNameByHandleW(
Handle, FinalPath, MAX_PATH - 1, VOLUME_NAME_NONE | FILE_NAME_NORMALIZED); Handle, FinalPath, MAX_PATH - 1, VOLUME_NAME_NONE | FILE_NAME_NORMALIZED);
ASSERT(0 != Result && Result < MAX_PATH); 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); (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);