From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/ntdll/tests/om.c | 5 ++++- include/winternl.h | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c index df62bffe2c7..8f38b3eecd7 100644 --- a/dlls/ntdll/tests/om.c +++ b/dlls/ntdll/tests/om.c @@ -2329,6 +2329,7 @@ static void test_object_types(void) TYPE( L"Token", TOKEN, SYNCHRONIZE, 0 ), TYPE( L"Type", TYPE, SYNCHRONIZE, 0 ), TYPE( L"UserApcReserve", USER_APC_RESERVE, 0, 0 ), + TYPE( L"WaitCompletionPacket", WAIT_COMPLETION_PACKET, SYNCHRONIZE, 1), TYPE( L"WindowStation", WINSTA, 0, 0 ), #undef TYPE }; @@ -2390,7 +2391,9 @@ static void test_object_types(void) break; }
- ok( j < ARRAY_SIZE(all_types), "type %s not found\n", debugstr_w(tests[i].name) ); + todo_wine_if(!lstrcmpW(tests[i].name, L"WaitCompletionPacket")) + ok( broken(!lstrcmpW(tests[i].name, L"WaitCompletionPacket") && j == ARRAY_SIZE(all_types)) /* Win7 doesn't have WaitCompletionPacket */ + || j < ARRAY_SIZE(all_types), "type %s not found\n", debugstr_w(tests[i].name) ); } for (j = 0; j < ARRAY_SIZE(all_types); j++) { diff --git a/include/winternl.h b/include/winternl.h index 585349905f5..4926bd1bf82 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -3690,6 +3690,12 @@ typedef struct _FILE_IO_COMPLETION_INFORMATION { IO_STATUS_BLOCK IoStatusBlock; } FILE_IO_COMPLETION_INFORMATION, *PFILE_IO_COMPLETION_INFORMATION;
+#define WAIT_COMPLETION_PACKET_QUERY_STATE 0x0001 +#define WAIT_COMPLETION_PACKET_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE|WAIT_COMPLETION_PACKET_QUERY_STATE) +#define WAIT_COMPLETION_PACKET_GENERIC_READ (STANDARD_RIGHTS_READ|WAIT_COMPLETION_PACKET_QUERY_STATE) +#define WAIT_COMPLETION_PACKET_GENERIC_WRITE (STANDARD_RIGHTS_WRITE|WAIT_COMPLETION_PACKET_QUERY_STATE) +#define WAIT_COMPLETION_PACKET_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|WAIT_COMPLETION_PACKET_QUERY_STATE) + typedef enum _HARDERROR_RESPONSE_OPTION { OptionAbortRetryIgnore, OptionOk,