reactos/base/applications/msconfig_new/fileutils.c
2019-08-15 14:20:00 +02:00

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;
}