1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

server: Generalize server request make_temporary to set_object_permanence.

Required for implementing NtMakePermanentObject().
This commit is contained in:
Jinoh Kang 2024-03-11 21:48:19 +09:00 committed by Alexandre Julliard
parent d282208ac3
commit e368515eef
6 changed files with 29 additions and 18 deletions

View file

@ -1281,9 +1281,10 @@ NTSTATUS WINAPI NtMakeTemporaryObject( HANDLE handle )
TRACE("%p\n", handle); TRACE("%p\n", handle);
SERVER_START_REQ( make_temporary ) SERVER_START_REQ( set_object_permanence )
{ {
req->handle = wine_server_obj_handle( handle ); req->handle = wine_server_obj_handle( handle );
req->permanent = 0;
ret = wine_server_call( req ); ret = wine_server_call( req );
} }
SERVER_END_REQ; SERVER_END_REQ;

View file

@ -1314,12 +1314,14 @@ struct compare_objects_reply
struct make_temporary_request struct set_object_permanence_request
{ {
struct request_header __header; struct request_header __header;
obj_handle_t handle; obj_handle_t handle;
int permanent;
char __pad_20[4];
}; };
struct make_temporary_reply struct set_object_permanence_reply
{ {
struct reply_header __header; struct reply_header __header;
}; };
@ -5659,7 +5661,7 @@ enum request
REQ_set_handle_info, REQ_set_handle_info,
REQ_dup_handle, REQ_dup_handle,
REQ_compare_objects, REQ_compare_objects,
REQ_make_temporary, REQ_set_object_permanence,
REQ_open_process, REQ_open_process,
REQ_open_thread, REQ_open_thread,
REQ_select, REQ_select,
@ -5951,7 +5953,7 @@ union generic_request
struct set_handle_info_request set_handle_info_request; struct set_handle_info_request set_handle_info_request;
struct dup_handle_request dup_handle_request; struct dup_handle_request dup_handle_request;
struct compare_objects_request compare_objects_request; struct compare_objects_request compare_objects_request;
struct make_temporary_request make_temporary_request; struct set_object_permanence_request set_object_permanence_request;
struct open_process_request open_process_request; struct open_process_request open_process_request;
struct open_thread_request open_thread_request; struct open_thread_request open_thread_request;
struct select_request select_request; struct select_request select_request;
@ -6241,7 +6243,7 @@ union generic_reply
struct set_handle_info_reply set_handle_info_reply; struct set_handle_info_reply set_handle_info_reply;
struct dup_handle_reply dup_handle_reply; struct dup_handle_reply dup_handle_reply;
struct compare_objects_reply compare_objects_reply; struct compare_objects_reply compare_objects_reply;
struct make_temporary_reply make_temporary_reply; struct set_object_permanence_reply set_object_permanence_reply;
struct open_process_reply open_process_reply; struct open_process_reply open_process_reply;
struct open_thread_reply open_thread_reply; struct open_thread_reply open_thread_reply;
struct select_reply select_reply; struct select_reply select_reply;
@ -6505,7 +6507,7 @@ union generic_reply
/* ### protocol_version begin ### */ /* ### protocol_version begin ### */
#define SERVER_PROTOCOL_VERSION 796 #define SERVER_PROTOCOL_VERSION 797
/* ### protocol_version end ### */ /* ### protocol_version end ### */

View file

