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
MyFileExists(IN LPCWSTR lpszFilePath,OUT PWIN32_FIND_DATAW pFindData OPTIONAL)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
FileQueryFiles(IN LPCWSTR Path,IN LPCWSTR FileNamesQuery,IN PQUERY_FILES_TABLE QueryTable,IN PVOID Context)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 
BackupIniFile(IN LPCWSTR lpszIniFile)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