Fixed overwrite failure on Windows 2000/XP/2003 when the existing file was hidden

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2889 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2003-09-09 14:25:16 +00:00
parent 2f4e738429
commit 60c7829e3a
3 changed files with 19 additions and 10 deletions

View file

@ -388,11 +388,11 @@ static int NSISCALL ExecuteEntry(entry *entry_)
} }
overwriteflag=!(cmp & (0x80000000 | (overwriteflag - 3))); overwriteflag=!(cmp & (0x80000000 | (overwriteflag - 3)));
} }
// remove read only flag if overwrite mode is on
if (!overwriteflag) if (!overwriteflag)
{ {
int attr=GetFileAttributes(buf0); int attr=GetFileAttributes(buf0);
if (attr & FILE_ATTRIBUTE_READONLY) SetFileAttributes(buf0,attr&(~FILE_ATTRIBUTE_READONLY));
SetFileAttributes(buf0,attr^FILE_ATTRIBUTE_READONLY);
} }
hOut=myOpenFile(buf0,GENERIC_WRITE,(overwriteflag==1)?CREATE_NEW:CREATE_ALWAYS); hOut=myOpenFile(buf0,GENERIC_WRITE,(overwriteflag==1)?CREATE_NEW:CREATE_ALWAYS);
if (hOut == INVALID_HANDLE_VALUE) if (hOut == INVALID_HANDLE_VALUE)
@ -430,9 +430,9 @@ static int NSISCALL ExecuteEntry(entry *entry_)
update_status_text(LANG_EXTRACT,buf3); update_status_text(LANG_EXTRACT,buf3);
{ {
ui_st_updateflag ^= 1; ui_st_updateflag++;
ret=GetCompressedDataFromDataBlock(parm2,hOut); ret=GetCompressedDataFromDataBlock(parm2,hOut);
ui_st_updateflag ^= 1; ui_st_updateflag--;
} }
log_printf3("File: wrote %d to \"%s\"",ret,buf0); log_printf3("File: wrote %d to \"%s\"",ret,buf0);

View file

@ -223,7 +223,16 @@ void * NSISCALL mini_memcpy(void *out, const void *in, int len)
HANDLE NSISCALL myOpenFile(const char *fn, DWORD da, DWORD cd) HANDLE NSISCALL myOpenFile(const char *fn, DWORD da, DWORD cd)
{ {
return CreateFile(fn,da,FILE_SHARE_READ,NULL,cd,0,NULL); int attr = GetFileAttributes(fn);
return CreateFile(
fn,
da,
FILE_SHARE_READ,
NULL,
cd,
attr == INVALID_FILE_ATTRIBUTES ? 0 : attr,
NULL
);
} }
char * NSISCALL my_GetTempFileName(char *buf, const char *dir) char * NSISCALL my_GetTempFileName(char *buf, const char *dir)
@ -241,7 +250,7 @@ char * NSISCALL my_GetTempFileName(char *buf, const char *dir)
} }
#ifdef NSIS_SUPPORT_MOVEONREBOOT #ifdef NSIS_SUPPORT_MOVEONREBOOT
BOOL NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew) void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
{ {
BOOL fOk = 0; BOOL fOk = 0;
HMODULE hLib=GetModuleHandle("kernel32.dll"); HMODULE hLib=GetModuleHandle("kernel32.dll");
@ -319,12 +328,12 @@ BOOL NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
else dwRenameLinePos = dwFileSize; else dwRenameLinePos = dwFileSize;
} }
mini_memcpy(&pszWinInit[dwRenameLinePos], szRenameLine,cchRenameLine); mini_memcpy(&pszWinInit[dwRenameLinePos], szRenameLine, cchRenameLine);
dwFileSize += cchRenameLine; dwFileSize += cchRenameLine;
UnmapViewOfFile(pszWinInit); UnmapViewOfFile(pszWinInit);
fOk++; //fOk++;
} }
CloseHandle(hfilemap); CloseHandle(hfilemap);
} }
@ -333,7 +342,7 @@ BOOL NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
CloseHandle(hfile); CloseHandle(hfile);
} }
} }
return fOk; //return fOk;
} }
#endif #endif

View file

@ -59,7 +59,7 @@ void NSISCALL trimslashtoend(char *buf);
char * NSISCALL scanendslash(const char *str); char * NSISCALL scanendslash(const char *str);
int NSISCALL is_valid_instpath(char *s); int NSISCALL is_valid_instpath(char *s);
char * NSISCALL validate_filename(char *fn); char * NSISCALL validate_filename(char *fn);
BOOL NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew); void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew);
void * NSISCALL mini_memcpy(void *out, const void *in, int len); void * NSISCALL mini_memcpy(void *out, const void *in, int len);
// Turn a pair of chars into a word // Turn a pair of chars into a word