Hook Clavier
par Arkon
Une DLL est indirectement une exécutable qui ne dispose pas d'une boucle de message pour recevoir une entrée d'utilisateur. Les dll sont séparés des fichiers contenant des fonctions(mais pas seulement) qui peut être appelée par les programmes et autres Dll. À l'utilisateur final une DLL est un programme qui ne peut pas être exécuté directement à partir du Programme de la Crèche(ou d'autres Coquillages), mais à partir du système du point de vue, il existe deux différences entre Dll et applications: Dll ne peut pas avoir plusieurs instances en cours d'exécution chargé en mémoire. et Dll fixer eux-mêmes les processus, les seules instances de l'application sont des processus. DLL est synonyme de Bibliothèque de liens Dynamiques. Dynamic-Link est un mécanisme de bibliothèques de liens pour les applications au moment de l'exécution. Ces bibliothèques(Dll) de résider dans leurs propres fichiers exécutables(.dll) et ne sont pas copiés dans des applications de " fichiers exécutables(.exe) qu'avec les bibliothèques de Liaison Statique. Il est important de comprendre qu'un .DLL est chargée dans l'espace d'adressage de la liaison de l'application et non pas dans le tas global! Les avantages de l'utilisation de la liaison dynamique de la méthode sont:
Elles peuvent être mises à jour sans que des applications pour la recompilation ou réédités.
Lorsque plusieurs applications utilisent la même .DLL, la .DLL est juste chargé une fois pour toutes les applications(réduction de l'espace disque et de mémoire).
La raison nous avons besoin d'une DLL d'un Système à l'échelle de crochet est parce que nous voulons que la Fonction de Filtre pour être dans n'importe quelle application de l'adresse de l'espace. Ainsi, lorsque vous réglez le crochet de message en fonction de filtre qui se trouve dans le .dll Windows cartes la .dll automatiquement dans toutes les applications de l'espace d'adressage. Ainsi, vous obtenez votre fonction de filtre appelée pour chaque processus! Par conséquent, lorsque nous la liaison dynamique le crochet qui est dans un .DLL il devient un Système de raccordement à l'échelle(bien sûr cela dépend du type de la Fonction Filtre trop). Bon, maintenant, après l'important matériel théorique..
Nous allons commencer le codage de l' .DLL pour le Système de clavier à l'échelle du crochet, puis je vais vous expliquer comment la liaison dynamique la .DLL dans notre application.
S'il vous plaît télécharger le code source pour voir comment tout est écrit et fait.
// C'est notre clavier rappel proc:
// _declspec(dllexport) signifie que nous voulons laisser à d'autres
// applications/Dll appeler cette fonction, dans le même cas que vous n'avez pas
// besoin de ce préfixe, mais pour la sécurité, nous allons l'utiliser.
_declspec(dllexport) LRESULT CALLBACK KBHookProc(int Code,
WPARAM wParam, LPARAM lParam)
{
// Si le code est inférieur à 0, nous appelons l'hameçon,
// c'est la façon dont les crochets de travail, rien de spécial
si (Code < 0) return(CallNextHookEx(hhook, Code, wParam, lParam));
// Info sur ce qui se passe avec le clavier
si (lParam & (1 << 31)) // Bit 31 indique si une touche est enfoncée
// Appel de la prochaine crochet.
retour(CallNextHookEx(hhook, Code, wParam, lParam));
}
// Ce sont les mêmes que WinMain/Principal, mais pour les Dll,
// vous obtenez la DLL exemple, la Raison de la façon dont votre .DLL est appelée, réservés.
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason,
LPVOID lpReserved)
{
// Il y a en fait 4 raisons, nous traiterons seulement 2 d'entre eux,
// parce que c'est assez pour notre prog.
si (dwReason == DLL_PROCESS_ATTACH) // Chargement de l' .DLL
{
si(pcount == 0)
{
// Initialisation // le Premier temps de chargement
// Définir crochet..
}
pcount++;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
// UnInit avant que le système libère l' .DLL à partir de la mémoire.
si(pcount == 1)
{
// Gratuit
// Tuer crochet..
}
pcount--;
}
return(1);
}
Vous voyez, c'est assez facile, je dirais. De toute façon, pcount est notre processus de compteur, il dit combien de fois le .DLL a été appelé. pcount est une variable spéciale, il doit être dans le tas global, parce que si elle n'est pas le cas, alors à chaque fois que notre .DLL est appelée, elle sera initialisée à 0, encore et encore...alors pour éviter cela, nous dire au compilateur de mettre la variable dans le tas global. Nous le faisons pour le crochet de la poignée trop, parce que nous avons mis le crochet qu'une seule fois. Si nous avons mis le crochet à chaque fois que l' .DLL est appelé, il va être sali crochet et il ne fonctionne pas correctement et que l'on souhaite! Afin de dire au compilateur que nous voulons mettre la variable dans le tas global-nous faire ceci:
#pragma data_seg("SharedBlock")
HHOOK hhook = NULL;
int pcount = 0;
#pragma data_seg()
Avis de chaque variable doit être initialisée. ok on va HHOOK hhook = NULL; unsigned long frappes = 0; int pcount = 0; #pragma data_seg() Nous avons bientôt fini d'écrire le .DLL, chaque .Le fichier DLL est d'avoir un .DEF fichier pour indiquer au compilateur. Dans l' .Fichier DEF nous dire au compilateur les fonctions que nous voulons pour l'exportation, oui, ceux avec le _declspec(dllexport), et nous dire au compilateur sur le partage de bloc de données. (Voir le code source pour la pleine compréhension de l' .Fichier DEF). Une fois l' .DLL fichier est prêt, vous devez le copier dans l'application qui charge le .DLL annuaire ou de le copier dans le répertoire %windir%\system.
OK, c'est tout pour le .DLL trucs, maintenant, nous allons charger le .DLL que nous venons de créer! Nous avons tout d'abord de déclarer des pointeurs de fonctions avec des paramètres qu'ils reçoivent.
typedef void (*LPFunction)(void);
LPFunction fonction = NULL;
// Ceci est un pointeur vers une fonction qui n'a pas de
// paramètres et renvoie un void.
HMODULE DLLmodule = LoadLibrary("mydll.dll");
if (!DLLmodule) // .DLL fichier n'est pas trouvé!!!
// Cette fonction est le code de la spécifiques voulais fonction de la mémoire,
// Notez les majuscules, le voulait le nom de la fonction est d'être exactement,
// comme dans le .Fichier DEF et .RPC fichier de la DLL, nous a écrit.
fonction = (LPFucntion)GetProcAddress(DLLmodule, "Fonction");
if (!la fonction) // Fonction de mise en œuvre du code n'est pas trouvé!!!
// Maintenant, vous pouvez appeler la fonction.
la fonction();
// Après avoir fini d'utiliser l' .DLL, n'oubliez pas de le libérer!
FreeLibrary(DLLmodule);
Wouhou, c'est ça!! Eh bien, c'était juste l'essentiel et il ne fonctionnera pas si vous copier coller.
Date de publication: