summaryrefslogtreecommitdiff
path: root/src/libs/dutil/WixToolset.DUtil/path2utl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/dutil/WixToolset.DUtil/path2utl.cpp')
-rw-r--r--src/libs/dutil/WixToolset.DUtil/path2utl.cpp53
1 files changed, 18 insertions, 35 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/path2utl.cpp b/src/libs/dutil/WixToolset.DUtil/path2utl.cpp
index 1957a8c5..9e48f9d5 100644
--- a/src/libs/dutil/WixToolset.DUtil/path2utl.cpp
+++ b/src/libs/dutil/WixToolset.DUtil/path2utl.cpp
@@ -64,31 +64,12 @@ DAPI_(HRESULT) PathCanonicalizeForComparison(
64 64
65 if (PATH_CANONICALIZE_KEEP_UNC_ROOT & dwCanonicalizeFlags) 65 if (PATH_CANONICALIZE_KEEP_UNC_ROOT & dwCanonicalizeFlags)
66 { 66 {
67 if (L'\\' == sczNormalizedPath[0] && (L'\\' == sczNormalizedPath[1] || L'?' == sczNormalizedPath[1]) && L'?' == sczNormalizedPath[2] && L'\\' == sczNormalizedPath[3]) 67 BOOL fUNC = FALSE;
68 LPCWSTR wzPastRoot = PathSkipPastRoot(sczNormalizedPath, NULL, NULL, &fUNC);
69 if (fUNC)
68 { 70 {
69 if (L'U' == sczNormalizedPath[4] && L'N' == sczNormalizedPath[5] && L'C' == sczNormalizedPath[6] && L'\\' == sczNormalizedPath[7]) 71 wzNormalizedPath = wzPastRoot;
70 { 72 cchUncRootLength = wzPastRoot - sczNormalizedPath;
71 cchUncRootLength = 8;
72 }
73 }
74 else if (L'\\' == sczNormalizedPath[0] && L'\\' == sczNormalizedPath[1])
75 {
76 cchUncRootLength = 2;
77 }
78
79 if (cchUncRootLength)
80 {
81 DWORD dwRemainingSlashes = 2;
82
83 for (wzNormalizedPath += cchUncRootLength; *wzNormalizedPath && dwRemainingSlashes; ++wzNormalizedPath)
84 {
85 ++cchUncRootLength;
86
87 if (L'\\' == *wzNormalizedPath)
88 {
89 --dwRemainingSlashes;
90 }
91 }
92 } 73 }
93 } 74 }
94 75
@@ -115,22 +96,24 @@ DAPI_(HRESULT) PathCanonicalizeForComparison(
115 if (PATH_CANONICALIZE_BACKSLASH_TERMINATE & dwCanonicalizeFlags) 96 if (PATH_CANONICALIZE_BACKSLASH_TERMINATE & dwCanonicalizeFlags)
116 { 97 {
117 hr = PathBackslashTerminate(psczCanonicalized); 98 hr = PathBackslashTerminate(psczCanonicalized);
118 PathExitOnFailure(hr, "Failed to backslash terminate the canonicalized path"); 99 PathExitOnFailure(hr, "Failed to backslash terminate the canonicalized path.");
119 } 100 }
120 101
121 if (PathIsFullyQualified(*psczCanonicalized, &fHasPrefix) && !fHasPrefix && 102 if (PATH_CANONICALIZE_APPEND_EXTENDED_PATH_PREFIX & dwCanonicalizeFlags)
122 (PATH_CANONICALIZE_APPEND_LONG_PATH_PREFIX & dwCanonicalizeFlags))
123 { 103 {
124 hr = PathPrefix(psczCanonicalized); 104 hr = PathPrefix(psczCanonicalized, 0, PATH_PREFIX_SHORT_PATHS);
125 PathExitOnFailure(hr, "Failed to ensure the long path prefix on the canonicalized path"); 105 PathExitOnFailure(hr, "Failed to ensure the extended path prefix on the canonicalized path.");
126
127 fHasPrefix = TRUE;
128 } 106 }
129 107
108 PathSkipPastRoot(*psczCanonicalized, &fHasPrefix, NULL, NULL);
109
130 if (fHasPrefix) 110 if (fHasPrefix)
131 { 111 {
132 // Canonicalize \??\ into \\?\. 112 // Canonicalize prefix into \\?\.
113 (*psczCanonicalized)[0] = L'\\';
133 (*psczCanonicalized)[1] = L'\\'; 114 (*psczCanonicalized)[1] = L'\\';
115 (*psczCanonicalized)[2] = L'?';
116 (*psczCanonicalized)[3] = L'\\';
134 } 117 }
135 118
136LExit: 119LExit:
@@ -188,7 +171,7 @@ DAPI_(HRESULT) PathCompareCanonicalized(
188 HRESULT hr = S_OK; 171 HRESULT hr = S_OK;
189 LPWSTR sczCanonicalized1 = NULL; 172 LPWSTR sczCanonicalized1 = NULL;
190 LPWSTR sczCanonicalized2 = NULL; 173 LPWSTR sczCanonicalized2 = NULL;
191 DWORD dwDefaultFlags = PATH_CANONICALIZE_APPEND_LONG_PATH_PREFIX | PATH_CANONICALIZE_KEEP_UNC_ROOT; 174 DWORD dwDefaultFlags = PATH_CANONICALIZE_APPEND_EXTENDED_PATH_PREFIX | PATH_CANONICALIZE_KEEP_UNC_ROOT;
192 int nResult = 0; 175 int nResult = 0;
193 176
194 if (!wzPath1 || !wzPath2) 177 if (!wzPath1 || !wzPath2)
@@ -221,7 +204,7 @@ DAPI_(HRESULT) PathDirectoryContainsPath(
221 HRESULT hr = S_OK; 204 HRESULT hr = S_OK;
222 LPWSTR sczCanonicalizedDirectory = NULL; 205 LPWSTR sczCanonicalizedDirectory = NULL;
223 LPWSTR sczCanonicalizedPath = NULL; 206 LPWSTR sczCanonicalizedPath = NULL;
224 DWORD dwDefaultFlags = PATH_CANONICALIZE_APPEND_LONG_PATH_PREFIX | PATH_CANONICALIZE_KEEP_UNC_ROOT; 207 DWORD dwDefaultFlags = PATH_CANONICALIZE_APPEND_EXTENDED_PATH_PREFIX | PATH_CANONICALIZE_KEEP_UNC_ROOT;
225 size_t cchDirectory = 0; 208 size_t cchDirectory = 0;
226 209
227 if (!wzDirectory || !*wzDirectory) 210 if (!wzDirectory || !*wzDirectory)
@@ -239,7 +222,7 @@ DAPI_(HRESULT) PathDirectoryContainsPath(
239 hr = PathCanonicalizeForComparison(wzPath, dwDefaultFlags, &sczCanonicalizedPath); 222 hr = PathCanonicalizeForComparison(wzPath, dwDefaultFlags, &sczCanonicalizedPath);
240 PathExitOnFailure(hr, "Failed to canonicalize the path."); 223 PathExitOnFailure(hr, "Failed to canonicalize the path.");
241 224
242 if (!PathIsFullyQualified(sczCanonicalizedDirectory, NULL)) 225 if (!PathIsFullyQualified(sczCanonicalizedDirectory))
243 { 226 {
244 PathExitWithRootFailure(hr, E_INVALIDARG, "wzDirectory must be a fully qualified path."); 227 PathExitWithRootFailure(hr, E_INVALIDARG, "wzDirectory must be a fully qualified path.");
245 } 228 }