Пытаюсь выделить память в 64 разраядном процессе( не в своем но созданном мной ) dllRemoteAddress = VirtualAllocEx64(hProcess, NULL, ntHeaders64->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); //ntHeaders64->OptionalHeader.SizeOfImage Около 300000 Функция возращает 0, GetLastError говорит 0 , в чем проблема ?
Пишите баг-репорт револьфу или приложите какое-нибудь минимальное приложение/код, где можно поймать такую же ошибку.
это типа вызов 64-битной функции в 32-битном процессе через хевенсгейт? если да, то само собой гетластеррор не будет получать ошибку, тк она попала в 64-битный теб, а не в 32-битный... можно руками ее получить, переведя поток а обратно в 64-битный режим, считав адрес теба из гс и просчитав смещение поля с ластеррором... --- Сообщение объединено, 17 дек 2018 --- даже больше... в 32 битном процессе же только нтдлл 64 битная занружена... то есть это функция виртуалаллокех использует нтапи в своей работе... а следовательно, если она не выставляет гетластеррор, то никто не выставляет гетластеррор... смотри ее реализацию...
для справки - код револьфа робит везде. на тек момент 10 соппортиться. по ошибкам - там ставиться ошибка для вов Код (C): BOOL __cdecl VirtualProtectEx64(HANDLE hProcess, DWORD64 lpAddress, SIZE_T dwSize, DWORD flNewProtect, DWORD* lpflOldProtect) { static DWORD64 ntpvm = 0; if (0 == ntpvm) { ntpvm = GetProcAddress64(getNTDLL64(), "NtProtectVirtualMemory"); if (0 == ntpvm) return 0; } DWORD64 tmpAddr = lpAddress; DWORD64 tmpSize = dwSize; DWORD64 ret = X64Call(ntpvm, 5, (DWORD64)hProcess, (DWORD64)&tmpAddr, (DWORD64)&tmpSize, (DWORD64)flNewProtect, (DWORD64)lpflOldProtect); if (STATUS_SUCCESS != ret) { SetLastErrorFromX64Call(ret); return FALSE; } else return TRUE; } VOID __cdecl SetLastErrorFromX64Call(DWORD64 status) { typedef ULONG(WINAPI *RtlNtStatusToDosError_t)(NTSTATUS Status); typedef ULONG(WINAPI *RtlSetLastWin32Error_t)(NTSTATUS Status); static RtlNtStatusToDosError_t RtlNtStatusToDosError = nullptr; static RtlSetLastWin32Error_t RtlSetLastWin32Error = nullptr; if ((nullptr == RtlNtStatusToDosError) || (nullptr == RtlSetLastWin32Error)) { HMODULE ntdll = GetModuleHandleW(L"ntdll.dll"); RtlNtStatusToDosError = (RtlNtStatusToDosError_t)GetProcAddress(ntdll, "RtlNtStatusToDosError"); RtlSetLastWin32Error = (RtlSetLastWin32Error_t)GetProcAddress(ntdll, "RtlSetLastWin32Error"); } if ((nullptr != RtlNtStatusToDosError) && (nullptr != RtlSetLastWin32Error)) { RtlSetLastWin32Error(RtlNtStatusToDosError((DWORD)status)); } } те GetLastError будет корректен. Смотрите сорцы.