1 /* 2 * PROJECT: ReactOS API Tests 3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later) 4 * PURPOSE: Test for LdrLoadDll 5 * COPYRIGHT: Copyright 2017 Thomas Faber <thomas.faber@reactos.org> 6 * Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com> 7 */ 8 9 #include "precomp.h" 10 11 /* 12 13 NTSTATUS 14 NTAPI 15 LdrLoadDll( 16 IN PWSTR SearchPath OPTIONAL, 17 IN PULONG DllCharacteristics OPTIONAL, 18 IN PUNICODE_STRING DllName, 19 OUT PVOID *BaseAddress 20 ); 21 22 */ 23 24 START_TEST(LdrLoadDll) 25 { 26 NTSTATUS Status = STATUS_SUCCESS; 27 UNICODE_STRING DllName; 28 PVOID BaseAddress, BaseAddress2; 29 WCHAR szWinDir[MAX_PATH], szSysDir[MAX_PATH], szPath[MAX_PATH]; 30 WCHAR *pch; 31 32 RtlInitEmptyUnicodeString(&DllName, NULL, 0); 33 GetWindowsDirectoryW(szWinDir, _countof(szWinDir)); 34 GetSystemDirectoryW(szSysDir, _countof(szSysDir)); 35 36 Status = 0xDEADFACE; 37 StartSeh() 38 Status = LdrLoadDll(NULL, NULL, &DllName, NULL); 39 EndSeh(STATUS_ACCESS_VIOLATION); 40 ok_ntstatus(Status, 0xDEADFACE); 41 42 Status = 0xDEADFACE; 43 BaseAddress = InvalidPointer; 44 StartSeh() 45 Status = LdrLoadDll(NULL, NULL, &DllName, &BaseAddress); 46 EndSeh(STATUS_ACCESS_VIOLATION); 47 ok_ntstatus(Status, 0xDEADFACE); 48 ok_ptr(BaseAddress, InvalidPointer); 49 50 Status = 0xDEADFACE; 51 StartSeh() 52 Status = LdrLoadDll(L"", NULL, &DllName, NULL); 53 EndSeh(STATUS_ACCESS_VIOLATION); 54 ok_ntstatus(Status, 0xDEADFACE); 55 56 Status = 0xDEADFACE; 57 BaseAddress = InvalidPointer; 58 StartSeh() 59 Status = LdrLoadDll(L"", NULL, &DllName, &BaseAddress); 60 EndSeh(STATUS_ACCESS_VIOLATION); 61 ok_ntstatus(Status, 0xDEADFACE); 62 ok_ptr(BaseAddress, InvalidPointer); 63 64 RtlInitUnicodeString(&DllName, L"advapi32.dll"); 65 66 Status = 0xDEADFACE; 67 BaseAddress = InvalidPointer; 68 StartSeh() 69 Status = LdrLoadDll(NULL, NULL, &DllName, NULL); 70 if (NT_SUCCESS(Status)) 71 LdrUnloadDll(BaseAddress); 72 EndSeh(STATUS_ACCESS_VIOLATION); 73 ok_ntstatus(Status, 0xDEADFACE); 74 ok_ptr(BaseAddress, InvalidPointer); 75 76 RtlInitUnicodeString(&DllName, L"advapi32.dll"); 77 Status = 0xDEADFACE; 78 BaseAddress = InvalidPointer; 79 StartSeh() 80 BaseAddress = InvalidPointer; 81 Status = LdrLoadDll(NULL, NULL, &DllName, &BaseAddress); 82 ok_ntstatus(Status, STATUS_SUCCESS); 83 ok(BaseAddress != NULL && BaseAddress != InvalidPointer, "BaseAddress = %p\n", BaseAddress); 84 if (NT_SUCCESS(Status)) 85 { 86 BaseAddress2 = InvalidPointer; 87 Status = LdrLoadDll(NULL, NULL, &DllName, &BaseAddress2); 88 ok_ntstatus(Status, STATUS_SUCCESS); 89 ok_ptr(BaseAddress2, BaseAddress); 90 LdrUnloadDll(BaseAddress); 91 } 92 EndSeh(STATUS_SUCCESS); 93 ok_ntstatus(Status, STATUS_SUCCESS); 94 ok(BaseAddress != NULL, "BaseAddress was NULL\n"); 95 96 RtlInitUnicodeString(&DllName, L"advapi32.dll"); 97 Status = 0xDEADFACE; 98 BaseAddress = InvalidPointer; 99 StartSeh() 100 Status = LdrLoadDll(L"\\SystemRoot\\System32", NULL, &DllName, NULL); 101 EndSeh(STATUS_ACCESS_VIOLATION); 102 ok_ntstatus(Status, 0xDEADFACE); 103 ok_ptr(BaseAddress, InvalidPointer); 104 105 /* Test with only backslashes in path; no file extension */ 106 StringCchPrintfW(szPath, _countof(szPath), L"%s\\advapi32", szSysDir); 107 RtlInitUnicodeString(&DllName, szPath); 108 Status = 0xDEADFACE; 109 BaseAddress = InvalidPointer; 110 StartSeh() 111 Status = LdrLoadDll(szWinDir, NULL, &DllName, &BaseAddress); 112 ok_ntstatus(Status, STATUS_SUCCESS); 113 if (NT_SUCCESS(Status)) 114 LdrUnloadDll(BaseAddress); 115 EndSeh(STATUS_SUCCESS); 116 ok_ntstatus(Status, STATUS_SUCCESS); 117 ok(BaseAddress != NULL, "BaseAddress was NULL\n"); 118 119 /* Test with only backslashes in path; with file extension */ 120 StringCchPrintfW(szPath, _countof(szPath), L"%s\\advapi32.dll", szSysDir); 121 RtlInitUnicodeString(&DllName, szPath); 122 Status = 0xDEADFACE; 123 BaseAddress = InvalidPointer; 124 StartSeh() 125 Status = LdrLoadDll(szWinDir, NULL, &DllName, &BaseAddress); 126 ok_ntstatus(Status, STATUS_SUCCESS); 127 if (NT_SUCCESS(Status)) 128 LdrUnloadDll(BaseAddress); 129 EndSeh(STATUS_SUCCESS); 130 ok_ntstatus(Status, STATUS_SUCCESS); 131 ok(BaseAddress != NULL, "BaseAddress was NULL\n"); 132 133 /* Test with one forward slash in path; no file extension */ 134 StringCchPrintfW(szPath, _countof(szPath), L"%s/advapi32", szSysDir); 135 RtlInitUnicodeString(&DllName, szPath); 136 Status = 0xDEADFACE; 137 BaseAddress = InvalidPointer; 138 StartSeh() 139 Status = LdrLoadDll(szWinDir, NULL, &DllName, &BaseAddress); 140 ok_ntstatus(Status, STATUS_SUCCESS); 141 if (NT_SUCCESS(Status)) 142 LdrUnloadDll(BaseAddress); 143 EndSeh(STATUS_SUCCESS); 144 ok_ntstatus(Status, STATUS_SUCCESS); 145 ok(BaseAddress != NULL, "BaseAddress was NULL\n"); 146 147 /* Test with one forward slash in path; with file extension */ 148 StringCchPrintfW(szPath, _countof(szPath), L"%s/advapi32.dll", szSysDir); 149 RtlInitUnicodeString(&DllName, szPath); 150 Status = 0xDEADFACE; 151 BaseAddress = InvalidPointer; 152 StartSeh() 153 Status = LdrLoadDll(szWinDir, NULL, &DllName, &BaseAddress); 154 ok_ntstatus(Status, STATUS_SUCCESS); 155 if (NT_SUCCESS(Status)) 156 LdrUnloadDll(BaseAddress); 157 EndSeh(STATUS_SUCCESS); 158 ok_ntstatus(Status, STATUS_SUCCESS); 159 ok(BaseAddress != NULL, "BaseAddress was NULL\n"); 160 161 /* Test with only forward slashes in path; no file extension */ 162 StringCchPrintfW(szPath, _countof(szPath), L"%s\\advapi32", szSysDir); 163 for (pch = szPath; *pch != UNICODE_NULL; ++pch) 164 { 165 if (*pch == L'\\') 166 *pch = L'/'; 167 } 168 169 RtlInitUnicodeString(&DllName, szPath); 170 Status = 0xDEADFACE; 171 BaseAddress = InvalidPointer; 172 StartSeh() 173 Status = LdrLoadDll(szWinDir, NULL, &DllName, &BaseAddress); 174 ok_ntstatus(Status, STATUS_SUCCESS); 175 if (NT_SUCCESS(Status)) 176 LdrUnloadDll(BaseAddress); 177 EndSeh(STATUS_SUCCESS); 178 ok_ntstatus(Status, STATUS_SUCCESS); 179 ok(BaseAddress != NULL, "BaseAddress was NULL\n"); 180 181 /* Test with only forward slashes in path; with file extension */ 182 /* Test with only forward slashes in path; with file extension */ 183 StringCchPrintfW(szPath, _countof(szPath), L"%s\\advapi32.dll", szSysDir); 184 for (pch = szPath; *pch != UNICODE_NULL; ++pch) 185 { 186 if (*pch == L'\\') 187 *pch = L'/'; 188 } 189 190 RtlInitUnicodeString(&DllName, szPath); 191 Status = 0xDEADFACE; 192 BaseAddress = InvalidPointer; 193 StartSeh() 194 Status = LdrLoadDll(szWinDir, NULL, &DllName, &BaseAddress); 195 ok_ntstatus(Status, STATUS_SUCCESS); 196 if (NT_SUCCESS(Status)) 197 LdrUnloadDll(BaseAddress); 198 EndSeh(STATUS_SUCCESS); 199 ok_ntstatus(Status, STATUS_SUCCESS); 200 ok(BaseAddress != NULL, "BaseAddress was NULL\n"); 201 } 202