| 1407 | } |
| 1408 | |
| 1409 | bool HandleExecuteWrite(unsigned long long Pa, const void* NextInstruction) |
| 1410 | { |
| 1411 | unsigned long long Pa4Kb = ALIGN_DOWN_BY(Pa, PageSize); |
| 1412 | auto Handler = m_Handlers.find(Pa4Kb); |
| 1413 | if (Handler == m_Handlers.end()) |
| 1414 | { |
| 1415 | return false; |
| 1416 | } |
| 1417 | |
| 1418 | auto& HandlerEntry = Handler->second; |
| 1419 | if (!HandlerEntry.Handlers.OnExecuteWrite.Value) |
| 1420 | { |
| 1421 | return false; |
| 1422 | } |
| 1423 | |
| 1424 | auto* Pte = HandlerEntry.Pte; |
| 1425 | |
| 1426 | m_PendingHandler.Rip = NextInstruction; |
| 1427 | m_PendingHandler.Pte = Pte; |
| 1428 | m_PendingHandler.PendingPrevEntry = *Pte; |
| 1429 | |
| 1430 | *Pte = HandlerEntry.Handlers.OnExecuteWrite; |
| 1431 | invept(); |
| 1432 | |
| 1433 | return true; |
| 1434 | } |
| 1435 | |
| 1436 | bool CompletePendingHandler(const void* Rip) |
| 1437 | { |
no test coverage detected