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..2b9c40653fd75d3b1197cecd97ea2d93d384201e 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, |
+ static_cast<DWORD>(*::GetSidSubAuthorityCount(token_label->Label.Sid)-1)); |
+ |
+ 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 |