Wdestroier

Untitled

Jun 21st, 2021
867
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Assume que o sistema operacional é o Windows e a arquitetura é x86 ou x86_64
  2.  
  3. #include <windows.h>
  4.  
  5. // O tamanho em bytes da struct CONTEXT. Se a arquitetura for ARM,
  6. // então a struct se chama ARM64_NT_CONTEXT e o tamanho é diferente.
  7. // sizeof(CONTEXT) = 716
  8. //#define CONTEXT_SIZE 716
  9.  
  10. // jmp_buf[0] é o valor que a função jmp_buf irá retornar
  11. // o resto do buffer é para guardar a struct CONTEXT
  12. typedef int jmp_buf[1 + (sizeof(CONTEXT) / sizeof(int)) + 1];
  13.  
  14. int setjmp(jmp_buf env)
  15. {
  16.     memset(env, 0, sizeof(jmp_buf));
  17.  
  18.     GetThreadContext(GetCurrentThreadId(), &env[1]);
  19.  
  20.     return env[0];
  21. }
  22.  
  23. void longjmp(jmp_buf env, int val)
  24. {
  25.     env[0] = val;
  26.  
  27.     SetThreadContext(GetCurrentThreadId(), &env[1]);
  28. }
  29.  
  30. // Exemplo de https://www.tutorialspoint.com/c_standard_library/c_function_longjmp.htm
  31.  
  32. // Saída esperada:
  33. // Jump function call
  34. // Returned from a longjmp() with value = tutorialspoint.com
  35. int main()
  36. {
  37.     int val;
  38.     jmp_buf env_buffer;
  39.  
  40.     val = setjmp(env_buffer);
  41.  
  42.     if (val != 0) {
  43.         printf("Returned from a longjmp() with value = %s\n", val);
  44.         exit(1);
  45.     }
  46.     printf("Jump function call\n");
  47.     longjmp(env_buffer, "tutorialspoint.com");
  48.  
  49.     return 0;
  50. }
RAW Paste Data