| Index: sandbox/src/handle_table.cc
|
| ===================================================================
|
| --- sandbox/src/handle_table.cc (revision 92230)
|
| +++ sandbox/src/handle_table.cc (working copy)
|
| @@ -17,6 +17,8 @@
|
| return a.ProcessId < b.ProcessId;
|
| }
|
|
|
| +static NtQueryObject QueryObject = NULL;
|
| +
|
| } // namespace
|
|
|
| namespace sandbox {
|
| @@ -84,7 +86,6 @@
|
| }
|
|
|
| void HandleTable::HandleEntry::UpdateInfo(UpdateType flag) {
|
| - static NtQueryObject QueryObject = NULL;
|
| if (!QueryObject)
|
| ResolveNTFunctionPtr("NtQueryObject", &QueryObject);
|
|
|
| @@ -119,18 +120,8 @@
|
| switch (flag) {
|
| case UPDATE_INFO_AND_NAME:
|
| if (type_info_buffer_.size() && handle_name_.empty()) {
|
| - ULONG size = MAX_PATH;
|
| - scoped_ptr<UNICODE_STRING> name;
|
| - do {
|
| - name.reset(reinterpret_cast<UNICODE_STRING*>(new BYTE[size]));
|
| - result = QueryObject(reinterpret_cast<HANDLE>(
|
| - handle_entry_->Handle), ObjectNameInformation, name.get(),
|
| - size, &size);
|
| - } while (result == STATUS_INFO_LENGTH_MISMATCH);
|
| -
|
| - if (NT_SUCCESS(result)) {
|
| - handle_name_.assign(name->Buffer, name->Length / sizeof(wchar_t));
|
| - }
|
| + GetHandleName(reinterpret_cast<HANDLE>(handle_entry_->Handle),
|
| + &handle_name_);
|
| }
|
| break;
|
|
|
| @@ -144,6 +135,27 @@
|
| }
|
| }
|
|
|
| +// Returns the object manager's name associated with a handle
|
| +BOOL GetHandleName(HANDLE handle, string16* handle_name) {
|
| + if (!QueryObject)
|
| + ResolveNTFunctionPtr("NtQueryObject", &QueryObject);
|
| +
|
| + ULONG size = MAX_PATH;
|
| + scoped_ptr<UNICODE_STRING> name;
|
| + NTSTATUS result;
|
| +
|
| + do {
|
| + name.reset(reinterpret_cast<UNICODE_STRING*>(new BYTE[size]));
|
| + result = QueryObject(handle, ObjectNameInformation, name.get(),
|
| + size, &size);
|
| + } while (result == STATUS_INFO_LENGTH_MISMATCH);
|
| +
|
| + if (NT_SUCCESS(result))
|
| + handle_name->assign(name->Buffer, name->Length / sizeof(wchar_t));
|
| +
|
| + return NT_SUCCESS(result);
|
| +}
|
| +
|
| const OBJECT_TYPE_INFORMATION* HandleTable::HandleEntry::TypeInfo() {
|
| UpdateInfo(UPDATE_INFO_ONLY);
|
| return type_info_buffer_.empty() ? NULL : type_info_internal();
|
|
|