Como corrigir ERROR_INVALID_BLOCK na função Detours

Como corrigir ERROR_INVALID_BLOCK 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

  1. 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.
  2. 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

  1. Certifique-se de que a variável apontada por ppPointer está corretamente inicializada e não é NULL.
  2. 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

  1. Inicie uma nova transação usando DetourTransactionBegin().
  2. Anexe a função de desvio usando DetourAttach().
  3. 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

  1. Certifique-se de que há memória suficiente disponível para completar a operação de desvio.
  2. 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

  1. Verifique a função alvo para quaisquer modificações ou patches que possam causar inconsistências.
  2. 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)

  1. Ao lidar com chamadas COM ou de automação, erros como ERROR_INVALID_BLOCK podem ser devido a um tipo de variável inesperado.
  2. 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.