| 500 | C_ASSERT(sizeof(IMAGE_NT_HEADERS64) == sizeof(IMAGE_NT_HEADERS32) + 16); |
| 501 | |
| 502 | static BOOL UpdateFrom32To64(HANDLE hProcess, HMODULE hModule, WORD machine, |
| 503 | DETOUR_EXE_RESTORE& der) |
| 504 | { |
| 505 | IMAGE_DOS_HEADER idh; |
| 506 | IMAGE_NT_HEADERS32 inh32; |
| 507 | IMAGE_NT_HEADERS64 inh64; |
| 508 | IMAGE_SECTION_HEADER sects[32]; |
| 509 | PBYTE pbModule = (PBYTE)hModule; |
| 510 | DWORD n; |
| 511 | |
| 512 | ZeroMemory(&inh32, sizeof(inh32)); |
| 513 | ZeroMemory(&inh64, sizeof(inh64)); |
| 514 | ZeroMemory(sects, sizeof(sects)); |
| 515 | |
| 516 | DETOUR_TRACE(("UpdateFrom32To64(%04x)\n", machine)); |
| 517 | //////////////////////////////////////////////////////// Read old headers. |
| 518 | // |
| 519 | if (!ReadProcessMemory(hProcess, pbModule, &idh, sizeof(idh), NULL)) { |
| 520 | DETOUR_TRACE(("ReadProcessMemory(idh@%p..%p) failed: %lu\n", |
| 521 | pbModule, pbModule + sizeof(idh), GetLastError())); |
| 522 | return FALSE; |
| 523 | } |
| 524 | DETOUR_TRACE(("ReadProcessMemory(idh@%p..%p)\n", |
| 525 | pbModule, pbModule + sizeof(idh))); |
| 526 | |
| 527 | PBYTE pnh = pbModule + idh.e_lfanew; |
| 528 | if (!ReadProcessMemory(hProcess, pnh, &inh32, sizeof(inh32), NULL)) { |
| 529 | DETOUR_TRACE(("ReadProcessMemory(inh@%p..%p) failed: %lu\n", |
| 530 | pnh, pnh + sizeof(inh32), GetLastError())); |
| 531 | return FALSE; |
| 532 | } |
| 533 | DETOUR_TRACE(("ReadProcessMemory(inh@%p..%p)\n", pnh, pnh + sizeof(inh32))); |
| 534 | |
| 535 | if (inh32.FileHeader.NumberOfSections > (sizeof(sects)/sizeof(sects[0]))) { |
| 536 | return FALSE; |
| 537 | } |
| 538 | |
| 539 | PBYTE psects = pnh + |
| 540 | FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader) + |
| 541 | inh32.FileHeader.SizeOfOptionalHeader; |
| 542 | ULONG cb = inh32.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER); |
| 543 | if (!ReadProcessMemory(hProcess, psects, §s, cb, NULL)) { |
| 544 | DETOUR_TRACE(("ReadProcessMemory(ish@%p..%p) failed: %lu\n", |
| 545 | psects, psects + cb, GetLastError())); |
| 546 | return FALSE; |
| 547 | } |
| 548 | DETOUR_TRACE(("ReadProcessMemory(ish@%p..%p)\n", psects, psects + cb)); |
| 549 | |
| 550 | ////////////////////////////////////////////////////////// Convert header. |
| 551 | // |
| 552 | inh64.Signature = inh32.Signature; |
| 553 | inh64.FileHeader = inh32.FileHeader; |
| 554 | inh64.FileHeader.Machine = machine; |
| 555 | inh64.FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_OPTIONAL_HEADER64); |
| 556 | |
| 557 | inh64.OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR64_MAGIC; |
| 558 | inh64.OptionalHeader.MajorLinkerVersion = inh32.OptionalHeader.MajorLinkerVersion; |
| 559 | inh64.OptionalHeader.MinorLinkerVersion = inh32.OptionalHeader.MinorLinkerVersion; |
no test coverage detected
searching dependent graphs…