OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/base/win32filesystem.h" | 11 #include "webrtc/base/win32filesystem.h" |
12 | 12 |
13 #include "webrtc/base/win32.h" | 13 #include "webrtc/base/win32.h" |
14 #include <shellapi.h> | 14 #include <shellapi.h> |
15 #include <shlobj.h> | 15 #include <shlobj.h> |
16 #include <tchar.h> | 16 #include <tchar.h> |
17 | 17 |
| 18 #include <memory> |
| 19 |
18 #include "webrtc/base/arraysize.h" | 20 #include "webrtc/base/arraysize.h" |
19 #include "webrtc/base/fileutils.h" | 21 #include "webrtc/base/fileutils.h" |
20 #include "webrtc/base/pathutils.h" | 22 #include "webrtc/base/pathutils.h" |
21 #include "webrtc/base/scoped_ptr.h" | |
22 #include "webrtc/base/stream.h" | 23 #include "webrtc/base/stream.h" |
23 #include "webrtc/base/stringutils.h" | 24 #include "webrtc/base/stringutils.h" |
24 | 25 |
25 // In several places in this file, we test the integrity level of the process | 26 // In several places in this file, we test the integrity level of the process |
26 // before calling GetLongPathName. We do this because calling GetLongPathName | 27 // before calling GetLongPathName. We do this because calling GetLongPathName |
27 // when running under protected mode IE (a low integrity process) can result in | 28 // when running under protected mode IE (a low integrity process) can result in |
28 // a virtualized path being returned, which is wrong if you only plan to read. | 29 // a virtualized path being returned, which is wrong if you only plan to read. |
29 // TODO: Waiting to hear back from IE team on whether this is the | 30 // TODO: Waiting to hear back from IE team on whether this is the |
30 // best approach; IEIsProtectedModeProcess is another possible solution. | 31 // best approach; IEIsProtectedModeProcess is another possible solution. |
31 | 32 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 // Get the size of its TOKEN_USER structure. Return value is not checked | 89 // Get the size of its TOKEN_USER structure. Return value is not checked |
89 // because we expect it to fail. | 90 // because we expect it to fail. |
90 DWORD token_user_size = 0; | 91 DWORD token_user_size = 0; |
91 (void)::GetTokenInformation(process_token, | 92 (void)::GetTokenInformation(process_token, |
92 TokenUser, | 93 TokenUser, |
93 NULL, | 94 NULL, |
94 0, | 95 0, |
95 &token_user_size); | 96 &token_user_size); |
96 | 97 |
97 // Get the TOKEN_USER structure. | 98 // Get the TOKEN_USER structure. |
98 scoped_ptr<char[]> token_user_bytes(new char[token_user_size]); | 99 std::unique_ptr<char[]> token_user_bytes(new char[token_user_size]); |
99 PTOKEN_USER token_user = reinterpret_cast<PTOKEN_USER>( | 100 PTOKEN_USER token_user = reinterpret_cast<PTOKEN_USER>( |
100 token_user_bytes.get()); | 101 token_user_bytes.get()); |
101 memset(token_user, 0, token_user_size); | 102 memset(token_user, 0, token_user_size); |
102 BOOL success = ::GetTokenInformation(process_token, | 103 BOOL success = ::GetTokenInformation(process_token, |
103 TokenUser, | 104 TokenUser, |
104 token_user, | 105 token_user, |
105 token_user_size, | 106 token_user_size, |
106 &token_user_size); | 107 &token_user_size); |
107 // We're now done with this. | 108 // We're now done with this. |
108 ::CloseHandle(process_token); | 109 ::CloseHandle(process_token); |
109 if (!success) { | 110 if (!success) { |
110 LOG_ERR(LS_ERROR) << "GetTokenInformation() failed"; | 111 LOG_ERR(LS_ERROR) << "GetTokenInformation() failed"; |
111 return false; | 112 return false; |
112 } | 113 } |
113 | 114 |
114 if (!IsValidSid(token_user->User.Sid)) { | 115 if (!IsValidSid(token_user->User.Sid)) { |
115 LOG_ERR(LS_ERROR) << "Current process has invalid user SID"; | 116 LOG_ERR(LS_ERROR) << "Current process has invalid user SID"; |
116 return false; | 117 return false; |
117 } | 118 } |
118 | 119 |
119 // Compute size needed for an ACL that allows access to just this user. | 120 // Compute size needed for an ACL that allows access to just this user. |
120 int acl_size = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + | 121 int acl_size = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + |
121 GetLengthSid(token_user->User.Sid); | 122 GetLengthSid(token_user->User.Sid); |
122 | 123 |
123 // Allocate it. | 124 // Allocate it. |
124 scoped_ptr<char[]> acl_bytes(new char[acl_size]); | 125 std::unique_ptr<char[]> acl_bytes(new char[acl_size]); |
125 PACL acl = reinterpret_cast<PACL>(acl_bytes.get()); | 126 PACL acl = reinterpret_cast<PACL>(acl_bytes.get()); |
126 memset(acl, 0, acl_size); | 127 memset(acl, 0, acl_size); |
127 if (!::InitializeAcl(acl, acl_size, ACL_REVISION)) { | 128 if (!::InitializeAcl(acl, acl_size, ACL_REVISION)) { |
128 LOG_ERR(LS_ERROR) << "InitializeAcl() failed"; | 129 LOG_ERR(LS_ERROR) << "InitializeAcl() failed"; |
129 return false; | 130 return false; |
130 } | 131 } |
131 | 132 |
132 // Allow access to only the current user. | 133 // Allow access to only the current user. |
133 if (!::AddAccessAllowedAce(acl, | 134 if (!::AddAccessAllowedAce(acl, |
134 ACL_REVISION, | 135 ACL_REVISION, |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 return true; | 419 return true; |
419 } else { | 420 } else { |
420 LOG(LS_VERBOSE) << "GetDiskFreeSpaceEx returns error."; | 421 LOG(LS_VERBOSE) << "GetDiskFreeSpaceEx returns error."; |
421 return false; | 422 return false; |
422 } | 423 } |
423 } | 424 } |
424 | 425 |
425 Pathname Win32Filesystem::GetCurrentDirectory() { | 426 Pathname Win32Filesystem::GetCurrentDirectory() { |
426 Pathname cwd; | 427 Pathname cwd; |
427 int path_len = 0; | 428 int path_len = 0; |
428 scoped_ptr<wchar_t[]> path; | 429 std::unique_ptr<wchar_t[]> path; |
429 do { | 430 do { |
430 int needed = ::GetCurrentDirectory(path_len, path.get()); | 431 int needed = ::GetCurrentDirectory(path_len, path.get()); |
431 if (needed == 0) { | 432 if (needed == 0) { |
432 // Error. | 433 // Error. |
433 LOG_GLE(LS_ERROR) << "::GetCurrentDirectory() failed"; | 434 LOG_GLE(LS_ERROR) << "::GetCurrentDirectory() failed"; |
434 return cwd; // returns empty pathname | 435 return cwd; // returns empty pathname |
435 } | 436 } |
436 if (needed <= path_len) { | 437 if (needed <= path_len) { |
437 // It wrote successfully. | 438 // It wrote successfully. |
438 break; | 439 break; |
(...skipping 14 matching lines...) Expand all Loading... |
453 temp_path16.append(1, '\0'); | 454 temp_path16.append(1, '\0'); |
454 | 455 |
455 SHFILEOPSTRUCT file_op = { 0 }; | 456 SHFILEOPSTRUCT file_op = { 0 }; |
456 file_op.wFunc = FO_DELETE; | 457 file_op.wFunc = FO_DELETE; |
457 file_op.pFrom = temp_path16.c_str(); | 458 file_op.pFrom = temp_path16.c_str(); |
458 file_op.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT; | 459 file_op.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT; |
459 return (0 == SHFileOperation(&file_op)); | 460 return (0 == SHFileOperation(&file_op)); |
460 */ | 461 */ |
461 | 462 |
462 } // namespace rtc | 463 } // namespace rtc |
OLD | NEW |