Comment corriger ERROR_INVALID_BLOCK dans la fonction Detours

Comment corriger ERROR_INVALID_BLOCK Traiter le problème ERROR_INVALID_BLOCK peut être un véritable casse-tête pour les développeurs, surtout lorsqu’il s’agit de détours de fonction. Il est généralement accompagné du message d’erreur 9 (0x9) L’adresse du bloc de contrôle de stockage est invalide.

Comment puis-je corriger ERROR_INVALID_BLOCK ?

1. Assurez-vous que la fonction cible est suffisamment grande pour être détournée

  1. Vérifiez que la fonction que vous essayez de détourner dispose de suffisamment d’espace mémoire pour accueillir le détournement. La fonction doit être suffisamment longue, généralement au moins cinq octets, car Detours doit écraser le début de la fonction avec une instruction de saut.
  2. Si la fonction est trop petite, envisagez de détourner une fonction plus grande qui appelle finalement la fonction cible.

Cela garantit que la fonction est suffisamment grande pour que le détournement s’attache correctement et empêche l’erreur ERROR_INVALID_BLOCK de se produire.

2. Initialisez correctement le pointeur de la fonction cible

  1. Assurez-vous que la variable pointée par ppPointer est correctement initialisée et n’est pas NULL.
  2. Initialisez le pointeur de la fonction originale une seule fois avant le crochet pour éviter ERROR_INVALID_BLOCK.
`BOOL(WINAPI* originFunc) (HDC, int, int, int, int, HDC, int, int, DWORD) = Bitblt;`

Cela évite l’ERROR_INVALID_BLOCK en s’assurant que le pointeur de fonction est configuré correctement avant d’attacher le détournement.

3. Utilisez correctement l’API DetourTransaction

  1. Commencez une nouvelle transaction en utilisant DetourTransactionBegin().
  2. Attachez la fonction de détournement en utilisant DetourAttach().
  3. Engagez la transaction en utilisant DetourTransactionCommit().

Voici un exemple d’utilisation de l’API DetourTransaction :

`DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)originFunc, MyBitBlt);
DetourTransactionCommit();`

Cela garantit que le détournement fait partie d’une transaction et aide à attacher et détacher les détournements de manière ordonnée, prévenant ainsi les erreurs.

4. Vérifiez la disponibilité de la mémoire

  1. Assurez-vous qu’il y a suffisamment de mémoire disponible pour compléter l’opération de détournement.
  2. Si la mémoire est insuffisante, vous devrez peut-être optimiser l’utilisation de la mémoire ailleurs dans votre application ou allouer plus de ressources.

S’assurer qu’il y a suffisamment de mémoire disponible prévient l’erreur ERROR_INVALID_BLOCK due à des contraintes de mémoire.

5. Vérifiez l’intégrité de la fonction étant détournée

  1. Vérifiez la fonction cible pour toute modification ou patch qui pourrait causer des incohérences.
  2. Assurez-vous que le code de la fonction est intact et non altéré par d’autres crochets ou outils de débogage.

Assurer l’intégrité de la fonction cible prévient les erreurs liées à la taille de la fonction ou à la corruption.

6. Gérez les cas spéciaux dans les appels d’automatisation (VBA/COM)

  1. Lorsqu’il s’agit d’appels COM ou d’automatisation, des erreurs comme ERROR_INVALID_BLOCK peuvent être dues à un type de variable inattendu.
  2. Assurez-vous que vous passez les bons types d’arguments attendus par la fonction.

Par exemple, en utilisant le bon type dans un appel VBA :

`Dim strArg As String
strArg = "Argument attendu"
Call someFunction(strArg)`

Cette méthode garantit que les types d’arguments correspondent aux attentes de la fonction, prévenant ainsi les erreurs de bloc.

En suivant ces solutions, vous pouvez efficacement traiter l’erreur ERROR_INVALID_BLOCK dans vos opérations de détournement et garantir un accrochage de fonction fluide et sans erreur. N’oubliez jamais de vérifier la taille de vos fonctions et la disponibilité de la mémoire pour éviter de tels problèmes à l’avenir. Vous pouvez également apprendre à résoudre un problème similaire, CNSS_FILE_SYSTEM_FILTER.

Avez-vous réussi à corriger le problème ERROR_INVALID_BLOCK ? Faites-le nous savoir dans les commentaires ci-dessous.