From: Jinoh Kang jinoh.kang.kr@gmail.com
Required for implementing NtMakePermanentObject(). --- dlls/ntdll/unix/sync.c | 3 ++- server/handle.c | 9 +++++++-- server/protocol.def | 5 +++-- 3 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c index cde6a0f8483..68a861f047a 100644 --- a/dlls/ntdll/unix/sync.c +++ b/dlls/ntdll/unix/sync.c @@ -1281,9 +1281,10 @@ NTSTATUS WINAPI NtMakeTemporaryObject( HANDLE handle )
TRACE("%p\n", handle);
- SERVER_START_REQ( make_temporary ) + SERVER_START_REQ( set_object_permanence ) { req->handle = wine_server_obj_handle( handle ); + req->permanent = 0; ret = wine_server_call( req ); } SERVER_END_REQ; diff --git a/server/handle.c b/server/handle.c index 71cdd2e328c..02a5a22edd1 100644 --- a/server/handle.c +++ b/server/handle.c @@ -885,13 +885,18 @@ DECL_HANDLER(get_system_handles) } }
-DECL_HANDLER(make_temporary) +DECL_HANDLER(set_object_permanence) { struct object *obj;
if (!(obj = get_handle_obj( current->process, req->handle, 0, NULL ))) return;
- if (obj->is_permanent) + if (req->permanent && !obj->is_permanent) + { + grab_object( obj ); + make_object_permanent( obj ); + } + else if (!req->permanent && obj->is_permanent) { make_object_temporary( obj ); release_object( obj ); diff --git a/server/protocol.def b/server/protocol.def index 13aea96e796..814ad741f9a 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1175,9 +1175,10 @@ typedef struct @END
-/* Make an object temporary */ -@REQ(make_temporary) +/* Make an object permanent or temporary */ +@REQ(set_object_permanence) obj_handle_t handle; /* handle to the object */ + int permanent; /* 1 to make permanent, 0 to make temporary */ @END