1// Copyright (c) 2006-2010 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef SANDBOX_SRC_WIN_UTILS_H_ 6#define SANDBOX_SRC_WIN_UTILS_H_ 7 8#include <windows.h> 9#include <string> 10 11#include "base/basictypes.h" 12#include "base/strings/string16.h" 13 14namespace sandbox { 15 16// Prefix for path used by NT calls. 17const wchar_t kNTPrefix[] = L"\\??\\"; 18const size_t kNTPrefixLen = arraysize(kNTPrefix) - 1; 19 20const wchar_t kNTObjManPrefix[] = L"\\Device\\"; 21const size_t kNTObjManPrefixLen = arraysize(kNTObjManPrefix) - 1; 22 23// Automatically acquires and releases a lock when the object is 24// is destroyed. 25class AutoLock { 26 public: 27 // Acquires the lock. 28 explicit AutoLock(CRITICAL_SECTION *lock) : lock_(lock) { 29 ::EnterCriticalSection(lock); 30 }; 31 32 // Releases the lock; 33 ~AutoLock() { 34 ::LeaveCriticalSection(lock_); 35 }; 36 37 private: 38 CRITICAL_SECTION *lock_; 39 DISALLOW_IMPLICIT_CONSTRUCTORS(AutoLock); 40}; 41 42// Basic implementation of a singleton which calls the destructor 43// when the exe is shutting down or the DLL is being unloaded. 44template <typename Derived> 45class SingletonBase { 46 public: 47 static Derived* GetInstance() { 48 static Derived* instance = NULL; 49 if (NULL == instance) { 50 instance = new Derived(); 51 // Microsoft CRT extension. In an exe this this called after 52 // winmain returns, in a dll is called in DLL_PROCESS_DETACH 53 _onexit(OnExit); 54 } 55 return instance; 56 } 57 58 private: 59 // this is the function that gets called by the CRT when the 60 // process is shutting down. 61 static int __cdecl OnExit() { 62 delete GetInstance(); 63 return 0; 64 } 65}; 66 67// Convert a short path (C:\path~1 or \\??\\c:\path~1) to the long version of 68// the path. If the path is not a valid filesystem path, the function returns 69// false and the output parameter is not modified. 70bool ConvertToLongPath(const base::string16& short_path, 71 base::string16* long_path); 72 73// Sets result to true if the path contains a reparse point. The return value 74// is ERROR_SUCCESS when the function succeeds or the appropriate error code 75// when the function fails. 76// This function is not smart. It looks for each element in the path and 77// returns true if any of them is a reparse point. 78DWORD IsReparsePoint(const base::string16& full_path, bool* result); 79 80// Returns true if the handle corresponds to the object pointed by this path. 81bool SameObject(HANDLE handle, const wchar_t* full_path); 82 83// Resolves a handle to an nt path. Returns true if the handle can be resolved. 84bool GetPathFromHandle(HANDLE handle, base::string16* path); 85 86// Resolves a win32 path to an nt path using GetPathFromHandle. The path must 87// exist. Returs true if the translation was succesful. 88bool GetNtPathFromWin32Path(const base::string16& path, 89 base::string16* nt_path); 90 91// Translates a reserved key name to its handle. 92// For example "HKEY_LOCAL_MACHINE" returns HKEY_LOCAL_MACHINE. 93// Returns NULL if the name does not represent any reserved key name. 94HKEY GetReservedKeyFromName(const base::string16& name); 95 96// Resolves a user-readable registry path to a system-readable registry path. 97// For example, HKEY_LOCAL_MACHINE\\Software\\microsoft is translated to 98// \\registry\\machine\\software\\microsoft. Returns false if the path 99// cannot be resolved. 100bool ResolveRegistryName(base::string16 name, base::string16* resolved_name); 101 102// Writes |length| bytes from the provided |buffer| into the address space of 103// |child_process|, at the specified |address|, preserving the original write 104// protection attributes. Returns true on success. 105bool WriteProtectedChildMemory(HANDLE child_process, void* address, 106 const void* buffer, size_t length); 107 108} // namespace sandbox 109 110// Resolves a function name in NTDLL to a function pointer. The second parameter 111// is a pointer to the function pointer. 112void ResolveNTFunctionPtr(const char* name, void* ptr); 113 114#endif // SANDBOX_SRC_WIN_UTILS_H_ 115