Advertisement
ItsTotallyRSX

Untitled

Oct 9th, 2018
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.55 KB | None | 0 0
  1. error_t OProcessImpl::AccessProcessMemory(user_addr_t address, void * buffer, size_t length, bool read)
  2. {
  3.     rw_semaphore_k semaphore;
  4.     uint32_t pages;
  5.     page_k *page_array;
  6.     user_addr_t start;
  7.     uint32_t TODO;
  8.     size_t remaining;
  9.     size_t written;
  10.     mm_struct_k  mm;
  11.  
  12.     if (ERROR(_int_err))
  13.         return _int_err;
  14.  
  15.     if (length == 0)
  16.         return kErrorIllegalArgLength;
  17.  
  18.     if (!address)
  19.         return kErrorIllegalBadArgument;
  20.  
  21.     if (!buffer)
  22.         return kErrorIllegalBadArgument;
  23.  
  24.     mm = (mm_struct_k)task_get_mm_size_t(_tsk);
  25.  
  26.     if (!mm)
  27.         return kErrorInternalError;
  28.  
  29.     start = (user_addr_t)(size_t(address) & (kernel_information.LINUX_PAGE_MASK));
  30.  
  31.     pages = (length / kernel_information.LINUX_PAGE_SIZE) + 1;
  32.     page_array = (page_k *)zalloc(pages * sizeof(page_k));
  33.  
  34.     if (!page_array)
  35.         return kErrorInternalError;
  36.  
  37.     semaphore = (rw_semaphore_k)mm_struct_get_mmap_sem(mm); // &mm->mmap_sem
  38.     down_read(semaphore);                                   // lock semaphore
  39.  
  40.     TODO = get_user_pages_remote(_tsk, mm, (l_unsigned_long)start, pages, FOLL_FORCE, page_array, NULL, NULL); // WHAT DOES THIS RETURN?
  41.  
  42.     remaining = length;
  43.     written = 0;
  44.     for (uint32_t pg = 0; pg < pages; pg++)
  45.     {
  46.         void * mapped;
  47.         size_t pg_offset;
  48.         size_t segment_length;
  49.  
  50.         segment_length = MIN(remaining, kernel_information.LINUX_PAGE_SIZE);
  51.  
  52.         if (remaining)
  53.         {
  54.             uint64_t pfn;
  55.             phys_addr_t physaddr;
  56.             void * x64_map;
  57.  
  58.             pfn = linux_page_to_pfn(page_array[pg]);
  59.             physaddr = phys_addr_t(pfn << kernel_information.LINUX_PAGE_SHIFT);
  60.             x64_map = (void*)(size_t(physaddr) + page_offset_base); // x86_64 only - consider iomap on other archs this if targeting such. iiirc arm supports WANT_PAGE_VIRTUALADDR
  61.  
  62.             pg_offset = 0;
  63.             if ((pg == 0) && (start != address))
  64.                 pg_offset = size_t(address) - size_t(start);
  65.  
  66.             // i dont even care at this point
  67.             if (read)
  68.                 memcpy((void *)(size_t(buffer) + written), (void *)(size_t(x64_map) + pg_offset), segment_length);
  69.             else
  70.                 memcpy((void *)(size_t(x64_map) + pg_offset), (void *)(size_t(buffer) + written), segment_length);
  71.         }
  72.  
  73.         remaining -= segment_length;
  74.         written += segment_length;
  75.     }
  76.  
  77.     up_read(semaphore);                                     // unlock semaphore
  78.     free(page_array);
  79.  
  80.     return kStatusOkay;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement