JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Liste des icônes/raccourcis du bureau Mer 17 Juil 2019 - 23:12 | |
| La liste des raccourcis se trouve dans: C:\Users\%USERNAME%\Desktop\" Chacun étant représenté par un fichier .lnk qui contient ses paramètres. On ne peut pas lire directement un fichier .lnk. L'astuce consiste à le renommer avec un autre suffixe le temps de l'exploiter, puis de lui redonner son suffixe .lnk après l'opération. Ou plus simple, ce que je fais ici, le recopier ailleurs avec un autre suffixe (ici .lne) et exploiter la copie, il y a moins de risques. Le programme affiche à gauche la liste des fichiers lnk, et à droite le dump du fichier sélectionné, avec possibilité de l'imprimer. PS en fait deux options: soit le dump brut du fichier sélectionné (option 1), soit le dump détaillé du même fichier (option 2), ces options sont en dur dans le programme (lignes 27/28). L'option 2 est sélectionnée a priori. Quant à la structure de ces fichiers je n'ai pas réussi à trouver des infos très convaincantes, c'est plutôt mystérieux. Mais il doit y avoir le lien vers l'exécutable, les paramètres de l'icône et sa position, etc... - Code:
-
' Dump de la liste des fichiers contenant les paramètres des icônes du bureau DIM rtm$,fd$,f1$,a$,b$,c$,d$,dp$,i%,j%,k%,rac$,q$,option%,ad%,nb%,sz%,lsi% DIM adli% LABEL Qt,Dplnk,Dpstr,Dppar,Traduc,Impr
q$ = CHR$(34) rtm$ = "Z:\": ' répertoire des fichiers temporaires (à ajuster)
fd$ = rtm$+"Dumpt.txt": ' dump total rac$ = "C:\Users\%USERNAME%\Desktop\": ' liste des raccourcis du bureau (.lnk) option% = 1: ' dump total du fichier cliqué option% = 2: ' analyse du contenu du fichier cliqué
WIDTH 0,600: HEIGHT 0,SCREEN_Y-30: LEFT 0,205: BORDER_SMALL 0: ON_CLOSE 0,Qt COLOR 0,180,255,255: FONT_SIZE 0,10: FONT_BOLD 0 CAPTION 0,rac$ LIST 1: TOP 1,25: WIDTH 1,WIDTH(0)-20: HEIGHT 1,HEIGHT(0)-60 FONT_NAME 1,"Lucida Console": FONT_SIZE 1,10: FONT_BOLD_OFF 1 ALPHA 4: TOP 4,3: LEFT 4,10 BUTTON 5: LEFT 5,200: WIDTH 5,150: CAPTION 5,"Imprimer la page" ON_CLICK 5,Impr DLIST 10 FORM 20: TOP 20,0: LEFT 20,0: WIDTH 20,200: HEIGHT 20,SCREEN_Y-30 BORDER_SMALL 20: CAPTION 20,"Liste des raccourcis bureau" LIST 21: PARENT 21,20: FULL_SPACE 21: ON_CLICK 21,Dplnk EXECUTE_WAIT "cmd.exe|/c DIR /B "+rac$+"*.lnk | clip" CLIPBOARD_PASTE 21 option% = 1: ' dump total du fichier cliqué option% = 2: HIDE 5: ' analyse du contenu du fichier cliqué END ' ============================================================================== Qt: IF FILE_EXISTS(fd$) = 1 THEN FILE_DELETE fd$ TERMINATE ' ============================================================================== Dplnk: EXECUTE_WAIT "cmd.exe|/c DEL /Q "+rtm$+"*.lne" a$ = ITEM_INDEX$(21): b$ = LEFT$(a$,LEN(a$)-4) f1$ = rtm$+b$+".lne": ' provisoire EXECUTE_WAIT "cmd.exe|/c COPY "+q$+rac$+a$+q$+" "+q$+f1$+q$ FILEBIN_OPEN_READ 1,q$+f1$+q$: sz% = FILEBIN_SIZE(1): FILEBIN_POSITION 1,76 lsi% = FILEBIN_READ(1)+256*FILEBIN_READ(1): ' décalage Shell Item id List FILEBIN_CLOSE 1 CAPTION 4,a$+" ("+STR$(sz%)+" = "+HEX$(sz%)+"h octets)." CLEAR 1 IF option% = 1 FileDump(f1$,fd$,16) FILE_LOAD 1,fd$ FILE_DELETE f1$ ELSE GOSUB Dpstr: ' Fichier binaire -> hexa ITEM_ADD 1,"==== Header : ====" ad% = 0: nb% = 4: GOSUB Dppar: ' = raccourci (toujours 4C000000) ad% = ad%+nb%: nb% = 16: GOSUB Dppar: ' Guid ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' Flag ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' autre flag ad% = ad%+nb%: nb% = 8: GOSUB Dppar: ' date de création ad% = ad%+nb%: nb% = 8: GOSUB Dppar: ' date de modification ad% = ad%+nb%: nb% = 8: GOSUB Dppar: ' date dernier accès ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' taille du fichier cible ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' numéro de l'icône ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' type affichage del a fenêtre ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' Hot Key ad% = ad%+nb%: nb% = 8: GOSUB Dppar: ' Toujours 0 ITEM_ADD 1,"==== Shell Item Id List : ====" ad% = ad%+nb%: nb% = 2+lsi%: GOSUB Dppar: ' ? ITEM_ADD 1,"==== File Location Infos : ====" ad% = ad%+nb%: adli% = ad%: nb% = 4: GOSUB Dppar: ' taille ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' toujours 1C ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' local ou partage réseau ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' offset table volume local ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' offset chemin de base ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' offset table volume réseau ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' offset chemin final ITEM_ADD 1,"==== Table Volume Local (et la suite...) : ====" ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' taille de la structure ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' type volume (=3 HD) ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' N° de série du volume ad% = ad%+nb%: nb% = 4: GOSUB Dppar: ' Toujours 10000000 ad% = ad%+nb%: nb% = sz%-ad%: GOSUB Dppar: ' Label volume... et la suite... ' Table volume réseau ' ITEM_ADD 1," Table Volume Réseau :" ' ad% = ad%+nb%: nb% = sz%-ad%: GOSUB Dppar END_IF RETURN ' ============================================================================== Impr: IF MESSAGE_CONFIRMATION_YES_NO("Imprimante prête ?") = 1 EXECUTE "Cmd.exe|/c start /min Notepad.exe /p "+CHR$(34)+fd$+CHR$(34) END_IF RETURN ' ============================================================================== Dpstr: ' Dump hexa de la totalité du fichier binaire f$ dans la chaîne dp$ FILEBIN_OPEN_READ 1,f1$: i% = FILEBIN_SIZE(1) FILEBIN_POSITION 1,0: FILEBIN_HEXA_READ 1,i%,dp$ FILEBIN_CLOSE 1 RETURN ' ============================================================================== Dppar: ' Dump de nb% octets (image dump = dp$) à partir de l'adresse ad% IF (ad%+nb%) > LEN(dp$)/2 THEN nb% = LEN(dp$)/2-ad% WHILE nb% > 16 j% = 16 a$ = RIGHT$("000"+HEX$(ad%),3)+": " b$ = MID$(dp$,2*ad%+1,2*j%): GOSUB Traduc ITEM_ADD 1,a$+b$: nb% = nb%-16: ad% = ad%+16 END_WHILE a$ = RIGHT$("000"+HEX$(ad%),3)+": " b$ = MID$(dp$,2*ad%+1,2*nb%): GOSUB Traduc ITEM_ADD 1,a$+b$ RETURN ' ============================================================================== Traduc: IF LEN(b$) > 2 FOR i% = LEN(b$)-2 TO 2 STEP -2 b$ = LEFT$(b$,i%)+" "+RIGHT_POS$(b$,i%+1) NEXT i% END_IF c$ = "" FOR i% = 1 TO LEN(b$) STEP 3 j% = HEX(MID$(b$,i%,2)) IF j% > 31 c$ = c$+CHR$(j%) ELSE c$ = c$+"." END_IF NEXT i% b$ = b$+STRING$(49-LEN(b$)," ")+c$ RETURN ' ============================================================================== SUB FileDump(f$,fd$,nc%) ' Dump de f$ dans le fichier texte fd$, nc% = 8, 16, 24 ou 32 colonnes ' (~ 12s pour 50 k octets) DIM_LOCAL bf$,c$,dp$,tr$,sz%,i%,j%,k% IF nc%<>8 AND nc%<>16 AND nc%<>24 AND nc%<>32 THEN nc% = 16 FILEBIN_OPEN_READ 9,f$: sz% = FILEBIN_SIZE(9): bf$ = "" i% = INT(sz%/2000): j% = sz%-i%*2000 IF i%>0 THEN FOR k% = 1 TO i%: bf$=bf$+FILEBIN_HEXA_READ$(9,2000): NEXT k% IF j%>0 THEN bf$ = bf$+FILEBIN_HEXA_READ$(9,j%): ' reste FILEBIN_CLOSE 9 FILE_OPEN_WRITE 9,fd$ FOR i% = 1 TO LEN(bf$) STEP nc%*2 dp$ = RIGHT$("0000"+HEX$((i%-1)/2),5)+": ": tr$ = "" FOR j% = i% TO i%+2*nc%-2 STEP 2 IF j% > LEN(bf$) THEN EXIT_FOR c$ = MID$(bf$,j%,2): k% = HEX(c$) IF k% > 31 tr$ = tr$ + CHR$(k%) ELSE tr$ = tr$ + "." END_IF dp$ = dp$+c$+" " NEXT j% FILE_WRITELN 9,dp$+" "+tr$ NEXT i% FILE_CLOSE 9 END_SUB ' ============================================================================== Concernant la structure des éléments, voici ce que j'ai pu trouver, mais c'est plutôt flou ! - Spoiler:
FORMAT ---------- Header Shell Item Id List File Location Info Description Relative Path Working directory Command Line Arguments Icon Filename Additional Info
Header -------- - 4 octets -> indique à windows qu'il s'agit d'un raccourci -> 4C 00 00 00 toujours
- 16 octets -> GUID -> 01 14 02 00 00 00 00 00 C0 00 00 00 00 00 00 46 - 1 dword (int) -> flag -> bit 0 : la liste des items est-elle présente ?? -> bit 1 : la cible ? fichier ou répertoire ? -> bit 2 : le raccourci a-t-il une description ? -> bit 3 : le raccourci a-t-il un chemin relatif ? -> bit 4 : le raccouci a-t-il un répertoire de travail ? -> bit 5 : le raccourci a t-il des arguments ? -> bit 6 : le raccouci a-t-il une icône particulière -> les autres bits, on s'en fout
- 1 dword -> un autre flag avec des indics sur la cible (je mets de coté) - 1 qword (long) -> date de création - 1 qword (long) -> date de modification - 1 qword (long) -> date de dernier accès - 1 dword -> taille du fichier cible - 1 dword -> le numéro de l'icone (si le bit 6 est à 1 dans le flag) sinon 0 - 1 dword -> affichage de la fenetre (1:NORMAL, 2:MINI, 3:MAXI) - 1 dword -> la HOT KEY - 2 dword -> toujours à 00...00
Shell Item Id List --------------------
Cette section du fichier .lnk n'est présente que si le bit 0 du flag est positionné à 1. Elle contient plein d'information dont je n'ai pas besoin, donc je saute
- 1 word (short) -> taille de la liste (ca me permet de skipper les octets)
File Location Infos ---------------------
C'est la section qui, comme son nom l'indique, contient des informations sur la location du fichier. Les différents offset commencent à partir du début de cette section. Si la cible est un répertoire, cette section ne contient que le premier dword qui vaudra 0.
- 1 dword -> sa taille. - 1 dword qui vaut toujours 1C - 1 dword -> fichier en local ou en partage réseau ?? - 1 dword -> deplacement vers la table du volume local (??) - 1 dword -> offset pour récupérer le chemin de base - 1 dword -> deplacement vers la table du volume réseau(??) - 1 dword -> offset pour récupérer le chemin final
Table du volume local : -------------------------- - 1 dword -> taille de cette structure - 1 dword -> Type du volume (2 pour removable, 3 disk Dur, 5 CD) - 1 dword -> numéro de série du volume - 1 dword -> 0x10 toujours - ASCII (String) -> label du volume
Table du volume réseau : ----------------------------- - 1 dword -> taille de cette structure - 1 dword -> toujours 0x02 - 1 dword -> 0x14 - 1 dword -> 0x00 - 1 dword -> 0x20000 - ASCII (String) -> Label du share
En combinant le chemin de base avec le chemin final, on retrouve le chemin de la cible sur le volume local. Pour un fichier sur le réseau, il suffit de combiner le nom du partage (share) avec le chemin final.
Description : --------------- Seulement si le bit 2 est à 1 -> tout d'abord, un word (short) pour la taille de la description puis la description elle-même (les caractères sont codés sur 2 octets).
Chemin relatif : ------------------ Seulement si le bit 3 est à 1 -> tout d'abord, un word (short) pour la taille du chemin relatif puis le chemin lui-même (les caractères sont codés sur 2 octets).
Répertoire de travail : ------------------------- Seulement si le bit 4 est à 1 -> tout d'abord, un word (short) pour la taille du chemin du répertoire de travail puis le chemin du répertoire de travail lui-même (les caractères sont codés sur 2 octets).
les arguments : ------------------ Seulement si le bit 5 est à 1 -> tout d'abord, un word (short) pour la taille de la ligne d'arguments puis la ligne d'argument elle-même (les caractères sont codés sur 2 octets).
Le fichier d'icone : --------------------- Seulement si le bit 6 est à 1 -> tout d'abord, un word (short) pour la taille du chemin vers l'icone puis le chemin vers l'icone elle-même (les caractères sont codés sur 2 octets).
Informations complémentaires ----------------------------------- - un dword -> toujours à 00 00 00 00
PS je suis sous W7, je n'ai pas essayé avec W10. Edit: suite à l'enthousiasme généré par ce programme, j'ai essayé de détailler les infos pour chaque élément, en fonction du peu d'informations que je possède (voir le spoiler). Et à quoi ça sert tout ça ? ... a priori, à rien ! c'est juste de la curiosité pure. | |
|