вообщем понадобилось написать фичу аля NTSTATUS ZwCallService(ULONG serviceNum, ...) т.е. вызов нт сервиса по его номеру, для х86 все ясно, но для 64 видел несколько кодесов, типа онион апи - но там гуано какоето. в итоге написал такое вот Code: ; ; extern "C" NTSTATUS ApiCallNtService(ULONG id, ...); ; ApiCallNtService PROC mov rax, rcx mov rcx, rdx mov rdx, r8 mov r8, r9 lea r9, [rsp+28h] mov r9, [r9] ; FIXED: stack to register dereference forgotten add rsp, 8 mov r10, rcx syscall sub rsp, 8 ret ApiCallNtService ENDP собственно проблема в том что приходится значения регистров сдвигать по причине наличия переменной id в RCX и по сравнению с нормальным сисколлом - появляется лишний qword в стеке, изза чего я тупо делаю add rsp/sub rsp во время вызова. все работает но работает хреново, например NtClose на инвалидном хендле валится гдето в RtlCaptureContext, хотя ф-ии 6 параметров итд работают нормально. может у кого есть готовая идея?
проверил. на входе оригинальной NtClose и через гейт RSP mod 0x10 = 8, но никак не нулю. и одна валится а другая нет. видимо чето упустил
не сбивайте с толку пацана, выравнивание тут ни при чем. дело в том что при сисколле параметры идут так: f(r10, rdx, r8, r9)...stack_vars; a в rcx syscall сохраняет retRIP т.е.: rax = service id r10 = param1 rdx = param2 r8 = param3 r9 = param4 [rsp+20h] = начало стековых переменных syscall