MCPcopy Create free account
hub / github.com/acl-dev/acl / UpdateFrom32To64

Function UpdateFrom32To64

lib_fiber/cpp/src/detours/creatwth.cpp:502–642  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

500C_ASSERT(sizeof(IMAGE_NT_HEADERS64) == sizeof(IMAGE_NT_HEADERS32) + 16);
501
502static 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, &sects, 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;

Callers 1

Calls 2

RecordExeRestoreFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…