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:
parent
2f4e738429
commit
60c7829e3a
3 changed files with 19 additions and 10 deletions
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue