From af192f83b692b44fdbfa731967d768bd16fb4ae0 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 8 Oct 2003 00:25:32 +0000 Subject: [PATCH] Store a "removable" flag instead of the full drive type in the server file object; this way we don't need to use GetDriveTypeW in the loader code. Make sure we always have a valid builtin_load_info pointer. --- dlls/ntdll/loader.c | 16 +++++----------- dlls/ntdll/virtual.c | 3 +-- files/file.c | 2 +- include/wine/server_protocol.h | 6 +++--- server/file.c | 22 +++++++++++----------- server/file.h | 2 +- server/mapping.c | 2 +- server/process.c | 11 +++++++++-- server/protocol.def | 4 ++-- server/trace.c | 4 ++-- 10 files changed, 36 insertions(+), 36 deletions(-) diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index c1aa55381b8..352e6143f00 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -1124,7 +1124,6 @@ static NTSTATUS load_native_dll( LPCWSTR load_path, LPCWSTR name, HANDLE file, DWORD len = 0; WINE_MODREF *wm; NTSTATUS status; - UINT drive_type; TRACE( "loading %s\n", debugstr_w(name) ); @@ -1175,7 +1174,6 @@ static NTSTATUS load_native_dll( LPCWSTR load_path, LPCWSTR name, HANDLE file, /* send DLL load event */ nt = RtlImageNtHeader( module ); - drive_type = GetDriveTypeW( wm->ldr.FullDllName.Buffer ); SERVER_START_REQ( load_dll ) { @@ -1185,8 +1183,6 @@ static NTSTATUS load_native_dll( LPCWSTR load_path, LPCWSTR name, HANDLE file, req->dbg_offset = nt->FileHeader.PointerToSymbolTable; req->dbg_size = nt->FileHeader.NumberOfSymbols; req->name = &wm->ldr.FullDllName.Buffer; - /* don't keep the file handle open on removable media */ - if (drive_type == DRIVE_REMOVABLE || drive_type == DRIVE_CDROM) req->handle = 0; wine_server_add_data( req, wm->ldr.FullDllName.Buffer, wm->ldr.FullDllName.Length ); wine_server_call( req ); } @@ -1887,20 +1883,18 @@ PVOID WINAPI RtlImageRvaToVa( const IMAGE_NT_HEADERS *nt, HMODULE module, */ HMODULE BUILTIN32_LoadExeModule( HMODULE main ) { - struct builtin_load_info info, *prev_info; + static struct builtin_load_info default_info; if (!MODULE_GetSystemDirectory( &system_dir )) MESSAGE( "Couldn't get system dir in process init\n"); NtCurrentTeb()->Peb->ImageBaseAddress = main; - info.status = STATUS_SUCCESS; - info.load_path = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer; - prev_info = builtin_load_info; - builtin_load_info = &info; + default_info.status = STATUS_SUCCESS; + default_info.load_path = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer; + builtin_load_info = &default_info; wine_dll_set_callback( load_builtin_callback ); - builtin_load_info = prev_info; if (!NtCurrentTeb()->Peb->ImageBaseAddress) MESSAGE( "No built-in EXE module loaded! Did you create a .spec file?\n" ); - if (info.status != STATUS_SUCCESS) + if (default_info.status != STATUS_SUCCESS) MESSAGE( "Error while processing initial modules\n"); return NtCurrentTeb()->Peb->ImageBaseAddress; } diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c index 2626994a67b..800a467643a 100644 --- a/dlls/ntdll/virtual.c +++ b/dlls/ntdll/virtual.c @@ -1404,8 +1404,7 @@ NTSTATUS WINAPI NtMapViewOfSection( HANDLE handle, HANDLE process, PVOID *addr_p header_size = reply->header_size; shared_file = reply->shared_file; shared_size = reply->shared_size; - removable = (reply->drive_type == DRIVE_REMOVABLE || - reply->drive_type == DRIVE_CDROM); + removable = reply->removable; } SERVER_END_REQ; if (res) goto error; diff --git a/files/file.c b/files/file.c index b219a27989e..9b78e2fb520 100644 --- a/files/file.c +++ b/files/file.c @@ -416,7 +416,7 @@ HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing, req->sharing = sharing; req->create = creation; req->attrs = attributes; - req->drive_type = drive_type; + req->removable = (drive_type == DRIVE_REMOVABLE || drive_type == DRIVE_CDROM); wine_server_add_data( req, filename, strlen(filename) ); SetLastError(0); err = wine_server_call( req ); diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index f5f38d22ae7..b00233ce4a3 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -753,7 +753,7 @@ struct create_file_request unsigned int sharing; int create; unsigned int attrs; - int drive_type; + int removable; /* VARARG(filename,string); */ }; struct create_file_reply @@ -1501,7 +1501,7 @@ struct get_mapping_info_reply void* base; obj_handle_t shared_file; int shared_size; - int drive_type; + int removable; }; @@ -3668,6 +3668,6 @@ union generic_reply struct set_global_windows_reply set_global_windows_reply; }; -#define SERVER_PROTOCOL_VERSION 124 +#define SERVER_PROTOCOL_VERSION 125 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/file.c b/server/file.c index 1ff29a90293..5ed8d4c51ac 100644 --- a/server/file.c +++ b/server/file.c @@ -59,7 +59,7 @@ struct file unsigned int access; /* file access (GENERIC_READ/WRITE) */ unsigned int flags; /* flags (FILE_FLAG_*) */ unsigned int sharing; /* file sharing mode */ - int drive_type; /* type of drive the file is on */ + int removable; /* is file on removable media? */ struct async_queue read_q; struct async_queue write_q; }; @@ -134,7 +134,7 @@ static int check_sharing( const char *name, int hash, unsigned int access, /* create a file from a file descriptor */ /* if the function fails the fd is closed */ static struct file *create_file_for_fd( int fd, unsigned int access, unsigned int sharing, - unsigned int attrs, int drive_type ) + unsigned int attrs, int removable ) { struct file *file; @@ -145,7 +145,7 @@ static struct file *create_file_for_fd( int fd, unsigned int access, unsigned in file->access = access; file->flags = attrs; file->sharing = sharing; - file->drive_type = drive_type; + file->removable = removable; if (file->flags & FILE_FLAG_OVERLAPPED) { init_async_queue (&file->read_q); @@ -163,7 +163,7 @@ static struct file *create_file_for_fd( int fd, unsigned int access, unsigned in static struct file *create_file( const char *nameptr, size_t len, unsigned int access, unsigned int sharing, int create, unsigned int attrs, - int drive_type ) + int removable ) { struct file *file; int hash, flags; @@ -205,7 +205,7 @@ static struct file *create_file( const char *nameptr, size_t len, unsigned int a file->access = access; file->flags = attrs; file->sharing = sharing; - file->drive_type = drive_type; + file->removable = removable; file->name = name; file->next = file_hash[hash]; file_hash[hash] = file; @@ -242,10 +242,10 @@ int is_same_file( struct file *file1, struct file *file2 ) return !strcmp( file1->name, file2->name ); } -/* get the type of drive the file is on */ -int get_file_drive_type( struct file *file ) +/* check if the file is on removable media */ +int is_file_removable( struct file *file ) { - return file->drive_type; + return file->removable; } /* create a temp file for anonymous mappings */ @@ -262,7 +262,7 @@ struct file *create_temp_file( int access ) return NULL; } unlink( tmpfn ); - return create_file_for_fd( fd, access, 0, 0, DRIVE_FIXED ); + return create_file_for_fd( fd, access, 0, 0, FALSE ); } static void file_dump( struct object *obj, int verbose ) @@ -598,7 +598,7 @@ DECL_HANDLER(create_file) reply->handle = 0; if ((file = create_file( get_req_data(), get_req_data_size(), req->access, - req->sharing, req->create, req->attrs, req->drive_type ))) + req->sharing, req->create, req->attrs, req->removable ))) { reply->handle = alloc_handle( current->process, file, req->access, req->inherit ); release_object( file ); @@ -618,7 +618,7 @@ DECL_HANDLER(alloc_file_handle) return; } if ((file = create_file_for_fd( fd, req->access, FILE_SHARE_READ | FILE_SHARE_WRITE, - 0, DRIVE_UNKNOWN ))) + 0, FALSE ))) { reply->handle = alloc_handle( current->process, file, req->access, req->inherit ); release_object( file ); diff --git a/server/file.h b/server/file.h index 8bc09e9b1b9..890cdb3d511 100644 --- a/server/file.h +++ b/server/file.h @@ -91,7 +91,7 @@ extern struct file *get_file_obj( struct process *process, obj_handle_t handle, unsigned int access ); extern int get_file_unix_fd( struct file *file ); extern int is_same_file( struct file *file1, struct file *file2 ); -extern int get_file_drive_type( struct file *file ); +extern int is_file_removable( struct file *file ); extern int grow_file( struct file *file, int size_high, int size_low ); extern struct file *create_temp_file( int access ); extern void file_set_error(void); diff --git a/server/mapping.c b/server/mapping.c index ccd0e8c9763..092f48a863e 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -391,7 +391,7 @@ DECL_HANDLER(get_mapping_info) reply->base = mapping->base; reply->shared_file = 0; reply->shared_size = mapping->shared_size; - reply->drive_type = get_file_drive_type( mapping->file ); + reply->removable = is_file_removable( mapping->file ); if (mapping->shared_file) reply->shared_file = alloc_handle( current->process, mapping->shared_file, GENERIC_READ|GENERIC_WRITE, 0 ); diff --git a/server/process.c b/server/process.c index 0e5da9510cf..7be8afd5ad0 100644 --- a/server/process.c +++ b/server/process.c @@ -1107,8 +1107,15 @@ DECL_HANDLER(load_dll) struct process_dll *dll; struct file *file = NULL; - if (req->handle && - !(file = get_file_obj( current->process, req->handle, GENERIC_READ ))) return; + if (req->handle) + { + if (!(file = get_file_obj( current->process, req->handle, GENERIC_READ ))) return; + if (is_file_removable( file )) /* don't keep the file open on removable media */ + { + release_object( file ); + file = NULL; + } + } if ((dll = process_load_dll( current->process, file, req->base, get_req_data(), get_req_data_size() ))) diff --git a/server/protocol.def b/server/protocol.def index e05d62b5bb0..e11111c0578 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -578,7 +578,7 @@ enum event_op { PULSE_EVENT, SET_EVENT, RESET_EVENT }; unsigned int sharing; /* sharing flags */ int create; /* file create action */ unsigned int attrs; /* file attributes for creation */ - int drive_type; /* type of drive the file is on */ + int removable; /* is file on removable media? */ VARARG(filename,string); /* file name */ @REPLY obj_handle_t handle; /* handle to the file */ @@ -1104,7 +1104,7 @@ enum char_info_mode void* base; /* default base addr (for VPROT_IMAGE mapping) */ obj_handle_t shared_file; /* shared mapping file handle */ int shared_size; /* shared mapping size */ - int drive_type; /* type of drive the file is on */ + int removable; /* is file on removable media? */ @END diff --git a/server/trace.c b/server/trace.c index 635c012ee51..99ae64955c3 100644 --- a/server/trace.c +++ b/server/trace.c @@ -841,7 +841,7 @@ static void dump_create_file_request( const struct create_file_request *req ) fprintf( stderr, " sharing=%08x,", req->sharing ); fprintf( stderr, " create=%d,", req->create ); fprintf( stderr, " attrs=%08x,", req->attrs ); - fprintf( stderr, " drive_type=%d,", req->drive_type ); + fprintf( stderr, " removable=%d,", req->removable ); fprintf( stderr, " filename=" ); dump_varargs_string( cur_size ); } @@ -1348,7 +1348,7 @@ static void dump_get_mapping_info_reply( const struct get_mapping_info_reply *re fprintf( stderr, " base=%p,", req->base ); fprintf( stderr, " shared_file=%p,", req->shared_file ); fprintf( stderr, " shared_size=%d,", req->shared_size ); - fprintf( stderr, " drive_type=%d", req->drive_type ); + fprintf( stderr, " removable=%d", req->removable ); } static void dump_create_device_request( const struct create_device_request *req )