Chromium Code Reviews| Index: base/process/process_info_win.cc |
| diff --git a/base/process/process_info_win.cc b/base/process/process_info_win.cc |
| index b930ae6dd8864bd0e9954e2794e68328f204127e..4091d532db443b5f6f9513f890e82b7cd5dd31b1 100644 |
| --- a/base/process/process_info_win.cc |
| +++ b/base/process/process_info_win.cc |
| @@ -7,11 +7,14 @@ |
| #include <windows.h> |
| #include "base/basictypes.h" |
| +#include "base/memory/scoped_ptr.h" |
| #include "base/time/time.h" |
| +#include "base/win/scoped_handle.h" |
| +#include "base/win/windows_version.h" |
| namespace base { |
| -//static |
| +// static |
| const Time CurrentProcessInfo::CreationTime() { |
| FILETIME creation_time = {}; |
| FILETIME ignore = {}; |
| @@ -22,4 +25,55 @@ const Time CurrentProcessInfo::CreationTime() { |
| return Time::FromFileTime(creation_time); |
| } |
| +IntegrityLevel GetCurrentProcessIntegrityLevel() { |
| + if (win::GetVersion() < base::win::VERSION_VISTA) |
| + return INTEGRITY_UNKNOWN; |
| + |
| + HANDLE process_token; |
| + if (!::OpenProcessToken(::GetCurrentProcess(), |
| + TOKEN_QUERY | TOKEN_QUERY_SOURCE, &process_token)) { |
| + return INTEGRITY_UNKNOWN; |
| + } |
| + win::ScopedHandle scoped_process_token(process_token); |
| + |
| + DWORD token_info_length = 0; |
| + if (::GetTokenInformation(process_token, TokenIntegrityLevel, NULL, 0, |
| + &token_info_length) || |
| + ::GetLastError() != ERROR_INSUFFICIENT_BUFFER) { |
| + return INTEGRITY_UNKNOWN; |
| + } |
| + |
| + scoped_ptr<char[]> token_label_bytes(new char[token_info_length]); |
| + if (!token_label_bytes.get()) |
| + return INTEGRITY_UNKNOWN; |
| + |
| + TOKEN_MANDATORY_LABEL* token_label = |
| + reinterpret_cast<TOKEN_MANDATORY_LABEL*>(token_label_bytes.get()); |
| + if (!token_label) |
| + return INTEGRITY_UNKNOWN; |
| + |
| + if (!::GetTokenInformation(process_token, TokenIntegrityLevel, token_label, |
| + token_info_length, &token_info_length)) { |
| + return INTEGRITY_UNKNOWN; |
| + } |
| + |
| + DWORD integrity_level = *::GetSidSubAuthority( |
| + token_label->Label.Sid, |
| + (DWORD)(UCHAR)(*::GetSidSubAuthorityCount(token_label->Label.Sid)-1)); |
| + |
|
cpu_(ooo_6.6-7.5)
2015/02/13 02:39:46
use c++ style casts.
rvargas (doing something else)
2015/02/13 02:49:08
arrggg. Sorry about that, I meant to fix it but fo
|
| + if (integrity_level < SECURITY_MANDATORY_MEDIUM_RID) |
| + return LOW_INTEGRITY; |
| + |
| + if (integrity_level >= SECURITY_MANDATORY_MEDIUM_RID && |
| + integrity_level < SECURITY_MANDATORY_HIGH_RID) { |
| + return MEDIUM_INTEGRITY; |
| + } |
| + |
| + if (integrity_level >= SECURITY_MANDATORY_HIGH_RID) |
| + return HIGH_INTEGRITY; |
| + |
| + NOTREACHED(); |
| + return INTEGRITY_UNKNOWN; |
| +} |
| + |
| } // namespace base |