ntdll/tests: Drop RTL function workarounds for Windows <= 2000.

Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alex Henrie 2020-05-25 22:36:21 -06:00 committed by Alexandre Julliard
parent e3d2d852a4
commit 917002c88f
1 changed files with 133 additions and 326 deletions

View File

@ -26,6 +26,7 @@
#include "ntdll_test.h"
#include "in6addr.h"
#include "inaddr.h"
#include "ip2string.h"
#ifndef __WINE_WINTERNL_H
@ -63,53 +64,23 @@ static inline USHORT __my_ushort_swap(USHORT s)
/* Function ptrs for ntdll calls */
static HMODULE hntdll = 0;
static SIZE_T (WINAPI *pRtlCompareMemory)(LPCVOID,LPCVOID,SIZE_T);
static SIZE_T (WINAPI *pRtlCompareMemoryUlong)(PULONG, SIZE_T, ULONG);
static NTSTATUS (WINAPI *pRtlDeleteTimer)(HANDLE, HANDLE, HANDLE);
static VOID (WINAPI *pRtlMoveMemory)(LPVOID,LPCVOID,SIZE_T);
static VOID (WINAPI *pRtlFillMemory)(LPVOID,SIZE_T,BYTE);
static VOID (WINAPI *pRtlFillMemoryUlong)(LPVOID,SIZE_T,ULONG);
static VOID (WINAPI *pRtlZeroMemory)(LPVOID,SIZE_T);
static ULONGLONG (WINAPIV *pRtlUlonglongByteSwap)(ULONGLONG source);
static ULONG (WINAPI *pRtlUniform)(PULONG);
static ULONG (WINAPI *pRtlRandom)(PULONG);
static BOOLEAN (WINAPI *pRtlAreAllAccessesGranted)(ACCESS_MASK, ACCESS_MASK);
static BOOLEAN (WINAPI *pRtlAreAnyAccessesGranted)(ACCESS_MASK, ACCESS_MASK);
static DWORD (WINAPI *pRtlComputeCrc32)(DWORD,const BYTE*,INT);
static void (WINAPI * pRtlInitializeHandleTable)(ULONG, ULONG, RTL_HANDLE_TABLE *);
static BOOLEAN (WINAPI * pRtlIsValidIndexHandle)(const RTL_HANDLE_TABLE *, ULONG, RTL_HANDLE **);
static NTSTATUS (WINAPI * pRtlDestroyHandleTable)(RTL_HANDLE_TABLE *);
static RTL_HANDLE * (WINAPI * pRtlAllocateHandle)(RTL_HANDLE_TABLE *, ULONG *);
static BOOLEAN (WINAPI * pRtlFreeHandle)(RTL_HANDLE_TABLE *, RTL_HANDLE *);
static NTSTATUS (WINAPI *pRtlAllocateAndInitializeSid)(PSID_IDENTIFIER_AUTHORITY,BYTE,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,PSID*);
static NTSTATUS (WINAPI *pRtlFreeSid)(PSID);
static DWORD (WINAPI *pRtlGetThreadErrorMode)(void);
static NTSTATUS (WINAPI *pRtlSetThreadErrorMode)(DWORD, LPDWORD);
static IMAGE_BASE_RELOCATION *(WINAPI *pLdrProcessRelocationBlock)(void*,UINT,USHORT*,INT_PTR);
static CHAR * (WINAPI *pRtlIpv4AddressToStringA)(const IN_ADDR *, LPSTR);
static NTSTATUS (WINAPI *pRtlIpv4AddressToStringExA)(const IN_ADDR *, USHORT, LPSTR, PULONG);
static NTSTATUS (WINAPI *pRtlIpv4StringToAddressA)(PCSTR, BOOLEAN, PCSTR *, IN_ADDR *);
static NTSTATUS (WINAPI *pRtlIpv4StringToAddressExA)(PCSTR, BOOLEAN, IN_ADDR *, PUSHORT);
static CHAR * (WINAPI *pRtlIpv6AddressToStringA)(struct in6_addr *, PSTR);
static NTSTATUS (WINAPI *pRtlIpv6AddressToStringExA)(struct in6_addr *, ULONG, USHORT, PCHAR, PULONG);
static NTSTATUS (WINAPI *pRtlIpv6StringToAddressA)(PCSTR, PCSTR *, struct in6_addr *);
static NTSTATUS (WINAPI *pRtlIpv6StringToAddressW)(PCWSTR, PCWSTR *, struct in6_addr *);
static NTSTATUS (WINAPI *pRtlIpv6StringToAddressExA)(PCSTR, struct in6_addr *, PULONG, PUSHORT);
static NTSTATUS (WINAPI *pRtlIpv6StringToAddressExW)(PCWSTR, struct in6_addr *, PULONG, PUSHORT);
static NTSTATUS (WINAPI *pLdrAddRefDll)(ULONG, HMODULE);
static NTSTATUS (WINAPI *pLdrLockLoaderLock)(ULONG, ULONG*, ULONG_PTR*);
static NTSTATUS (WINAPI *pLdrUnlockLoaderLock)(ULONG, ULONG_PTR);
static NTSTATUS (WINAPI *pRtlMultiByteToUnicodeN)(LPWSTR, DWORD, LPDWORD, LPCSTR, DWORD);
static NTSTATUS (WINAPI *pRtlGetCompressionWorkSpaceSize)(USHORT, PULONG, PULONG);
static NTSTATUS (WINAPI *pRtlDecompressBuffer)(USHORT, PUCHAR, ULONG, const UCHAR*, ULONG, PULONG);
static NTSTATUS (WINAPI *pRtlDecompressFragment)(USHORT, PUCHAR, ULONG, const UCHAR*, ULONG, ULONG, PULONG, PVOID);
static NTSTATUS (WINAPI *pRtlCompressBuffer)(USHORT, const UCHAR*, ULONG, PUCHAR, ULONG, ULONG, PULONG, PVOID);
static BOOL (WINAPI *pRtlIsCriticalSectionLocked)(CRITICAL_SECTION *);
static BOOL (WINAPI *pRtlIsCriticalSectionLockedByThread)(CRITICAL_SECTION *);
static NTSTATUS (WINAPI *pRtlInitializeCriticalSectionEx)(CRITICAL_SECTION *, ULONG, ULONG);
static NTSTATUS (WINAPI *pLdrEnumerateLoadedModules)(void *, void *, void *);
static NTSTATUS (WINAPI *pRtlMakeSelfRelativeSD)(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,LPDWORD);
static NTSTATUS (WINAPI *pRtlAbsoluteToSelfRelativeSD)(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,PULONG);
static NTSTATUS (WINAPI *pLdrRegisterDllNotification)(ULONG, PLDR_DLL_NOTIFICATION_FUNCTION, void *, void **);
static NTSTATUS (WINAPI *pLdrUnregisterDllNotification)(void *);
@ -134,53 +105,23 @@ static void InitFunctionPtrs(void)
hntdll = LoadLibraryA("ntdll.dll");
ok(hntdll != 0, "LoadLibrary failed\n");
if (hntdll) {
pRtlCompareMemory = (void *)GetProcAddress(hntdll, "RtlCompareMemory");
pRtlCompareMemoryUlong = (void *)GetProcAddress(hntdll, "RtlCompareMemoryUlong");
pRtlDeleteTimer = (void *)GetProcAddress(hntdll, "RtlDeleteTimer");
pRtlMoveMemory = (void *)GetProcAddress(hntdll, "RtlMoveMemory");
pRtlFillMemory = (void *)GetProcAddress(hntdll, "RtlFillMemory");
pRtlFillMemoryUlong = (void *)GetProcAddress(hntdll, "RtlFillMemoryUlong");
pRtlZeroMemory = (void *)GetProcAddress(hntdll, "RtlZeroMemory");
pRtlUlonglongByteSwap = (void *)GetProcAddress(hntdll, "RtlUlonglongByteSwap");
pRtlUniform = (void *)GetProcAddress(hntdll, "RtlUniform");
pRtlRandom = (void *)GetProcAddress(hntdll, "RtlRandom");
pRtlAreAllAccessesGranted = (void *)GetProcAddress(hntdll, "RtlAreAllAccessesGranted");
pRtlAreAnyAccessesGranted = (void *)GetProcAddress(hntdll, "RtlAreAnyAccessesGranted");
pRtlComputeCrc32 = (void *)GetProcAddress(hntdll, "RtlComputeCrc32");
pRtlInitializeHandleTable = (void *)GetProcAddress(hntdll, "RtlInitializeHandleTable");
pRtlIsValidIndexHandle = (void *)GetProcAddress(hntdll, "RtlIsValidIndexHandle");
pRtlDestroyHandleTable = (void *)GetProcAddress(hntdll, "RtlDestroyHandleTable");
pRtlAllocateHandle = (void *)GetProcAddress(hntdll, "RtlAllocateHandle");
pRtlFreeHandle = (void *)GetProcAddress(hntdll, "RtlFreeHandle");
pRtlAllocateAndInitializeSid = (void *)GetProcAddress(hntdll, "RtlAllocateAndInitializeSid");
pRtlFreeSid = (void *)GetProcAddress(hntdll, "RtlFreeSid");
pRtlGetThreadErrorMode = (void *)GetProcAddress(hntdll, "RtlGetThreadErrorMode");
pRtlSetThreadErrorMode = (void *)GetProcAddress(hntdll, "RtlSetThreadErrorMode");
pLdrProcessRelocationBlock = (void *)GetProcAddress(hntdll, "LdrProcessRelocationBlock");
pRtlIpv4AddressToStringA = (void *)GetProcAddress(hntdll, "RtlIpv4AddressToStringA");
pRtlIpv4AddressToStringExA = (void *)GetProcAddress(hntdll, "RtlIpv4AddressToStringExA");
pRtlIpv4StringToAddressA = (void *)GetProcAddress(hntdll, "RtlIpv4StringToAddressA");
pRtlIpv4StringToAddressExA = (void *)GetProcAddress(hntdll, "RtlIpv4StringToAddressExA");
pRtlIpv6AddressToStringA = (void *)GetProcAddress(hntdll, "RtlIpv6AddressToStringA");
pRtlIpv6AddressToStringExA = (void *)GetProcAddress(hntdll, "RtlIpv6AddressToStringExA");
pRtlIpv6StringToAddressA = (void *)GetProcAddress(hntdll, "RtlIpv6StringToAddressA");
pRtlIpv6StringToAddressW = (void *)GetProcAddress(hntdll, "RtlIpv6StringToAddressW");
pRtlIpv6StringToAddressExA = (void *)GetProcAddress(hntdll, "RtlIpv6StringToAddressExA");
pRtlIpv6StringToAddressExW = (void *)GetProcAddress(hntdll, "RtlIpv6StringToAddressExW");
pLdrAddRefDll = (void *)GetProcAddress(hntdll, "LdrAddRefDll");
pLdrLockLoaderLock = (void *)GetProcAddress(hntdll, "LdrLockLoaderLock");
pLdrUnlockLoaderLock = (void *)GetProcAddress(hntdll, "LdrUnlockLoaderLock");
pRtlMultiByteToUnicodeN = (void *)GetProcAddress(hntdll, "RtlMultiByteToUnicodeN");
pRtlGetCompressionWorkSpaceSize = (void *)GetProcAddress(hntdll, "RtlGetCompressionWorkSpaceSize");
pRtlDecompressBuffer = (void *)GetProcAddress(hntdll, "RtlDecompressBuffer");
pRtlDecompressFragment = (void *)GetProcAddress(hntdll, "RtlDecompressFragment");
pRtlCompressBuffer = (void *)GetProcAddress(hntdll, "RtlCompressBuffer");
pRtlIsCriticalSectionLocked = (void *)GetProcAddress(hntdll, "RtlIsCriticalSectionLocked");
pRtlIsCriticalSectionLockedByThread = (void *)GetProcAddress(hntdll, "RtlIsCriticalSectionLockedByThread");
pRtlInitializeCriticalSectionEx = (void *)GetProcAddress(hntdll, "RtlInitializeCriticalSectionEx");
pLdrEnumerateLoadedModules = (void *)GetProcAddress(hntdll, "LdrEnumerateLoadedModules");
pRtlMakeSelfRelativeSD = (void *)GetProcAddress(hntdll, "RtlMakeSelfRelativeSD");
pRtlAbsoluteToSelfRelativeSD = (void *)GetProcAddress(hntdll, "RtlAbsoluteToSelfRelativeSD");
pLdrRegisterDllNotification = (void *)GetProcAddress(hntdll, "LdrRegisterDllNotification");
pLdrUnregisterDllNotification = (void *)GetProcAddress(hntdll, "LdrUnregisterDllNotification");
}
@ -193,19 +134,13 @@ static void InitFunctionPtrs(void)
ok(strlen(src) == 15, "Source must be 16 bytes long!\n");
}
#define COMP(str1,str2,cmplen,len) size = pRtlCompareMemory(str1, str2, cmplen); \
#define COMP(str1,str2,cmplen,len) size = RtlCompareMemory(str1, str2, cmplen); \
ok(size == len, "Expected %ld, got %ld\n", size, (SIZE_T)len)
static void test_RtlCompareMemory(void)
{
SIZE_T size;
if (!pRtlCompareMemory)
{
win_skip("RtlCompareMemory is not available\n");
return;
}
strcpy(dest, src);
COMP(src,src,0,0);
@ -219,49 +154,43 @@ static void test_RtlCompareMemoryUlong(void)
ULONG a[10];
ULONG result;
if (!pRtlCompareMemoryUlong)
{
win_skip("RtlCompareMemoryUlong is not available\n");
return;
}
a[0]= 0x0123;
a[1]= 0x4567;
a[2]= 0x89ab;
a[3]= 0xcdef;
result = pRtlCompareMemoryUlong(a, 0, 0x0123);
result = RtlCompareMemoryUlong(a, 0, 0x0123);
ok(result == 0, "RtlCompareMemoryUlong(%p, 0, 0x0123) returns %u, expected 0\n", a, result);
result = pRtlCompareMemoryUlong(a, 3, 0x0123);
result = RtlCompareMemoryUlong(a, 3, 0x0123);
ok(result == 0, "RtlCompareMemoryUlong(%p, 3, 0x0123) returns %u, expected 0\n", a, result);
result = pRtlCompareMemoryUlong(a, 4, 0x0123);
result = RtlCompareMemoryUlong(a, 4, 0x0123);
ok(result == 4, "RtlCompareMemoryUlong(%p, 4, 0x0123) returns %u, expected 4\n", a, result);
result = pRtlCompareMemoryUlong(a, 5, 0x0123);
result = RtlCompareMemoryUlong(a, 5, 0x0123);
ok(result == 4, "RtlCompareMemoryUlong(%p, 5, 0x0123) returns %u, expected 4\n", a, result);
result = pRtlCompareMemoryUlong(a, 7, 0x0123);
result = RtlCompareMemoryUlong(a, 7, 0x0123);
ok(result == 4, "RtlCompareMemoryUlong(%p, 7, 0x0123) returns %u, expected 4\n", a, result);
result = pRtlCompareMemoryUlong(a, 8, 0x0123);
result = RtlCompareMemoryUlong(a, 8, 0x0123);
ok(result == 4, "RtlCompareMemoryUlong(%p, 8, 0x0123) returns %u, expected 4\n", a, result);
result = pRtlCompareMemoryUlong(a, 9, 0x0123);
result = RtlCompareMemoryUlong(a, 9, 0x0123);
ok(result == 4, "RtlCompareMemoryUlong(%p, 9, 0x0123) returns %u, expected 4\n", a, result);
result = pRtlCompareMemoryUlong(a, 4, 0x0127);
result = RtlCompareMemoryUlong(a, 4, 0x0127);
ok(result == 0, "RtlCompareMemoryUlong(%p, 4, 0x0127) returns %u, expected 0\n", a, result);
result = pRtlCompareMemoryUlong(a, 4, 0x7123);
result = RtlCompareMemoryUlong(a, 4, 0x7123);
ok(result == 0, "RtlCompareMemoryUlong(%p, 4, 0x7123) returns %u, expected 0\n", a, result);
result = pRtlCompareMemoryUlong(a, 16, 0x4567);
result = RtlCompareMemoryUlong(a, 16, 0x4567);
ok(result == 0, "RtlCompareMemoryUlong(%p, 16, 0x4567) returns %u, expected 0\n", a, result);
a[1]= 0x0123;
result = pRtlCompareMemoryUlong(a, 3, 0x0123);
result = RtlCompareMemoryUlong(a, 3, 0x0123);
ok(result == 0, "RtlCompareMemoryUlong(%p, 3, 0x0123) returns %u, expected 0\n", a, result);
result = pRtlCompareMemoryUlong(a, 4, 0x0123);
result = RtlCompareMemoryUlong(a, 4, 0x0123);
ok(result == 4, "RtlCompareMemoryUlong(%p, 4, 0x0123) returns %u, expected 4\n", a, result);
result = pRtlCompareMemoryUlong(a, 5, 0x0123);
result = RtlCompareMemoryUlong(a, 5, 0x0123);
ok(result == 4, "RtlCompareMemoryUlong(%p, 5, 0x0123) returns %u, expected 4\n", a, result);
result = pRtlCompareMemoryUlong(a, 7, 0x0123);
result = RtlCompareMemoryUlong(a, 7, 0x0123);
ok(result == 4, "RtlCompareMemoryUlong(%p, 7, 0x0123) returns %u, expected 4\n", a, result);
result = pRtlCompareMemoryUlong(a, 8, 0x0123);
result = RtlCompareMemoryUlong(a, 8, 0x0123);
ok(result == 8, "RtlCompareMemoryUlong(%p, 8, 0x0123) returns %u, expected 8\n", a, result);
result = pRtlCompareMemoryUlong(a, 9, 0x0123);
result = RtlCompareMemoryUlong(a, 9, 0x0123);
ok(result == 8, "RtlCompareMemoryUlong(%p, 9, 0x0123) returns %u, expected 8\n", a, result);
}
@ -382,12 +311,6 @@ static void test_RtlUlonglongByteSwap(void)
return;
}
if ( pRtlUlonglongByteSwap( 0 ) != 0 )
{
win_skip("Broken RtlUlonglongByteSwap in win2k\n");
return;
}
result = pRtlUlonglongByteSwap( ((ULONGLONG)0x76543210 << 32) | 0x87654321 );
ok( (((ULONGLONG)0x21436587 << 32) | 0x10325476) == result,
"RtlUlonglongByteSwap(0x7654321087654321) returns 0x%s, expected 0x2143658710325476\n",
@ -403,12 +326,6 @@ static void test_RtlUniform(void)
ULONG expected;
ULONG result;
if (!pRtlUniform)
{
win_skip("RtlUniform is not available\n");
return;
}
/*
* According to the documentation RtlUniform is using D.H. Lehmer's 1948
* algorithm. This algorithm is:
@ -429,7 +346,7 @@ static void test_RtlUniform(void)
*/
seed = 0;
expected = 0x7fffffc3;
result = pRtlUniform(&seed);
result = RtlUniform(&seed);
ok(result == expected,
"RtlUniform(&seed (seed == 0)) returns %x, expected %x\n",
result, expected);
@ -450,7 +367,7 @@ static void test_RtlUniform(void)
*/
seed = 1;
expected = seed * 0xffffffed + 0x7fffffc3 + 1;
result = pRtlUniform(&seed);
result = RtlUniform(&seed);
ok(result == expected,
"RtlUniform(&seed (seed == 1)) returns %x, expected %x\n",
result, expected);
@ -459,7 +376,7 @@ static void test_RtlUniform(void)
*/
seed = 2;
expected = seed * 0xffffffed + 0x7fffffc3;
result = pRtlUniform(&seed);
result = RtlUniform(&seed);
/*
* Windows Vista uses different algorithms, so skip the rest of the tests
@ -480,21 +397,21 @@ static void test_RtlUniform(void)
*/
seed = 3;
expected = seed * 0xffffffed + 0x7fffffc3 + (seed & 1);
result = pRtlUniform(&seed);
result = RtlUniform(&seed);
ok(result == expected,
"RtlUniform(&seed (seed == 3)) returns %x, expected %x\n",
result, expected);
seed = 0x6bca1aa;
expected = seed * 0xffffffed + 0x7fffffc3;
result = pRtlUniform(&seed);
result = RtlUniform(&seed);
ok(result == expected,
"RtlUniform(&seed (seed == 0x6bca1aa)) returns %x, expected %x\n",
result, expected);
seed = 0x6bca1ab;
expected = seed * 0xffffffed + 0x7fffffc3 + 1;
result = pRtlUniform(&seed);
result = RtlUniform(&seed);
ok(result == expected,
"RtlUniform(&seed (seed == 0x6bca1ab)) returns %x, expected %x\n",
result, expected);
@ -503,7 +420,7 @@ static void test_RtlUniform(void)
*/
seed = 0x6bca1ac;
expected = seed * 0xffffffed + 0x7fffffc3 + 2;
result = pRtlUniform(&seed);
result = RtlUniform(&seed);
ok(result == expected,
"RtlUniform(&seed (seed == 0x6bca1ac)) returns %x, expected %x\n",
result, expected);
@ -515,14 +432,14 @@ static void test_RtlUniform(void)
*/
seed = 0x6bca1ad;
expected = (seed * 0xffffffed + 0x7fffffc3) & MAXLONG;
result = pRtlUniform(&seed);
result = RtlUniform(&seed);
ok(result == expected,
"RtlUniform(&seed (seed == 0x6bca1ad)) returns %x, expected %x\n",
result, expected);
seed = 0x6bca1ae;
expected = (seed * 0xffffffed + 0x7fffffc3 + 1) & MAXLONG;
result = pRtlUniform(&seed);
result = RtlUniform(&seed);
ok(result == expected,
"RtlUniform(&seed (seed == 0x6bca1ae)) returns %x, expected %x\n",
result, expected);
@ -630,7 +547,7 @@ static void test_RtlUniform(void)
expected = expected + (seed & 1);
} /* if */
seed_bak = seed;
result = pRtlUniform(&seed);
result = RtlUniform(&seed);
ok(result == expected,
"test: 0x%s RtlUniform(&seed (seed == %x)) returns %x, expected %x\n",
wine_dbgstr_longlong(num), seed_bak, result, expected);
@ -677,7 +594,7 @@ static void test_RtlUniform(void)
for (num = 0; num <= 100000; num++) {
expected = (seed * 0x7fffffed + 0x7fffffc3) % 0x7fffffff;
seed_bak = seed;
result = pRtlUniform(&seed);
result = RtlUniform(&seed);
ok(result == expected,
"test: 0x%s RtlUniform(&seed (seed == %x)) returns %x, expected %x\n",
wine_dbgstr_longlong(num), seed_bak, result, expected);
@ -699,16 +616,10 @@ static void test_RtlRandom(void)
ULONG seed;
ULONG res[512];
if (!pRtlRandom)
{
win_skip("RtlRandom is not available\n");
return;
}
seed = 0;
for (i = 0; i < ARRAY_SIZE(res); i++)
{
res[i] = pRtlRandom(&seed);
res[i] = RtlRandom(&seed);
ok(seed != res[i], "%i: seed is same as res %x\n", i, seed);
for (j = 0; j < i; j++)
ok(res[i] != res[j], "res[%i] (%x) is same as res[%i] (%x)\n", j, res[j], i, res[i]);
@ -741,14 +652,8 @@ static void test_RtlAreAllAccessesGranted(void)
unsigned int test_num;
BOOLEAN result;
if (!pRtlAreAllAccessesGranted)
{
win_skip("RtlAreAllAccessesGranted is not available\n");
return;
}
for (test_num = 0; test_num < ARRAY_SIZE(all_accesses); test_num++) {
result = pRtlAreAllAccessesGranted(all_accesses[test_num].GrantedAccess,
result = RtlAreAllAccessesGranted(all_accesses[test_num].GrantedAccess,
all_accesses[test_num].DesiredAccess);
ok(all_accesses[test_num].result == result,
"(test %d): RtlAreAllAccessesGranted(%08x, %08x) returns %d, expected %d\n",
@ -783,14 +688,8 @@ static void test_RtlAreAnyAccessesGranted(void)
unsigned int test_num;
BOOLEAN result;
if (!pRtlAreAnyAccessesGranted)
{
win_skip("RtlAreAnyAccessesGranted is not available\n");
return;
}
for (test_num = 0; test_num < ARRAY_SIZE(any_accesses); test_num++) {
result = pRtlAreAnyAccessesGranted(any_accesses[test_num].GrantedAccess,
result = RtlAreAnyAccessesGranted(any_accesses[test_num].GrantedAccess,
any_accesses[test_num].DesiredAccess);
ok(any_accesses[test_num].result == result,
"(test %d): RtlAreAnyAccessesGranted(%08x, %08x) returns %d, expected %d\n",
@ -804,13 +703,7 @@ static void test_RtlComputeCrc32(void)
{
DWORD crc = 0;
if (!pRtlComputeCrc32)
{
win_skip("RtlComputeCrc32 is not available\n");
return;
}
crc = pRtlComputeCrc32(crc, (const BYTE *)src, LEN);
crc = RtlComputeCrc32(crc, (const BYTE *)src, LEN);
ok(crc == 0x40861dc2,"Expected 0x40861dc2, got %8x\n", crc);
}
@ -835,22 +728,16 @@ static void test_HandleTables(void)
MY_HANDLE * MyHandle;
RTL_HANDLE_TABLE HandleTable;
if (!pRtlInitializeHandleTable)
{
win_skip("RtlInitializeHandleTable is not available\n");
return;
}
pRtlInitializeHandleTable(0x3FFF, sizeof(MY_HANDLE), &HandleTable);
MyHandle = (MY_HANDLE *)pRtlAllocateHandle(&HandleTable, &Index);
RtlInitializeHandleTable(0x3FFF, sizeof(MY_HANDLE), &HandleTable);
MyHandle = (MY_HANDLE *)RtlAllocateHandle(&HandleTable, &Index);
ok(MyHandle != NULL, "RtlAllocateHandle failed\n");
RtlpMakeHandleAllocated(&MyHandle->RtlHandle);
MyHandle = NULL;
result = pRtlIsValidIndexHandle(&HandleTable, Index, (RTL_HANDLE **)&MyHandle);
result = RtlIsValidIndexHandle(&HandleTable, Index, (RTL_HANDLE **)&MyHandle);
ok(result, "Handle %p wasn't valid\n", MyHandle);
result = pRtlFreeHandle(&HandleTable, &MyHandle->RtlHandle);
result = RtlFreeHandle(&HandleTable, &MyHandle->RtlHandle);
ok(result, "Couldn't free handle %p\n", MyHandle);
status = pRtlDestroyHandleTable(&HandleTable);
status = RtlDestroyHandleTable(&HandleTable);
ok(status == STATUS_SUCCESS, "RtlDestroyHandleTable failed with error 0x%08x\n", status);
}
@ -860,25 +747,19 @@ static void test_RtlAllocateAndInitializeSid(void)
SID_IDENTIFIER_AUTHORITY sia = {{ 1, 2, 3, 4, 5, 6 }};
PSID psid;
if (!pRtlAllocateAndInitializeSid)
{
win_skip("RtlAllocateAndInitializeSid is not available\n");
return;
}
ret = pRtlAllocateAndInitializeSid(&sia, 0, 1, 2, 3, 4, 5, 6, 7, 8, &psid);
ret = RtlAllocateAndInitializeSid(&sia, 0, 1, 2, 3, 4, 5, 6, 7, 8, &psid);
ok(!ret, "RtlAllocateAndInitializeSid error %08x\n", ret);
ret = pRtlFreeSid(psid);
ret = RtlFreeSid(psid);
ok(!ret, "RtlFreeSid error %08x\n", ret);
/* these tests crash on XP */
if (0)
{
pRtlAllocateAndInitializeSid(NULL, 0, 1, 2, 3, 4, 5, 6, 7, 8, &psid);
pRtlAllocateAndInitializeSid(&sia, 0, 1, 2, 3, 4, 5, 6, 7, 8, NULL);
RtlAllocateAndInitializeSid(NULL, 0, 1, 2, 3, 4, 5, 6, 7, 8, &psid);
RtlAllocateAndInitializeSid(&sia, 0, 1, 2, 3, 4, 5, 6, 7, 8, NULL);
}
ret = pRtlAllocateAndInitializeSid(&sia, 9, 1, 2, 3, 4, 5, 6, 7, 8, &psid);
ret = RtlAllocateAndInitializeSid(&sia, 9, 1, 2, 3, 4, 5, 6, 7, 8, &psid);
ok(ret == STATUS_INVALID_SID, "wrong error %08x\n", ret);
}
@ -886,13 +767,7 @@ static void test_RtlDeleteTimer(void)
{
NTSTATUS ret;
if (!pRtlDeleteTimer)
{
win_skip("RtlDeleteTimer is not available\n");
return;
}
ret = pRtlDeleteTimer(NULL, NULL, NULL);
ret = RtlDeleteTimer(NULL, NULL, NULL);
ok(ret == STATUS_INVALID_PARAMETER_1 ||
ret == STATUS_INVALID_PARAMETER, /* W2K */
"expected STATUS_INVALID_PARAMETER_1 or STATUS_INVALID_PARAMETER, got %x\n", ret);
@ -973,26 +848,21 @@ static void test_LdrProcessRelocationBlock(void)
DWORD addr32;
SHORT addr16;
if(!pLdrProcessRelocationBlock) {
win_skip("LdrProcessRelocationBlock not available\n");
return;
}
addr32 = 0x50005;
reloc = IMAGE_REL_BASED_HIGHLOW<<12;
ret = pLdrProcessRelocationBlock(&addr32, 1, &reloc, 0x500050);
ret = LdrProcessRelocationBlock(&addr32, 1, &reloc, 0x500050);
ok((USHORT*)ret == &reloc+1, "ret = %p, expected %p\n", ret, &reloc+1);
ok(addr32 == 0x550055, "addr32 = %x, expected 0x550055\n", addr32);
addr16 = 0x505;
reloc = IMAGE_REL_BASED_HIGH<<12;
ret = pLdrProcessRelocationBlock(&addr16, 1, &reloc, 0x500060);
ret = LdrProcessRelocationBlock(&addr16, 1, &reloc, 0x500060);
ok((USHORT*)ret == &reloc+1, "ret = %p, expected %p\n", ret, &reloc+1);
ok(addr16 == 0x555, "addr16 = %x, expected 0x555\n", addr16);
addr16 = 0x505;
reloc = IMAGE_REL_BASED_LOW<<12;
ret = pLdrProcessRelocationBlock(&addr16, 1, &reloc, 0x500060);
ret = LdrProcessRelocationBlock(&addr16, 1, &reloc, 0x500060);
ok((USHORT*)ret == &reloc+1, "ret = %p, expected %p\n", ret, &reloc+1);
ok(addr16 == 0x565, "addr16 = %x, expected 0x565\n", addr16);
}
@ -1004,12 +874,6 @@ static void test_RtlIpv4AddressToString(void)
IN_ADDR ip;
DWORD_PTR len;
if (!pRtlIpv4AddressToStringA)
{
win_skip("RtlIpv4AddressToStringA not available\n");
return;
}
ip.S_un.S_un_b.s_b1 = 1;
ip.S_un.S_un_b.s_b2 = 2;
ip.S_un.S_un_b.s_b3 = 3;
@ -1017,11 +881,11 @@ static void test_RtlIpv4AddressToString(void)
memset(buffer, '#', sizeof(buffer) - 1);
buffer[sizeof(buffer) -1] = 0;
res = pRtlIpv4AddressToStringA(&ip, buffer);
res = RtlIpv4AddressToStringA(&ip, buffer);
len = strlen(buffer);
ok(res == (buffer + len), "got %p with '%s' (expected %p)\n", res, buffer, buffer + len);
res = pRtlIpv4AddressToStringA(&ip, NULL);
res = RtlIpv4AddressToStringA(&ip, NULL);
ok( (res == (char *)~0) ||
broken(res == (char *)len), /* XP and w2003 */
"got %p (expected ~0)\n", res);
@ -1030,13 +894,13 @@ static void test_RtlIpv4AddressToString(void)
/* this crashes in windows */
memset(buffer, '#', sizeof(buffer) - 1);
buffer[sizeof(buffer) -1] = 0;
res = pRtlIpv4AddressToStringA(NULL, buffer);
res = RtlIpv4AddressToStringA(NULL, buffer);
trace("got %p with '%s'\n", res, buffer);
}
if (0) {
/* this crashes in windows */
res = pRtlIpv4AddressToStringA(NULL, NULL);
res = RtlIpv4AddressToStringA(NULL, NULL);
trace("got %p\n", res);
}
}
@ -1292,23 +1156,17 @@ static void test_RtlIpv4StringToAddress(void)
CHAR dummy;
int i;
if (!pRtlIpv4StringToAddressA)
{
skip("RtlIpv4StringToAddress not available\n");
return;
}
if (0)
{
/* leaving either parameter NULL crashes on Windows */
res = pRtlIpv4StringToAddressA(NULL, FALSE, &terminator, &ip);
res = pRtlIpv4StringToAddressA("1.1.1.1", FALSE, NULL, &ip);
res = pRtlIpv4StringToAddressA("1.1.1.1", FALSE, &terminator, NULL);
res = RtlIpv4StringToAddressA(NULL, FALSE, &terminator, &ip);
res = RtlIpv4StringToAddressA("1.1.1.1", FALSE, NULL, &ip);
res = RtlIpv4StringToAddressA("1.1.1.1", FALSE, &terminator, NULL);
/* same for the wide char version */
/*
res = pRtlIpv4StringToAddressW(NULL, FALSE, &terminatorW, &ip);
res = pRtlIpv4StringToAddressW(L"1.1.1.1", FALSE, NULL, &ip);
res = pRtlIpv4StringToAddressW(L"1.1.1.1", FALSE, &terminatorW, NULL);
res = RtlIpv4StringToAddressW(NULL, FALSE, &terminatorW, &ip);
res = RtlIpv4StringToAddressW(L"1.1.1.1", FALSE, NULL, &ip);
res = RtlIpv4StringToAddressW(L"1.1.1.1", FALSE, &terminatorW, NULL);
*/
}
@ -1317,7 +1175,7 @@ static void test_RtlIpv4StringToAddress(void)
/* non-strict */
terminator = &dummy;
ip.S_un.S_addr = 0xabababab;
res = pRtlIpv4StringToAddressA(ipv4_tests[i].address, FALSE, &terminator, &ip);
res = RtlIpv4StringToAddressA(ipv4_tests[i].address, FALSE, &terminator, &ip);
ok(res == ipv4_tests[i].res,
"[%s] res = 0x%08x, expected 0x%08x\n",
ipv4_tests[i].address, res, ipv4_tests[i].res);
@ -1342,7 +1200,7 @@ static void test_RtlIpv4StringToAddress(void)
/* strict */
terminator = &dummy;
ip.S_un.S_addr = 0xabababab;
res = pRtlIpv4StringToAddressA(ipv4_tests[i].address, TRUE, &terminator, &ip);
res = RtlIpv4StringToAddressA(ipv4_tests[i].address, TRUE, &terminator, &ip);
ok(res == ipv4_tests[i].res_strict,
"[%s] res = 0x%08x, expected 0x%08x\n",
ipv4_tests[i].address, res, ipv4_tests[i].res_strict);
@ -2095,14 +1953,11 @@ static void compare_RtlIpv6StringToAddressW(PCSTR name_a, int terminator_offset_
IN6_ADDR ip;
PCWSTR terminator;
if (!pRtlIpv6StringToAddressW)
return;
pRtlMultiByteToUnicodeN(name, sizeof(name), NULL, name_a, strlen(name_a) + 1);
RtlMultiByteToUnicodeN(name, sizeof(name), NULL, name_a, strlen(name_a) + 1);
init_ip6(&ip, NULL);
terminator = (void *)0xdeadbeef;
res = pRtlIpv6StringToAddressW(name, &terminator, &ip);
res = RtlIpv6StringToAddressW(name, &terminator, &ip);
ok(res == res_a, "[W:%s] res = 0x%08x, expected 0x%08x\n", name_a, res, res_a);
if (terminator_offset_a < 0)
@ -2134,28 +1989,16 @@ static void test_RtlIpv6StringToAddress(void)
PCSTR terminator;
unsigned int i;
if (!pRtlIpv6StringToAddressW)
{
skip("RtlIpv6StringToAddressW not available\n");
/* we can continue, just not test W */
}
if (!pRtlIpv6StringToAddressA)
{
skip("RtlIpv6StringToAddressA not available\n");
return; /* all tests are centered around A, we cannot continue */
}
res = pRtlIpv6StringToAddressA("::", &terminator, &ip);
res = RtlIpv6StringToAddressA("::", &terminator, &ip);
ok(res == STATUS_SUCCESS, "[validate] res = 0x%08x, expected STATUS_SUCCESS\n", res);
if (0)
{
/* any of these crash */
res = pRtlIpv6StringToAddressA(NULL, &terminator, &ip);
res = RtlIpv6StringToAddressA(NULL, &terminator, &ip);
ok(res == STATUS_INVALID_PARAMETER, "[null string] res = 0x%08x, expected STATUS_INVALID_PARAMETER\n", res);
res = pRtlIpv6StringToAddressA("::", NULL, &ip);
res = RtlIpv6StringToAddressA("::", NULL, &ip);
ok(res == STATUS_INVALID_PARAMETER, "[null terminator] res = 0x%08x, expected STATUS_INVALID_PARAMETER\n", res);
res = pRtlIpv6StringToAddressA("::", &terminator, NULL);
res = RtlIpv6StringToAddressA("::", &terminator, NULL);
ok(res == STATUS_INVALID_PARAMETER, "[null result] res = 0x%08x, expected STATUS_INVALID_PARAMETER\n", res);
}
@ -2166,7 +2009,7 @@ static void test_RtlIpv6StringToAddress(void)
{
init_ip6(&ip, NULL);
terminator = (void *)0xdeadbeef;
res = pRtlIpv6StringToAddressA(ipv6_tests[i].address, &terminator, &ip);
res = RtlIpv6StringToAddressA(ipv6_tests[i].address, &terminator, &ip);
compare_RtlIpv6StringToAddressW(ipv6_tests[i].address, (terminator != (void *)0xdeadbeef) ?
(terminator - ipv6_tests[i].address) : -1, &ip, res);
@ -2221,7 +2064,7 @@ static void compare_RtlIpv6StringToAddressExW(PCSTR name_a, const struct in6_add
if (!pRtlIpv6StringToAddressExW)
return;
pRtlMultiByteToUnicodeN(name, sizeof(name), NULL, name_a, strlen(name_a) + 1);
RtlMultiByteToUnicodeN(name, sizeof(name), NULL, name_a, strlen(name_a) + 1);
init_ip6(&ip, NULL);
res = pRtlIpv6StringToAddressExW(name, &ip, &scope, &port);
@ -2478,12 +2321,6 @@ static void test_LdrAddRefDll(void)
NTSTATUS status;
BOOL ret;
if (!pLdrAddRefDll)
{
win_skip( "LdrAddRefDll not supported\n" );
return;
}
mod = LoadLibraryA("comctl32.dll");
ok(mod != NULL, "got %p\n", mod);
ret = FreeLibrary(mod);
@ -2495,7 +2332,7 @@ static void test_LdrAddRefDll(void)
/* load, addref and release 2 times */
mod = LoadLibraryA("comctl32.dll");
ok(mod != NULL, "got %p\n", mod);
status = pLdrAddRefDll(0, mod);
status = LdrAddRefDll(0, mod);
ok(status == STATUS_SUCCESS, "got 0x%08x\n", status);
ret = FreeLibrary(mod);
ok(ret, "got %d\n", ret);
@ -2511,7 +2348,7 @@ static void test_LdrAddRefDll(void)
/* pin refcount */
mod = LoadLibraryA("comctl32.dll");
ok(mod != NULL, "got %p\n", mod);
status = pLdrAddRefDll(LDR_ADDREF_DLL_PIN, mod);
status = LdrAddRefDll(LDR_ADDREF_DLL_PIN, mod);
ok(status == STATUS_SUCCESS, "got 0x%08x\n", status);
ret = FreeLibrary(mod);
@ -2533,69 +2370,57 @@ static void test_LdrLockLoaderLock(void)
ULONG result;
NTSTATUS status;
if (!pLdrLockLoaderLock)
{
win_skip("LdrLockLoaderLock() is not available\n");
return;
}
/* invalid flags */
result = 10;
magic = 0xdeadbeef;
status = pLdrLockLoaderLock(0x10, &result, &magic);
status = LdrLockLoaderLock(0x10, &result, &magic);
ok(status == STATUS_INVALID_PARAMETER_1, "got 0x%08x\n", status);
ok(result == 0, "got %d\n", result);
ok(magic == 0, "got %lx\n", magic);
magic = 0xdeadbeef;
status = pLdrLockLoaderLock(0x10, NULL, &magic);
status = LdrLockLoaderLock(0x10, NULL, &magic);
ok(status == STATUS_INVALID_PARAMETER_1, "got 0x%08x\n", status);
ok(magic == 0, "got %lx\n", magic);
result = 10;
status = pLdrLockLoaderLock(0x10, &result, NULL);
status = LdrLockLoaderLock(0x10, &result, NULL);
ok(status == STATUS_INVALID_PARAMETER_1, "got 0x%08x\n", status);
ok(result == 0, "got %d\n", result);
/* non-blocking mode, result is null */
magic = 0xdeadbeef;
status = pLdrLockLoaderLock(0x2, NULL, &magic);
status = LdrLockLoaderLock(0x2, NULL, &magic);
ok(status == STATUS_INVALID_PARAMETER_2, "got 0x%08x\n", status);
ok(magic == 0, "got %lx\n", magic);
/* magic pointer is null */
result = 10;
status = pLdrLockLoaderLock(0, &result, NULL);
status = LdrLockLoaderLock(0, &result, NULL);
ok(status == STATUS_INVALID_PARAMETER_3, "got 0x%08x\n", status);
ok(result == 0, "got %d\n", result);
/* lock in non-blocking mode */
result = 0;
magic = 0;
status = pLdrLockLoaderLock(0x2, &result, &magic);
status = LdrLockLoaderLock(0x2, &result, &magic);
ok(status == STATUS_SUCCESS, "got 0x%08x\n", status);
ok(result == 1, "got %d\n", result);
ok(magic != 0, "got %lx\n", magic);
pLdrUnlockLoaderLock(0, magic);
LdrUnlockLoaderLock(0, magic);
}
static void test_RtlCompressBuffer(void)
{
ULONG compress_workspace, decompress_workspace;
static const UCHAR test_buffer[] = "WineWineWine";
static UCHAR test_buffer[] = "WineWineWine";
static UCHAR buf1[0x1000], buf2[0x1000];
ULONG final_size, buf_size;
UCHAR *workspace = NULL;
NTSTATUS status;
if (!pRtlCompressBuffer || !pRtlDecompressBuffer || !pRtlGetCompressionWorkSpaceSize)
{
win_skip("skipping RtlCompressBuffer tests, required functions not available\n");
return;
}
compress_workspace = decompress_workspace = 0xdeadbeef;
status = pRtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_LZNT1, &compress_workspace,
status = RtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_LZNT1, &compress_workspace,
&decompress_workspace);
ok(status == STATUS_SUCCESS, "got wrong status 0x%08x\n", status);
ok(compress_workspace != 0, "got wrong compress_workspace %u\n", compress_workspace);
@ -2604,19 +2429,19 @@ static void test_RtlCompressBuffer(void)
/* test compression format / engine */
final_size = 0xdeadbeef;
status = pRtlCompressBuffer(COMPRESSION_FORMAT_NONE, test_buffer, sizeof(test_buffer),
status = RtlCompressBuffer(COMPRESSION_FORMAT_NONE, test_buffer, sizeof(test_buffer),
buf1, sizeof(buf1) - 1, 4096, &final_size, workspace);
ok(status == STATUS_INVALID_PARAMETER, "got wrong status 0x%08x\n", status);
ok(final_size == 0xdeadbeef, "got wrong final_size %u\n", final_size);
final_size = 0xdeadbeef;
status = pRtlCompressBuffer(COMPRESSION_FORMAT_DEFAULT, test_buffer, sizeof(test_buffer),
status = RtlCompressBuffer(COMPRESSION_FORMAT_DEFAULT, test_buffer, sizeof(test_buffer),
buf1, sizeof(buf1) - 1, 4096, &final_size, workspace);
ok(status == STATUS_INVALID_PARAMETER, "got wrong status 0x%08x\n", status);
ok(final_size == 0xdeadbeef, "got wrong final_size %u\n", final_size);
final_size = 0xdeadbeef;
status = pRtlCompressBuffer(0xFF, test_buffer, sizeof(test_buffer),
status = RtlCompressBuffer(0xFF, test_buffer, sizeof(test_buffer),
buf1, sizeof(buf1) - 1, 4096, &final_size, workspace);
ok(status == STATUS_UNSUPPORTED_COMPRESSION, "got wrong status 0x%08x\n", status);
ok(final_size == 0xdeadbeef, "got wrong final_size %u\n", final_size);
@ -2624,7 +2449,7 @@ static void test_RtlCompressBuffer(void)
/* test compression */
final_size = 0xdeadbeef;
memset(buf1, 0x11, sizeof(buf1));
status = pRtlCompressBuffer(COMPRESSION_FORMAT_LZNT1, test_buffer, sizeof(test_buffer),
status = RtlCompressBuffer(COMPRESSION_FORMAT_LZNT1, test_buffer, sizeof(test_buffer),
buf1, sizeof(buf1), 4096, &final_size, workspace);
ok(status == STATUS_SUCCESS, "got wrong status 0x%08x\n", status);
ok((*(WORD *)buf1 & 0x7000) == 0x3000, "no chunk signature found %04x\n", *(WORD *)buf1);
@ -2635,7 +2460,7 @@ static void test_RtlCompressBuffer(void)
buf_size = final_size;
final_size = 0xdeadbeef;
memset(buf2, 0x11, sizeof(buf2));
status = pRtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, buf2, sizeof(buf2),
status = RtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, buf2, sizeof(buf2),
buf1, buf_size, &final_size);
ok(status == STATUS_SUCCESS, "got wrong status 0x%08x\n", status);
ok(final_size == sizeof(test_buffer), "got wrong final_size %u\n", final_size);
@ -2645,7 +2470,7 @@ static void test_RtlCompressBuffer(void)
/* buffer too small */
final_size = 0xdeadbeef;
memset(buf1, 0x11, sizeof(buf1));
status = pRtlCompressBuffer(COMPRESSION_FORMAT_LZNT1, test_buffer, sizeof(test_buffer),
status = RtlCompressBuffer(COMPRESSION_FORMAT_LZNT1, test_buffer, sizeof(test_buffer),
buf1, 4, 4096, &final_size, workspace);
ok(status == STATUS_BUFFER_TOO_SMALL, "got wrong status 0x%08x\n", status);
@ -2657,34 +2482,28 @@ static void test_RtlGetCompressionWorkSpaceSize(void)
ULONG compress_workspace, decompress_workspace;
NTSTATUS status;
if (!pRtlGetCompressionWorkSpaceSize)
{
win_skip("RtlGetCompressionWorkSpaceSize is not available\n");
return;
}
/* test invalid format / engine */
status = pRtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_NONE, &compress_workspace,
status = RtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_NONE, &compress_workspace,
&decompress_workspace);
ok(status == STATUS_INVALID_PARAMETER, "got wrong status 0x%08x\n", status);
status = pRtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_DEFAULT, &compress_workspace,
status = RtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_DEFAULT, &compress_workspace,
&decompress_workspace);
ok(status == STATUS_INVALID_PARAMETER, "got wrong status 0x%08x\n", status);
status = pRtlGetCompressionWorkSpaceSize(0xFF, &compress_workspace, &decompress_workspace);
status = RtlGetCompressionWorkSpaceSize(0xFF, &compress_workspace, &decompress_workspace);
ok(status == STATUS_UNSUPPORTED_COMPRESSION, "got wrong status 0x%08x\n", status);
/* test LZNT1 with normal and maximum compression */
compress_workspace = decompress_workspace = 0xdeadbeef;
status = pRtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_LZNT1, &compress_workspace,
status = RtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_LZNT1, &compress_workspace,
&decompress_workspace);
ok(status == STATUS_SUCCESS, "got wrong status 0x%08x\n", status);
ok(compress_workspace != 0, "got wrong compress_workspace %u\n", compress_workspace);
ok(decompress_workspace == 0x1000, "got wrong decompress_workspace %u\n", decompress_workspace);
compress_workspace = decompress_workspace = 0xdeadbeef;
status = pRtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_MAXIMUM,
status = RtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_MAXIMUM,
&compress_workspace, &decompress_workspace);
ok(status == STATUS_SUCCESS, "got wrong status 0x%08x\n", status);
ok(compress_workspace != 0, "got wrong compress_workspace %u\n", compress_workspace);
@ -2718,7 +2537,7 @@ static BOOL is_incomplete_chunk(const UCHAR *compressed, ULONG compressed_size,
static void test_RtlDecompressBuffer(void)
{
static const struct
static struct
{
UCHAR compressed[32];
ULONG compressed_size;
@ -2925,27 +2744,21 @@ static void test_RtlDecompressBuffer(void)
ULONG final_size;
int i;
if (!pRtlDecompressBuffer || !pRtlDecompressFragment)
{
win_skip("RtlDecompressBuffer or RtlDecompressFragment is not available\n");
return;
}
/* test compression format / engine */
final_size = 0xdeadbeef;
status = pRtlDecompressBuffer(COMPRESSION_FORMAT_NONE, buf, sizeof(buf), test_lznt[0].compressed,
status = RtlDecompressBuffer(COMPRESSION_FORMAT_NONE, buf, sizeof(buf), test_lznt[0].compressed,
test_lznt[0].compressed_size, &final_size);
ok(status == STATUS_INVALID_PARAMETER, "got wrong status 0x%08x\n", status);
ok(final_size == 0xdeadbeef, "got wrong final_size %u\n", final_size);
final_size = 0xdeadbeef;
status = pRtlDecompressBuffer(COMPRESSION_FORMAT_DEFAULT, buf, sizeof(buf), test_lznt[0].compressed,
status = RtlDecompressBuffer(COMPRESSION_FORMAT_DEFAULT, buf, sizeof(buf), test_lznt[0].compressed,
test_lznt[0].compressed_size, &final_size);
ok(status == STATUS_INVALID_PARAMETER, "got wrong status 0x%08x\n", status);
ok(final_size == 0xdeadbeef, "got wrong final_size %u\n", final_size);
final_size = 0xdeadbeef;
status = pRtlDecompressBuffer(0xFF, buf, sizeof(buf), test_lznt[0].compressed,
status = RtlDecompressBuffer(0xFF, buf, sizeof(buf), test_lznt[0].compressed,
test_lznt[0].compressed_size, &final_size);
ok(status == STATUS_UNSUPPORTED_COMPRESSION, "got wrong status 0x%08x\n", status);
ok(final_size == 0xdeadbeef, "got wrong final_size %u\n", final_size);
@ -2959,7 +2772,7 @@ static void test_RtlDecompressBuffer(void)
/* test with very big buffer */
final_size = 0xdeadbeef;
memset(buf, 0x11, sizeof(buf));
status = pRtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, buf, sizeof(buf), test_lznt[i].compressed,
status = RtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, buf, sizeof(buf), test_lznt[i].compressed,
test_lznt[i].compressed_size, &final_size);
ok(status == test_lznt[i].status || broken(status == STATUS_BAD_COMPRESSION_BUFFER &&
(test_lznt[i].broken_flags & DECOMPRESS_BROKEN_FRAGMENT)), "%d: got wrong status 0x%08x\n", i, status);
@ -2976,7 +2789,7 @@ static void test_RtlDecompressBuffer(void)
/* test that modifier for compression engine is ignored */
final_size = 0xdeadbeef;
memset(buf, 0x11, sizeof(buf));
status = pRtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_MAXIMUM, buf, sizeof(buf),
status = RtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_MAXIMUM, buf, sizeof(buf),
test_lznt[i].compressed, test_lznt[i].compressed_size, &final_size);
ok(status == test_lznt[i].status || broken(status == STATUS_BAD_COMPRESSION_BUFFER &&
(test_lznt[i].broken_flags & DECOMPRESS_BROKEN_FRAGMENT)), "%d: got wrong status 0x%08x\n", i, status);
@ -2995,7 +2808,7 @@ static void test_RtlDecompressBuffer(void)
{
final_size = 0xdeadbeef;
memset(buf, 0x11, sizeof(buf));
status = pRtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, buf, test_lznt[i].uncompressed_size,
status = RtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, buf, test_lznt[i].uncompressed_size,
test_lznt[i].compressed, test_lznt[i].compressed_size, &final_size);
ok(status == test_lznt[i].status, "%d: got wrong status 0x%08x\n", i, status);
if (!status)
@ -3014,7 +2827,7 @@ static void test_RtlDecompressBuffer(void)
{
final_size = 0xdeadbeef;
memset(buf, 0x11, sizeof(buf));
status = pRtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, buf, test_lznt[i].uncompressed_size - 1,
status = RtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, buf, test_lznt[i].uncompressed_size - 1,
test_lznt[i].compressed, test_lznt[i].compressed_size, &final_size);
if (test_lznt[i].broken_flags & DECOMPRESS_BROKEN_TRUNCATED)
todo_wine
@ -3035,7 +2848,7 @@ static void test_RtlDecompressBuffer(void)
/* test with zero output size */
final_size = 0xdeadbeef;
memset(buf, 0x11, sizeof(buf));
status = pRtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, buf, 0, test_lznt[i].compressed,
status = RtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, buf, 0, test_lznt[i].compressed,
test_lznt[i].compressed_size, &final_size);
if (is_incomplete_chunk(test_lznt[i].compressed, test_lznt[i].compressed_size, FALSE))
ok(status == STATUS_BAD_COMPRESSION_BUFFER, "%d: got wrong status 0x%08x\n", i, status);
@ -3049,7 +2862,7 @@ static void test_RtlDecompressBuffer(void)
/* test RtlDecompressFragment with offset = 0 */
final_size = 0xdeadbeef;
memset(buf, 0x11, sizeof(buf));
status = pRtlDecompressFragment(COMPRESSION_FORMAT_LZNT1, buf, sizeof(buf), test_lznt[i].compressed,
status = RtlDecompressFragment(COMPRESSION_FORMAT_LZNT1, buf, sizeof(buf), test_lznt[i].compressed,
test_lznt[i].compressed_size, 0, &final_size, workspace);
if (test_lznt[i].broken_flags & DECOMPRESS_BROKEN_FRAGMENT)
todo_wine
@ -3069,7 +2882,7 @@ static void test_RtlDecompressBuffer(void)
/* test RtlDecompressFragment with offset = 1 */
final_size = 0xdeadbeef;
memset(buf, 0x11, sizeof(buf));
status = pRtlDecompressFragment(COMPRESSION_FORMAT_LZNT1, buf, sizeof(buf), test_lznt[i].compressed,
status = RtlDecompressFragment(COMPRESSION_FORMAT_LZNT1, buf, sizeof(buf), test_lznt[i].compressed,
test_lznt[i].compressed_size, 1, &final_size, workspace);
if (test_lznt[i].broken_flags & DECOMPRESS_BROKEN_FRAGMENT)
todo_wine
@ -3099,7 +2912,7 @@ static void test_RtlDecompressBuffer(void)
/* test RtlDecompressFragment with offset = 4095 */
final_size = 0xdeadbeef;
memset(buf, 0x11, sizeof(buf));
status = pRtlDecompressFragment(COMPRESSION_FORMAT_LZNT1, buf, sizeof(buf), test_lznt[i].compressed,
status = RtlDecompressFragment(COMPRESSION_FORMAT_LZNT1, buf, sizeof(buf), test_lznt[i].compressed,
test_lznt[i].compressed_size, 4095, &final_size, workspace);
if (test_lznt[i].broken_flags & DECOMPRESS_BROKEN_FRAGMENT)
todo_wine
@ -3118,7 +2931,7 @@ static void test_RtlDecompressBuffer(void)
/* test RtlDecompressFragment with offset = 4096 */
final_size = 0xdeadbeef;
memset(buf, 0x11, sizeof(buf));
status = pRtlDecompressFragment(COMPRESSION_FORMAT_LZNT1, buf, sizeof(buf), test_lznt[i].compressed,
status = RtlDecompressFragment(COMPRESSION_FORMAT_LZNT1, buf, sizeof(buf), test_lznt[i].compressed,
test_lznt[i].compressed_size, 4096, &final_size, workspace);
expected_status = is_incomplete_chunk(test_lznt[i].compressed, test_lznt[i].compressed_size, TRUE) ?
test_lznt[i].status : STATUS_SUCCESS;
@ -3384,41 +3197,35 @@ static void test_RtlMakeSelfRelativeSD(void)
NTSTATUS status;
DWORD len;
if (!pRtlMakeSelfRelativeSD || !pRtlAbsoluteToSelfRelativeSD)
{
win_skip( "RtlMakeSelfRelativeSD/RtlAbsoluteToSelfRelativeSD not available\n" );
return;
}
memset( &sd, 0, sizeof(sd) );
sd.Revision = SECURITY_DESCRIPTOR_REVISION;
len = 0;
status = pRtlMakeSelfRelativeSD( &sd, NULL, &len );
status = RtlMakeSelfRelativeSD( &sd, NULL, &len );
ok( status == STATUS_BUFFER_TOO_SMALL, "got %08x\n", status );
ok( len == sizeof(*sd_rel), "got %u\n", len );
len += 4;
status = pRtlMakeSelfRelativeSD( &sd, sd_rel, &len );
status = RtlMakeSelfRelativeSD( &sd, sd_rel, &len );
ok( status == STATUS_SUCCESS, "got %08x\n", status );
ok( len == sizeof(*sd_rel) + 4, "got %u\n", len );
len = 0;
status = pRtlAbsoluteToSelfRelativeSD( &sd, NULL, &len );
status = RtlAbsoluteToSelfRelativeSD( &sd, NULL, &len );
ok( status == STATUS_BUFFER_TOO_SMALL, "got %08x\n", status );
ok( len == sizeof(*sd_rel), "got %u\n", len );
len += 4;
status = pRtlAbsoluteToSelfRelativeSD( &sd, sd_rel, &len );
status = RtlAbsoluteToSelfRelativeSD( &sd, sd_rel, &len );
ok( status == STATUS_SUCCESS, "got %08x\n", status );
ok( len == sizeof(*sd_rel) + 4, "got %u\n", len );
sd.Control = SE_SELF_RELATIVE;
status = pRtlMakeSelfRelativeSD( &sd, sd_rel, &len );
status = RtlMakeSelfRelativeSD( &sd, sd_rel, &len );
ok( status == STATUS_SUCCESS, "got %08x\n", status );
ok( len == sizeof(*sd_rel) + 4, "got %u\n", len );
status = pRtlAbsoluteToSelfRelativeSD( &sd, sd_rel, &len );
status = RtlAbsoluteToSelfRelativeSD( &sd, sd_rel, &len );
ok( status == STATUS_BAD_DESCRIPTOR_FORMAT, "got %08x\n", status );
}