[PATCH 2/3] ntdll: Fill the handle attributes in System(Extended)HandleInformation.
Zebediah Figura
z.figura12 at gmail.com
Wed Feb 17 22:59:16 CST 2021
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/ntdll/tests/info.c | 24 +++++++++++++++++++-----
dlls/ntdll/unix/system.c | 12 +++++++-----
server/handle.c | 5 +++++
server/protocol.def | 1 +
server/trace.c | 4 ++--
5 files changed, 34 insertions(+), 12 deletions(-)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index 419d8582dd3..85c523881ef 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -542,11 +542,14 @@ static void test_query_handle(void)
ULONG SystemInformationLength = sizeof(SYSTEM_HANDLE_INFORMATION);
SYSTEM_HANDLE_INFORMATION* shi = HeapAlloc(GetProcessHeap(), 0, SystemInformationLength);
HANDLE EventHandle;
- BOOL found;
+ BOOL found, ret;
INT i;
EventHandle = CreateEventA(NULL, FALSE, FALSE, NULL);
ok( EventHandle != NULL, "CreateEventA failed %u\n", GetLastError() );
+ ret = SetHandleInformation(EventHandle, HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE,
+ HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE);
+ ok(ret, "got error %u\n", GetLastError());
/* Request the needed length : a SystemInformationLength greater than one struct sets ReturnLength */
ReturnLength = 0xdeadbeef;
@@ -581,11 +584,22 @@ static void test_query_handle(void)
goto done;
}
- for (i = 0, found = FALSE; i < shi->Count && !found; i++)
- found = (shi->Handle[i].OwnerPid == GetCurrentProcessId()) &&
- ((HANDLE)(ULONG_PTR)shi->Handle[i].HandleValue == EventHandle);
+ found = FALSE;
+ for (i = 0; i < shi->Count; i++)
+ {
+ if (shi->Handle[i].OwnerPid == GetCurrentProcessId() &&
+ (HANDLE)(ULONG_PTR)shi->Handle[i].HandleValue == EventHandle)
+ {
+ ok(shi->Handle[i].HandleFlags == (OBJ_INHERIT | OBJ_PROTECT_CLOSE),
+ "got attributes %#x\n", shi->Handle[i].HandleFlags);
+ found = TRUE;
+ break;
+ }
+ }
ok( found, "Expected to find event handle %p (pid %x) in handle list\n", EventHandle, GetCurrentProcessId() );
+ ret = SetHandleInformation(EventHandle, HANDLE_FLAG_PROTECT_FROM_CLOSE, 0);
+ ok(ret, "got error %u\n", GetLastError());
CloseHandle(EventHandle);
ReturnLength = 0xdeadbeef;
@@ -645,7 +659,7 @@ static void test_query_handle_ex(void)
if (info->Handles[i].UniqueProcessId == GetCurrentProcessId()
&& (HANDLE)info->Handles[i].HandleValue == event)
{
- todo_wine ok(info->Handles[i].HandleAttributes == (OBJ_INHERIT | OBJ_PROTECT_CLOSE),
+ ok(info->Handles[i].HandleAttributes == (OBJ_INHERIT | OBJ_PROTECT_CLOSE),
"got flags %#x\n", info->Handles[i].HandleAttributes);
ok(info->Handles[i].GrantedAccess == EVENT_ALL_ACCESS, "got access %#x\n", info->Handles[i].GrantedAccess);
found = TRUE;
diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c
index e2482f91041..f4a879d8748 100644
--- a/dlls/ntdll/unix/system.c
+++ b/dlls/ntdll/unix/system.c
@@ -2446,7 +2446,8 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class,
shi->Handle[i].OwnerPid = handle_info[i].owner;
shi->Handle[i].HandleValue = handle_info[i].handle;
shi->Handle[i].AccessMask = handle_info[i].access;
- /* FIXME: Fill out ObjectType, HandleFlags, ObjectPointer */
+ shi->Handle[i].HandleFlags = handle_info[i].attributes;
+ /* FIXME: Fill out ObjectType, ObjectPointer */
}
}
else if (ret == STATUS_BUFFER_TOO_SMALL)
@@ -2493,10 +2494,11 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class,
for (i = 0; i < shi->NumberOfHandles; i++)
{
memset( &shi->Handles[i], 0, sizeof(shi->Handles[i]) );
- shi->Handles[i].UniqueProcessId = handle_info[i].owner;
- shi->Handles[i].HandleValue = handle_info[i].handle;
- shi->Handles[i].GrantedAccess = handle_info[i].access;
- /* FIXME: Fill out Object, HandleAttributes, ObjectTypeIndex */
+ shi->Handles[i].UniqueProcessId = handle_info[i].owner;
+ shi->Handles[i].HandleValue = handle_info[i].handle;
+ shi->Handles[i].GrantedAccess = handle_info[i].access;
+ shi->Handles[i].HandleAttributes = handle_info[i].attributes;
+ /* FIXME: Fill out Object, ObjectTypeIndex */
}
}
else if (ret == STATUS_BUFFER_TOO_SMALL)
diff --git a/server/handle.c b/server/handle.c
index ef0f595bf08..c32b001f2e2 100644
--- a/server/handle.c
+++ b/server/handle.c
@@ -833,6 +833,11 @@ static int enum_handles( struct process *process, void *user )
handle->owner = process->id;
handle->handle = index_to_handle(i);
handle->access = entry->access & ~RESERVED_ALL;
+ handle->attributes = 0;
+ if (entry->access & RESERVED_INHERIT)
+ handle->attributes |= OBJ_INHERIT;
+ if (entry->access & RESERVED_CLOSE_PROTECT)
+ handle->attributes |= OBJ_PROTECT_CLOSE;
info->count--;
}
diff --git a/server/protocol.def b/server/protocol.def
index fa19bb41bb4..5126a9e37e5 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -3197,6 +3197,7 @@ struct handle_info
process_id_t owner;
obj_handle_t handle;
unsigned int access;
+ unsigned int attributes;
};
/* Return a list of all opened handles */
diff --git a/server/trace.c b/server/trace.c
index 2737cb16499..9faa3d5a443 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -1342,8 +1342,8 @@ static void dump_varargs_handle_infos( const char *prefix, data_size_t size )
while (size >= sizeof(*handle))
{
handle = cur_data;
- fprintf( stderr, "{owner=%04x,handle=%04x,access=%08x}",
- handle->owner, handle->handle, handle->access );
+ fprintf( stderr, "{owner=%04x,handle=%04x,access=%08x,attributes=%08x}",
+ handle->owner, handle->handle, handle->access, handle->attributes );
size -= sizeof(*handle);
remove_data( sizeof(*handle) );
if (size) fputc( ',', stderr );
--
2.20.1
More information about the wine-devel
mailing list