There are times when it is useful to test changes on the Windows XP and 2003 VMs, but the direct use of functions not on those platforms makes this impossible.
Once applied, the kernel32 tests will run on the Windows XP and 2003 testbot VMs.
From: Hugh McMaster hugh.mcmaster@outlook.com
--- dlls/kernel32/tests/process.c | 48 +++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 22 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 5ac6ed57bbe..8ad5bed9549 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -63,39 +63,43 @@ } while (0)
static HINSTANCE hkernel32, hntdll; + +/* kernel32 functions */ +static BOOL (WINAPI *pAssignProcessToJobObject)(HANDLE job, HANDLE process); +static HANDLE (WINAPI *pCreateIoCompletionPort)(HANDLE file, HANDLE existing_port, ULONG_PTR key, DWORD threads); +static HANDLE (WINAPI *pCreateJobObjectW)(LPSECURITY_ATTRIBUTES sa, LPCWSTR name); +static HANDLE (WINAPI *pCreateToolhelp32Snapshot)(DWORD, DWORD); +static void (WINAPI *pDeleteProcThreadAttributeList)(struct _PROC_THREAD_ATTRIBUTE_LIST*); +static DWORD (WINAPI *pGetActiveProcessorCount)(WORD); +static SIZE_T (WINAPI *pGetLargePageMinimum)(void); +static BOOL (WINAPI *pGetLogicalProcessorInformationEx)(LOGICAL_PROCESSOR_RELATIONSHIP,SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*,DWORD*); +static DWORD (WINAPI *pGetMaximumProcessorCount)(WORD); static void (WINAPI *pGetNativeSystemInfo)(LPSYSTEM_INFO); +static BOOL (WINAPI *pGetNumaProcessorNode)(UCHAR, PUCHAR); +static BOOL (WINAPI *pGetSystemCpuSetInformation)(SYSTEM_CPU_SET_INFORMATION*,ULONG,ULONG*,HANDLE,ULONG); static BOOL (WINAPI *pGetSystemRegistryQuota)(PDWORD, PDWORD); +static BOOL (WINAPI *pInitializeProcThreadAttributeList)(struct _PROC_THREAD_ATTRIBUTE_LIST*, DWORD, DWORD, SIZE_T*); +static BOOL (WINAPI *pIsProcessInJob)(HANDLE process, HANDLE job, PBOOL result); static BOOL (WINAPI *pIsWow64Process)(HANDLE,PBOOL); static BOOL (WINAPI *pIsWow64Process2)(HANDLE, USHORT *, USHORT *); -static BOOL (WINAPI *pQueryFullProcessImageNameA)(HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize); -static BOOL (WINAPI *pQueryFullProcessImageNameW)(HANDLE hProcess, DWORD dwFlags, LPWSTR lpExeName, PDWORD lpdwSize); static DWORD (WINAPI *pK32GetProcessImageFileNameA)(HANDLE,LPSTR,DWORD); -static HANDLE (WINAPI *pCreateJobObjectW)(LPSECURITY_ATTRIBUTES sa, LPCWSTR name); static HANDLE (WINAPI *pOpenJobObjectA)(DWORD access, BOOL inherit, LPCSTR name); -static BOOL (WINAPI *pAssignProcessToJobObject)(HANDLE job, HANDLE process); -static BOOL (WINAPI *pIsProcessInJob)(HANDLE process, HANDLE job, PBOOL result); -static BOOL (WINAPI *pTerminateJobObject)(HANDLE job, UINT exit_code); -static BOOL (WINAPI *pQueryInformationJobObject)(HANDLE job, JOBOBJECTINFOCLASS class, LPVOID info, DWORD len, LPDWORD ret_len); -static BOOL (WINAPI *pSetInformationJobObject)(HANDLE job, JOBOBJECTINFOCLASS class, LPVOID info, DWORD len); -static HANDLE (WINAPI *pCreateIoCompletionPort)(HANDLE file, HANDLE existing_port, ULONG_PTR key, DWORD threads); -static BOOL (WINAPI *pGetNumaProcessorNode)(UCHAR, PUCHAR); -static NTSTATUS (WINAPI *pNtQueryInformationProcess)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG); -static NTSTATUS (WINAPI *pNtQueryInformationThread)(HANDLE, THREADINFOCLASS, PVOID, ULONG, PULONG); -static NTSTATUS (WINAPI *pNtQuerySystemInformationEx)(SYSTEM_INFORMATION_CLASS, void*, ULONG, void*, ULONG, ULONG*); -static DWORD (WINAPI *pWTSGetActiveConsoleSessionId)(void); -static HANDLE (WINAPI *pCreateToolhelp32Snapshot)(DWORD, DWORD); static BOOL (WINAPI *pProcess32First)(HANDLE, PROCESSENTRY32*); static BOOL (WINAPI *pProcess32Next)(HANDLE, PROCESSENTRY32*); +static BOOL (WINAPI *pQueryFullProcessImageNameA)(HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize); +static BOOL (WINAPI *pQueryFullProcessImageNameW)(HANDLE hProcess, DWORD dwFlags, LPWSTR lpExeName, PDWORD lpdwSize); +static BOOL (WINAPI *pQueryInformationJobObject)(HANDLE job, JOBOBJECTINFOCLASS class, LPVOID info, DWORD len, LPDWORD ret_len); +static BOOL (WINAPI *pSetInformationJobObject)(HANDLE job, JOBOBJECTINFOCLASS class, LPVOID info, DWORD len); +static BOOL (WINAPI *pTerminateJobObject)(HANDLE job, UINT exit_code); static BOOL (WINAPI *pThread32First)(HANDLE, THREADENTRY32*); static BOOL (WINAPI *pThread32Next)(HANDLE, THREADENTRY32*); -static BOOL (WINAPI *pGetLogicalProcessorInformationEx)(LOGICAL_PROCESSOR_RELATIONSHIP,SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*,DWORD*); -static SIZE_T (WINAPI *pGetLargePageMinimum)(void); -static BOOL (WINAPI *pGetSystemCpuSetInformation)(SYSTEM_CPU_SET_INFORMATION*,ULONG,ULONG*,HANDLE,ULONG); -static BOOL (WINAPI *pInitializeProcThreadAttributeList)(struct _PROC_THREAD_ATTRIBUTE_LIST*, DWORD, DWORD, SIZE_T*); static BOOL (WINAPI *pUpdateProcThreadAttribute)(struct _PROC_THREAD_ATTRIBUTE_LIST*, DWORD, DWORD_PTR, void *,SIZE_T,void*,SIZE_T*); -static void (WINAPI *pDeleteProcThreadAttributeList)(struct _PROC_THREAD_ATTRIBUTE_LIST*); -static DWORD (WINAPI *pGetActiveProcessorCount)(WORD); -static DWORD (WINAPI *pGetMaximumProcessorCount)(WORD); +static DWORD (WINAPI *pWTSGetActiveConsoleSessionId)(void); + +/* ntdll functions */ +static NTSTATUS (WINAPI *pNtQueryInformationProcess)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG); +static NTSTATUS (WINAPI *pNtQueryInformationThread)(HANDLE, THREADINFOCLASS, PVOID, ULONG, PULONG); +static NTSTATUS (WINAPI *pNtQuerySystemInformationEx)(SYSTEM_INFORMATION_CLASS, void*, ULONG, void*, ULONG, ULONG*);
/* ############################### */ static char base[MAX_PATH];
From: Hugh McMaster hugh.mcmaster@outlook.com
--- dlls/kernel32/tests/process.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 8ad5bed9549..9faec85badf 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -252,10 +252,6 @@ static BOOL init(void) hkernel32 = GetModuleHandleA("kernel32"); hntdll = GetModuleHandleA("ntdll.dll");
- pNtQueryInformationProcess = (void *)GetProcAddress(hntdll, "NtQueryInformationProcess"); - pNtQueryInformationThread = (void *)GetProcAddress(hntdll, "NtQueryInformationThread"); - pNtQuerySystemInformationEx = (void *)GetProcAddress(hntdll, "NtQuerySystemInformationEx"); - pGetNativeSystemInfo = (void *) GetProcAddress(hkernel32, "GetNativeSystemInfo"); pGetSystemRegistryQuota = (void *) GetProcAddress(hkernel32, "GetSystemRegistryQuota"); pIsWow64Process = (void *) GetProcAddress(hkernel32, "IsWow64Process"); @@ -287,6 +283,16 @@ static BOOL init(void) pGetActiveProcessorCount = (void *)GetProcAddress(hkernel32, "GetActiveProcessorCount"); pGetMaximumProcessorCount = (void *)GetProcAddress(hkernel32, "GetMaximumProcessorCount");
+#define NTDLL_GET_PROC(func) \ + p##func = (void *)GetProcAddress(hntdll, #func); \ + if (!p##func) trace("GetProcAddress(hntdll, '%s') failed\n", #func); + + NTDLL_GET_PROC(NtQueryInformationProcess); + NTDLL_GET_PROC(NtQueryInformationThread); + NTDLL_GET_PROC(NtQuerySystemInformationEx); + +#undef NTDLL_GET_PROC + return TRUE; }
From: Hugh McMaster hugh.mcmaster@outlook.com
--- dlls/kernel32/tests/process.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 9faec85badf..74d61bdfa30 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -71,6 +71,7 @@ static HANDLE (WINAPI *pCreateJobObjectW)(LPSECURITY_ATTRIBUTES sa, LPCWSTR name static HANDLE (WINAPI *pCreateToolhelp32Snapshot)(DWORD, DWORD); static void (WINAPI *pDeleteProcThreadAttributeList)(struct _PROC_THREAD_ATTRIBUTE_LIST*); static DWORD (WINAPI *pGetActiveProcessorCount)(WORD); +static BOOL (WINAPI *pGetFileInformationByHandleEx)(HANDLE, FILE_INFO_BY_HANDLE_CLASS, LPVOID, DWORD); static SIZE_T (WINAPI *pGetLargePageMinimum)(void); static BOOL (WINAPI *pGetLogicalProcessorInformationEx)(LOGICAL_PROCESSOR_RELATIONSHIP,SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*,DWORD*); static DWORD (WINAPI *pGetMaximumProcessorCount)(WORD); @@ -252,6 +253,7 @@ static BOOL init(void) hkernel32 = GetModuleHandleA("kernel32"); hntdll = GetModuleHandleA("ntdll.dll");
+ pGetFileInformationByHandleEx = (void *)GetProcAddress(hkernel32, "GetFileInformationByHandleEx"); pGetNativeSystemInfo = (void *) GetProcAddress(hkernel32, "GetNativeSystemInfo"); pGetSystemRegistryQuota = (void *) GetProcAddress(hkernel32, "GetSystemRegistryQuota"); pIsWow64Process = (void *) GetProcAddress(hkernel32, "IsWow64Process"); @@ -4267,6 +4269,12 @@ static void test_handle_list_attribute(BOOL child, HANDLE handle1, HANDLE handle BOOL ret; SECURITY_ATTRIBUTES sa;
+ if (!pGetFileInformationByHandleEx) + { + win_skip("GetFileInformationByHandleEx not available.\n"); + return; + } + if (child) { char name1[256], name2[256]; @@ -4276,7 +4284,7 @@ static void test_handle_list_attribute(BOOL child, HANDLE handle1, HANDLE handle ret = GetHandleInformation(handle1, &flags); ok(ret, "Failed to get handle info, error %ld.\n", GetLastError()); ok(flags == HANDLE_FLAG_INHERIT, "Unexpected flags %#lx.\n", flags); - ret = GetFileInformationByHandleEx(handle1, FileNameInfo, name1, sizeof(name1)); + ret = pGetFileInformationByHandleEx(handle1, FileNameInfo, name1, sizeof(name1)); ok(ret, "Failed to get pipe name, error %ld\n", GetLastError()); CloseHandle(handle1); flags = 0; @@ -4284,7 +4292,7 @@ static void test_handle_list_attribute(BOOL child, HANDLE handle1, HANDLE handle if (ret) { ok(!(flags & HANDLE_FLAG_INHERIT), "Parent's handle shouldn't have been inherited\n"); - ret = GetFileInformationByHandleEx(handle2, FileNameInfo, name2, sizeof(name2)); + ret = pGetFileInformationByHandleEx(handle2, FileNameInfo, name2, sizeof(name2)); ok(!ret || strcmp(name1, name2), "Parent's handle shouldn't have been inherited\n"); } else
From: Hugh McMaster hugh.mcmaster@outlook.com
--- dlls/kernel32/tests/process.c | 66 +++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 30 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 74d61bdfa30..6f3f2f05ff2 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -253,37 +253,43 @@ static BOOL init(void) hkernel32 = GetModuleHandleA("kernel32"); hntdll = GetModuleHandleA("ntdll.dll");
- pGetFileInformationByHandleEx = (void *)GetProcAddress(hkernel32, "GetFileInformationByHandleEx"); - pGetNativeSystemInfo = (void *) GetProcAddress(hkernel32, "GetNativeSystemInfo"); - pGetSystemRegistryQuota = (void *) GetProcAddress(hkernel32, "GetSystemRegistryQuota"); - pIsWow64Process = (void *) GetProcAddress(hkernel32, "IsWow64Process"); - pIsWow64Process2 = (void *) GetProcAddress(hkernel32, "IsWow64Process2"); - pQueryFullProcessImageNameA = (void *) GetProcAddress(hkernel32, "QueryFullProcessImageNameA"); - pQueryFullProcessImageNameW = (void *) GetProcAddress(hkernel32, "QueryFullProcessImageNameW"); - pK32GetProcessImageFileNameA = (void *) GetProcAddress(hkernel32, "K32GetProcessImageFileNameA"); - pCreateJobObjectW = (void *)GetProcAddress(hkernel32, "CreateJobObjectW"); - pOpenJobObjectA = (void *)GetProcAddress(hkernel32, "OpenJobObjectA"); - pAssignProcessToJobObject = (void *)GetProcAddress(hkernel32, "AssignProcessToJobObject"); - pIsProcessInJob = (void *)GetProcAddress(hkernel32, "IsProcessInJob"); - pTerminateJobObject = (void *)GetProcAddress(hkernel32, "TerminateJobObject"); - pQueryInformationJobObject = (void *)GetProcAddress(hkernel32, "QueryInformationJobObject"); - pSetInformationJobObject = (void *)GetProcAddress(hkernel32, "SetInformationJobObject"); - pCreateIoCompletionPort = (void *)GetProcAddress(hkernel32, "CreateIoCompletionPort"); - pGetNumaProcessorNode = (void *)GetProcAddress(hkernel32, "GetNumaProcessorNode"); - pWTSGetActiveConsoleSessionId = (void *)GetProcAddress(hkernel32, "WTSGetActiveConsoleSessionId"); - pCreateToolhelp32Snapshot = (void *)GetProcAddress(hkernel32, "CreateToolhelp32Snapshot"); - pProcess32First = (void *)GetProcAddress(hkernel32, "Process32First"); - pProcess32Next = (void *)GetProcAddress(hkernel32, "Process32Next"); - pThread32First = (void *)GetProcAddress(hkernel32, "Thread32First"); - pThread32Next = (void *)GetProcAddress(hkernel32, "Thread32Next"); - pGetLogicalProcessorInformationEx = (void *)GetProcAddress(hkernel32, "GetLogicalProcessorInformationEx"); - pGetLargePageMinimum = (void *)GetProcAddress(hkernel32, "GetLargePageMinimum"); +#define KERNEL32_GET_PROC(func) \ + p##func = (void *)GetProcAddress(hkernel32, #func); \ + if (!p##func) trace("GetProcAddress(hkernel32, '%s') failed\n", #func); + + KERNEL32_GET_PROC(AssignProcessToJobObject); + KERNEL32_GET_PROC(CreateIoCompletionPort); + KERNEL32_GET_PROC(CreateJobObjectW); + KERNEL32_GET_PROC(CreateToolhelp32Snapshot); + KERNEL32_GET_PROC(DeleteProcThreadAttributeList); + KERNEL32_GET_PROC(GetActiveProcessorCount); + KERNEL32_GET_PROC(GetLargePageMinimum); + KERNEL32_GET_PROC(GetLogicalProcessorInformationEx); + KERNEL32_GET_PROC(GetMaximumProcessorCount); + KERNEL32_GET_PROC(GetFileInformationByHandleEx); + KERNEL32_GET_PROC(GetNativeSystemInfo); + KERNEL32_GET_PROC(GetNumaProcessorNode); pGetSystemCpuSetInformation = (void *)GetProcAddress(hkernel32, "GetSystemCpuSetInformation"); - pInitializeProcThreadAttributeList = (void *)GetProcAddress(hkernel32, "InitializeProcThreadAttributeList"); - pUpdateProcThreadAttribute = (void *)GetProcAddress(hkernel32, "UpdateProcThreadAttribute"); - pDeleteProcThreadAttributeList = (void *)GetProcAddress(hkernel32, "DeleteProcThreadAttributeList"); - pGetActiveProcessorCount = (void *)GetProcAddress(hkernel32, "GetActiveProcessorCount"); - pGetMaximumProcessorCount = (void *)GetProcAddress(hkernel32, "GetMaximumProcessorCount"); + KERNEL32_GET_PROC(GetSystemRegistryQuota); + KERNEL32_GET_PROC(InitializeProcThreadAttributeList); + KERNEL32_GET_PROC(IsProcessInJob); + KERNEL32_GET_PROC(IsWow64Process); + pIsWow64Process2 = (void *) GetProcAddress(hkernel32, "IsWow64Process2"); + KERNEL32_GET_PROC(K32GetProcessImageFileNameA); + KERNEL32_GET_PROC(OpenJobObjectA); + KERNEL32_GET_PROC(Process32First); + KERNEL32_GET_PROC(Process32Next); + KERNEL32_GET_PROC(QueryFullProcessImageNameA); + KERNEL32_GET_PROC(QueryFullProcessImageNameW); + KERNEL32_GET_PROC(QueryInformationJobObject); + KERNEL32_GET_PROC(SetInformationJobObject); + KERNEL32_GET_PROC(TerminateJobObject); + KERNEL32_GET_PROC(Thread32First); + KERNEL32_GET_PROC(Thread32Next); + KERNEL32_GET_PROC(UpdateProcThreadAttribute); + KERNEL32_GET_PROC(WTSGetActiveConsoleSessionId); + +#undef KERNEL32_GET_PROC
#define NTDLL_GET_PROC(func) \ p##func = (void *)GetProcAddress(hntdll, #func); \