From 6d60acbb21fb9ac4c1b084104cfa4c0523ee1302 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Fri, 31 Jul 2015 07:01:43 +0200 Subject: [PATCH] Improve stub for NtQueryInformationJobObject and add tests. --- ...stub-for-NtQueryInformationJobObject.patch | 57 ++++++++++++++ ...dd-basic-tests-for-QueryInformationJ.patch | 61 +++++++++++++++ .../definition | 2 - patches/patchinstall.sh | 75 ++++++++----------- ...NtQueryInformationJobObject-stub-fun.patch | 55 -------------- 5 files changed, 151 insertions(+), 99 deletions(-) create mode 100644 patches/ntdll-JobObjects/0001-ntdll-Improve-stub-for-NtQueryInformationJobObject.patch create mode 100644 patches/ntdll-JobObjects/0002-kernel32-tests-Add-basic-tests-for-QueryInformationJ.patch rename patches/{server-JobObjects => ntdll-JobObjects}/definition (58%) delete mode 100644 patches/server-JobObjects/0001-ntdll-Implement-NtQueryInformationJobObject-stub-fun.patch diff --git a/patches/ntdll-JobObjects/0001-ntdll-Improve-stub-for-NtQueryInformationJobObject.patch b/patches/ntdll-JobObjects/0001-ntdll-Improve-stub-for-NtQueryInformationJobObject.patch new file mode 100644 index 00000000..d32aa004 --- /dev/null +++ b/patches/ntdll-JobObjects/0001-ntdll-Improve-stub-for-NtQueryInformationJobObject.patch @@ -0,0 +1,57 @@ +From bd3dde0e7077535723fc12ec0e0c16e2e4f91cd9 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Fri, 31 Jul 2015 06:56:04 +0200 +Subject: ntdll: Improve stub for NtQueryInformationJobObject. + +--- + dlls/ntdll/sync.c | 34 +++++++++++++++++++++++++++++++++- + 1 file changed, 33 insertions(+), 1 deletion(-) + +diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c +index 04c6de30..b0329ab 100644 +--- a/dlls/ntdll/sync.c ++++ b/dlls/ntdll/sync.c +@@ -636,7 +636,39 @@ NTSTATUS WINAPI NtQueryInformationJobObject( HANDLE handle, JOBOBJECTINFOCLASS c + ULONG len, PULONG ret_len ) + { + FIXME( "stub: %p %u %p %u %p\n", handle, class, info, len, ret_len ); +- return STATUS_NOT_IMPLEMENTED; ++ ++ if (class >= MaxJobObjectInfoClass) ++ return STATUS_INVALID_PARAMETER; ++ ++ switch (class) ++ { ++ case JobObjectExtendedLimitInformation: ++ { ++ JOBOBJECT_EXTENDED_LIMIT_INFORMATION *extended_limit; ++ if (len < sizeof(*extended_limit)) ++ return STATUS_INFO_LENGTH_MISMATCH; ++ ++ extended_limit = (JOBOBJECT_EXTENDED_LIMIT_INFORMATION *)info; ++ memset(extended_limit, 0, sizeof(*extended_limit)); ++ if (ret_len) *ret_len = sizeof(*extended_limit); ++ return STATUS_SUCCESS; ++ } ++ ++ case JobObjectBasicLimitInformation: ++ { ++ JOBOBJECT_BASIC_LIMIT_INFORMATION *basic_limit; ++ if (len < sizeof(*basic_limit)) ++ return STATUS_INFO_LENGTH_MISMATCH; ++ ++ basic_limit = (JOBOBJECT_BASIC_LIMIT_INFORMATION *)info; ++ memset(basic_limit, 0, sizeof(*basic_limit)); ++ if (ret_len) *ret_len = sizeof(*basic_limit); ++ return STATUS_SUCCESS; ++ } ++ ++ default: ++ return STATUS_NOT_IMPLEMENTED; ++ } + } + + /****************************************************************************** +-- +2.5.0 + diff --git a/patches/ntdll-JobObjects/0002-kernel32-tests-Add-basic-tests-for-QueryInformationJ.patch b/patches/ntdll-JobObjects/0002-kernel32-tests-Add-basic-tests-for-QueryInformationJ.patch new file mode 100644 index 00000000..355f2104 --- /dev/null +++ b/patches/ntdll-JobObjects/0002-kernel32-tests-Add-basic-tests-for-QueryInformationJ.patch @@ -0,0 +1,61 @@ +From b3fa2403b0179adbed187dc1cf7e044beb8d620a Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Fri, 31 Jul 2015 06:58:14 +0200 +Subject: kernel32/tests: Add basic tests for QueryInformationJobObject with + JobObject*LimitInformation info class. + +--- + dlls/kernel32/tests/process.c | 30 ++++++++++++++++++++++++++++++ + 1 file changed, 30 insertions(+) + +diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c +index 9f62e13..113ec35 100644 +--- a/dlls/kernel32/tests/process.c ++++ b/dlls/kernel32/tests/process.c +@@ -2304,6 +2304,8 @@ static void test_QueryInformationJobObject(void) + { + char buf[FIELD_OFFSET(JOBOBJECT_BASIC_PROCESS_ID_LIST, ProcessIdList[5])]; + PJOBOBJECT_BASIC_PROCESS_ID_LIST pid_list = (JOBOBJECT_BASIC_PROCESS_ID_LIST *)buf; ++ JOBOBJECT_EXTENDED_LIMIT_INFORMATION ext_limit_info; ++ JOBOBJECT_BASIC_LIMIT_INFORMATION *basic_limit_info = &ext_limit_info.BasicLimitInformation; + DWORD dwret, ret_len; + PROCESS_INFORMATION pi[2]; + HANDLE job; +@@ -2374,6 +2376,34 @@ static void test_QueryInformationJobObject(void) + } + } + ++ /* test JobObjectBasicLimitInformation */ ++ ret = pQueryInformationJobObject(job, JobObjectBasicLimitInformation, basic_limit_info, ++ sizeof(*basic_limit_info) - 1, &ret_len); ++ ok(!ret, "QueryInformationJobObject expected failure\n"); ++ expect_eq_d(ERROR_BAD_LENGTH, GetLastError()); ++ ++ ret_len = 0xdeadbeef; ++ memset(basic_limit_info, 0x11, sizeof(*basic_limit_info)); ++ ret = pQueryInformationJobObject(job, JobObjectBasicLimitInformation, basic_limit_info, ++ sizeof(*basic_limit_info), &ret_len); ++ ok(ret, "QueryInformationJobObject error %u\n", GetLastError()); ++ ok(ret_len == sizeof(*basic_limit_info), "QueryInformationJobObject returned ret_len=%u\n", ret_len); ++ expect_eq_d(0, basic_limit_info->LimitFlags); ++ ++ /* test JobObjectExtendedLimitInformation */ ++ ret = pQueryInformationJobObject(job, JobObjectExtendedLimitInformation, &ext_limit_info, ++ sizeof(ext_limit_info) - 1, &ret_len); ++ ok(!ret, "QueryInformationJobObject expected failure\n"); ++ expect_eq_d(ERROR_BAD_LENGTH, GetLastError()); ++ ++ ret_len = 0xdeadbeef; ++ memset(&ext_limit_info, 0x11, sizeof(ext_limit_info)); ++ ret = pQueryInformationJobObject(job, JobObjectExtendedLimitInformation, &ext_limit_info, ++ sizeof(ext_limit_info), &ret_len); ++ ok(ret, "QueryInformationJobObject error %u\n", GetLastError()); ++ ok(ret_len == sizeof(ext_limit_info), "QueryInformationJobObject returned ret_len=%u\n", ret_len); ++ expect_eq_d(0, basic_limit_info->LimitFlags); ++ + TerminateProcess(pi[0].hProcess, 0); + CloseHandle(pi[0].hProcess); + CloseHandle(pi[0].hThread); +-- +2.5.0 + diff --git a/patches/server-JobObjects/definition b/patches/ntdll-JobObjects/definition similarity index 58% rename from patches/server-JobObjects/definition rename to patches/ntdll-JobObjects/definition index a97d955a..c1d308eb 100644 --- a/patches/server-JobObjects/definition +++ b/patches/ntdll-JobObjects/definition @@ -1,3 +1 @@ Fixes: Multiple applications needs better NtQueryInformationJobObject stub -Depends: server-OpenProcess -Depends: server-Misc_ACL diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index 82930520..25f2cded 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -168,6 +168,7 @@ patch_enable_all () enable_ntdll_FreeBSD_Directory="$1" enable_ntdll_Heap_FreeLists="$1" enable_ntdll_Hide_Wine_Exports="$1" + enable_ntdll_JobObjects="$1" enable_ntdll_Junction_Points="$1" enable_ntdll_Loader_Machine_Type="$1" enable_ntdll_NtQueryEaFile="$1" @@ -204,7 +205,6 @@ patch_enable_all () enable_server_Delete_On_Close="$1" enable_server_File_Permissions="$1" enable_server_Inherited_ACLs="$1" - enable_server_JobObjects="$1" enable_server_Key_State="$1" enable_server_Misc_ACL="$1" enable_server_OpenProcess="$1" @@ -584,6 +584,9 @@ patch_enable () ntdll-Hide_Wine_Exports) enable_ntdll_Hide_Wine_Exports="$2" ;; + ntdll-JobObjects) + enable_ntdll_JobObjects="$2" + ;; ntdll-Junction_Points) enable_ntdll_Junction_Points="$2" ;; @@ -692,9 +695,6 @@ patch_enable () server-Inherited_ACLs) enable_server_Inherited_ACLs="$2" ;; - server-JobObjects) - enable_server_JobObjects="$2" - ;; server-Key_State) enable_server_Key_State="$2" ;; @@ -1673,17 +1673,6 @@ if test "$enable_server_Shared_Memory" -eq 1; then enable_server_PeekMessage=1 fi -if test "$enable_server_JobObjects" -eq 1; then - if test "$enable_server_Misc_ACL" -gt 1; then - abort "Patchset server-Misc_ACL disabled, but server-JobObjects depends on that." - fi - if test "$enable_server_OpenProcess" -gt 1; then - abort "Patchset server-OpenProcess disabled, but server-JobObjects depends on that." - fi - enable_server_Misc_ACL=1 - enable_server_OpenProcess=1 -fi - if test "$enable_server_ACL_Compat" -eq 1; then if test "$enable_server_Inherited_ACLs" -gt 1; then abort "Patchset server-Inherited_ACLs disabled, but server-ACL_Compat depends on that." @@ -3614,6 +3603,20 @@ if test "$enable_ntdll_Hide_Wine_Exports" -eq 1; then ) >> "$patchlist" fi +# Patchset ntdll-JobObjects +# | +# | Modified files: +# | * dlls/kernel32/tests/process.c, dlls/ntdll/sync.c +# | +if test "$enable_ntdll_JobObjects" -eq 1; then + patch_apply ntdll-JobObjects/0001-ntdll-Improve-stub-for-NtQueryInformationJobObject.patch + patch_apply ntdll-JobObjects/0002-kernel32-tests-Add-basic-tests-for-QueryInformationJ.patch + ( + echo '+ { "Sebastian Lackner", "ntdll: Improve stub for NtQueryInformationJobObject.", 1 },'; + echo '+ { "Sebastian Lackner", "kernel32/tests: Add basic tests for QueryInformationJobObject with JobObject*LimitInformation info class.", 1 },'; + ) >> "$patchlist" +fi + # Patchset ntdll-NtQueryEaFile # | # | Modified files: @@ -4222,33 +4225,6 @@ if test "$enable_server_Delete_On_Close" -eq 1; then ) >> "$patchlist" fi -# Patchset server-OpenProcess -# | -# | This patchset fixes the following Wine bugs: -# | * [#37087] Return an error when trying to open a terminated process -# | -# | Modified files: -# | * server/process.c, server/process.h -# | -if test "$enable_server_OpenProcess" -eq 1; then - patch_apply server-OpenProcess/0001-server-Return-error-when-opening-a-terminating-proce.patch - ( - echo '+ { "Michael Müller", "server: Return error when opening a terminating process.", 3 },'; - ) >> "$patchlist" -fi - -# Patchset server-JobObjects -# | -# | Modified files: -# | * dlls/ntdll/sync.c -# | -if test "$enable_server_JobObjects" -eq 1; then - patch_apply server-JobObjects/0001-ntdll-Implement-NtQueryInformationJobObject-stub-fun.patch - ( - echo '+ { "Sebastian Lackner", "ntdll: Implement NtQueryInformationJobObject stub function.", 1 },'; - ) >> "$patchlist" -fi - # Patchset server-Key_State # | # | This patchset fixes the following Wine bugs: @@ -4269,6 +4245,21 @@ if test "$enable_server_Key_State" -eq 1; then ) >> "$patchlist" fi +# Patchset server-OpenProcess +# | +# | This patchset fixes the following Wine bugs: +# | * [#37087] Return an error when trying to open a terminated process +# | +# | Modified files: +# | * server/process.c, server/process.h +# | +if test "$enable_server_OpenProcess" -eq 1; then + patch_apply server-OpenProcess/0001-server-Return-error-when-opening-a-terminating-proce.patch + ( + echo '+ { "Michael Müller", "server: Return error when opening a terminating process.", 3 },'; + ) >> "$patchlist" +fi + # Patchset server-PeekMessage # | # | This patchset fixes the following Wine bugs: diff --git a/patches/server-JobObjects/0001-ntdll-Implement-NtQueryInformationJobObject-stub-fun.patch b/patches/server-JobObjects/0001-ntdll-Implement-NtQueryInformationJobObject-stub-fun.patch deleted file mode 100644 index dfba39a4..00000000 --- a/patches/server-JobObjects/0001-ntdll-Implement-NtQueryInformationJobObject-stub-fun.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 32940d62072444eb41a918b27aae6e4b48fe555f Mon Sep 17 00:00:00 2001 -From: Sebastian Lackner -Date: Thu, 12 Mar 2015 22:19:50 +0100 -Subject: ntdll: Implement NtQueryInformationJobObject stub function. - ---- - dlls/ntdll/sync.c | 31 ++++++++++++++++++++++++++++++- - 1 file changed, 30 insertions(+), 1 deletion(-) - -diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c -index 04c6de30..fb95460 100644 ---- a/dlls/ntdll/sync.c -+++ b/dlls/ntdll/sync.c -@@ -635,8 +635,37 @@ NTSTATUS WINAPI NtTerminateJobObject( HANDLE handle, NTSTATUS status ) - NTSTATUS WINAPI NtQueryInformationJobObject( HANDLE handle, JOBOBJECTINFOCLASS class, PVOID info, - ULONG len, PULONG ret_len ) - { -+ JOBOBJECT_EXTENDED_LIMIT_INFORMATION *extended_limit; -+ JOBOBJECT_BASIC_LIMIT_INFORMATION *basic_limit; -+ - FIXME( "stub: %p %u %p %u %p\n", handle, class, info, len, ret_len ); -- return STATUS_NOT_IMPLEMENTED; -+ -+ if (class >= MaxJobObjectInfoClass) -+ return STATUS_INVALID_PARAMETER; -+ -+ switch (class) -+ { -+ case JobObjectExtendedLimitInformation: -+ if (len < sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)) -+ return STATUS_INVALID_PARAMETER; -+ -+ extended_limit = (JOBOBJECT_EXTENDED_LIMIT_INFORMATION *)info; -+ memset(extended_limit, 0, sizeof(*extended_limit)); -+ if (ret_len) *ret_len = sizeof(*extended_limit); -+ return STATUS_SUCCESS; -+ -+ case JobObjectBasicLimitInformation: -+ if (len < sizeof(JOBOBJECT_BASIC_LIMIT_INFORMATION)) -+ return STATUS_INVALID_PARAMETER; -+ -+ basic_limit = (JOBOBJECT_BASIC_LIMIT_INFORMATION *)info; -+ memset(basic_limit, 0, sizeof(*basic_limit)); -+ if (ret_len) *ret_len = sizeof(*basic_limit); -+ return STATUS_SUCCESS; -+ -+ default: -+ return STATUS_NOT_IMPLEMENTED; -+ } - } - - /****************************************************************************** --- -2.3.5 -