AppleWin, l'excellent émulateur Apple II (avec son mode debug qui est tout simplement une tuerie !) est très pratique pour bidouiller quand on n'a pas un Apple II sous la main.
En fait il faut bien l'avouer, il est même plus pratique à utiliser qu'un vrai Apple II dans bien des cas (qui a dit presque tous ? !).
C'est aussi grâce aux émulateurs (et à AppleWin en particulier) que j'ai découvert à quoi pouvait bien ressembler la couleur sur un IIe ! Et finalement, bah c'est pas plus mal en monochrome...
Mais je m'égare ! AppleWin donc, est pratique mais il le serait encore plus si on pouvait lancer deux sessions en même temps, chacune avec ses propres paramètres (du genre, "Authentic Speed Disk" sur l'une pour un Fastboot récalcitrant par exemple et "Enhanced" sur l'autre etc...) ! Mais aussi conserver ces paramètres d'une session à l'autre. Bref avoir deux programmes totalement indépendants !
On va donc résoudre le problème avec la bonne vieille méthode bourrine qui me caractérise tant : on va patcher l'EXE Windows.
Comme on est ici sur PC, je ne me hasarderai bien évidemment pas à diffuser l'EXE modifié. Il y aura toujours un détecteur de virus qui finira par renvoyer un faux-positif et je serais alors accusé de tous les maux...
Je vais donc vous expliquer où et quoi modifier et vous ferez le boulot comme des grands. Il vous faudra bien évidemment un éditeur Hexa de fichiers (UltraEdit, HexEdit, HexWorkshop, etc... sous Windows le choix est vaste).
Première chose à faire : une copie complète du répertoire d'installation d'AppleWin (ou alors faire une seconde installation ailleurs) : chaque session sera lancée depuis un EXE différent, dans son propre répertoire. Logique, il y aura ainsi le modifié et le non modifié !
Une fois cela fait, on va donc dans le second répertoire pour patcher notre AppleWin (qui deviendra donc le bis). Pensez à faire une copie de l'EXE avant toute modification, on ne sait jamais.
Modification 1 :
AppleWin sauve ses paramètres dans la base de Registre Windows. On va donc faire en sorte que l'AppleWin-bis sauve les siens dans une autre clef de la base de registre que celle par défaut.
La clef par défaut, c'est celle-ci : HKEY_CURRENT_USER\Software\AppleWin
On va donc chercher avec notre éditeur HEXA (après y avoir ouvert AppleWin.exe) la chaîne : "Software\Applewin" (sans les guillemets évidemment).
Normalement, vous ne devriez trouver qu'une occurence à savoir : "Software\AppleWin\CurrentVersion\%s". Si vous ne trouvez rien, vérifiez la casse (il y a des majuscules/minuscules), vérifiez si vous cherchez bien en mode ASCII, vérifiez si vous avez ouvert le bon fichier, bref vérifiez quoi ! Pour info, elle se trouve à la position 10DB3Ch du fichier (version 1.20.0.0).
On va donc modifier cette chaîne. Ne touchez qu'à la partie "AppleWin" pas à "Software\" ni à "\CurrentVersion\%s"
J'ai perso mis "AppleW1n" (L33t inside yeah !). On ne modifie donc qu'un octet ! Ne pas ajouter ou supprimer de lettre évidemment (sinon vous décallez tout et ça compliquerait la chose inutilement).
Pensez à sauver avant de quitter... Normalement si tout s'est bien passé, vous devriez pouvoir lancer les deux EXE (le normal et le bis) et chacun devrait faire sa vie sans s'occuper de l'autre (ou presque). Pensez à définir des fichiers de sauvegarde d'état et d'impression différents, ça sera encore mieux !
Modification 2 :
Et là vous me dites : ouais mais l'erreur à l'ouverture avec le PrintScreen bidule c'est normal ça ?
Et je vous réponds : oui c'est normal, d'où le "ou presque" du dessus !
En effet, AppleWin définit la touche IMPR ECRAN comme une Hotkey système. Il utilise pour ce faire l'API Windows RegisterHotKey. Je ne dis pas ça pour faire savant mais parce que l'idée, pour notre AppleWin-bis, est de définir non plus la touche IMPR ECRAN mais une autre pour faire les captures. Il n'y aura donc plus interférence entre les deux sessions au niveau du système, chacune ayant sa propre HotKey de définie.
Il va donc falloir modifier les paramètres passés à cette API par le programme. Sans entrer dans les détails, il y a un code touche (en l'occurence ici 2Ch) de passé correspondant à la touche IMPR ECRAN. On va modifier ce code touche pour faire réagir notre AppleWin-bis à autre chose. Perso j'ai choisi la touche HOME non utilisée par AppleWin par défaut. Pour connaître les codes touche c'est ici que ça se passe. On voit que pour notre touche HOME c'est 24h.
On va donc remplacer tous les 2Ch de l'EXE par 24h ! Il y en a 3358 ! Non je déconne... il va bien évidemment falloir changer uniquement les bons !
Pour les localiser c'est pas compliqué : il faut désassembler l'EXE, repérer l'API RegisterHotkey, voir quand elle est utilisée pour la touche IMP ECRAN. Repérez alors les octets à changer dans le fichier et le faire effectivement avec notre éditeur Hexa de tout à l'heure...
Allez-y vous avez 1 heure !
En fait, on trouve 4 modifications à faire : il y a en effet 2 fois appel à l'API RegisterHotkey pour notre touche IMPR ECRAN (un pour la touche seule, l'autre avec le shift en plus). Et ce, deux fois dans l'EXE (2x2=4... le compte est bon !).
Voici les offsets où changer le 2Ch en 24h dans l'EXE (faites-moi confiance cela ne transformera pas votre EXE en un méchant malware) :
222Eh : 2C -> 24
2240h : 2C -> 24
et
29B3h : 2C -> 24
29BEh : 2C -> 24
Et pour les plus curieux d'entre vous et parce que cela met un peu de couleur, voici une capture d'écran avec le code de l'EXE désassemblé avec les appels des API (un des deux endroits) :
Oui c'est de l'ASM x86, ça dépasse allègrement le cadre de ce Blog donc on ne commente pas, on regarde juste ! Les plus malins d'entre vous auront remarqué qu'il était encore plus rapide de localiser l'endroit intéressant dans l'exe grâce au message d'erreur et à sa MessageBox !
Il est bien évident qu'à chaque mise à jour du soft, il faudra refaire le même périple (recherche/modification/sauvegarde). Les adresses changeront sûrement d'une build à l'autre mais le principe restera le même... On en reparlera si jamais cela se produit !