By the way, Shadow Walker's HookMemoryPage() routine has a bug.
//Go ahead and flush the TLBs. We want to guarantee that all //subsequent accesses to this hooked page are filtered //through our new page fault handler. __asm invlpg pExecutePage
This will not flush the needed TLB if the compiler has not moved pExecutePage value to the register: it will flush the TLB entry for the page where pExecutePage variable resides - one of the stack pages. Use mov reg32, Address/invlpg [reg32] instead or call KiFlushSingleTb(), which is the same.