| 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 |