OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // This file defines helper methods used to schedule files for deletion | 5 // This file defines helper methods used to schedule files for deletion |
6 // on next reboot. The code here is heavily borrowed and simplified from | 6 // on next reboot. The code here is heavily borrowed and simplified from |
7 // http://code.google.com/p/omaha/source/browse/trunk/common/file.cc and | 7 // http://code.google.com/p/omaha/source/browse/trunk/common/file.cc and |
8 // http://code.google.com/p/omaha/source/browse/trunk/common/utils.cc | 8 // http://code.google.com/p/omaha/source/browse/trunk/common/utils.cc |
9 // | 9 // |
10 // This implementation really is not fast, so do not use it where that will | 10 // This implementation really is not fast, so do not use it where that will |
11 // matter. | 11 // matter. |
12 | 12 |
13 #include "chrome/installer/util/delete_after_reboot_helper.h" | 13 #include "chrome/installer/util/delete_after_reboot_helper.h" |
14 | 14 |
15 #include <string> | 15 #include <string> |
16 #include <vector> | 16 #include <vector> |
17 | 17 |
18 #include "base/file_util.h" | 18 #include "base/file_util.h" |
19 #include "base/registry.h" | 19 #include "base/win/registry.h" |
20 #include "base/string_util.h" | 20 #include "base/string_util.h" |
21 | 21 |
22 // The moves-pending-reboot is a MULTISZ registry key in the HKLM part of the | 22 // The moves-pending-reboot is a MULTISZ registry key in the HKLM part of the |
23 // registry. | 23 // registry. |
24 const wchar_t kSessionManagerKey[] = | 24 const wchar_t kSessionManagerKey[] = |
25 L"SYSTEM\\CurrentControlSet\\Control\\Session Manager"; | 25 L"SYSTEM\\CurrentControlSet\\Control\\Session Manager"; |
26 const wchar_t kPendingFileRenameOps[] = L"PendingFileRenameOperations"; | 26 const wchar_t kPendingFileRenameOps[] = L"PendingFileRenameOperations"; |
27 | 27 |
28 namespace { | 28 namespace { |
29 | 29 |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 return short_path; | 238 return short_path; |
239 } | 239 } |
240 | 240 |
241 HRESULT GetPendingMovesValue( | 241 HRESULT GetPendingMovesValue( |
242 std::vector<PendingMove>* pending_moves) { | 242 std::vector<PendingMove>* pending_moves) { |
243 DCHECK(pending_moves); | 243 DCHECK(pending_moves); |
244 pending_moves->clear(); | 244 pending_moves->clear(); |
245 | 245 |
246 // Get the current value of the key | 246 // Get the current value of the key |
247 // If the Key is missing, that's totally acceptable. | 247 // If the Key is missing, that's totally acceptable. |
248 RegKey session_manager_key(HKEY_LOCAL_MACHINE, kSessionManagerKey, | 248 base::win::RegKey session_manager_key(HKEY_LOCAL_MACHINE, kSessionManagerKey, |
249 KEY_QUERY_VALUE); | 249 KEY_QUERY_VALUE); |
250 HKEY session_manager_handle = session_manager_key.Handle(); | 250 HKEY session_manager_handle = session_manager_key.Handle(); |
251 if (!session_manager_handle) { | 251 if (!session_manager_handle) { |
252 return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); | 252 return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); |
253 } | 253 } |
254 | 254 |
255 // The base::RegKey Read code squashes the return code from | 255 // The base::RegKey Read code squashes the return code from |
256 // ReqQueryValueEx, we have to do things ourselves: | 256 // ReqQueryValueEx, we have to do things ourselves: |
257 DWORD buffer_size = 0; | 257 DWORD buffer_size = 0; |
258 std::vector<char> buffer; | 258 std::vector<char> buffer; |
259 buffer.resize(1); | 259 buffer.resize(1); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 strings_to_keep.push_back(*iter); | 344 strings_to_keep.push_back(*iter); |
345 } | 345 } |
346 } | 346 } |
347 | 347 |
348 if (strings_to_keep.size() == pending_moves.size()) { | 348 if (strings_to_keep.size() == pending_moves.size()) { |
349 // Nothing to remove, return true. | 349 // Nothing to remove, return true. |
350 return true; | 350 return true; |
351 } | 351 } |
352 | 352 |
353 // Write the key back into a buffer. | 353 // Write the key back into a buffer. |
354 RegKey session_manager_key(HKEY_LOCAL_MACHINE, kSessionManagerKey, | 354 base::win::RegKey session_manager_key(HKEY_LOCAL_MACHINE, kSessionManagerKey, |
355 KEY_CREATE_SUB_KEY | KEY_SET_VALUE); | 355 KEY_CREATE_SUB_KEY | KEY_SET_VALUE); |
356 if (!session_manager_key.Handle()) { | 356 if (!session_manager_key.Handle()) { |
357 // Couldn't open / create the key. | 357 // Couldn't open / create the key. |
358 LOG(ERROR) << "Failed to open session manager key for writing."; | 358 LOG(ERROR) << "Failed to open session manager key for writing."; |
359 return false; | 359 return false; |
360 } | 360 } |
361 | 361 |
362 if (strings_to_keep.size() > 1) { | 362 if (strings_to_keep.size() > 1) { |
363 std::vector<char> buffer; | 363 std::vector<char> buffer; |
364 StringArrayToMultiSZBytes(strings_to_keep, &buffer); | 364 StringArrayToMultiSZBytes(strings_to_keep, &buffer); |
365 DCHECK(buffer.size() > 0); | 365 DCHECK(buffer.size() > 0); |
366 if (buffer.size() > 0) { | 366 if (buffer.size() > 0) { |
367 return session_manager_key.WriteValue(kPendingFileRenameOps, &buffer[0], | 367 return session_manager_key.WriteValue(kPendingFileRenameOps, &buffer[0], |
368 buffer.size(), REG_MULTI_SZ); | 368 buffer.size(), REG_MULTI_SZ); |
369 } else { | 369 } else { |
370 return false; | 370 return false; |
371 } | 371 } |
372 } else { | 372 } else { |
373 // We have only the trailing NULL string. Don't bother writing that. | 373 // We have only the trailing NULL string. Don't bother writing that. |
374 return session_manager_key.DeleteValue(kPendingFileRenameOps); | 374 return session_manager_key.DeleteValue(kPendingFileRenameOps); |
375 } | 375 } |
376 } | 376 } |
OLD | NEW |