VirtualAllocEx возращаеть 0, GetLastError0 ( 64 bit)

Тема в разделе "LANGS.C", создана пользователем Ivanushka23, 17 дек 2018.

  1. Ivanushka23

    Ivanushka23 New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2018
    Сообщения:
    6
    Пытаюсь выделить память в 64 разраядном процессе( не в своем но созданном мной )



    dllRemoteAddress = VirtualAllocEx64(hProcess, NULL, ntHeaders64->OptionalHeader.SizeOfImage,
    MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

    //ntHeaders64->OptionalHeader.SizeOfImage Около 300000
    Функция возращает 0, GetLastError говорит 0 , в чем проблема ?
     
  2. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Пишите баг-репорт револьфу или приложите какое-нибудь минимальное приложение/код, где можно поймать такую же ошибку.
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    это типа вызов 64-битной функции в 32-битном процессе через хевенсгейт? если да, то само собой гетластеррор не будет получать ошибку, тк она попала в 64-битный теб, а не в 32-битный... можно руками ее получить, переведя поток а обратно в 64-битный режим, считав адрес теба из гс и просчитав смещение поля с ластеррором...
    --- Сообщение объединено, 17 дек 2018 ---
    даже больше... в 32 битном процессе же только нтдлл 64 битная занружена... то есть это функция виртуалаллокех использует нтапи в своей работе... а следовательно, если она не выставляет гетластеррор, то никто не выставляет гетластеррор... смотри ее реализацию...
     
    M0rg0t и q2e74 нравится это.
  4. Ivanushka23

    Ivanushka23 New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2018
    Сообщения:
    6
    Решено спасибо, в коде функция была переназначена немного )
     
  5. superakira

    superakira Guest

    Публикаций:
    0
    для справки - код револьфа робит везде. на тек момент 10 соппортиться. по ошибкам - там ставиться ошибка для вов

    Код (C):
    1. BOOL __cdecl VirtualProtectEx64(HANDLE hProcess, DWORD64 lpAddress, SIZE_T dwSize, DWORD flNewProtect, DWORD* lpflOldProtect)
    2. {
    3.   static DWORD64 ntpvm = 0;
    4.   if (0 == ntpvm)
    5.   {
    6.     ntpvm = GetProcAddress64(getNTDLL64(), "NtProtectVirtualMemory");
    7.     if (0 == ntpvm)
    8.       return 0;
    9.   }
    10.  
    11.   DWORD64 tmpAddr = lpAddress;
    12.   DWORD64 tmpSize = dwSize;
    13.   DWORD64 ret = X64Call(ntpvm, 5, (DWORD64)hProcess, (DWORD64)&tmpAddr, (DWORD64)&tmpSize, (DWORD64)flNewProtect, (DWORD64)lpflOldProtect);
    14.   if (STATUS_SUCCESS != ret)
    15.   {
    16.     SetLastErrorFromX64Call(ret);
    17.     return FALSE;
    18.   }
    19.   else
    20.     return TRUE;
    21. }
    22.  
    23. VOID __cdecl SetLastErrorFromX64Call(DWORD64 status)
    24. {
    25.   typedef ULONG(WINAPI *RtlNtStatusToDosError_t)(NTSTATUS Status);
    26.   typedef ULONG(WINAPI *RtlSetLastWin32Error_t)(NTSTATUS Status);
    27.  
    28.   static RtlNtStatusToDosError_t RtlNtStatusToDosError = nullptr;
    29.   static RtlSetLastWin32Error_t RtlSetLastWin32Error = nullptr;
    30.  
    31.   if ((nullptr == RtlNtStatusToDosError) || (nullptr == RtlSetLastWin32Error))
    32.   {
    33.   HMODULE ntdll = GetModuleHandleW(L"ntdll.dll");
    34.   RtlNtStatusToDosError = (RtlNtStatusToDosError_t)GetProcAddress(ntdll, "RtlNtStatusToDosError");
    35.   RtlSetLastWin32Error = (RtlSetLastWin32Error_t)GetProcAddress(ntdll, "RtlSetLastWin32Error");
    36.   }
    37.  
    38.   if ((nullptr != RtlNtStatusToDosError) && (nullptr != RtlSetLastWin32Error))
    39.   {
    40.   RtlSetLastWin32Error(RtlNtStatusToDosError((DWORD)status));
    41.   }
    42. }
    те GetLastError будет корректен. Смотрите сорцы.