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);
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;

View file

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

View file

@ -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

View file

@ -144,7 +144,7 @@ DECL_HANDLER(close_handle);
DECL_HANDLER(set_handle_info);
DECL_HANDLER(dup_handle);
DECL_HANDLER(compare_objects);
DECL_HANDLER(make_temporary);
DECL_HANDLER(set_object_permanence);
DECL_HANDLER(open_process);
DECL_HANDLER(open_thread);
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_dup_handle,
(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_thread,
(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, second) == 16 );
C_ASSERT( sizeof(struct compare_objects_request) == 24 );
C_ASSERT( FIELD_OFFSET(struct make_temporary_request, handle) == 12 );
C_ASSERT( sizeof(struct make_temporary_request) == 16 );
C_ASSERT( FIELD_OFFSET(struct set_object_permanence_request, handle) == 12 );
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, access) == 16 );
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 );
}
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, ", permanent=%d", req->permanent );
}
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_dup_handle_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_thread_request,
(dump_func)dump_select_request,
@ -5197,7 +5198,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
"set_handle_info",
"dup_handle",
"compare_objects",
"make_temporary",
"set_object_permanence",
"open_process",
"open_thread",
"select",