Проблема с NtAllocateVirtualMemory

Тема в разделе "WASM.WIN32", создана пользователем UPI, 8 май 2006.

  1. UPI

    UPI New Member

    Публикаций:
    0
    Регистрация:
    1 май 2006
    Сообщения:
    11
    В общем проблема большая для такого прогера как я.:) Пробовал с помощью NtAllocateVirtualMemory зарезервировать память в процессе. Как только не юзал функцию и с (HANDLE)(-1) и NtOpenProcess пробовал. Ошибка C0000005h. То есть не правильный указатель как я понял. Дальше уже пишу:



    PVOID AllocMemRing3(ULONG Size)

    {

    PVOID BaseAddress=NULL;

    ULONG RegionSize=Size;

    HANDLE hHandle=(HANDLE)GetCurrentProcessXP;



    if (NtAllocateVirtualMemory(hHandle,&BaseAddress,0,&RegionSize,MEM_RESERV E,4)!=STATUS_SUCCESS) { return NULL; }

    if (RegionSize<Size) {

    NtFreeVirtualMemory(hHandle,&BaseAddress,&RegionSize,MEM_RESERVE);

    return NULL;

    }

    return BaseAddress;

    }



    И NtAllocateVirtualMemory((HANDLE)(-1)...) тоже пробовал.



    Я че то не могу понять. Помогите плиз. В чем там дело с этой функцией, если кто знает.
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Как я понял, ты это делаешь из драйвера, а адрес NtAllocateVirtualMemory получаешь через SDT. Если да, то указатели BaseAddress и RegionSize должны находиться не в стеке ядра, а в юзермодном адресном пространстве, либо придется менять PerivousMode.

    Рекомендую не выделять память через NtAllocateVirtualMemory, а мапить ядерную память (из пула) в юзермод через MDL. Но этот метод не годиться тогда, когда требуется много памяти (т.к. при этом обязательно нужно использовать NonPagedPool), хотя работает он быстрее NtAllocateVirtualMemory.

    Еще можешь попробовать вызвать NtAllocateVirtualMemory не по указателю из SDT, а через int 2E. При этом обработчик KiSystemService сам установит PerivousMode.
     
  3. UPI

    UPI New Member

    Публикаций:
    0
    Регистрация:
    1 май 2006
    Сообщения:
    11
    Спасибо Ms Rem. Попробую.
     
  4. UPI

    UPI New Member

    Публикаций:
    0
    Регистрация:
    1 май 2006
    Сообщения:
    11
    Вот функции получения хендла текущего процесса, если нету у тебя. Пробовал только в XP. Вроде хендлы совпали.:) В 2K просто написал, что было в тонне тамошнего мусора, не проверял.:)



    ULONG GetCurrentProcess2K(VOID)

    {

    ULONG ProcessHandle;



    __asm {

    mov eax,fs:[0x124]

    mov eax,[eax+0x44]

    mov eax,[eax+0x128]

    mov eax,[eax+0x14]

    shl eax,2

    mov ProcessHandle,eax

    }



    return ProcessHandle;

    }



    ULONG GetCurrentProcessXP(VOID)

    {

    ULONG ProcessHandle;



    __asm {

    mov eax,fs:[0x124]

    mov eax,[eax+0x44]

    mov eax,[eax+0xC4]

    mov eax,[eax+0x30]

    mov ProcessHandle,eax

    }



    return ProcessHandle;

    }
     
  5. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    А не изобретать велосипед и использовать NtCurrentProcess не пробовал?