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.
oldstable
Alexandre Julliard 2003-10-08 00:25:32 +00:00
parent 146afcc98c
commit af192f83b6
10 changed files with 36 additions and 36 deletions

View File

@ -1124,7 +1124,6 @@ static NTSTATUS load_native_dll( LPCWSTR load_path, LPCWSTR name, HANDLE file,
DWORD len = 0; DWORD len = 0;
WINE_MODREF *wm; WINE_MODREF *wm;
NTSTATUS status; NTSTATUS status;
UINT drive_type;
TRACE( "loading %s\n", debugstr_w(name) ); 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 */ /* send DLL load event */
nt = RtlImageNtHeader( module ); nt = RtlImageNtHeader( module );
drive_type = GetDriveTypeW( wm->ldr.FullDllName.Buffer );
SERVER_START_REQ( load_dll ) 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_offset = nt->FileHeader.PointerToSymbolTable;
req->dbg_size = nt->FileHeader.NumberOfSymbols; req->dbg_size = nt->FileHeader.NumberOfSymbols;
req->name = &wm->ldr.FullDllName.Buffer; 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_add_data( req, wm->ldr.FullDllName.Buffer, wm->ldr.FullDllName.Length );
wine_server_call( req ); wine_server_call( req );
} }
@ -1887,20 +1883,18 @@ PVOID WINAPI RtlImageRvaToVa( const IMAGE_NT_HEADERS *nt, HMODULE module,
*/ */
HMODULE BUILTIN32_LoadExeModule( HMODULE main ) HMODULE BUILTIN32_LoadExeModule( HMODULE main )
{ {
struct builtin_load_info info, *prev_info; static struct builtin_load_info default_info;
if (!MODULE_GetSystemDirectory( &system_dir )) if (!MODULE_GetSystemDirectory( &system_dir ))
MESSAGE( "Couldn't get system dir in process init\n"); MESSAGE( "Couldn't get system dir in process init\n");
NtCurrentTeb()->Peb->ImageBaseAddress = main; NtCurrentTeb()->Peb->ImageBaseAddress = main;
info.status = STATUS_SUCCESS; default_info.status = STATUS_SUCCESS;
info.load_path = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer; default_info.load_path = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer;
prev_info = builtin_load_info; builtin_load_info = &default_info;
builtin_load_info = &info;
wine_dll_set_callback( load_builtin_callback ); wine_dll_set_callback( load_builtin_callback );
builtin_load_info = prev_info;
if (!NtCurrentTeb()->Peb->ImageBaseAddress) if (!NtCurrentTeb()->Peb->ImageBaseAddress)
MESSAGE( "No built-in EXE module loaded! Did you create a .spec file?\n" ); 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"); MESSAGE( "Error while processing initial modules\n");
return NtCurrentTeb()->Peb->ImageBaseAddress; return NtCurrentTeb()->Peb->ImageBaseAddress;
} }

View File

@ -1404,8 +1404,7 @@ NTSTATUS WINAPI NtMapViewOfSection( HANDLE handle, HANDLE process, PVOID *addr_p
header_size = reply->header_size; header_size = reply->header_size;
shared_file = reply->shared_file; shared_file = reply->shared_file;
shared_size = reply->shared_size; shared_size = reply->shared_size;
removable = (reply->drive_type == DRIVE_REMOVABLE || removable = reply->removable;
reply->drive_type == DRIVE_CDROM);
} }
SERVER_END_REQ; SERVER_END_REQ;
if (res) goto error; if (res) goto error;

View File

@ -416,7 +416,7 @@ HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing,
req->sharing = sharing; req->sharing = sharing;
req->create = creation; req->create = creation;
req->attrs = attributes; 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) ); wine_server_add_data( req, filename, strlen(filename) );
SetLastError(0); SetLastError(0);
err = wine_server_call( req ); err = wine_server_call( req );

View File

@ -753,7 +753,7 @@ struct create_file_request
unsigned int sharing; unsigned int sharing;
int create; int create;
unsigned int attrs; unsigned int attrs;
int drive_type; int removable;
/* VARARG(filename,string); */ /* VARARG(filename,string); */
}; };
struct create_file_reply struct create_file_reply
@ -1501,7 +1501,7 @@ struct get_mapping_info_reply
void* base; void* base;
obj_handle_t shared_file; obj_handle_t shared_file;
int shared_size; int shared_size;
int drive_type; int removable;
}; };
@ -3668,6 +3668,6 @@ union generic_reply
struct set_global_windows_reply set_global_windows_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 */ #endif /* __WINE_WINE_SERVER_PROTOCOL_H */

View File

@ -59,7 +59,7 @@ struct file
unsigned int access; /* file access (GENERIC_READ/WRITE) */ unsigned int access; /* file access (GENERIC_READ/WRITE) */
unsigned int flags; /* flags (FILE_FLAG_*) */ unsigned int flags; /* flags (FILE_FLAG_*) */
unsigned int sharing; /* file sharing mode */ 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 read_q;
struct async_queue write_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 */ /* create a file from a file descriptor */
/* if the function fails the fd is closed */ /* if the function fails the fd is closed */
static struct file *create_file_for_fd( int fd, unsigned int access, unsigned int sharing, 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; 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->access = access;
file->flags = attrs; file->flags = attrs;
file->sharing = sharing; file->sharing = sharing;
file->drive_type = drive_type; file->removable = removable;
if (file->flags & FILE_FLAG_OVERLAPPED) if (file->flags & FILE_FLAG_OVERLAPPED)
{ {
init_async_queue (&file->read_q); 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, static struct file *create_file( const char *nameptr, size_t len, unsigned int access,
unsigned int sharing, int create, unsigned int attrs, unsigned int sharing, int create, unsigned int attrs,
int drive_type ) int removable )
{ {
struct file *file; struct file *file;
int hash, flags; 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->access = access;
file->flags = attrs; file->flags = attrs;
file->sharing = sharing; file->sharing = sharing;
file->drive_type = drive_type; file->removable = removable;
file->name = name; file->name = name;
file->next = file_hash[hash]; file->next = file_hash[hash];
file_hash[hash] = file; file_hash[hash] = file;
@ -242,10 +242,10 @@ int is_same_file( struct file *file1, struct file *file2 )
return !strcmp( file1->name, file2->name ); return !strcmp( file1->name, file2->name );
} }
/* get the type of drive the file is on */ /* check if the file is on removable media */
int get_file_drive_type( struct file *file ) int is_file_removable( struct file *file )
{ {
return file->drive_type; return file->removable;
} }
/* create a temp file for anonymous mappings */ /* create a temp file for anonymous mappings */
@ -262,7 +262,7 @@ struct file *create_temp_file( int access )
return NULL; return NULL;
} }
unlink( tmpfn ); 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 ) static void file_dump( struct object *obj, int verbose )
@ -598,7 +598,7 @@ DECL_HANDLER(create_file)
reply->handle = 0; reply->handle = 0;
if ((file = create_file( get_req_data(), get_req_data_size(), req->access, 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 ); reply->handle = alloc_handle( current->process, file, req->access, req->inherit );
release_object( file ); release_object( file );
@ -618,7 +618,7 @@ DECL_HANDLER(alloc_file_handle)
return; return;
} }
if ((file = create_file_for_fd( fd, req->access, FILE_SHARE_READ | FILE_SHARE_WRITE, 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 ); reply->handle = alloc_handle( current->process, file, req->access, req->inherit );
release_object( file ); release_object( file );

View File

@ -91,7 +91,7 @@ extern struct file *get_file_obj( struct process *process, obj_handle_t handle,
unsigned int access ); unsigned int access );
extern int get_file_unix_fd( struct file *file ); extern int get_file_unix_fd( struct file *file );
extern int is_same_file( struct file *file1, struct file *file2 ); 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 int grow_file( struct file *file, int size_high, int size_low );
extern struct file *create_temp_file( int access ); extern struct file *create_temp_file( int access );
extern void file_set_error(void); extern void file_set_error(void);

View File

@ -391,7 +391,7 @@ DECL_HANDLER(get_mapping_info)
reply->base = mapping->base; reply->base = mapping->base;
reply->shared_file = 0; reply->shared_file = 0;
reply->shared_size = mapping->shared_size; 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) if (mapping->shared_file)
reply->shared_file = alloc_handle( current->process, mapping->shared_file, reply->shared_file = alloc_handle( current->process, mapping->shared_file,
GENERIC_READ|GENERIC_WRITE, 0 ); GENERIC_READ|GENERIC_WRITE, 0 );

View File

@ -1107,8 +1107,15 @@ DECL_HANDLER(load_dll)
struct process_dll *dll; struct process_dll *dll;
struct file *file = NULL; struct file *file = NULL;
if (req->handle && if (req->handle)
!(file = get_file_obj( current->process, req->handle, GENERIC_READ ))) return; {
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, if ((dll = process_load_dll( current->process, file, req->base,
get_req_data(), get_req_data_size() ))) get_req_data(), get_req_data_size() )))

View File

@ -578,7 +578,7 @@ enum event_op { PULSE_EVENT, SET_EVENT, RESET_EVENT };
unsigned int sharing; /* sharing flags */ unsigned int sharing; /* sharing flags */
int create; /* file create action */ int create; /* file create action */
unsigned int attrs; /* file attributes for creation */ 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 */ VARARG(filename,string); /* file name */
@REPLY @REPLY
obj_handle_t handle; /* handle to the file */ 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) */ void* base; /* default base addr (for VPROT_IMAGE mapping) */
obj_handle_t shared_file; /* shared mapping file handle */ obj_handle_t shared_file; /* shared mapping file handle */
int shared_size; /* shared mapping size */ int shared_size; /* shared mapping size */
int drive_type; /* type of drive the file is on */ int removable; /* is file on removable media? */
@END @END

View File

@ -841,7 +841,7 @@ static void dump_create_file_request( const struct create_file_request *req )
fprintf( stderr, " sharing=%08x,", req->sharing ); fprintf( stderr, " sharing=%08x,", req->sharing );
fprintf( stderr, " create=%d,", req->create ); fprintf( stderr, " create=%d,", req->create );
fprintf( stderr, " attrs=%08x,", req->attrs ); fprintf( stderr, " attrs=%08x,", req->attrs );
fprintf( stderr, " drive_type=%d,", req->drive_type ); fprintf( stderr, " removable=%d,", req->removable );
fprintf( stderr, " filename=" ); fprintf( stderr, " filename=" );
dump_varargs_string( cur_size ); 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, " base=%p,", req->base );
fprintf( stderr, " shared_file=%p,", req->shared_file ); fprintf( stderr, " shared_file=%p,", req->shared_file );
fprintf( stderr, " shared_size=%d,", req->shared_size ); 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 ) static void dump_create_device_request( const struct create_device_request *req )