Como corrigir ERROR_INVALID_BLOCK na função Detours
Lidar com o problema ERROR_INVALID_BLOCK pode ser bastante complicado para os desenvolvedores, especialmente ao trabalhar com desvios de função. Geralmente, vem acompanhado da mensagem de erro 9 (0x9) O endereço do bloco de controle de armazenamento é inválido.
Como posso corrigir ERROR_INVALID_BLOCK?
1. Certifique-se de que a função alvo é grande o suficiente para ser desviada
- Verifique se a função que você está tentando desviar tem espaço de memória suficiente para acomodar o desvio. A função deve ser suficientemente longa, tipicamente pelo menos cinco bytes, porque o Detours precisa sobrescrever o início da função com uma instrução de salto.
- Se a função for muito pequena, considere desviar uma função maior que eventualmente chama a função alvo.
Isso garante que a função seja grande o suficiente para que o desvio se anexe corretamente e evita que o erro ERROR_INVALID_BLOCK ocorra.
2. Inicialize o ponteiro da função alvo corretamente
- Certifique-se de que a variável apontada por ppPointer está corretamente inicializada e não é NULL.
- Inicialize o ponteiro da função original apenas uma vez antes do hook para evitar ERROR_INVALID_BLOCK.
`BOOL(WINAPI* originFunc) (HDC, int, int, int, int, HDC, int, int, DWORD) = Bitblt;`Isso evita o ERROR_INVALID_BLOCK garantindo que o ponteiro da função esteja configurado corretamente antes de anexar o desvio.
3. Use a API DetourTransaction corretamente
- Inicie uma nova transação usando DetourTransactionBegin().
- Anexe a função de desvio usando DetourAttach().
- Comite a transação usando DetourTransactionCommit().
Aqui está um exemplo de uso da API DetourTransaction:
`DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)originFunc, MyBitBlt);
DetourTransactionCommit();`Isso garante que o desvio faça parte de uma transação e ajuda na anexação e desanexação ordenada dos desvios, prevenindo erros.
4. Verifique a disponibilidade de memória
- Certifique-se de que há memória suficiente disponível para completar a operação de desvio.
- Se a memória for insuficiente, você pode precisar otimizar o uso de memória em outro lugar em seu aplicativo ou alocar mais recursos.
Garantir que há memória suficiente disponível previne o erro ERROR_INVALID_BLOCK devido a restrições de memória.
5. Verifique a integridade da função sendo desviada
- Verifique a função alvo para quaisquer modificações ou patches que possam causar inconsistências.
- Certifique-se de que o código da função está intacto e não foi alterado por outros hooks ou ferramentas de depuração.
Garantir a integridade da função alvo previne erros relacionados ao tamanho da função ou corrupção.
6. Lide com casos especiais em chamadas de automação (VBA/COM)
- Ao lidar com chamadas COM ou de automação, erros como ERROR_INVALID_BLOCK podem ser devido a um tipo de variável inesperado.
- Certifique-se de que você está passando os tipos corretos de argumentos esperados pela função.
Por exemplo, usando o tipo correto em uma chamada VBA:
`Dim strArg As String
strArg = "Argumento Esperado"
Call someFunction(strArg)`Esse método garante que os tipos de argumento correspondam às expectativas da função, prevenindo erros de bloco.
Seguindo essas soluções, você pode abordar efetivamente o erro ERROR_INVALID_BLOCK em suas operações de desvio e garantir uma ligação de função suave e sem erros. Sempre lembre-se de verificar os tamanhos das suas funções e a disponibilidade de memória para evitar tais problemas no futuro. Você também pode aprender como resolver um problema semelhante, CNSS_FILE_SYSTEM_FILTER.
Você conseguiu corrigir o problema ERROR_INVALID_BLOCK? Deixe-nos saber nos comentários abaixo.