To make things more clear, about SharedUserData.
This is a structure that contains informations about kernel version, tick counts, system time, debugger and more.
(see
http://www.nirsoft.net/kernel_struct/vi ... _DATA.html)
KeUpdateSystemTime is called from interrupt dispatcher to dispatch Clock interrupt.
It fills SharedUserData.TickCount field with up-to-date tick count.
SharedUserData is mapped into every process, but this it is owned by kernel.
You can change PTE of a page to "redirect" SharedUserData in a specified process to another region of memory.
This will require you to copy and keep your copy of SharedUserData values up to date.
To hook GetTickCount it will be easier to do this from ring3.