mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 10:35:28 +00:00
123 lines
3.6 KiB
C
123 lines
3.6 KiB
C
/*
|
|
* PROJECT: ReactOS Applications
|
|
* LICENSE: LGPL - See COPYING in the top level directory
|
|
* FILE: base/applications/msconfig_new/fileutils.c
|
|
* PURPOSE: File Utility Functions
|
|
* COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
#include "utils.h"
|
|
#include "fileutils.h"
|
|
|
|
//
|
|
// NOTE: A function called "FileExists" with the very same prototype
|
|
// already exists in the PSDK headers (in setupapi.h)
|
|
//
|
|
BOOL
|
|
MyFileExists(IN LPCWSTR lpszFilePath,
|
|
OUT PWIN32_FIND_DATAW pFindData OPTIONAL)
|
|
{
|
|
BOOL bIsFound = FALSE;
|
|
WIN32_FIND_DATAW find_data;
|
|
|
|
DWORD dwNumOfChars;
|
|
LPWSTR lpszCmdLine;
|
|
HANDLE search;
|
|
|
|
dwNumOfChars = ExpandEnvironmentStringsW(lpszFilePath, NULL, 0);
|
|
lpszCmdLine = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR));
|
|
ExpandEnvironmentStringsW(lpszFilePath, lpszCmdLine, dwNumOfChars);
|
|
|
|
search = FindFirstFileW(lpszCmdLine, &find_data);
|
|
MemFree(lpszCmdLine);
|
|
|
|
bIsFound = (search != INVALID_HANDLE_VALUE);
|
|
|
|
FindClose(search);
|
|
|
|
if (bIsFound && pFindData)
|
|
*pFindData = find_data;
|
|
|
|
return bIsFound;
|
|
}
|
|
|
|
LRESULT
|
|
FileQueryFiles(IN LPCWSTR Path,
|
|
IN LPCWSTR FileNamesQuery,
|
|
IN PQUERY_FILES_TABLE QueryTable,
|
|
IN PVOID Context)
|
|
{
|
|
LRESULT res = ERROR_SUCCESS;
|
|
WIN32_FIND_DATAW find_data;
|
|
|
|
LPWSTR lpszQuery;
|
|
SIZE_T dwNumOfChars;
|
|
LPWSTR lpszExpandedQuery;
|
|
HANDLE search;
|
|
|
|
dwNumOfChars = wcslen(Path) + 1 + wcslen(FileNamesQuery) + 1;
|
|
lpszQuery = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR));
|
|
wcscpy(lpszQuery, Path);
|
|
wcscat(lpszQuery, L"\\");
|
|
wcscat(lpszQuery, FileNamesQuery);
|
|
|
|
dwNumOfChars = ExpandEnvironmentStringsW(lpszQuery, NULL, 0);
|
|
lpszExpandedQuery = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR));
|
|
ExpandEnvironmentStringsW(lpszQuery, lpszExpandedQuery, dwNumOfChars);
|
|
MemFree(lpszQuery);
|
|
|
|
search = FindFirstFileW(lpszExpandedQuery, &find_data);
|
|
if (search != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
PQUERY_FILES_TABLE pTable = QueryTable;
|
|
while (pTable && pTable->QueryRoutine)
|
|
{
|
|
pTable->QueryRoutine(Path, FileNamesQuery, lpszExpandedQuery, &find_data, Context, pTable->EntryContext);
|
|
++pTable;
|
|
}
|
|
} while (/*res = */ FindNextFileW(search, &find_data));
|
|
}
|
|
else
|
|
res = ERROR_NO_MORE_FILES;
|
|
|
|
FindClose(search);
|
|
|
|
MemFree(lpszExpandedQuery);
|
|
|
|
return res;
|
|
}
|
|
|
|
BOOL BackupIniFile(IN LPCWSTR lpszIniFile)
|
|
{
|
|
BOOL Success = FALSE;
|
|
SIZE_T dwNumOfChars = 0;
|
|
LPWSTR SourceFile, DestFile;
|
|
LPWSTR lpName, lpPath;
|
|
|
|
dwNumOfChars = ExpandEnvironmentStringsW(lpszIniFile, NULL, 0);
|
|
SourceFile = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR));
|
|
ExpandEnvironmentStringsW(lpszIniFile, SourceFile, dwNumOfChars);
|
|
|
|
lpName = wcsrchr(SourceFile, L'\\');
|
|
lpName = (lpName ? lpName + 1 : SourceFile);
|
|
dwNumOfChars = wcslen(L"%SystemRoot%\\pss\\") + wcslen(lpName) + 7 + 1;
|
|
lpPath = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR));
|
|
wcscpy(lpPath, L"%SystemRoot%\\pss\\");
|
|
wcscat(lpPath, lpName);
|
|
wcscat(lpPath, L".backup");
|
|
|
|
dwNumOfChars = ExpandEnvironmentStringsW(lpPath, NULL, 0);
|
|
DestFile = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR));
|
|
ExpandEnvironmentStringsW(lpPath, DestFile, dwNumOfChars);
|
|
MemFree(lpPath);
|
|
|
|
Success = CopyFileW(SourceFile, DestFile, TRUE /* don't overwrite */ /* FALSE */ /* overwrite */);
|
|
|
|
MemFree(DestFile);
|
|
MemFree(SourceFile);
|
|
|
|
return Success;
|
|
}
|