1 /* 2 * PROJECT: ReactOS Applications 3 * LICENSE: LGPL - See COPYING in the top level directory 4 * FILE: base/applications/msconfig_new/fileutils.c 5 * PURPOSE: File Utility Functions 6 * COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr> 7 */ 8 9 #include "precomp.h" 10 #include "utils.h" 11 #include "fileutils.h" 12 13 // 14 // NOTE: A function called "FileExists" with the very same prototype 15 // already exists in the PSDK headers (in setupapi.h) 16 // 17 BOOL 18 MyFileExists(IN LPCWSTR lpszFilePath, 19 OUT PWIN32_FIND_DATAW pFindData OPTIONAL) 20 { 21 BOOL bIsFound = FALSE; 22 WIN32_FIND_DATAW find_data; 23 24 DWORD dwNumOfChars; 25 LPWSTR lpszCmdLine; 26 HANDLE search; 27 28 dwNumOfChars = ExpandEnvironmentStringsW(lpszFilePath, NULL, 0); 29 lpszCmdLine = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR)); 30 ExpandEnvironmentStringsW(lpszFilePath, lpszCmdLine, dwNumOfChars); 31 32 search = FindFirstFileW(lpszCmdLine, &find_data); 33 MemFree(lpszCmdLine); 34 35 bIsFound = (search != INVALID_HANDLE_VALUE); 36 37 FindClose(search); 38 39 if (bIsFound && pFindData) 40 *pFindData = find_data; 41 42 return bIsFound; 43 } 44 45 LRESULT 46 FileQueryFiles(IN LPCWSTR Path, 47 IN LPCWSTR FileNamesQuery, 48 IN PQUERY_FILES_TABLE QueryTable, 49 IN PVOID Context) 50 { 51 LRESULT res = ERROR_SUCCESS; 52 WIN32_FIND_DATAW find_data; 53 54 LPWSTR lpszQuery; 55 SIZE_T dwNumOfChars; 56 LPWSTR lpszExpandedQuery; 57 HANDLE search; 58 59 dwNumOfChars = wcslen(Path) + 1 + wcslen(FileNamesQuery) + 1; 60 lpszQuery = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR)); 61 wcscpy(lpszQuery, Path); 62 wcscat(lpszQuery, L"\\"); 63 wcscat(lpszQuery, FileNamesQuery); 64 65 dwNumOfChars = ExpandEnvironmentStringsW(lpszQuery, NULL, 0); 66 lpszExpandedQuery = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR)); 67 ExpandEnvironmentStringsW(lpszQuery, lpszExpandedQuery, dwNumOfChars); 68 MemFree(lpszQuery); 69 70 search = FindFirstFileW(lpszExpandedQuery, &find_data); 71 if (search != INVALID_HANDLE_VALUE) 72 { 73 do 74 { 75 PQUERY_FILES_TABLE pTable = QueryTable; 76 while (pTable && pTable->QueryRoutine) 77 { 78 pTable->QueryRoutine(Path, FileNamesQuery, lpszExpandedQuery, &find_data, Context, pTable->EntryContext); 79 ++pTable; 80 } 81 } while (/*res = */ FindNextFileW(search, &find_data)); 82 } 83 else 84 res = ERROR_NO_MORE_FILES; 85 86 FindClose(search); 87 88 MemFree(lpszExpandedQuery); 89 90 return res; 91 } 92 93 BOOL BackupIniFile(IN LPCWSTR lpszIniFile) 94 { 95 BOOL Success = FALSE; 96 SIZE_T dwNumOfChars = 0; 97 LPWSTR SourceFile, DestFile; 98 LPWSTR lpName, lpPath; 99 100 dwNumOfChars = ExpandEnvironmentStringsW(lpszIniFile, NULL, 0); 101 SourceFile = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR)); 102 ExpandEnvironmentStringsW(lpszIniFile, SourceFile, dwNumOfChars); 103 104 lpName = wcsrchr(SourceFile, L'\\'); 105 lpName = (lpName ? lpName + 1 : SourceFile); 106 dwNumOfChars = wcslen(L"%SystemRoot%\\pss\\") + wcslen(lpName) + 7 + 1; 107 lpPath = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR)); 108 wcscpy(lpPath, L"%SystemRoot%\\pss\\"); 109 wcscat(lpPath, lpName); 110 wcscat(lpPath, L".backup"); 111 112 dwNumOfChars = ExpandEnvironmentStringsW(lpPath, NULL, 0); 113 DestFile = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR)); 114 ExpandEnvironmentStringsW(lpPath, DestFile, dwNumOfChars); 115 MemFree(lpPath); 116 117 Success = CopyFileW(SourceFile, DestFile, TRUE /* don't overwrite */ /* FALSE */ /* overwrite */); 118 119 MemFree(DestFile); 120 MemFree(SourceFile); 121 122 return Success; 123 } 124