OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "base/win/win_util.h" | 5 #include "base/win/win_util.h" |
6 | 6 |
7 #include <aclapi.h> | 7 #include <aclapi.h> |
8 #include <shobjidl.h> // Must be before propkey. | 8 #include <shobjidl.h> // Must be before propkey. |
9 #include <propkey.h> | 9 #include <propkey.h> |
10 #include <propvarutil.h> | 10 #include <propvarutil.h> |
11 #include <sddl.h> | 11 #include <sddl.h> |
12 #include <shlobj.h> | 12 #include <shlobj.h> |
13 | 13 |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "base/win/registry.h" | 15 #include "base/win/registry.h" |
16 #include "base/scoped_handle.h" | |
17 #include "base/scoped_ptr.h" | 16 #include "base/scoped_ptr.h" |
18 #include "base/string_util.h" | 17 #include "base/string_util.h" |
19 #include "base/stringprintf.h" | 18 #include "base/stringprintf.h" |
20 #include "base/threading/thread_restrictions.h" | 19 #include "base/threading/thread_restrictions.h" |
| 20 #include "base/win/scoped_handle.h" |
21 #include "base/win/windows_version.h" | 21 #include "base/win/windows_version.h" |
22 | 22 |
23 namespace base { | 23 namespace base { |
24 namespace win { | 24 namespace win { |
25 | 25 |
26 #define SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(struct_name, member) \ | 26 #define SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(struct_name, member) \ |
27 offsetof(struct_name, member) + \ | 27 offsetof(struct_name, member) + \ |
28 (sizeof static_cast<struct_name*>(NULL)->member) | 28 (sizeof static_cast<struct_name*>(NULL)->member) |
29 #define NONCLIENTMETRICS_SIZE_PRE_VISTA \ | 29 #define NONCLIENTMETRICS_SIZE_PRE_VISTA \ |
30 SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(NONCLIENTMETRICS, lfMessageFont) | 30 SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(NONCLIENTMETRICS, lfMessageFont) |
31 | 31 |
32 void GetNonClientMetrics(NONCLIENTMETRICS* metrics) { | 32 void GetNonClientMetrics(NONCLIENTMETRICS* metrics) { |
33 DCHECK(metrics); | 33 DCHECK(metrics); |
34 | 34 |
35 static const UINT SIZEOF_NONCLIENTMETRICS = | 35 static const UINT SIZEOF_NONCLIENTMETRICS = |
36 (base::win::GetVersion() >= base::win::VERSION_VISTA) ? | 36 (base::win::GetVersion() >= base::win::VERSION_VISTA) ? |
37 sizeof(NONCLIENTMETRICS) : NONCLIENTMETRICS_SIZE_PRE_VISTA; | 37 sizeof(NONCLIENTMETRICS) : NONCLIENTMETRICS_SIZE_PRE_VISTA; |
38 metrics->cbSize = SIZEOF_NONCLIENTMETRICS; | 38 metrics->cbSize = SIZEOF_NONCLIENTMETRICS; |
39 const bool success = !!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, | 39 const bool success = !!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, |
40 SIZEOF_NONCLIENTMETRICS, metrics, | 40 SIZEOF_NONCLIENTMETRICS, metrics, |
41 0); | 41 0); |
42 DCHECK(success); | 42 DCHECK(success); |
43 } | 43 } |
44 | 44 |
45 bool GetUserSidString(std::wstring* user_sid) { | 45 bool GetUserSidString(std::wstring* user_sid) { |
46 // Get the current token. | 46 // Get the current token. |
47 HANDLE token = NULL; | 47 HANDLE token = NULL; |
48 if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &token)) | 48 if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &token)) |
49 return false; | 49 return false; |
50 ScopedHandle token_scoped(token); | 50 base::win::ScopedHandle token_scoped(token); |
51 | 51 |
52 DWORD size = sizeof(TOKEN_USER) + SECURITY_MAX_SID_SIZE; | 52 DWORD size = sizeof(TOKEN_USER) + SECURITY_MAX_SID_SIZE; |
53 scoped_array<BYTE> user_bytes(new BYTE[size]); | 53 scoped_array<BYTE> user_bytes(new BYTE[size]); |
54 TOKEN_USER* user = reinterpret_cast<TOKEN_USER*>(user_bytes.get()); | 54 TOKEN_USER* user = reinterpret_cast<TOKEN_USER*>(user_bytes.get()); |
55 | 55 |
56 if (!::GetTokenInformation(token, TokenUser, user, size, &size)) | 56 if (!::GetTokenInformation(token, TokenUser, user, size, &size)) |
57 return false; | 57 return false; |
58 | 58 |
59 if (!user->User.Sid) | 59 if (!user->User.Sid) |
60 return false; | 60 return false; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 | 153 |
154 #ifndef COPY_FILE_COPY_SYMLINK | 154 #ifndef COPY_FILE_COPY_SYMLINK |
155 #error You must install the Windows 2008 or Vista Software Development Kit and \ | 155 #error You must install the Windows 2008 or Vista Software Development Kit and \ |
156 set it as your default include path to build this library. You can grab it by \ | 156 set it as your default include path to build this library. You can grab it by \ |
157 searching for "download windows sdk 2008" in your favorite web search engine. \ | 157 searching for "download windows sdk 2008" in your favorite web search engine. \ |
158 Also make sure you register the SDK with Visual Studio, by selecting \ | 158 Also make sure you register the SDK with Visual Studio, by selecting \ |
159 "Integrate Windows SDK with Visual Studio 2005" from the Windows SDK \ | 159 "Integrate Windows SDK with Visual Studio 2005" from the Windows SDK \ |
160 menu (see Start - All Programs - Microsoft Windows SDK - \ | 160 menu (see Start - All Programs - Microsoft Windows SDK - \ |
161 Visual Studio Registration). | 161 Visual Studio Registration). |
162 #endif | 162 #endif |
OLD | NEW |