OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "sandbox/win/src/sandbox_nt_util.h" | 5 #include "sandbox/win/src/sandbox_nt_util.h" |
6 | 6 |
7 #include "base/win/pe_image.h" | 7 #include "base/win/pe_image.h" |
8 #include "sandbox/win/src/sandbox_factory.h" | 8 #include "sandbox/win/src/sandbox_factory.h" |
9 #include "sandbox/win/src/target_services.h" | 9 #include "sandbox/win/src/target_services.h" |
10 | 10 |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 DCHECK_NT(STATUS_BUFFER_OVERFLOW != ret); | 354 DCHECK_NT(STATUS_BUFFER_OVERFLOW != ret); |
355 if (!NT_SUCCESS(ret)) { | 355 if (!NT_SUCCESS(ret)) { |
356 operator delete(out_string, NT_ALLOC); | 356 operator delete(out_string, NT_ALLOC); |
357 return NULL; | 357 return NULL; |
358 } | 358 } |
359 | 359 |
360 return out_string; | 360 return out_string; |
361 } | 361 } |
362 | 362 |
363 UNICODE_STRING* GetImageInfoFromModule(HMODULE module, uint32* flags) { | 363 UNICODE_STRING* GetImageInfoFromModule(HMODULE module, uint32* flags) { |
| 364 // PEImage's dtor won't be run during SEH unwinding, but that's OK. |
| 365 #pragma warning(push) |
| 366 #pragma warning(disable: 4509) |
364 UNICODE_STRING* out_name = NULL; | 367 UNICODE_STRING* out_name = NULL; |
365 __try { | 368 __try { |
366 do { | 369 do { |
367 *flags = 0; | 370 *flags = 0; |
368 base::win::PEImage pe(module); | 371 base::win::PEImage pe(module); |
369 | 372 |
370 if (!pe.VerifyMagic()) | 373 if (!pe.VerifyMagic()) |
371 break; | 374 break; |
372 *flags |= MODULE_IS_PE_IMAGE; | 375 *flags |= MODULE_IS_PE_IMAGE; |
373 | 376 |
374 PIMAGE_EXPORT_DIRECTORY exports = pe.GetExportDirectory(); | 377 PIMAGE_EXPORT_DIRECTORY exports = pe.GetExportDirectory(); |
375 if (exports) { | 378 if (exports) { |
376 char* name = reinterpret_cast<char*>(pe.RVAToAddr(exports->Name)); | 379 char* name = reinterpret_cast<char*>(pe.RVAToAddr(exports->Name)); |
377 out_name = AnsiToUnicode(name); | 380 out_name = AnsiToUnicode(name); |
378 } | 381 } |
379 | 382 |
380 PIMAGE_NT_HEADERS headers = pe.GetNTHeaders(); | 383 PIMAGE_NT_HEADERS headers = pe.GetNTHeaders(); |
381 if (headers) { | 384 if (headers) { |
382 if (headers->OptionalHeader.AddressOfEntryPoint) | 385 if (headers->OptionalHeader.AddressOfEntryPoint) |
383 *flags |= MODULE_HAS_ENTRY_POINT; | 386 *flags |= MODULE_HAS_ENTRY_POINT; |
384 if (headers->OptionalHeader.SizeOfCode) | 387 if (headers->OptionalHeader.SizeOfCode) |
385 *flags |= MODULE_HAS_CODE; | 388 *flags |= MODULE_HAS_CODE; |
386 } | 389 } |
387 } while (false); | 390 } while (false); |
388 } __except(EXCEPTION_EXECUTE_HANDLER) { | 391 } __except(EXCEPTION_EXECUTE_HANDLER) { |
389 } | 392 } |
390 | 393 |
391 return out_name; | 394 return out_name; |
| 395 #pragma warning(pop) |
392 } | 396 } |
393 | 397 |
394 UNICODE_STRING* GetBackingFilePath(PVOID address) { | 398 UNICODE_STRING* GetBackingFilePath(PVOID address) { |
395 // We'll start with something close to max_path charactes for the name. | 399 // We'll start with something close to max_path charactes for the name. |
396 ULONG buffer_bytes = MAX_PATH * 2; | 400 ULONG buffer_bytes = MAX_PATH * 2; |
397 | 401 |
398 for (;;) { | 402 for (;;) { |
399 MEMORY_SECTION_NAME* section_name = reinterpret_cast<MEMORY_SECTION_NAME*>( | 403 MEMORY_SECTION_NAME* section_name = reinterpret_cast<MEMORY_SECTION_NAME*>( |
400 new(NT_ALLOC) char[buffer_bytes]); | 404 new(NT_ALLOC) char[buffer_bytes]); |
401 | 405 |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 UNREFERENCED_PARAMETER(type); | 598 UNREFERENCED_PARAMETER(type); |
595 return buffer; | 599 return buffer; |
596 } | 600 } |
597 | 601 |
598 void __cdecl operator delete(void* memory, void* buffer, | 602 void __cdecl operator delete(void* memory, void* buffer, |
599 sandbox::AllocationType type) { | 603 sandbox::AllocationType type) { |
600 UNREFERENCED_PARAMETER(memory); | 604 UNREFERENCED_PARAMETER(memory); |
601 UNREFERENCED_PARAMETER(buffer); | 605 UNREFERENCED_PARAMETER(buffer); |
602 UNREFERENCED_PARAMETER(type); | 606 UNREFERENCED_PARAMETER(type); |
603 } | 607 } |
OLD | NEW |