15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/sandbox_utils.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/internal_types.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sandbox {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsXPSP2OrLater() {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::Version version = base::win::GetVersion();
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (version > base::win::VERSION_XP) ||
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ((version == base::win::VERSION_XP) &&
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       (base::win::OSInfo::GetInstance()->service_pack().major >= 2));
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitObjectAttribs(const std::wstring& name,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ULONG attributes,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       HANDLE root,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       OBJECT_ATTRIBUTES* obj_attr,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       UNICODE_STRING* uni_name) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static RtlInitUnicodeStringFunction RtlInitUnicodeString;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!RtlInitUnicodeString) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HMODULE ntdll = ::GetModuleHandle(kNtdllName);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RtlInitUnicodeString = reinterpret_cast<RtlInitUnicodeStringFunction>(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProcAddress(ntdll, "RtlInitUnicodeString"));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(RtlInitUnicodeString);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RtlInitUnicodeString(uni_name, name.c_str());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeObjectAttributes(obj_attr, uni_name, attributes, root, NULL);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};  // namespace sandbox
39