Столкнулся со странной ошибкой. Иногда вызов NtProtectVirtualMemory возвращает ошибку STATUS_CONFLICTING_ADDRESSES ( 0xC0000018 ). Может кто сталкивался с таким? Программа 32-битная, выполняется на Win10x64, аверов и подобного нет. Код (ASM): .data? align 8 ;надо выравнять для х64 ? pMem dd ? tmp dd ? oldProtect dd ? .code start: invoke VirtualAlloc,0,4096,MEM_COMMIT,PAGE_READONLY .if !eax ;invoke dbgs,chr$("Vmalloc failed") exit .else ;invoke dbgs,chr$("[+] Memory allocated") mov pMem,eax .endif push offset oldProtect push PAGE_EXECUTE_READWRITE mov tmp,4096 push offset tmp push offset pMem push 0FFFFFFFFh call NtProtectVirtualMemory ;иногда возвращает STATUS_CONFLICTING_ADDRESSES
M0rg0t, Вроде как (на сколько я помню) для функции NtProtectVirtualMemory (ну и для ее высокоуровневого аналога VirtualProtect) память должна быть с флагом MEM_RESERVE ну и второе предположение это размер - попробуйте 64kb
TermoSINteZ, да, в самом деле нужен MEM_RESERVE (ошибки нет, и в мсдн так пишут). Всегда думал, что хватает одного флага MEM_COMMIT.. Тут тоже были дебаты вот https://wasm.in/threads/mem_commit-vs-mem_reserve.10061/
TermoSINteZ, Вообще есть случаи когда происходит преобразование аргументов функции прежде чем они будут переданы низкоуровневой функции(те которые с префиксом Nt или Zw) ?
Entropy, Режим совместимости(compat -> legacy), тот самый wow - аргументы конвертируются(расширяется разрядность). Если оптимизатор не выключен, то таблично.