| OLD | NEW |
| 1 // Copyright 2015 Google Inc. All Rights Reserved. | 1 // Copyright 2015 Google Inc. All Rights Reserved. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 bool ModuleLayerAccessor::GetModuleSignature(const Address va, | 65 bool ModuleLayerAccessor::GetModuleSignature(const Address va, |
| 66 pe::PEFile::Signature* signature) { | 66 pe::PEFile::Signature* signature) { |
| 67 DCHECK(signature); | 67 DCHECK(signature); |
| 68 | 68 |
| 69 // Find the module record corresponding to the virtual address. | 69 // Find the module record corresponding to the virtual address. |
| 70 ModuleRecordPtr module_record; | 70 ModuleRecordPtr module_record; |
| 71 if (!process_state_->FindSingleRecord(va, &module_record)) | 71 if (!process_state_->FindSingleRecord(va, &module_record)) |
| 72 return false; | 72 return false; |
| 73 | 73 |
| 74 // Retrieve the signature. | 74 // Retrieve the signature. |
| 75 ModuleLayerPtr layer; | |
| 76 process_state_->FindOrCreateLayer(&layer); | |
| 77 const Module& module = module_record->data(); | 75 const Module& module = module_record->data(); |
| 78 if (!layer->mutable_data()->Find(module.module_id(), signature)) | 76 if (!GetModuleSignature(module.module_id(), signature)) |
| 79 return false; | 77 return false; |
| 80 | 78 |
| 81 // Set the signature's address. | 79 // Set the signature's address. |
| 82 const AddressRange& module_range = module_record->range(); | 80 const AddressRange& module_range = module_record->range(); |
| 83 if (!base::IsValueInRangeForNumericType<uint32>(module_range.start())) { | 81 if (!base::IsValueInRangeForNumericType<uint32>(module_range.start())) { |
| 84 LOG(ERROR) << "PE::Signature doesn't support 64bit addresses. Address: " | 82 LOG(ERROR) << "PE::Signature doesn't support 64bit addresses. Address: " |
| 85 << module_range.start(); | 83 << module_range.start(); |
| 86 return false; | 84 return false; |
| 87 } | 85 } |
| 88 signature->base_address = | 86 signature->base_address = |
| 89 core::AbsoluteAddress(base::checked_cast<uint32>(module_range.start())); | 87 core::AbsoluteAddress(base::checked_cast<uint32>(module_range.start())); |
| 90 | 88 |
| 91 return true; | 89 return true; |
| 92 } | 90 } |
| 93 | 91 |
| 92 bool ModuleLayerAccessor::GetModuleSignature(const ModuleId id, |
| 93 pe::PEFile::Signature* signature) { |
| 94 DCHECK_NE(kNoModuleId, id); |
| 95 DCHECK(signature); |
| 96 |
| 97 ModuleLayerPtr layer; |
| 98 process_state_->FindOrCreateLayer(&layer); |
| 99 return layer->data().Find(id, signature); |
| 100 } |
| 101 |
| 102 ModuleId ModuleLayerAccessor::GetModuleId(const Address va) { |
| 103 ModuleRecordPtr module_record; |
| 104 if (!process_state_->FindSingleRecord(va, &module_record)) |
| 105 return kNoModuleId; |
| 106 return module_record->data().module_id(); |
| 107 } |
| 108 |
| 109 ModuleId ModuleLayerAccessor::GetModuleId( |
| 110 const pe::PEFile::Signature& signature) { |
| 111 ModuleLayerPtr layer; |
| 112 process_state_->FindOrCreateLayer(&layer); |
| 113 return layer->data().Find(signature); |
| 114 } |
| 115 |
| 94 bool AddTypedBlockRecord(const AddressRange& range, | 116 bool AddTypedBlockRecord(const AddressRange& range, |
| 95 base::StringPiece16 data_name, | 117 base::StringPiece16 data_name, |
| 96 base::StringPiece16 type_name, | 118 ModuleId module_id, |
| 119 TypeId type_id, |
| 97 ProcessState* process_state) { | 120 ProcessState* process_state) { |
| 98 DCHECK(range.IsValid()); | 121 DCHECK(range.IsValid()); |
| 99 DCHECK(process_state); | 122 DCHECK(process_state); |
| 100 | 123 |
| 101 TypedBlock* typedblock_proto = CreateRecord<TypedBlock>(range, process_state); | 124 TypedBlock* typedblock_proto = CreateRecord<TypedBlock>(range, process_state); |
| 102 | 125 |
| 103 std::string data_name_narrow; | 126 std::string data_name_narrow; |
| 104 if (!base::UTF16ToUTF8(data_name.data(), data_name.size(), &data_name_narrow)) | 127 if (!base::UTF16ToUTF8(data_name.data(), data_name.size(), &data_name_narrow)) |
| 105 return false; | 128 return false; |
| 106 typedblock_proto->set_data_name(data_name_narrow); | 129 typedblock_proto->set_data_name(data_name_narrow); |
| 107 | 130 |
| 108 std::string type_name_narrow; | 131 typedblock_proto->set_module_id(module_id); |
| 109 if (!base::UTF16ToUTF8(type_name.data(), type_name.size(), &type_name_narrow)) | 132 typedblock_proto->set_type_id(type_id); |
| 110 return false; | |
| 111 typedblock_proto->set_type_name(type_name_narrow); | |
| 112 | 133 |
| 113 return true; | 134 return true; |
| 114 } | 135 } |
| 115 | 136 |
| 116 } // namespace refinery | 137 } // namespace refinery |
| OLD | NEW |