ntdll: Implementation of inter-process VirtualProtectEx.
diff --git a/server/protocol.def b/server/protocol.def index b24e275..8c40e10 100644 --- a/server/protocol.def +++ b/server/protocol.def
@@ -233,7 +233,8 @@ APC_ASYNC_IO, APC_VIRTUAL_ALLOC, APC_VIRTUAL_FREE, - APC_VIRTUAL_QUERY + APC_VIRTUAL_QUERY, + APC_VIRTUAL_PROTECT }; typedef union @@ -281,6 +282,13 @@ enum apc_type type; /* APC_VIRTUAL_QUERY */ const void *addr; /* requested address */ } virtual_query; + struct + { + enum apc_type type; /* APC_VIRTUAL_PROTECT */ + void *addr; /* requested address */ + unsigned long size; /* requested address */ + unsigned int prot; /* new protection flags */ + } virtual_protect; } apc_call_t; typedef union @@ -312,6 +320,14 @@ unsigned int alloc_prot;/* resulting allocation protection */ unsigned int alloc_type;/* resulting region allocation type */ } virtual_query; + struct + { + enum apc_type type; /* APC_VIRTUAL_PROTECT */ + unsigned int status; /* status returned by call */ + void *addr; /* resulting address */ + unsigned long size; /* resulting size */ + unsigned int prot; /* old protection flags */ + } virtual_protect; } apc_result_t; /****************************************************************/
diff --git a/server/thread.c b/server/thread.c index 62bd559..35484a4 100644 --- a/server/thread.c +++ b/server/thread.c
@@ -1157,6 +1157,7 @@ case APC_VIRTUAL_ALLOC: case APC_VIRTUAL_FREE: case APC_VIRTUAL_QUERY: + case APC_VIRTUAL_PROTECT: access = (apc->call.type == APC_VIRTUAL_QUERY) ? PROCESS_QUERY_INFORMATION : PROCESS_VM_OPERATION; if ((process = get_process_from_handle( req->process, access ))) {
diff --git a/server/trace.c b/server/trace.c index 2b9ee8c..b878c02 100644 --- a/server/trace.c +++ b/server/trace.c
@@ -133,6 +133,11 @@ case APC_VIRTUAL_QUERY: fprintf( stderr, "APC_VIRTUAL_QUERY,addr=%p", call->virtual_query.addr ); break; + case APC_VIRTUAL_PROTECT: + fprintf( stderr, "APC_VIRTUAL_PROTECT,addr=%p,size=%lu,prot=%x", + call->virtual_protect.addr, call->virtual_protect.size, + call->virtual_protect.prot ); + break; default: fprintf( stderr, "type=%u", call->type ); break; @@ -165,6 +170,12 @@ result->virtual_query.prot, result->virtual_query.alloc_prot, result->virtual_query.alloc_type ); break; + case APC_VIRTUAL_PROTECT: + fprintf( stderr, "APC_VIRTUAL_PROTECT,status=%s,addr=%p,size=%lu,prot=%x", + get_status_name( result->virtual_protect.status ), + result->virtual_protect.addr, result->virtual_protect.size, + result->virtual_protect.prot ); + break; default: fprintf( stderr, "type=%u", result->type ); break;