Author: gadamopoulos
Date: Sun Jan 15 00:42:10 2017
New Revision: 73551
URL:
http://svn.reactos.org/svn/reactos?rev=73551&view=rev
Log:
[NTDLL_APITEST]
- Add more tests for RtlDosApplyFileIsolationRedirection_Ustr. Unfortunately creating
.local files and making it have instant effect seems to be impossible. So I added tests
for .local than can be enabled to show that this is indeed the behaviour but I have
disabled them to avoid random failed tests.
Modified:
trunk/rostests/apitests/ntdll/RtlDosApplyFileIsolationRedirection_Ustr.c
Modified: trunk/rostests/apitests/ntdll/RtlDosApplyFileIsolationRedirection_Ustr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ntdll/RtlDosAppl…
==============================================================================
--- trunk/rostests/apitests/ntdll/RtlDosApplyFileIsolationRedirection_Ustr.c [iso-8859-1]
(original)
+++ trunk/rostests/apitests/ntdll/RtlDosApplyFileIsolationRedirection_Ustr.c [iso-8859-1]
Sun Jan 15 00:42:10 2017
@@ -13,72 +13,152 @@
#define ok_eq_hex(value, expected) ok((value) == (expected), #value " = 0x%lx,
expected 0x%lx\n", value, expected)
#define ok_eq_pointer(value, expected) ok((value) == (expected), #value " = %p,
expected %p\n", value, expected)
+#define EXPECT_IN_SAME_DIR (WCHAR*)0xdead
+
UNICODE_STRING DotDll = RTL_CONSTANT_STRING(L".DLL");
-void TestDefaultSxsRedirection(void)
+struct test_data
{
- UNICODE_STRING GdiPlusSXS =
RTL_CONSTANT_STRING(L"\\WinSxS\\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.");
- UNICODE_STRING Comctl32SXS =
RTL_CONSTANT_STRING(L"\\WinSxS\\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82");
- UNICODE_STRING Comctl32 = RTL_CONSTANT_STRING(L"COMCTL32.DLL");
- UNICODE_STRING GdiPlus = RTL_CONSTANT_STRING(L"GDIPLUS.DLL");
- UNICODE_STRING CallerBuffer;
- UNICODE_STRING DynamicString;
- PUNICODE_STRING FullNameOut;
- USHORT Position;
+ int testline;
+ NTSTATUS ExpectedStatus;
+ WCHAR* Param;
+ WCHAR* ExpectedSubString;
+};
+struct test_data Tests[] =
+{
+ /* Not redirected file */
+ {__LINE__, STATUS_SXS_KEY_NOT_FOUND, L"somefilesomefile", NULL},
+ {__LINE__, STATUS_SXS_KEY_NOT_FOUND, L"ntdll.dll", NULL},
+ /* Files redirected with sxs */
+ {__LINE__, STATUS_SUCCESS, L"GDIPLUS",
L"\\winsxs\\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1."},
+ {__LINE__, STATUS_SUCCESS, L"GDIPLUS.DLL",
L"\\winsxs\\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1."},
+ {__LINE__, STATUS_SUCCESS, L"COMCTL32.DLL",
L"\\winsxs\\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82"},
+ {__LINE__, STATUS_SUCCESS, L"comctl32.DLL",
L"\\winsxs\\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82"},
+ {__LINE__, STATUS_SUCCESS, L"c:\\windows\\system32\\comctl32.DLL",
L"\\winsxs\\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82"},
+ /* This is a weird case; the source doesn't exist but does get redirected */
+ {__LINE__, STATUS_SUCCESS, L"c:\\windows\\system32\\gdiplus.DLL",
L"\\winsxs\\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1."},
+ /* But redirecting gdiplus from a different directory doesn't work */
+ {__LINE__, STATUS_SXS_KEY_NOT_FOUND, L"c:\\GDIPLUS.DLL", NULL},
+ {__LINE__, STATUS_SXS_KEY_NOT_FOUND, L"c:\\comctl32.DLL", NULL},
+#if 0
+ /* Redirection based on .local */
+ {__LINE__, STATUS_SUCCESS, L"test", EXPECT_IN_SAME_DIR},
+ {__LINE__, STATUS_SUCCESS, L"test.dll", EXPECT_IN_SAME_DIR},
+ {__LINE__, STATUS_SUCCESS, L"c:\\test.dll", EXPECT_IN_SAME_DIR},
+ /* known dlls are also covered */
+ {__LINE__, STATUS_SUCCESS, L"shell32", EXPECT_IN_SAME_DIR},
+ {__LINE__, STATUS_SUCCESS, L"shell32.dll", EXPECT_IN_SAME_DIR},
+ {__LINE__, STATUS_SUCCESS, L"c:\\shell32.dll", EXPECT_IN_SAME_DIR}
+#endif
+};
+
+void TestRedirection(void)
+{
+ WCHAR SystemDir[MAX_PATH];
+ WCHAR TestPath[MAX_PATH];
+ WCHAR ParameterBuffer[MAX_PATH];
+ WCHAR* separator;
NTSTATUS Status;
+ int i;
- /* NOTE: in xp and 2k3 gdiplus does not exist in system32 */
- RtlInitUnicodeString(&CallerBuffer, NULL);
- RtlInitUnicodeString(&DynamicString, NULL);
- FullNameOut = NULL;
- Status = RtlDosApplyFileIsolationRedirection_Ustr(TRUE,
- &GdiPlus,
- &DotDll,
- &CallerBuffer,
- &DynamicString,
- &FullNameOut,
- NULL,
- NULL,
- NULL);
- ok_eq_hex(Status, STATUS_SUCCESS);
- ok_eq_pointer(CallerBuffer.Buffer, NULL);
- ok_eq_pointer(FullNameOut, &DynamicString);
- Status =
RtlFindCharInUnicodeString(RTL_FIND_CHAR_IN_UNICODE_STRING_CASE_INSENSITIVE,
- &GdiPlusSXS,
- &DynamicString,
- &Position);
- ok_eq_hex(Status, STATUS_SUCCESS);
-
-
- RtlInitUnicodeString(&CallerBuffer, NULL);
- RtlInitUnicodeString(&DynamicString, NULL);
- FullNameOut = NULL;
- Status = RtlDosApplyFileIsolationRedirection_Ustr(TRUE,
- &Comctl32,
- &DotDll,
- &CallerBuffer,
- &DynamicString,
- &FullNameOut,
- NULL,
- NULL,
- NULL);
- ok_eq_hex(Status, STATUS_SUCCESS);
- ok_eq_pointer(CallerBuffer.Buffer, NULL);
- ok_eq_pointer(FullNameOut, &DynamicString);
- Status =
RtlFindCharInUnicodeString(RTL_FIND_CHAR_IN_UNICODE_STRING_CASE_INSENSITIVE,
- &Comctl32SXS,
- &DynamicString,
- &Position);
- ok_eq_hex(Status, STATUS_SUCCESS);
-}
+ GetSystemDirectoryW(SystemDir, MAX_PATH);
+ GetModuleFileNameW(NULL, TestPath, MAX_PATH);
+ separator = wcsrchr(TestPath, L'\\');
+ separator++;
+ *separator = 0;
-void TestDotLocal(void)
-{
+ for (i = 0; i < _countof(Tests); i ++)
+ {
+ UNICODE_STRING OriginalName, DynamicString;
+ PUNICODE_STRING StringUsed = NULL;
+
+ if (memcmp(Tests[i].Param, L"c:\\windows\\system32", 38) == 0)
+ {
+ wcscpy(ParameterBuffer, SystemDir);
+ wcscat(ParameterBuffer, &Tests[i].Param[19]);
+ }
+ else
+ {
+ wcscpy(ParameterBuffer, Tests[i].Param);
+ }
+
+ RtlInitUnicodeString(&OriginalName, ParameterBuffer);
+ RtlInitEmptyUnicodeString(&DynamicString, NULL, 0);
+
+ Status = RtlDosApplyFileIsolationRedirection_Ustr(TRUE,
+ &OriginalName,
+ &DotDll,
+ NULL,
+ &DynamicString,
+ &StringUsed,
+ NULL,
+ NULL,
+ NULL);
+ ok(Status == Tests[i].ExpectedStatus, "Status 0x%lx, expected 0x%lx\n",
value, expected)
+ ok_eq_hex(Status, Tests[i].ExpectedStatus);
+
+ if (DynamicString.Buffer)
+ {
+ BOOL exists = RtlDoesFileExists_U(DynamicString.Buffer);
+ ok(exists, "%d: Expected file %S to exist!\n", Tests[i].testline,
DynamicString.Buffer);
+ }
+
+ if(Tests[i].ExpectedSubString && DynamicString.Buffer == NULL)
+ {
+ ok(0, "%d: Expected a returned string\n", Tests[i].testline);
+ }
+
+ if (Tests[i].ExpectedSubString && DynamicString.Buffer != NULL)
+ {
+ if (Tests[i].ExpectedSubString == EXPECT_IN_SAME_DIR)
+ {
+ ok(wcsstr(DynamicString.Buffer, TestPath) != 0, "%d: Expected string
%S in %S\n", Tests[i].testline, TestPath, DynamicString.Buffer);
+ }
+ else
+ {
+ RtlDowncaseUnicodeString(&DynamicString, &DynamicString, FALSE);
+ ok(wcsstr(DynamicString.Buffer, Tests[i].ExpectedSubString) != 0,
"%d: Expected string %S in %S\n", Tests[i].testline, Tests[i].ExpectedSubString,
DynamicString.Buffer);
+ }
+ }
+ }
}
START_TEST(RtlDosApplyFileIsolationRedirection_Ustr)
{
- TestDotLocal();
- TestDefaultSxsRedirection();
+#if 0
+ WCHAR TestPath[MAX_PATH];
+ WCHAR* separator;
+ STARTUPINFOW si = { sizeof(si) };
+ PROCESS_INFORMATION pi;
+ BOOL created;
+ HANDLE file;
+
+ /* Create .local files */
+ GetModuleFileNameW(NULL, TestPath, MAX_PATH);
+
+ wcscat(TestPath, L".local");
+ file = CreateFileW(TestPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_FLAG_NO_BUFFERING , NULL);
+ CloseHandle(file);
+ separator = wcsrchr(TestPath, L'\\');
+ separator++;
+ wcscpy(separator, L"test.dll");
+ file = CreateFileW(TestPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_FLAG_NO_BUFFERING , NULL);
+ CloseHandle(file);
+ wcscpy(separator, L"shell32.dll");
+ file = CreateFileW(TestPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_FLAG_NO_BUFFERING , NULL);
+ CloseHandle(file);
+ *separator = 0;
+#endif
+ TestRedirection();
+#if 0
+ /*Cleanup*/
+ wcscpy(separator, L"test.dll");
+ DeleteFileW(TestPath);
+ wcscpy(separator, L"shell32.dll");
+ DeleteFileW(TestPath);
+ GetModuleFileNameW(NULL, TestPath, MAX_PATH);
+ wcscat(TestPath, L".local");
+ DeleteFileW(TestPath);
+#endif
}