*(unsigned int*)&hookProc[6] = function; // Заменить 4 байта нужным адресом.
Не, не надо так делать. Правильно будет --
memcpy(hookProc + 6, &function, sizeof(function))
.
(void*)(address & 0x0xFFFFF000), sizeof(hookProc)
Скорее всего не является причиной проблемы, но выглядит неправильно. Правильно было бы
(void*)(address & 0xFFFFF000), ((address + sizeof(hookProc) + 0xfff) & 0xfffff000) - (address & 0xfffff000)
.
видно, что не изменилась инструкция перехода со сменой режима.
Ты можешь привести дамп (т.е. адреса и байты) этой области памяти до и после записи?