Дело нестандартное. В общем дело так обстоит: 7 x64. Я подменяю обработчик LSTAR (nt!KiSystemCall64) - поправьте, если неверно. Подменяю на свой код, который (срабатывает при первом же вызове какой-нибуль АПИ типа CreateFile) 1. восстанавливает родной обработчик 2. Вызываю NtOpenProcess. Получаю синий экран, падает на nt!SwapContext_PatchXSave (переход от KiSwapContext). Вот у меня такой вопрос, где можно узнать про эти контексты и почему у меня падает? WinDbg я ловлю когда начинает срабатывать мой обработчик и пошагово дохожу до NtOpenProcess и .. там в недрах.. падение... Запутался на счет контектстов. Юзермодная прога вызывает CreateFile, далее дело передается в ядро, там в какой-то момент срабатывает мой обработчик. Указатели на структуру правильные и тд. Причем падает только если корректный ПИД передается, иначе видимо просто не доходит. Вопрос: как мне прояснить ситуацию с KiSwapContext?
Там не функции, а макро. Посмотрите в сурсах. Как в x64 нормально делается я не знаю, в x86 я морфлю сискол в буфер, чтобы выделить код, формирующий т-фрейм.
Код (Text): ;++ ; ; Routine Description: ; ; This routine gains control when a system call instruction is executed ; from 64-bit mode. The specified system service is executed by locating ; its routine address in system service dispatch table and calling the ; specified function. ; ; N.B. This routine is never entered from kernel mode and it executed with ; interrupts disabled. ; ; Arguments: ; ; eax - Supplies the system service number. ; ; Return Value: ; ; eax - System service status code. ; ; r10, rdx, r8, and r9 - Supply the first four system call arguments. ; ; rcx - Supplies the RIP of the system call. ; ; r11 - Supplies the previous EFLAGS. ; ;-- TRAP_ENTRY KiSystemCall64, KiSystemServiceHandler swapgs ; swap GS base to kernel PCR mov gs:[PcUserRsp], rsp ; save user stack pointer mov rsp, gs:[PcRspBase] ; set kernel stack pointer push KGDT64_R3_DATA or RPL_MASK ; push dummy SS selector push gs:[PcUserRsp] ; push user stack pointer push r11 ; push previous EFLAGS push KGDT64_R3_CODE or RPL_MASK ; push dummy 64-bit CS selector push rcx ; push return address mov rcx, r10 ; set first argument value push_frame ; mark machine frame alloc_stack 8 ; allocate dummy error code push_reg rbp ; save standard register alloc_stack (KTRAP_FRAME_LENGTH - (7 * 8)) ; allocate fixed frame set_frame rbp, 128 ; set frame pointer mov TrRbx[rbp], rbx ; save nonvolatile registers .savereg rbx, (TrRbx + 128) ; mov TrRdi[rbp], rdi ; .savereg rdi, (TrRdi + 128) ; mov TrRsi[rbp], rsi ; .savereg rsi, (TrRsi + 128) ; END_PROLOGUE mov byte ptr TrExceptionActive[rbp], 2 ; set service active mov rbx, gs:[PcCurrentThread] ; get current thread address prefetchw ThTrapFrame[rbx] ; prefetch with write intent stmxcsr TrMxCsr[rbp] ; save current MXCSR ldmxcsr gs:[PcMxCsr] ; set default MXCSR test byte ptr ThDebugActive[rbx], TRUE ; test if debug enabled mov word ptr TrDr7[rbp], 0 ; assume debug not enabled jz short KiSS05 ; if z, debug not enabled mov TrRax[rbp], rax ; save service argument registers mov TrRcx[rbp], rcx ; mov TrRdx[rbp], rdx ; mov TrR8[rbp], r8 ; mov TrR9[rbp], r9 ; call KiSaveDebugRegisterState ; save user debug registers mov rax, TrRax[rbp] ; restore service argument registers mov rcx, TrRcx[rbp] ; mov rdx, TrRdx[rbp] ; mov r8, TrR8[rbp] ; mov r9, TrR9[rbp] ; align 16 KiSS05: sti ; enable interrupts if DBG cmp byte ptr ThPreviousMode[rbx], UserMode ; check previous mode je short @f ; if e, previous mode set to user int 3 ; @@: ; endif ; ; Dispatch system service. ; ; eax - Supplies the system service number. ; rbx - Supplies the current thread address. ; rcx - Supplies the first argument if present. ; rdx - Supplies the second argument if present. ; r8 - Supplies the third argument if present. ; r9 - Supplies the fourth argument if present. ; ALTERNATE_ENTRY KiSystemServiceStart mov ThTrapFrame[rbx], rsp ; set current frame pointer address Это всё опенсурсно. Лень чтоле посмотреть, как вы кодить собрались %)