GetLayeredWindowAttributes et Windows 2000

cs_Xaviou Messages postés 154 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 2 octobre 2009 - 13 mars 2009 à 08:54
cs_Xaviou Messages postés 154 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 2 octobre 2009 - 16 mars 2009 à 13:41
Bonjour à tous.

J'ai un petit soft qui tourne actuellement sur différentes machines, dont certaines encore équipées de Windows 2000.

A un moment donné, j'ai besoin de récupérer les éventuelles informations de transparence d'une fenêtre.
Mais Windows 2000, s'il possède bien la fonction SetLayeredWindowAttributes, ne possède pas la fonction GetLayeredWindowAttributes.
D'après MSDN, cette fonction est apparue à partir deWindow XP.

Je passe donc par la fonction GetWindowLong pour savoir si oui ou non la fenêtre a le style transparent (car dans ce cas, elle a le style WS_EX_LAYERED).
Par contre, je ne sais pas comment retrouver les valeurs des deux derniers paramètres de GetLayeredWindowAttributes :

Merci d'avance pour vos éventuelles  pistes (ou solutions).

@+
Xav'

5 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
14 mars 2009 à 20:00
Salut,

Désassemblé, sous XP, c'est juste un appel au service système 0x125C...

Je ne trouve plus la doc avec les numéros des services systèmes par OS...
0
cs_Xaviou Messages postés 154 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 2 octobre 2009
15 mars 2009 à 15:11
Salut.

Est-ce que tu peux m'en dire plus sur ce genre de truc (les appels aux services systèmes). C'est quelque chose que je ne connais pas du tout.
Quels genre de services peut-on appeler de cette façon (je suppose qu'il ne s'agit pas des mêmes services que ceux auxquels on peut avoir accès depuis le panneau de configuration, mais je ne voispas du tout à quoi ça correspond).

Merci d'avance.

@+
Xav'
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 mars 2009 à 17:42
En gros un certain nombre de fonction win32 (CreateFile) appellent des fonctions présentes dans ntdll (NtCreateFile). Ces fonctions préfixées par Nt font souvent un appel à un service système, c'est à dire une fonction du noyau. Les fonctions préfixées Nt mettent le numéro de service dans le registre eax et appellent KiFastSystemCall, une fonction de NtDll. Cette fonction utilise l'instruction sysenter pour passer en mode noyau et exécuter la fonction KiFastCallEntry de celui-ci. KiFastCallEntry appelle KiSystemService. KiSystemService regarde dans la GTD ou LTD l'adresse de la fonction correspondant au numéro de service mis en place dans eax par la fonction préfixée Nt. Et le service peut enfin s'exécuter.

Plus d'infos ici.

Dans ton cas, GetLayeredWindowAttributes ne passe pas par une fonction NtGetLayeredWindowAttributes. Le code de cette fonction de user32 est le suivant :

mov eax, 0x125C
mov edx, KiFastSystemCall
call dword ptr edx

Bref elle fait le boulot de NtDll à la place de NtDll.
Ce qui est un peu curieux (Pour moi...), c'est le numéro du service :
0x125C, qui est sensé correspondre à une entrée dans la GDT. Il est
sacrément élevé...

Tu pourrais donc facilement implémentée ta propre GetLayeredWindowAttributes pour un OS en particulier : quelques lignes d'assembleur...

Mais le numéro de service n'est pas forcément compatible avec windows 2000 : les numéros peuvent changer d'un NT à l'autre. Et le service GetLayeredWindowAttributes n'existe peut être tout simplement pas sous 2000.

Pour aller plus loin, il faudrait regarder dans la GDT si 0x125C est un index valide, et désassembler la fonction correspondante.

Le problème de la chose étant qu'il faut un débugueur noyau et savoir à peu près s'en servir. (Windbg un des "Debugging Tools for Windows" s'en sort très bien en mode non intrusif pour ce genre de chose). Et qu'ensuite il faudrait (Probablement) faire un driver pour windows 2000 faisant la même chose que le code désassemblé d'un XP ou d'un Vista.

Bref, il y a pas mal de boulot...
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 mars 2009 à 18:06
Erratum sur mon code de
GetLayeredWindowAttributes, mais bon c'est le même esprit...
mov eax, 0x125C
mov edx, entrée KiFastSystemCall dans la table d'import
call dword ptr edx
<hr size="2" width="100%" />Je supporte plus Vista. Et il a même pas ntsd, un petit débugueur bien sympa présent sous XP par défaut.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Xaviou Messages postés 154 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 2 octobre 2009
16 mars 2009 à 13:41
Gloups....

C'est d'un niveau malheureusement trop élevé pour que je m'y mette

Va falloir que je trouve une autre solution.

J'ai bien, dans un premier temps, trouvé ceci, mais en regardant le code source fourni, la fonction recréée ne retourne pas les valeurs correspondantes à la fenêtre. Elle renvoie tout simplement les valeurs 0x00FFFFFF pour COLORREF, 0xFF pour la valeur alpha, et LW_ALPHA pour les flags. Autant dire que ça ne sert à rien.

Il y a ensuite ce projet (qu'il faudrait que je teste pour voir si la fonction GetLayeredWindowAttributes fonctionne correctement), mais cette fois-ci, le problème est tout autre : il s'agit d'un package à installer qui, d'après ce que j'ai compris, fait une copie de certaines dll et prend leur place.
Par exemple, la dll user32.dll est "renommée" en user2k.dll, et la nouvelle user32.dll mise prend sa place et lui est linkée.
Le genre de truc que l'on ne veut surtout pas imposer à nos utilisateurs.

En tout cas, merci pour avoir pris le temps de regarder mon problème, et pour tes explications.

@+
Xav'
0
Rejoignez-nous