| 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 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 NTSTATUS ret = STATUS_UNSUCCESSFUL; | 299 NTSTATUS ret = STATUS_UNSUCCESSFUL; |
| 300 __try { | 300 __try { |
| 301 do { | 301 do { |
| 302 if (in_object->RootDirectory != static_cast<HANDLE>(0) && !root) | 302 if (in_object->RootDirectory != static_cast<HANDLE>(0) && !root) |
| 303 break; | 303 break; |
| 304 if (NULL == in_object->ObjectName) | 304 if (NULL == in_object->ObjectName) |
| 305 break; | 305 break; |
| 306 if (NULL == in_object->ObjectName->Buffer) | 306 if (NULL == in_object->ObjectName->Buffer) |
| 307 break; | 307 break; |
| 308 | 308 |
| 309 size_t size = in_object->ObjectName->Length + sizeof(wchar_t); | 309 ret = AllocAndCopyUnicodeString(in_object->ObjectName, out_name); |
| 310 *out_name = new(NT_ALLOC) wchar_t[size/sizeof(wchar_t)]; | |
| 311 if (NULL == *out_name) | |
| 312 break; | |
| 313 | |
| 314 ret = CopyData(*out_name, in_object->ObjectName->Buffer, | |
| 315 size - sizeof(wchar_t)); | |
| 316 if (!NT_SUCCESS(ret)) | 310 if (!NT_SUCCESS(ret)) |
| 317 break; | 311 break; |
| 318 | 312 |
| 319 (*out_name)[size / sizeof(wchar_t) - 1] = L'\0'; | |
| 320 | |
| 321 if (attributes) | 313 if (attributes) |
| 322 *attributes = in_object->Attributes; | 314 *attributes = in_object->Attributes; |
| 323 | 315 |
| 324 if (root) | 316 if (root) |
| 325 *root = in_object->RootDirectory; | 317 *root = in_object->RootDirectory; |
| 326 ret = STATUS_SUCCESS; | 318 ret = STATUS_SUCCESS; |
| 327 } while (false); | 319 } while (false); |
| 328 } __except(EXCEPTION_EXECUTE_HANDLER) { | 320 } __except(EXCEPTION_EXECUTE_HANDLER) { |
| 329 ret = GetExceptionCode(); | 321 ret = GetExceptionCode(); |
| 330 } | 322 } |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 | 602 |
| 611 if (file_info->FileName[0] != kPathPrefix[0] || | 603 if (file_info->FileName[0] != kPathPrefix[0] || |
| 612 file_info->FileName[1] != kPathPrefix[1] || | 604 file_info->FileName[1] != kPathPrefix[1] || |
| 613 file_info->FileName[2] != kPathPrefix[2] || | 605 file_info->FileName[2] != kPathPrefix[2] || |
| 614 file_info->FileName[3] != kPathPrefix[3]) | 606 file_info->FileName[3] != kPathPrefix[3]) |
| 615 return false; | 607 return false; |
| 616 | 608 |
| 617 return true; | 609 return true; |
| 618 } | 610 } |
| 619 | 611 |
| 612 NTSTATUS AllocAndCopyUnicodeString(const UNICODE_STRING* in_string, |
| 613 wchar_t** out_string) { |
| 614 if (!in_string) |
| 615 return STATUS_INVALID_PARAMETER; |
| 616 |
| 617 size_t size = in_string->Length + sizeof(wchar_t); |
| 618 *out_string = new(NT_ALLOC) wchar_t[size/sizeof(wchar_t)]; |
| 619 if (NULL == *out_string) |
| 620 return STATUS_UNSUCCESSFUL; |
| 621 |
| 622 NTSTATUS ret = CopyData(*out_string, in_string->Buffer, |
| 623 size - sizeof(wchar_t)); |
| 624 if (!NT_SUCCESS(ret)) |
| 625 return ret; |
| 626 |
| 627 (*out_string)[size / sizeof(wchar_t) - 1] = L'\0'; |
| 628 return STATUS_SUCCESS; |
| 629 } |
| 630 |
| 620 } // namespace sandbox | 631 } // namespace sandbox |
| 621 | 632 |
| 622 void* operator new(size_t size, sandbox::AllocationType type, | 633 void* operator new(size_t size, sandbox::AllocationType type, |
| 623 void* near_to) { | 634 void* near_to) { |
| 624 using namespace sandbox; | 635 using namespace sandbox; |
| 625 | 636 |
| 626 void* result = NULL; | 637 void* result = NULL; |
| 627 if (NT_ALLOC == type) { | 638 if (NT_ALLOC == type) { |
| 628 if (InitHeap()) { | 639 if (InitHeap()) { |
| 629 // Use default flags for the allocation. | 640 // Use default flags for the allocation. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 670 UNREFERENCED_PARAMETER(type); | 681 UNREFERENCED_PARAMETER(type); |
| 671 return buffer; | 682 return buffer; |
| 672 } | 683 } |
| 673 | 684 |
| 674 void __cdecl operator delete(void* memory, void* buffer, | 685 void __cdecl operator delete(void* memory, void* buffer, |
| 675 sandbox::AllocationType type) { | 686 sandbox::AllocationType type) { |
| 676 UNREFERENCED_PARAMETER(memory); | 687 UNREFERENCED_PARAMETER(memory); |
| 677 UNREFERENCED_PARAMETER(buffer); | 688 UNREFERENCED_PARAMETER(buffer); |
| 678 UNREFERENCED_PARAMETER(type); | 689 UNREFERENCED_PARAMETER(type); |
| 679 } | 690 } |
| OLD | NEW |