Create the AHCI branch for Aman's work
[reactos.git] / base / applications / msconfig_new / fileutils.c
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 DWORD 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 DWORD 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 }