ntdll: Use the actual zero_bits parameter in the server requests.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
3e9f8c87e5
commit
b925dd78b8
|
@ -177,8 +177,6 @@ extern NTSTATUS nt_to_unix_file_name_attr( const OBJECT_ATTRIBUTES *attr, ANSI_S
|
||||||
UINT disposition ) DECLSPEC_HIDDEN;
|
UINT disposition ) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
/* virtual memory */
|
/* virtual memory */
|
||||||
extern NTSTATUS virtual_alloc( PVOID *ret, unsigned short zero_bits_64, SIZE_T *size_ptr,
|
|
||||||
ULONG type, ULONG protect ) DECLSPEC_HIDDEN;
|
|
||||||
extern NTSTATUS virtual_map_section( HANDLE handle, PVOID *addr_ptr, unsigned short zero_bits_64, SIZE_T commit_size,
|
extern NTSTATUS virtual_map_section( HANDLE handle, PVOID *addr_ptr, unsigned short zero_bits_64, SIZE_T commit_size,
|
||||||
const LARGE_INTEGER *offset_ptr, SIZE_T *size_ptr, ULONG alloc_type,
|
const LARGE_INTEGER *offset_ptr, SIZE_T *size_ptr, ULONG alloc_type,
|
||||||
ULONG protect, pe_image_info_t *image_info ) DECLSPEC_HIDDEN;
|
ULONG protect, pe_image_info_t *image_info ) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -258,9 +258,8 @@ static void invoke_apc( const user_apc_t *apc )
|
||||||
*/
|
*/
|
||||||
static void invoke_system_apc( const apc_call_t *call, apc_result_t *result )
|
static void invoke_system_apc( const apc_call_t *call, apc_result_t *result )
|
||||||
{
|
{
|
||||||
SIZE_T size;
|
SIZE_T size, bits;
|
||||||
void *addr;
|
void *addr;
|
||||||
pe_image_info_t image_info;
|
|
||||||
|
|
||||||
memset( result, 0, sizeof(*result) );
|
memset( result, 0, sizeof(*result) );
|
||||||
|
|
||||||
|
@ -282,11 +281,13 @@ static void invoke_system_apc( const apc_call_t *call, apc_result_t *result )
|
||||||
result->type = call->type;
|
result->type = call->type;
|
||||||
addr = wine_server_get_ptr( call->virtual_alloc.addr );
|
addr = wine_server_get_ptr( call->virtual_alloc.addr );
|
||||||
size = call->virtual_alloc.size;
|
size = call->virtual_alloc.size;
|
||||||
if ((ULONG_PTR)addr == call->virtual_alloc.addr && size == call->virtual_alloc.size)
|
bits = call->virtual_alloc.zero_bits;
|
||||||
|
if ((ULONG_PTR)addr == call->virtual_alloc.addr && size == call->virtual_alloc.size &&
|
||||||
|
bits == call->virtual_alloc.zero_bits)
|
||||||
{
|
{
|
||||||
result->virtual_alloc.status = virtual_alloc( &addr, call->virtual_alloc.zero_bits_64, &size,
|
result->virtual_alloc.status = NtAllocateVirtualMemory( NtCurrentProcess(), &addr, bits, &size,
|
||||||
call->virtual_alloc.op_type,
|
call->virtual_alloc.op_type,
|
||||||
call->virtual_alloc.prot );
|
call->virtual_alloc.prot );
|
||||||
result->virtual_alloc.addr = wine_server_client_ptr( addr );
|
result->virtual_alloc.addr = wine_server_client_ptr( addr );
|
||||||
result->virtual_alloc.size = size;
|
result->virtual_alloc.size = size;
|
||||||
}
|
}
|
||||||
|
@ -384,16 +385,16 @@ static void invoke_system_apc( const apc_call_t *call, apc_result_t *result )
|
||||||
result->type = call->type;
|
result->type = call->type;
|
||||||
addr = wine_server_get_ptr( call->map_view.addr );
|
addr = wine_server_get_ptr( call->map_view.addr );
|
||||||
size = call->map_view.size;
|
size = call->map_view.size;
|
||||||
if ((ULONG_PTR)addr == call->map_view.addr && size == call->map_view.size)
|
bits = call->map_view.zero_bits;
|
||||||
|
if ((ULONG_PTR)addr == call->map_view.addr && size == call->map_view.size &&
|
||||||
|
bits == call->map_view.zero_bits)
|
||||||
{
|
{
|
||||||
LARGE_INTEGER offset;
|
LARGE_INTEGER offset;
|
||||||
offset.QuadPart = call->map_view.offset;
|
offset.QuadPart = call->map_view.offset;
|
||||||
result->map_view.status = virtual_map_section( wine_server_ptr_handle(call->map_view.handle),
|
result->map_view.status = NtMapViewOfSection( wine_server_ptr_handle(call->map_view.handle),
|
||||||
&addr,
|
NtCurrentProcess(),
|
||||||
call->map_view.zero_bits_64, 0,
|
&addr, bits, 0, &offset, &size, 0,
|
||||||
&offset, &size,
|
call->map_view.alloc_type, call->map_view.prot );
|
||||||
call->map_view.alloc_type, call->map_view.prot,
|
|
||||||
&image_info );
|
|
||||||
result->map_view.addr = wine_server_client_ptr( addr );
|
result->map_view.addr = wine_server_client_ptr( addr );
|
||||||
result->map_view.size = size;
|
result->map_view.size = size;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2959,6 +2959,11 @@ void virtual_set_large_address_space(void)
|
||||||
NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG_PTR zero_bits,
|
NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG_PTR zero_bits,
|
||||||
SIZE_T *size_ptr, ULONG type, ULONG protect )
|
SIZE_T *size_ptr, ULONG type, ULONG protect )
|
||||||
{
|
{
|
||||||
|
void *base;
|
||||||
|
unsigned int vprot;
|
||||||
|
BOOL is_dos_memory = FALSE;
|
||||||
|
struct file_view *view;
|
||||||
|
sigset_t sigset;
|
||||||
SIZE_T size = *size_ptr;
|
SIZE_T size = *size_ptr;
|
||||||
NTSTATUS status = STATUS_SUCCESS;
|
NTSTATUS status = STATUS_SUCCESS;
|
||||||
unsigned short zero_bits_64 = zero_bits_win_to_64( zero_bits );
|
unsigned short zero_bits_64 = zero_bits_win_to_64( zero_bits );
|
||||||
|
@ -2979,7 +2984,7 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG_PTR z
|
||||||
call.virtual_alloc.type = APC_VIRTUAL_ALLOC;
|
call.virtual_alloc.type = APC_VIRTUAL_ALLOC;
|
||||||
call.virtual_alloc.addr = wine_server_client_ptr( *ret );
|
call.virtual_alloc.addr = wine_server_client_ptr( *ret );
|
||||||
call.virtual_alloc.size = *size_ptr;
|
call.virtual_alloc.size = *size_ptr;
|
||||||
call.virtual_alloc.zero_bits_64 = zero_bits_64;
|
call.virtual_alloc.zero_bits = zero_bits;
|
||||||
call.virtual_alloc.op_type = type;
|
call.virtual_alloc.op_type = type;
|
||||||
call.virtual_alloc.prot = protect;
|
call.virtual_alloc.prot = protect;
|
||||||
status = server_queue_process_apc( process, &call, &result );
|
status = server_queue_process_apc( process, &call, &result );
|
||||||
|
@ -2993,26 +2998,6 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG_PTR z
|
||||||
return result.virtual_alloc.status;
|
return result.virtual_alloc.status;
|
||||||
}
|
}
|
||||||
|
|
||||||
return virtual_alloc( ret, zero_bits_64, size_ptr, type, protect );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* virtual_alloc (NTDLL.@)
|
|
||||||
*
|
|
||||||
* Same as NtAllocateVirtualMemory for the current process.
|
|
||||||
*/
|
|
||||||
NTSTATUS virtual_alloc( PVOID *ret, unsigned short zero_bits_64, SIZE_T *size_ptr,
|
|
||||||
ULONG type, ULONG protect )
|
|
||||||
{
|
|
||||||
void *base;
|
|
||||||
unsigned int vprot;
|
|
||||||
SIZE_T size = *size_ptr;
|
|
||||||
NTSTATUS status = STATUS_SUCCESS;
|
|
||||||
BOOL is_dos_memory = FALSE;
|
|
||||||
struct file_view *view;
|
|
||||||
sigset_t sigset;
|
|
||||||
|
|
||||||
/* Round parameters to a page boundary */
|
/* Round parameters to a page boundary */
|
||||||
|
|
||||||
if (is_beyond_limit( 0, size, working_set_limit )) return STATUS_WORKING_SET_LIMIT_RANGE;
|
if (is_beyond_limit( 0, size, working_set_limit )) return STATUS_WORKING_SET_LIMIT_RANGE;
|
||||||
|
@ -3709,7 +3694,7 @@ NTSTATUS WINAPI NtMapViewOfSection( HANDLE handle, HANDLE process, PVOID *addr_p
|
||||||
call.map_view.addr = wine_server_client_ptr( *addr_ptr );
|
call.map_view.addr = wine_server_client_ptr( *addr_ptr );
|
||||||
call.map_view.size = *size_ptr;
|
call.map_view.size = *size_ptr;
|
||||||
call.map_view.offset = offset.QuadPart;
|
call.map_view.offset = offset.QuadPart;
|
||||||
call.map_view.zero_bits_64 = zero_bits_64;
|
call.map_view.zero_bits = zero_bits;
|
||||||
call.map_view.alloc_type = alloc_type;
|
call.map_view.alloc_type = alloc_type;
|
||||||
call.map_view.prot = protect;
|
call.map_view.prot = protect;
|
||||||
res = server_queue_process_apc( process, &call, &result );
|
res = server_queue_process_apc( process, &call, &result );
|
||||||
|
|
|
@ -493,7 +493,7 @@ typedef union
|
||||||
unsigned int op_type;
|
unsigned int op_type;
|
||||||
client_ptr_t addr;
|
client_ptr_t addr;
|
||||||
mem_size_t size;
|
mem_size_t size;
|
||||||
unsigned int zero_bits_64;
|
mem_size_t zero_bits;
|
||||||
unsigned int prot;
|
unsigned int prot;
|
||||||
} virtual_alloc;
|
} virtual_alloc;
|
||||||
struct
|
struct
|
||||||
|
@ -544,9 +544,9 @@ typedef union
|
||||||
client_ptr_t addr;
|
client_ptr_t addr;
|
||||||
mem_size_t size;
|
mem_size_t size;
|
||||||
file_pos_t offset;
|
file_pos_t offset;
|
||||||
|
mem_size_t zero_bits;
|
||||||
unsigned int alloc_type;
|
unsigned int alloc_type;
|
||||||
unsigned short zero_bits_64;
|
unsigned int prot;
|
||||||
unsigned short prot;
|
|
||||||
} map_view;
|
} map_view;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
@ -1270,7 +1270,7 @@ struct select_reply
|
||||||
apc_call_t call;
|
apc_call_t call;
|
||||||
obj_handle_t apc_handle;
|
obj_handle_t apc_handle;
|
||||||
/* VARARG(context,context); */
|
/* VARARG(context,context); */
|
||||||
char __pad_52[4];
|
char __pad_60[4];
|
||||||
};
|
};
|
||||||
#define SELECT_ALERTABLE 1
|
#define SELECT_ALERTABLE 1
|
||||||
#define SELECT_INTERRUPTIBLE 2
|
#define SELECT_INTERRUPTIBLE 2
|
||||||
|
@ -6683,7 +6683,7 @@ union generic_reply
|
||||||
|
|
||||||
/* ### protocol_version begin ### */
|
/* ### protocol_version begin ### */
|
||||||
|
|
||||||
#define SERVER_PROTOCOL_VERSION 606
|
#define SERVER_PROTOCOL_VERSION 607
|
||||||
|
|
||||||
/* ### protocol_version end ### */
|
/* ### protocol_version end ### */
|
||||||
|
|
||||||
|
|
|
@ -509,7 +509,7 @@ typedef union
|
||||||
unsigned int op_type; /* type of operation */
|
unsigned int op_type; /* type of operation */
|
||||||
client_ptr_t addr; /* requested address */
|
client_ptr_t addr; /* requested address */
|
||||||
mem_size_t size; /* allocation size */
|
mem_size_t size; /* allocation size */
|
||||||
unsigned int zero_bits_64; /* number of zero high bits */
|
mem_size_t zero_bits; /* number of zero high bits */
|
||||||
unsigned int prot; /* memory protection flags */
|
unsigned int prot; /* memory protection flags */
|
||||||
} virtual_alloc;
|
} virtual_alloc;
|
||||||
struct
|
struct
|
||||||
|
@ -560,9 +560,9 @@ typedef union
|
||||||
client_ptr_t addr; /* requested address */
|
client_ptr_t addr; /* requested address */
|
||||||
mem_size_t size; /* allocation size */
|
mem_size_t size; /* allocation size */
|
||||||
file_pos_t offset; /* file offset */
|
file_pos_t offset; /* file offset */
|
||||||
|
mem_size_t zero_bits; /* number of zero high bits */
|
||||||
unsigned int alloc_type; /* allocation type */
|
unsigned int alloc_type; /* allocation type */
|
||||||
unsigned short zero_bits_64; /* number of zero high bits */
|
unsigned int prot; /* memory protection flags */
|
||||||
unsigned short prot; /* memory protection flags */
|
|
||||||
} map_view;
|
} map_view;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
|
|
@ -719,7 +719,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
|
||||||
|
|
||||||
C_ASSERT( sizeof(abstime_t) == 8 );
|
C_ASSERT( sizeof(abstime_t) == 8 );
|
||||||
C_ASSERT( sizeof(affinity_t) == 8 );
|
C_ASSERT( sizeof(affinity_t) == 8 );
|
||||||
C_ASSERT( sizeof(apc_call_t) == 40 );
|
C_ASSERT( sizeof(apc_call_t) == 48 );
|
||||||
C_ASSERT( sizeof(apc_param_t) == 8 );
|
C_ASSERT( sizeof(apc_param_t) == 8 );
|
||||||
C_ASSERT( sizeof(apc_result_t) == 40 );
|
C_ASSERT( sizeof(apc_result_t) == 40 );
|
||||||
C_ASSERT( sizeof(async_data_t) == 40 );
|
C_ASSERT( sizeof(async_data_t) == 40 );
|
||||||
|
@ -891,7 +891,7 @@ C_ASSERT( FIELD_OFFSET(struct unload_dll_request, base) == 16 );
|
||||||
C_ASSERT( sizeof(struct unload_dll_request) == 24 );
|
C_ASSERT( sizeof(struct unload_dll_request) == 24 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct queue_apc_request, handle) == 12 );
|
C_ASSERT( FIELD_OFFSET(struct queue_apc_request, handle) == 12 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct queue_apc_request, call) == 16 );
|
C_ASSERT( FIELD_OFFSET(struct queue_apc_request, call) == 16 );
|
||||||
C_ASSERT( sizeof(struct queue_apc_request) == 56 );
|
C_ASSERT( sizeof(struct queue_apc_request) == 64 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct queue_apc_reply, handle) == 8 );
|
C_ASSERT( FIELD_OFFSET(struct queue_apc_reply, handle) == 8 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct queue_apc_reply, self) == 12 );
|
C_ASSERT( FIELD_OFFSET(struct queue_apc_reply, self) == 12 );
|
||||||
C_ASSERT( sizeof(struct queue_apc_reply) == 16 );
|
C_ASSERT( sizeof(struct queue_apc_reply) == 16 );
|
||||||
|
@ -937,8 +937,8 @@ C_ASSERT( FIELD_OFFSET(struct select_request, size) == 32 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct select_request, prev_apc) == 36 );
|
C_ASSERT( FIELD_OFFSET(struct select_request, prev_apc) == 36 );
|
||||||
C_ASSERT( sizeof(struct select_request) == 40 );
|
C_ASSERT( sizeof(struct select_request) == 40 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct select_reply, call) == 8 );
|
C_ASSERT( FIELD_OFFSET(struct select_reply, call) == 8 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct select_reply, apc_handle) == 48 );
|
C_ASSERT( FIELD_OFFSET(struct select_reply, apc_handle) == 56 );
|
||||||
C_ASSERT( sizeof(struct select_reply) == 56 );
|
C_ASSERT( sizeof(struct select_reply) == 64 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct create_event_request, access) == 12 );
|
C_ASSERT( FIELD_OFFSET(struct create_event_request, access) == 12 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct create_event_request, manual_reset) == 16 );
|
C_ASSERT( FIELD_OFFSET(struct create_event_request, manual_reset) == 16 );
|
||||||
C_ASSERT( FIELD_OFFSET(struct create_event_request, initial_state) == 20 );
|
C_ASSERT( FIELD_OFFSET(struct create_event_request, initial_state) == 20 );
|
||||||
|
|
|
@ -177,9 +177,8 @@ static void dump_apc_call( const char *prefix, const apc_call_t *call )
|
||||||
case APC_VIRTUAL_ALLOC:
|
case APC_VIRTUAL_ALLOC:
|
||||||
dump_uint64( "APC_VIRTUAL_ALLOC,addr==", &call->virtual_alloc.addr );
|
dump_uint64( "APC_VIRTUAL_ALLOC,addr==", &call->virtual_alloc.addr );
|
||||||
dump_uint64( ",size=", &call->virtual_alloc.size );
|
dump_uint64( ",size=", &call->virtual_alloc.size );
|
||||||
fprintf( stderr, ",zero_bits_64=%u,op_type=%x,prot=%x",
|
dump_uint64( ",zero_bits=", &call->virtual_alloc.zero_bits );
|
||||||
call->virtual_alloc.zero_bits_64, call->virtual_alloc.op_type,
|
fprintf( stderr, ",op_type=%x,prot=%x", call->virtual_alloc.op_type, call->virtual_alloc.prot );
|
||||||
call->virtual_alloc.prot );
|
|
||||||
break;
|
break;
|
||||||
case APC_VIRTUAL_FREE:
|
case APC_VIRTUAL_FREE:
|
||||||
dump_uint64( "APC_VIRTUAL_FREE,addr=", &call->virtual_free.addr );
|
dump_uint64( "APC_VIRTUAL_FREE,addr=", &call->virtual_free.addr );
|
||||||
|
@ -211,8 +210,8 @@ static void dump_apc_call( const char *prefix, const apc_call_t *call )
|
||||||
dump_uint64( ",addr=", &call->map_view.addr );
|
dump_uint64( ",addr=", &call->map_view.addr );
|
||||||
dump_uint64( ",size=", &call->map_view.size );
|
dump_uint64( ",size=", &call->map_view.size );
|
||||||
dump_uint64( ",offset=", &call->map_view.offset );
|
dump_uint64( ",offset=", &call->map_view.offset );
|
||||||
fprintf( stderr, ",zero_bits_64=%u,alloc_type=%x,prot=%x",
|
dump_uint64( ",zero_bits=", &call->map_view.zero_bits );
|
||||||
call->map_view.zero_bits_64, call->map_view.alloc_type, call->map_view.prot );
|
fprintf( stderr, ",alloc_type=%x,prot=%x", call->map_view.alloc_type, call->map_view.prot );
|
||||||
break;
|
break;
|
||||||
case APC_UNMAP_VIEW:
|
case APC_UNMAP_VIEW:
|
||||||
dump_uint64( "APC_UNMAP_VIEW,addr=", &call->unmap_view.addr );
|
dump_uint64( "APC_UNMAP_VIEW,addr=", &call->unmap_view.addr );
|
||||||
|
|
|
@ -46,7 +46,7 @@ my %formats =
|
||||||
"abstime_t" => [ 8, 8, "&dump_abstime" ],
|
"abstime_t" => [ 8, 8, "&dump_abstime" ],
|
||||||
"rectangle_t" => [ 16, 4, "&dump_rectangle" ],
|
"rectangle_t" => [ 16, 4, "&dump_rectangle" ],
|
||||||
"char_info_t" => [ 4, 2, "&dump_char_info" ],
|
"char_info_t" => [ 4, 2, "&dump_char_info" ],
|
||||||
"apc_call_t" => [ 40, 8, "&dump_apc_call" ],
|
"apc_call_t" => [ 48, 8, "&dump_apc_call" ],
|
||||||
"apc_result_t" => [ 40, 8, "&dump_apc_result" ],
|
"apc_result_t" => [ 40, 8, "&dump_apc_result" ],
|
||||||
"async_data_t" => [ 40, 8, "&dump_async_data" ],
|
"async_data_t" => [ 40, 8, "&dump_async_data" ],
|
||||||
"irp_params_t" => [ 32, 8, "&dump_irp_params" ],
|
"irp_params_t" => [ 32, 8, "&dump_irp_params" ],
|
||||||
|
|
Loading…
Reference in New Issue