📄 files.c
字号:
{
res = E_FAIL;
goto done;
}
dwFilesFound = fill_file_list(&extractDest, CabName, szConvertedList);
if (dwFilesFound != dwFileCount)
{
res = E_FAIL;
goto done;
}
}
else
extractDest.flags |= EXTRACT_FILLFILELIST;
extractDest.flags |= EXTRACT_EXTRACTFILES;
res = pExtract(&extractDest, CabName);
if (extractDest.filelist)
{
struct ExtractFileList* curr = extractDest.filelist;
struct ExtractFileList* next;
while (curr)
{
next = curr->next;
free_file_node(curr);
curr = next;
}
}
done:
FreeLibrary(hCabinet);
HeapFree(GetProcessHeap(), 0, szConvertedList);
return res;
}
/***********************************************************************
* FileSaveMarkNotExistA (ADVPACK.@)
*
* See FileSaveMarkNotExistW.
*/
HRESULT WINAPI FileSaveMarkNotExistA(LPSTR pszFileList, LPSTR pszDir, LPSTR pszBaseName)
{
TRACE("(%s, %s, %s)\n", debugstr_a(pszFileList),
debugstr_a(pszDir), debugstr_a(pszBaseName));
return AddDelBackupEntryA(pszFileList, pszDir, pszBaseName, AADBE_DEL_ENTRY);
}
/***********************************************************************
* FileSaveMarkNotExistW (ADVPACK.@)
*
* Marks the files in the file list as not existing so they won't be
* backed up during a save.
*
* PARAMS
* pszFileList [I] NULL-separated list of filenames.
* pszDir [I] Path of the backup directory.
* pszBaseName [I] Basename of the INI file.
*
* RETURNS
* Success: S_OK.
* Failure: E_FAIL.
*/
HRESULT WINAPI FileSaveMarkNotExistW(LPWSTR pszFileList, LPWSTR pszDir, LPWSTR pszBaseName)
{
TRACE("(%s, %s, %s)\n", debugstr_w(pszFileList),
debugstr_w(pszDir), debugstr_w(pszBaseName));
return AddDelBackupEntryW(pszFileList, pszDir, pszBaseName, AADBE_DEL_ENTRY);
}
/***********************************************************************
* FileSaveRestoreA (ADVPACK.@)
*
* See FileSaveRestoreW.
*/
HRESULT WINAPI FileSaveRestoreA(HWND hDlg, LPSTR pszFileList, LPSTR pszDir,
LPSTR pszBaseName, DWORD dwFlags)
{
UNICODE_STRING filelist, dir, basename;
HRESULT hr;
TRACE("(%p, %s, %s, %s, %d)\n", hDlg, debugstr_a(pszFileList),
debugstr_a(pszDir), debugstr_a(pszBaseName), dwFlags);
RtlCreateUnicodeStringFromAsciiz(&filelist, pszFileList);
RtlCreateUnicodeStringFromAsciiz(&dir, pszDir);
RtlCreateUnicodeStringFromAsciiz(&basename, pszBaseName);
hr = FileSaveRestoreW(hDlg, filelist.Buffer, dir.Buffer,
basename.Buffer, dwFlags);
RtlFreeUnicodeString(&filelist);
RtlFreeUnicodeString(&dir);
RtlFreeUnicodeString(&basename);
return hr;
}
/***********************************************************************
* FileSaveRestoreW (ADVPACK.@)
*
* Saves or restores the files in the specified file list.
*
* PARAMS
* hDlg [I] Handle to the dialog used for the display.
* pszFileList [I] NULL-separated list of filenames.
* pszDir [I] Path of the backup directory.
* pszBaseName [I] Basename of the backup files.
* dwFlags [I] See advpub.h.
*
* RETURNS
* Success: S_OK.
* Failure: E_FAIL.
*
* NOTES
* If pszFileList is NULL on restore, all files will be restored.
*
* BUGS
* Unimplemented.
*/
HRESULT WINAPI FileSaveRestoreW(HWND hDlg, LPWSTR pszFileList, LPWSTR pszDir,
LPWSTR pszBaseName, DWORD dwFlags)
{
FIXME("(%p, %s, %s, %s, %d) stub\n", hDlg, debugstr_w(pszFileList),
debugstr_w(pszDir), debugstr_w(pszBaseName), dwFlags);
return E_FAIL;
}
/***********************************************************************
* FileSaveRestoreOnINFA (ADVPACK.@)
*
* See FileSaveRestoreOnINFW.
*/
HRESULT WINAPI FileSaveRestoreOnINFA(HWND hWnd, LPCSTR pszTitle, LPCSTR pszINF,
LPCSTR pszSection, LPCSTR pszBackupDir,
LPCSTR pszBaseBackupFile, DWORD dwFlags)
{
UNICODE_STRING title, inf, section;
UNICODE_STRING backupdir, backupfile;
HRESULT hr;
TRACE("(%p, %s, %s, %s, %s, %s, %d)\n", hWnd, debugstr_a(pszTitle),
debugstr_a(pszINF), debugstr_a(pszSection), debugstr_a(pszBackupDir),
debugstr_a(pszBaseBackupFile), dwFlags);
RtlCreateUnicodeStringFromAsciiz(&title, pszTitle);
RtlCreateUnicodeStringFromAsciiz(&inf, pszINF);
RtlCreateUnicodeStringFromAsciiz(§ion, pszSection);
RtlCreateUnicodeStringFromAsciiz(&backupdir, pszBackupDir);
RtlCreateUnicodeStringFromAsciiz(&backupfile, pszBaseBackupFile);
hr = FileSaveRestoreOnINFW(hWnd, title.Buffer, inf.Buffer, section.Buffer,
backupdir.Buffer, backupfile.Buffer, dwFlags);
RtlFreeUnicodeString(&title);
RtlFreeUnicodeString(&inf);
RtlFreeUnicodeString(§ion);
RtlFreeUnicodeString(&backupdir);
RtlFreeUnicodeString(&backupfile);
return hr;
}
/***********************************************************************
* FileSaveRestoreOnINFW (ADVPACK.@)
*
*
* PARAMS
* hWnd [I] Handle to the window used for the display.
* pszTitle [I] Title of the window.
* pszINF [I] Fully-qualified INF filename.
* pszSection [I] GenInstall INF section name.
* pszBackupDir [I] Directory to store the backup file.
* pszBaseBackupFile [I] Basename of the backup files.
* dwFlags [I] See advpub.h
*
* RETURNS
* Success: S_OK.
* Failure: E_FAIL.
*
* NOTES
* If pszSection is NULL, the default section will be used.
*
* BUGS
* Unimplemented.
*/
HRESULT WINAPI FileSaveRestoreOnINFW(HWND hWnd, LPCWSTR pszTitle, LPCWSTR pszINF,
LPCWSTR pszSection, LPCWSTR pszBackupDir,
LPCWSTR pszBaseBackupFile, DWORD dwFlags)
{
FIXME("(%p, %s, %s, %s, %s, %s, %d): stub\n", hWnd, debugstr_w(pszTitle),
debugstr_w(pszINF), debugstr_w(pszSection), debugstr_w(pszBackupDir),
debugstr_w(pszBaseBackupFile), dwFlags);
return E_FAIL;
}
/***********************************************************************
* GetVersionFromFileA (ADVPACK.@)
*
* See GetVersionFromFileExW.
*/
HRESULT WINAPI GetVersionFromFileA(LPCSTR Filename, LPDWORD MajorVer,
LPDWORD MinorVer, BOOL Version )
{
TRACE("(%s, %p, %p, %d)\n", debugstr_a(Filename), MajorVer, MinorVer, Version);
return GetVersionFromFileExA(Filename, MajorVer, MinorVer, Version);
}
/***********************************************************************
* GetVersionFromFileW (ADVPACK.@)
*
* See GetVersionFromFileExW.
*/
HRESULT WINAPI GetVersionFromFileW(LPCWSTR Filename, LPDWORD MajorVer,
LPDWORD MinorVer, BOOL Version )
{
TRACE("(%s, %p, %p, %d)\n", debugstr_w(Filename), MajorVer, MinorVer, Version);
return GetVersionFromFileExW(Filename, MajorVer, MinorVer, Version);
}
/* data for GetVersionFromFileEx */
typedef struct tagLANGANDCODEPAGE
{
WORD wLanguage;
WORD wCodePage;
} LANGANDCODEPAGE;
/***********************************************************************
* GetVersionFromFileExA (ADVPACK.@)
*
* See GetVersionFromFileExW.
*/
HRESULT WINAPI GetVersionFromFileExA(LPCSTR lpszFilename, LPDWORD pdwMSVer,
LPDWORD pdwLSVer, BOOL bVersion )
{
UNICODE_STRING filename;
HRESULT res;
TRACE("(%s, %p, %p, %d)\n", debugstr_a(lpszFilename),
pdwMSVer, pdwLSVer, bVersion);
RtlCreateUnicodeStringFromAsciiz(&filename, lpszFilename);
res = GetVersionFromFileExW(filename.Buffer, pdwMSVer, pdwLSVer, bVersion);
RtlFreeUnicodeString(&filename);
return res;
}
/***********************************************************************
* GetVersionFromFileExW (ADVPACK.@)
*
* Gets the files version or language information.
*
* PARAMS
* lpszFilename [I] The file to get the info from.
* pdwMSVer [O] Major version.
* pdwLSVer [O] Minor version.
* bVersion [I] Whether to retrieve version or language info.
*
* RETURNS
* Always returns S_OK.
*
* NOTES
* If bVersion is TRUE, version information is retrieved, else
* pdwMSVer gets the language ID and pdwLSVer gets the codepage ID.
*/
HRESULT WINAPI GetVersionFromFileExW(LPCWSTR lpszFilename, LPDWORD pdwMSVer,
LPDWORD pdwLSVer, BOOL bVersion )
{
VS_FIXEDFILEINFO *pFixedVersionInfo;
LANGANDCODEPAGE *pLangAndCodePage;
DWORD dwHandle, dwInfoSize;
WCHAR szWinDir[MAX_PATH];
WCHAR szFile[MAX_PATH];
LPVOID pVersionInfo = NULL;
BOOL bFileCopied = FALSE;
UINT uValueLen;
static WCHAR backslash[] = {'\\',0};
static WCHAR translation[] = {
'\\','V','a','r','F','i','l','e','I','n','f','o',
'\\','T','r','a','n','s','l','a','t','i','o','n',0
};
TRACE("(%s, %p, %p, %d)\n", debugstr_w(lpszFilename),
pdwMSVer, pdwLSVer, bVersion);
*pdwLSVer = 0;
*pdwMSVer = 0;
lstrcpynW(szFile, lpszFilename, MAX_PATH);
dwInfoSize = GetFileVersionInfoSizeW(szFile, &dwHandle);
if (!dwInfoSize)
{
/* check that the file exists */
if (GetFileAttributesW(szFile) == INVALID_FILE_ATTRIBUTES)
return S_OK;
/* file exists, but won't be found by GetFileVersionInfoSize,
* so copy it to the temp dir where it will be found.
*/
GetWindowsDirectoryW(szWinDir, MAX_PATH);
GetTempFileNameW(szWinDir, NULL, 0, szFile);
CopyFileW(lpszFilename, szFile, FALSE);
bFileCopied = TRUE;
dwInfoSize = GetFileVersionInfoSizeW(szFile, &dwHandle);
if (!dwInfoSize)
goto done;
}
pVersionInfo = HeapAlloc(GetProcessHeap(), 0, dwInfoSize);
if (!pVersionInfo)
goto done;
if (!GetFileVersionInfoW(szFile, dwHandle, dwInfoSize, pVersionInfo))
goto done;
if (bVersion)
{
if (!VerQueryValueW(pVersionInfo, backslash,
(LPVOID *)&pFixedVersionInfo, &uValueLen))
goto done;
if (!uValueLen)
goto done;
*pdwMSVer = pFixedVersionInfo->dwFileVersionMS;
*pdwLSVer = pFixedVersionInfo->dwFileVersionLS;
}
else
{
if (!VerQueryValueW(pVersionInfo, translation,
(LPVOID *)&pLangAndCodePage, &uValueLen))
goto done;
if (!uValueLen)
goto done;
*pdwMSVer = pLangAndCodePage->wLanguage;
*pdwLSVer = pLangAndCodePage->wCodePage;
}
done:
HeapFree(GetProcessHeap(), 0, pVersionInfo);
if (bFileCopied)
DeleteFileW(szFile);
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -