Don't keep main exe and dlls handles open when the file is on

removable media.
This commit is contained in:
Alexandre Julliard 2001-10-25 19:52:12 +00:00
parent 850c9dd6bd
commit ac2e4f1e3d
3 changed files with 23 additions and 7 deletions

View File

@ -667,6 +667,12 @@ WINE_MODREF *PE_CreateModule( HMODULE hModule, LPCSTR filename, DWORD flags,
if (nt->FileHeader.Characteristics & IMAGE_FILE_DLL)
{
if (hFile)
{
UINT drive_type = GetDriveTypeA( wm->short_filename );
/* don't keep the file handle open on removable media */
if (drive_type == DRIVE_REMOVABLE || drive_type == DRIVE_CDROM) hFile = 0;
}
SERVER_START_REQ( load_dll )
{
req->handle = hFile;

View File

@ -319,6 +319,7 @@ static void start_process(void)
int debugged, console_app;
LPTHREAD_START_ROUTINE entry;
WINE_MODREF *wm;
HFILE main_file = main_exe_file;
/* use original argv[0] as name for the main module */
if (!main_exe_name[0])
@ -327,6 +328,13 @@ static void start_process(void)
lstrcpynA( main_exe_name, full_argv0, sizeof(main_exe_name) );
}
if (main_file)
{
UINT drive_type = GetDriveTypeA( main_exe_name );
/* don't keep the file handle open on removable media */
if (drive_type == DRIVE_REMOVABLE || drive_type == DRIVE_CDROM) main_file = 0;
}
/* Retrieve entry point address */
entry = (LPTHREAD_START_ROUTINE)((char*)current_process.module +
PE_HEADER(current_process.module)->OptionalHeader.AddressOfEntryPoint);
@ -340,7 +348,7 @@ static void start_process(void)
req->entry = entry;
/* API requires a double indirection */
req->name = &main_exe_name_ptr;
req->exe_file = main_exe_file;
req->exe_file = main_file;
req->gui = !console_app;
SERVER_CALL();
debugged = req->debugged;
@ -357,6 +365,8 @@ static void start_process(void)
goto error;
wm->refCount++;
if (main_exe_file) CloseHandle( main_exe_file ); /* we no longer need it */
RtlAcquirePebLock();
PE_InitTls();
MODULE_DllProcessAttach( NULL, (LPVOID)1 );

View File

@ -788,8 +788,9 @@ DECL_HANDLER(init_process)
/* signal the end of the process initialization */
DECL_HANDLER(init_process_done)
{
struct file *file;
struct file *file = NULL;
struct process *process = current->process;
if (!process->init_event)
{
fatal_protocol_error( current, "init_process_done: no event\n" );
@ -798,11 +799,10 @@ DECL_HANDLER(init_process_done)
process->exe.base = req->module;
process->exe.name = req->name;
if (req->exe_file && (file = get_file_obj( current->process, req->exe_file, GENERIC_READ )))
{
if (process->exe.file) release_object( process->exe.file );
process->exe.file = file;
}
if (req->exe_file) file = get_file_obj( current->process, req->exe_file, GENERIC_READ );
if (process->exe.file) release_object( process->exe.file );
process->exe.file = file;
generate_startup_debug_events( current->process, req->entry );
set_event( process->init_event );
release_object( process->init_event );