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
3 // found in the LICENSE file.
5 #ifndef SANDBOX_SRC_HANDLE_TABLE_H_
6 #define SANDBOX_SRC_HANDLE_TABLE_H_
12 #include "base/basictypes.h"
13 #include "base/string16.h"
14 #include "sandbox/src/nt_internals.h"
18 // HandleTable retrieves the global handle table and provides helper classes
19 // for iterating through the table and retrieving handle info.
22 static const char16
* HandleTable::kTypeProcess
;
23 static const char16
* HandleTable::kTypeThread
;
24 static const char16
* HandleTable::kTypeFile
;
25 static const char16
* HandleTable::kTypeDirectory
;
26 static const char16
* HandleTable::kTypeKey
;
27 static const char16
* HandleTable::kTypeWindowStation
;
28 static const char16
* HandleTable::kTypeDesktop
;
29 static const char16
* HandleTable::kTypeService
;
30 static const char16
* HandleTable::kTypeMutex
;
31 static const char16
* HandleTable::kTypeSemaphore
;
32 static const char16
* HandleTable::kTypeEvent
;
33 static const char16
* HandleTable::kTypeTimer
;
34 static const char16
* HandleTable::kTypeNamedPipe
;
35 static const char16
* HandleTable::kTypeJobObject
;
36 static const char16
* HandleTable::kTypeFileMap
;
37 static const char16
* HandleTable::kTypeAlpcPort
;
41 // Used by the iterator to provide simple caching accessors to handle data.
44 bool operator==(const HandleEntry
& rhs
) const {
45 return handle_entry_
== rhs
.handle_entry_
;
48 bool operator!=(const HandleEntry
& rhs
) const {
49 return handle_entry_
!= rhs
.handle_entry_
;
52 const SYSTEM_HANDLE_INFORMATION
* handle_entry() const {
56 const OBJECT_TYPE_INFORMATION
* TypeInfo();
58 const string16
& Name();
60 const string16
& Type();
62 bool IsType(const string16
& type_string
);
65 friend class Iterator
;
66 friend class HandleTable
;
71 UPDATE_INFO_AND_TYPE_NAME
,
74 explicit HandleEntry(const SYSTEM_HANDLE_INFORMATION
* handle_info_entry
);
76 bool needs_info_update() { return handle_entry_
!= last_entry_
; }
78 void UpdateInfo(UpdateType flag
);
80 OBJECT_TYPE_INFORMATION
* type_info_internal() {
81 return reinterpret_cast<OBJECT_TYPE_INFORMATION
*>(
82 &(type_info_buffer_
[0]));
85 const SYSTEM_HANDLE_INFORMATION
* handle_entry_
;
86 const SYSTEM_HANDLE_INFORMATION
* last_entry_
;
87 std::vector
<BYTE
> type_info_buffer_
;
88 string16 handle_name_
;
91 DISALLOW_COPY_AND_ASSIGN(HandleEntry
);
96 Iterator(const HandleTable
& table
, const SYSTEM_HANDLE_INFORMATION
* start
,
97 const SYSTEM_HANDLE_INFORMATION
* stop
);
99 Iterator(const Iterator
& it
);
101 Iterator
& operator++() {
102 if (++(current_
.handle_entry_
) == end_
)
103 current_
.handle_entry_
= table_
.end();
107 bool operator==(const Iterator
& rhs
) const {
108 return current_
== rhs
.current_
;
111 bool operator!=(const Iterator
& rhs
) const {
112 return current_
!= rhs
.current_
;
115 HandleEntry
& operator*() { return current_
; }
117 operator const SYSTEM_HANDLE_INFORMATION
*() {
118 return current_
.handle_entry_
;
121 HandleEntry
* operator->() { return ¤t_
; }
124 const HandleTable
& table_
;
125 HandleEntry current_
;
126 const SYSTEM_HANDLE_INFORMATION
* end_
;
131 Iterator
begin() const {
132 return Iterator(*this, handle_info()->Information
,
133 &handle_info()->Information
[handle_info()->NumberOfHandles
]);
136 const SYSTEM_HANDLE_INFORMATION_EX
* handle_info() const {
137 return reinterpret_cast<const SYSTEM_HANDLE_INFORMATION_EX
*>(
138 &(handle_info_buffer_
[0]));
141 // Returns an iterator to the handles for only the supplied process ID.
142 Iterator
HandlesForProcess(ULONG process_id
) const;
143 const SYSTEM_HANDLE_INFORMATION
* end() const {
144 return &handle_info()->Information
[handle_info()->NumberOfHandles
];
148 SYSTEM_HANDLE_INFORMATION_EX
* handle_info_internal() {
149 return reinterpret_cast<SYSTEM_HANDLE_INFORMATION_EX
*>(
150 &(handle_info_buffer_
[0]));
153 std::vector
<BYTE
> handle_info_buffer_
;
155 DISALLOW_COPY_AND_ASSIGN(HandleTable
);
158 } // namespace sandbox
160 #endif // SANDBOX_SRC_HANDLE_TABLE_H_