@ -885,13 +885,18 @@ DECL_HANDLER(get_system_handles)
} }
} }
DECL_HANDLER(make_temporary) DECL_HANDLER(set_object_permanence)
{ {
struct object *obj; struct object *obj;
if (!(obj = get_handle_obj( current->process, req->handle, 0, NULL ))) return; 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 ); make_object_temporary( obj );
release_object( obj ); release_object( obj );

View file

@ -1175,9 +1175,10 @@ typedef struct
@END @END
/* Make an object temporary */ /* Make an object permanent or temporary */
@REQ(make_temporary) @REQ(set_object_permanence)
obj_handle_t handle; /* handle to the object */ obj_handle_t handle; /* handle to the object */
int permanent; /* 1 to make permanent, 0 to make temporary */
@END @END

View file

@ -144,7 +144,7 @@ DECL_HANDLER(close_handle);
DECL_HANDLER(set_handle_info); DECL_HANDLER(set_handle_info);
DECL_HANDLER(dup_handle); DECL_HANDLER(dup_handle);
DECL_HANDLER(compare_objects); DECL_HANDLER(compare_objects);
DECL_HANDLER(make_temporary); DECL_HANDLER(set_object_permanence);
DECL_HANDLER(open_process); DECL_HANDLER(open_process);
DECL_HANDLER(open_thread); DECL_HANDLER(open_thread);
DECL_HANDLER(select); DECL_HANDLER(select);
@ -435,7 +435,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
(req_handler)req_set_handle_info, (req_handler)req_set_handle_info,
(req_handler)req_dup_handle, (req_handler)req_dup_handle,
(req_handler)req_compare_objects, (req_handler)req_compare_objects,
(req_handler)req_make_temporary, (req_handler)req_set_object_permanence,
(req_handler)req_open_process, (req_handler)req_open_process,
(req_handler)req_open_thread, (req_handler)req_open_thread,
(req_handler)req_select, (req_handler)req_select,
@ -916,8 +916,9 @@ C_ASSERT( sizeof(struct dup_handle_reply) == 16 );
C_ASSERT( FIELD_OFFSET(struct compare_objects_request, first) == 12 ); C_ASSERT( FIELD_OFFSET(struct compare_objects_request, first) == 12 );
C_ASSERT( FIELD_OFFSET(struct compare_objects_request, second) == 16 ); C_ASSERT( FIELD_OFFSET(struct compare_objects_request, second) == 16 );
C_ASSERT( sizeof(struct compare_objects_request) == 24 ); C_ASSERT( sizeof(struct compare_objects_request) == 24 );
C_ASSERT( FIELD_OFFSET(struct make_temporary_request, handle) == 12 ); C_ASSERT( FIELD_OFFSET(struct set_object_permanence_request, handle) == 12 );
C_ASSERT( sizeof(struct make_temporary_request) == 16 ); C_ASSERT( FIELD_OFFSET(struct set_object_permanence_request, permanent) == 16 );
C_ASSERT( sizeof(struct set_object_permanence_request) == 24 );
C_ASSERT( FIELD_OFFSET(struct open_process_request, pid) == 12 ); C_ASSERT( FIELD_OFFSET(struct open_process_request, pid) == 12 );
C_ASSERT( FIELD_OFFSET(struct open_process_request, access) == 16 ); C_ASSERT( FIELD_OFFSET(struct open_process_request, access) == 16 );
C_ASSERT( FIELD_OFFSET(struct open_process_request, attributes) == 20 ); C_ASSERT( FIELD_OFFSET(struct open_process_request, attributes) == 20 );

View file

@ -1697,9 +1697,10 @@ static void dump_compare_objects_request( const struct compare_objects_request *
fprintf( stderr, ", second=%04x", req->second ); fprintf( stderr, ", second=%04x", req->second );
} }
static void dump_make_temporary_request( const struct make_temporary_request *req ) static void dump_set_object_permanence_request( const struct set_object_permanence_request *req )
{ {
fprintf( stderr, " handle=%04x", req->handle ); fprintf( stderr, " handle=%04x", req->handle );
fprintf( stderr, ", permanent=%d", req->permanent );
} }
static void dump_open_process_request( const struct open_process_request *req ) static void dump_open_process_request( const struct open_process_request *req )
@ -4621,7 +4622,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_set_handle_info_request, (dump_func)dump_set_handle_info_request,
(dump_func)dump_dup_handle_request, (dump_func)dump_dup_handle_request,
(dump_func)dump_compare_objects_request, (dump_func)dump_compare_objects_request,
(dump_func)dump_make_temporary_request, (dump_func)dump_set_object_permanence_request,
(dump_func)dump_open_process_request, (dump_func)dump_open_process_request,
(dump_func)dump_open_thread_request, (dump_func)dump_open_thread_request,
(dump_func)dump_select_request, (dump_func)dump_select_request,
@ -5197,7 +5198,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
"set_handle_info", "set_handle_info",
"dup_handle", "dup_handle",
"compare_objects", "compare_objects",
"make_temporary", "set_object_permanence",
"open_process", "open_process",
"open_thread", "open_thread",
"select", "select",