ring0.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /* https://github.com/cirosantilli/linux-kernel-module-cheat#ring0 */
  2. #ifndef LKMC_RING0_H
  3. #define LKMC_RING0_H
  4. #if defined(__x86_64__) || defined(__i386__)
  5. #ifdef THIS_MODULE
  6. #include <linux/kernel.h>
  7. #if defined(__x86_64__)
  8. typedef u64 LkmcRing0RegsType;
  9. #elif defined(__i386__)
  10. typedef u32 LkmcRing0RegsType;
  11. #endif
  12. #else
  13. #include <stdint.h>
  14. #if defined(__x86_64__)
  15. typedef uint64_t LkmcRing0RegsType;
  16. #elif defined(__i386__)
  17. typedef uint32_t LkmcRing0RegsType;
  18. #endif
  19. #endif
  20. typedef struct {
  21. LkmcRing0RegsType cr0;
  22. LkmcRing0RegsType cr2;
  23. LkmcRing0RegsType cr3;
  24. } LkmcRing0Regs;
  25. void lkmc_ring0_get_control_regs(LkmcRing0Regs *ring0_regs) {
  26. #if defined(__x86_64__)
  27. __asm__ __volatile__ (
  28. "mov %%cr0, %%rax;"
  29. "mov %%eax, %[cr0];"
  30. : [cr0] "=m" (ring0_regs->cr0)
  31. :
  32. : "rax"
  33. );
  34. __asm__ __volatile__ (
  35. "mov %%cr2, %%rax;"
  36. "mov %%eax, %[cr2];"
  37. : [cr2] "=m" (ring0_regs->cr2)
  38. :
  39. : "rax"
  40. );
  41. __asm__ __volatile__ (
  42. "mov %%cr3, %%rax;"
  43. "mov %%eax, %[cr3];"
  44. : [cr3] "=m" (ring0_regs->cr3)
  45. :
  46. : "rax"
  47. );
  48. #elif defined(__i386__)
  49. __asm__ __volatile__ (
  50. "mov %%cr0, %%eax;"
  51. "mov %%eax, %[cr0];"
  52. : [cr0] "=m" (ring0_regs->cr0)
  53. :
  54. : "eax"
  55. );
  56. __asm__ __volatile__ (
  57. "mov %%cr2, %%eax;"
  58. "mov %%eax, %[cr2];"
  59. : [cr2] "=m" (ring0_regs->cr2)
  60. :
  61. : "eax"
  62. );
  63. __asm__ __volatile__ (
  64. "mov %%cr3, %%eax;"
  65. "mov %%eax, %[cr3];"
  66. : [cr3] "=m" (ring0_regs->cr3)
  67. :
  68. : "eax"
  69. );
  70. #endif
  71. }
  72. #endif
  73. #endif