You are here

Registry Keys in Vista & Windows 7

17 posts / 0 new
Last post
Mark Sikkema
Offline
Last seen: 12 years 7 months ago
Developer
Joined: 2009-07-20 14:55
Registry Keys in Vista & Windows 7

Hi everybody,

Lately I have made my launcher modify certain extra settings in the registry, on my XP computer. Now I`m wondering if these registry settings will be valid for Vista and/or Windows 7 as well.

If anybody could send me a copy of the following keys in Vista or Windows 7
(just the .reg file as text)

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU

HKLM\SOFTWARE\Classes\regfile\shell

Thanx very much!!!

Ps.: I promise, one day I will also contribute in making a PortableApp for this site. But first I have to get more common with NSIS (and Windows in general).

Chris Morgan
Chris Morgan's picture
Offline
Last seen: 8 years 10 months ago
Joined: 2007-04-15 21:08
Vista: problems

Thanks for continuing with this.

On Vista, HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU does not exist. There is LastVisitedPidlMRU, but that's full of meaningless (seriously meaningless) REG_BINARY values. I'll look for another LastVisitedMRU, just can't remember where it stores all that lot at the moment.

I don't see quite why you want the regfile verb; take a look at the 7-Zip launcher for how we cope with it (that works for all of 98 through 7, it includes two techniques, the first for 98/ME only from memory, the other for 2000 on). Nevertheless, here is what I have for shell\open\MUIVerb=@%SystemRoot%\regedit.exe,-310, and the one you'd really care about, shell\open\command\=regedit.exe "%1" (nice and simple Smile ).

These should be the same across Windows 7 as well.

I am a Christian and a developer and moderator here.

“A soft answer turns away wrath, but a harsh word stirs up anger.” – Proverbs 15:1

Mark Sikkema
Offline
Last seen: 12 years 7 months ago
Developer
Joined: 2009-07-20 14:55
LastVisitMRU

Nice to see you around again, you seem to be the only one reacting to my post. Thanxs

I have finished a `macro` doing the modifying I want. And works fine on XP. I`m actually very happy with the fact that the apps which use this, will directly use the usb-document folder, instead of some local folder. (this just irritated me)

About the 'LastVisitedPidlMRU' you were talking about, I think this is what i`m after. Does it look any thing like the following:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU]
"a"=hex:69,00,65,00,78,00,70,00,6c,00,6f,00,72,00,65,00,2e,00,65,00,78,00,65,\
  00,00,00,43,00,3a,00,5c,00,44,00,6f,00,63,00,75,00,6d,00,65,00,6e,00,74,00,\
  73,00,20,00,61,00,6e,00,64,00,20,00,53,00,65,00,74,00,74,00,69,00,6e,00,67,\
  00,73,00,5c,00,47,00,72,00,69,00,6e,00,67,00,6f,00,6c,00,6f,00,63,00,6f,00,\
  5c,00,44,00,65,00,73,00,6b,00,74,00,6f,00,70,00,00,00
"MRUList"="edgfacb"
"b"=hex:53,00,56,00,53,00,41,00,64,00,6d,00,69,00,6e,00,2e,00,65,00,78,00,65,\
  00,00,00,44,00,3a,00,5c,00,44,00,6f,00,63,00,75,00,6d,00,65,00,6e,00,74,00,\
  73,00,5c,00,53,00,56,00,53,00,2d,00,50,00,61,00,63,00,6b,00,61,00,67,00,65,\
  00,73,00,00,00
"c"=hex:53,00,74,00,61,00,72,00,74,00,65,00,72,00,2e,00,65,00,78,00,65,00,00,\
  00,44,00,3a,00,5c,00,50,00,6f,00,72,00,74,00,61,00,62,00,6c,00,65,00,41,00,\
  70,00,70,00,73,00,5c,00,53,00,6b,00,79,00,70,00,65,00,50,00,6f,00,72,00,74,\
  00,61,00,62,00,6c,00,65,00,00,00
"d"=hex:70,00,64,00,66,00,32,00,77,00,6f,00,72,00,64,00,2e,00,65,00,78,00,65,\
  00,00,00,44,00,3a,00,5c,00,44,00,6f,00,63,00,75,00,6d,00,65,00,6e,00,74,00,\
  73,00,00,00
"e"=hex:52,00,65,00,67,00,57,00,6f,00,72,00,6b,00,73,00,68,00,6f,00,70,00,2e,\
  00,65,00,78,00,65,00,00,00,43,00,3a,00,5c,00,44,00,6f,00,63,00,75,00,6d,00,\
  65,00,6e,00,74,00,73,00,20,00,61,00,6e,00,64,00,20,00,53,00,65,00,74,00,74,\
  00,69,00,6e,00,67,00,73,00,5c,00,47,00,72,00,69,00,6e,00,67,00,6f,00,6c,00,\
  6f,00,63,00,6f,00,5c,00,44,00,65,00,73,00,6b,00,74,00,6f,00,70,00,00,00
"f"=hex:57,00,52,00,52,00,2e,00,65,00,78,00,65,00,00,00,43,00,3a,00,5c,00,53,\
  00,61,00,6e,00,64,00,62,00,6f,00,78,00,5c,00,44,00,65,00,66,00,61,00,75,00,\
  6c,00,74,00,42,00,6f,00,78,00,00,00
"g"=hex:61,00,69,00,63,00,6f,00,6e,00,2e,00,65,00,78,00,65,00,00,00,44,00,3a,\
  00,5c,00,50,00,6f,00,72,00,74,00,61,00,62,00,6c,00,65,00,42,00,65,00,74,00,\
  61,00,5c,00,50,00,44,00,46,00,74,00,6f,00,57,00,6f,00,72,00,64,00,50,00,6f,\
  00,72,00,74,00,61,00,62,00,6c,00,65,00,5c,00,4f,00,74,00,68,00,65,00,72,00,\
  5c,00,54,00,65,00,73,00,74,00,41,00,70,00,70,00,50,00,6f,00,72,00,74,00,61,\
  00,62,00,6c,00,65,00,53,00,6f,00,75,00,72,00,63,00,65,00,00,00

If it looks the same, could you tell me the exact root\path of this key.
If it doesn't look the same, just use regshot and open an app, then open a file through the apps own menu, by clicking 'open file', change to different folder and open a file. It`s important to open a file from a different folder so the MRU will be modified. Make a new shot, the ~res.txt file hopefully includes some value named *MRU* containing the binary code ,every character is followed by a NULL byte. (I really wonder whats the sense of this)
For exaple, in the above the 'a' value contains this string:
i.e.x.p.l.o.r.e.r...e.x.e...C.:.\.D.o.c.u.m.e.n.t.s. .a.n.d. .S.e.t.t.i.n.g.s.\,etc

As well I found out (after spending some time opening as many apps as possible) what happens when the MRUList is full. Strangly enough 'y' is the last letter, but for the rest it behaved as expected. It will use the final letter out of the MRUList string (this one hasn't been used for the longest time), and add this letter on to the front of the string. This I did include in the macro.

Here is the code:

; SetMRUList.nsh
; Copyright: GringoLoco
; License: BSD  (NSIS license)

!include WordFunc.nsh ; add header for file manipulation
!insertmacro WordReplace

Function SetMRU

  Exch $0      ; MRU_PATH
  Exch
  Exch $1      ; EXE_NAME

  Push $2     ;temp function stringtohex string
  Push $3     ;total hex path value to write
  Push $4     ;registry::open handle / whole MRUList / temp function StringToHex 2 digit hex number to add
  Push $5     ;temp function stringtohex lenght of string
  Push $R0     ;error flag
  Push $R1     ;registry::find PATH (not used)
  Push $R2     ;registry::find VALUE / KEY name, used as driveletter in Found: / MRUListLetter
  Push $R3     ;(part of) registry::find STRING, Value used to compare EXE_NAME
  Push $R4     ;registry::find TYPE (not used)

Var /GLOBAL MRUListLetter
StrCpy $3 ""
                        ${registry::StrToHex} "$1" $2               ;turn path into binary
                        StrLen $5 $1
                        Call StringToHex
                        StrCpy $3 $30000

                StrLen $5 $3                                        ;get lenght of MRUPATH
                ${registry::Open} "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU" "" $4
                SearchLoop:
                           ${registry::Find} "$4" $R1 $R2 $R3 $R4                  ;see if lastvisitMRU already exits
                           StrCpy $R3 $R3 $5
                           StrCmp $R3 $3 Found                                     ;found lastvisitMRU
                           StrCmp $R2 "" NotFound                                  ;didn't find lastvisitMRU
                        Goto SearchLoop

                       NotFound:
                                ${Registry::Close} $4
                                 ${registry::Read} "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU" "MRUList" $4 $R0
                                 StrLen $R2 $4                                            ;get amount of letters used
                                 Intop $R2 $R2 + 97                                        ;add 97 to make equal to ascii
                                 IntFmt $R2 "%c" $R2                                       ;change in to character
                                 StrCmp $R2 "z" FullMRUList                               ;see if there is a letter available, y is last
                                 StrCpy $4 $R2$4                                          ;add character to MRUList
                                 ${registry::Write} "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU" "MRUList" "$4" "REG_SZ" $R0
                                 Goto Write                                              ;write binary string

                      FullMRUList:
                                  ${registry::Read} "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU" "MRUList" $4 $R0
                                  StrCpy $R2 $4 "" -1
                                  StrCpy $4 $4 -1
                                  StrCpy $4 $R2$4
                                  ${registry::Write} "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU" "MRUList" "$4" "REG_SZ" $R0
                                  Goto Write

                        Found:
                                 ${Registry::Close} $4
                                 ${registry::Read} "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU" "MRUList" $4 $R0
                                 ${WordReplace} $4 "$R2" "" "+" $4
                                 StrCpy $4 $R2$4                                         ;add character to MRUList
                                 ${registry::Write} "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU" "MRUList" "$4" "REG_SZ" $R0

                Write:
                      ${registry::StrToHex} "$0" $2      ;change MRUPATH to hex-code
                      StrLen $5 $0                       ;get lenght of MRUPATH
                      Call StringToHex                                  ;add NULL byte after every character
                      StrCpy $3 $30000                                  ;add (double) NULL byte after string
                      ${registry::Write} "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU" "$R2" "$3" "REG_BINARY" $R0

  StrCpy $MRUListLetter $R2
  Pop $R4
  Pop $R3
  Pop $R2
  Pop $R1
  Pop $R0
  Pop $5
  Pop $4
  Pop $3
  Pop $2
  Pop $1
  Exch $0
FunctionEnd

Function StringToHex
         IntOp $5 $5 * 2
               Loop:
               StrCpy $4 $2 2 -$5
               StrCpy $3 $3$400                      ;add NULL byte after every character
               IntOp $5 $5 - 2
               IntCmp $5 0 "" "" Loop
FunctionEnd

!macro _SetMRUPath EXE_NAME MRU_PATH 
  Push "${EXE_NAME}"
  Push "${MRU_PATH}"
  Call SetMRU
!macroend

!define SetMRUPath '!insertmacro "_SetMRUPath"'

It still needs some code in the launchers script to get the last used path and to save the current path in the launcher ending of course, I could send you that if your interested. (This post will really get to long). All I have to do is make sure it works on the other platforms. But is it really still necessary to make launchers run on '98' !!!

About the classes, that WAS just some other situation I came across. I have got one app, which writes classes by it self, and the launcher has to restore the keys afterwords. Got this to work fine, and for a moment I thought this would be wicked for all apps. I left this project for now, realizing that if all apps would do this by there self, the registry could/would really get messed up. I still think it could be done, but the code would be very extreme for what it does.....

Ok, probably I should include the rest of the script as well:

; insert default MRU path, the app will open/save files to this path on the portable drive by default.
        !define MRUPATH                 "Documents\Pictures"

; rest of your own script

; script to add before updating the roots in settings files, cause it needs the lastdriveletter
               Var /GLOBAL FilesOpenMRUPATH
                   ${GetRoot} $EXEDIR $0
                        ReadINIStr $R4 "$DATADIR\Settings\${PNAME}Settings.ini" "PortableSettings" "LastDrive"
                        ReadINIStr $3 "$DATADIR\Settings\${PNAME}Settings.ini" "PortableSettings" "LastMRU"
               StrCpy $4 $3 2                                       ;get last MRU driveletter
                          ${If} $3 == ""                                       ; see if ini-parameter exists
                                StrCpy $FilesOpenMRUPATH $0\${MRUPATH}         ;if not use default
                          ${Else}
                                       ${If} $4 == $R4                         ;if lastdrive letter equals last MRU drive letter
                                             StrCpy $3 $3 "" 3                 ;remove last MRU driveletter
                                             StrCpy $FilesOpenMRUPATH $0\$3    ;add current driveletter and lastMRUpath
                                       ${Else}                                 ;last drive doesn't equal to last MRU letter, use default
                                             StrCpy $FilesOpenMRUPATH $0\${MRUPATH}
                                       ${endif}
                        ${EndIf}
                ${SetMRUPath} ${EXE} $FilesOpenMRUPATH
; rest of your own script, including ${replaceinfile}....

; Run App

; save current MRU path
                ${registry::Read} "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedMRU" "$MRUListLetter" $3 $R0
                ${WordReplace} $3 "00" "" "+" $3                      ;remove all NULL bytes
                ${Registry::HexToStr} $3 $3                           ;change into hex-code
                ${WordFind} $3 ".exe" "+2" $3                       ;find string containing path
                WriteINIStr "$DATADIR\Settings\${PNAME}Settings.ini" "PortableSettings" "LastMRU" $3

Please, feel free to give me any tips and trick about my coding, cause I`m just a beginner.

For the moment I've just been making every app, I used to have installed, portable for my own use(they are mainly not open-source). But since PA.c also accepts freeware:) Smile :smile:, probably there are some apps I will contribute to PA.c soon.

Ps.: I done some last minute changes on this last script, to make it compatable with the standard PA.c apps, hope I didn`t mess it up!!!

Anyway, I will not be on the forum till next weekend, cause of exams.

Formerly Gringoloco
Windows XP Pro sp3 x32

richo
richo's picture
Offline
Last seen: 1 month 2 weeks ago
Joined: 2007-01-31 22:03
Short explanation of the null bytes...

The null bytes are there because these values are in Unicode, which is also why they end with 3 null bytes.

Chris Morgan
Chris Morgan's picture
Offline
Last seen: 8 years 10 months ago
Joined: 2007-04-15 21:08
OK...

You asked for it Wink

The reason I didn't think it could be the one was the very lack of the index string - I'm vaguely familiar with it on Windows 2000 and XP, and so, missing it, decided it probably wasn't the one. I'm not sure. The explanation about the null byte being for Unicode makes sense Smile

I'm also not on here much for the next several weeks, as I'm doing my exams, starting on Friday.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedPidlMRU]
"MRUListEx"=hex:15,00,00,00,0e,00,00,00,0f,00,00,00,13,00,00,00,01,00,00,00,12,\
  00,00,00,16,00,00,00,14,00,00,00,0b,00,00,00,00,00,00,00,10,00,00,00,0d,00,\
  00,00,0c,00,00,00,0a,00,00,00,05,00,00,00,09,00,00,00,03,00,00,00,02,00,00,\
  00,08,00,00,00,07,00,00,00,06,00,00,00,04,00,00,00,11,00,00,00,18,00,00,00,\
  17,00,00,00,ff,ff,ff,ff
"4"=hex:54,00,6f,00,72,00,74,00,6f,00,69,00,73,00,65,00,4d,00,65,00,72,00,67,\
  00,65,00,2e,00,65,00,78,00,65,00,00,00,14,00,1f,68,80,53,1c,87,a0,42,69,10,\
  a2,ea,08,00,2b,30,30,9d,00,00
"8"=hex:70,00,75,00,74,00,74,00,79,00,2e,00,65,00,78,00,65,00,00,00,14,00,1f,\
  44,47,1a,03,59,72,3f,a7,44,89,c5,55,95,fe,6b,30,ee,00,00
"12"=hex:6d,00,61,00,6b,00,65,00,6e,00,73,00,69,00,73,00,77,00,2e,00,65,00,78,\
  00,65,00,00,00,14,00,1f,44,47,1a,03,59,72,3f,a7,44,89,c5,55,95,fe,6b,30,ee,\
  20,00,00,00,1a,00,ee,bb,fe,23,00,00,10,00,90,e2,4d,37,3f,12,65,45,91,64,39,\
  c4,92,5e,46,7b,00,00,52,00,31,00,00,00,00,00,00,00,00,00,10,00,49,6e,6b,73,\
  63,61,70,65,00,00,3a,00,07,00,04,00,ef,be,00,00,00,00,00,00,00,00,26,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,49,00,6e,00,6b,00,\
  73,00,63,00,61,00,70,00,65,00,00,00,18,00,6c,00,31,00,00,00,00,00,00,00,00,\
  00,10,00,69,6e,6b,73,63,61,70,65,2d,30,2e,34,37,70,72,65,32,00,4c,00,07,00,\
  04,00,ef,be,00,00,00,00,00,00,00,00,26,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,69,00,6e,00,6b,00,73,00,63,00,61,00,70,00,65,00,\
  2d,00,30,00,2e,00,34,00,37,00,70,00,72,00,65,00,32,00,00,00,20,00,54,00,31,\
  00,00,00,00,00,00,00,00,00,10,00,70,61,63,6b,61,67,69,6e,67,00,3c,00,07,00,\
  04,00,ef,be,00,00,00,00,00,00,00,00,26,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,70,00,61,00,63,00,6b,00,61,00,67,00,69,00,6e,00,\
  67,00,00,00,18,00,48,00,31,00,00,00,00,00,18,3b,ee,48,10,00,77,69,6e,33,32,\
  00,34,00,07,00,04,00,ef,be,18,3b,ee,48,18,3b,ee,48,26,00,00,00,59,a0,07,00,\
  00,00,02,00,00,00,00,00,00,00,00,00,00,00,77,00,69,00,6e,00,33,00,32,00,00,\
  00,14,00,00,00
"13"=hex:70,00,6f,00,65,00,64,00,69,00,74,00,2e,00,65,00,78,00,65,00,00,00,14,\
  00,1f,44,47,1a,03,59,72,3f,a7,44,89,c5,55,95,fe,6b,30,ee,20,00,00,00,1a,00,\
  ee,bb,fe,23,00,00,10,00,90,e2,4d,37,3f,12,65,45,91,64,39,c4,92,5e,46,7b,00,\
  00,52,00,31,00,00,00,00,00,18,3b,9c,48,10,00,49,6e,6b,73,63,61,70,65,00,00,\
  3a,00,07,00,04,00,ef,be,f2,3a,ca,58,18,3b,9c,48,26,00,00,00,87,90,01,00,00,\
  00,12,00,00,00,00,00,00,00,00,00,00,00,49,00,6e,00,6b,00,73,00,63,00,61,00,\
  70,00,65,00,00,00,18,00,68,00,31,00,00,00,00,00,18,3b,02,4a,10,00,49,4e,4b,\
  53,43,41,7e,31,2e,34,37,50,00,00,4c,00,07,00,04,00,ef,be,18,3b,a7,35,18,3b,\
  02,4a,26,00,00,00,95,90,01,00,00,00,2e,00,00,00,00,00,00,00,00,00,00,00,69,\
  00,6e,00,6b,00,73,00,63,00,61,00,70,00,65,00,2d,00,30,00,2e,00,34,00,37,00,\
  70,00,72,00,65,00,32,00,00,00,1c,00,40,00,31,00,00,00,00,00,18,3b,5d,5b,10,\
  00,70,6f,00,00,2e,00,07,00,04,00,ef,be,18,3b,dd,48,18,3b,5d,5b,26,00,00,00,\
  dc,90,01,00,00,00,75,00,00,00,00,00,00,00,00,00,00,00,70,00,6f,00,00,00,12,\
  00,00,00
"16"=hex:77,00,67,00,6e,00,75,00,70,00,6c,00,6f,00,74,00,2e,00,65,00,78,00,65,\
  00,00,00,14,00,1f,50,e0,4f,d0,20,ea,3a,69,10,a2,d8,08,00,2b,30,30,9d,19,00,\
  2f,43,3a,5c,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,84,00,\
  31,00,00,00,00,00,1a,3b,5a,39,11,00,50,52,4f,47,52,41,7e,31,00,00,6c,00,07,\
  00,04,00,ef,be,62,35,51,5a,1a,3b,5a,39,26,00,00,00,c5,00,00,00,00,00,05,00,\
  00,00,00,00,00,00,00,00,42,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,20,\
  00,46,00,69,00,6c,00,65,00,73,00,00,00,40,00,73,00,68,00,65,00,6c,00,6c,00,\
  33,00,32,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,32,00,31,00,37,00,38,00,31,\
  00,00,00,18,00,4c,00,31,00,00,00,00,00,d9,3a,7a,56,10,00,4d,61,78,69,6d,61,\
  00,00,36,00,07,00,04,00,ef,be,d9,3a,74,56,d9,3a,7a,56,26,00,00,00,86,bc,00,\
  00,00,00,09,00,00,00,00,00,00,00,00,00,00,00,4d,00,61,00,78,00,69,00,6d,00,\
  61,00,00,00,16,00,48,00,31,00,00,00,00,00,d9,3a,75,56,10,00,73,68,61,72,65,\
  00,34,00,07,00,04,00,ef,be,d9,3a,75,56,d9,3a,75,56,26,00,00,00,57,cb,01,00,\
  00,00,06,00,00,00,00,00,00,00,00,00,00,00,73,00,68,00,61,00,72,00,65,00,00,\
  00,14,00,4c,00,31,00,00,00,00,00,d9,3a,75,56,10,00,6d,61,78,69,6d,61,00,00,\
  36,00,07,00,04,00,ef,be,d9,3a,75,56,d9,3a,75,56,26,00,00,00,58,cb,01,00,00,\
  00,05,00,00,00,00,00,00,00,00,00,00,00,6d,00,61,00,78,00,69,00,6d,00,61,00,\
  00,00,16,00,4c,00,31,00,00,00,00,00,d9,3a,79,56,10,00,35,31,38,7e,31,2e,31,\
  00,36,00,07,00,04,00,ef,be,d9,3a,75,56,d9,3a,79,56,26,00,00,00,5c,cb,01,00,\
  00,00,06,00,00,00,00,00,00,00,00,00,00,00,35,00,2e,00,31,00,38,00,2e,00,31,\
  00,00,00,16,00,46,00,31,00,00,00,00,00,d9,3a,75,56,10,00,64,65,6d,6f,00,00,\
  32,00,07,00,04,00,ef,be,d9,3a,75,56,d9,3a,75,56,26,00,00,00,60,cb,01,00,00,\
  00,05,00,00,00,00,00,00,00,00,00,00,00,64,00,65,00,6d,00,6f,00,00,00,14,00,\
  00,00
"11"=hex:41,00,70,00,74,00,61,00,6e,00,61,00,53,00,74,00,75,00,64,00,69,00,6f,\
  00,2e,00,65,00,78,00,65,00,00,00,14,00,1f,44,47,1a,03,59,72,3f,a7,44,89,c5,\
  55,95,fe,6b,30,ee,20,00,00,00,1a,00,ee,bb,fe,23,00,00,10,00,d0,9a,d3,fd,8f,\
  23,af,46,ad,b4,6c,85,48,03,69,c7,00,00,70,00,31,00,00,00,00,00,42,3b,46,0d,\
  10,00,41,50,54,41,4e,41,7e,32,00,00,58,00,07,00,04,00,ef,be,3e,3b,21,40,42,\
  3b,46,0d,26,00,00,00,06,b1,01,00,00,00,06,00,00,00,00,00,00,00,00,00,00,00,\
  41,00,70,00,74,00,61,00,6e,00,61,00,20,00,53,00,74,00,75,00,64,00,69,00,6f,\
  00,20,00,57,00,6f,00,72,00,6b,00,73,00,70,00,61,00,63,00,65,00,00,00,18,00,\
  46,00,31,00,00,00,00,00,44,3b,ae,50,10,00,4f,72,63,61,00,00,32,00,07,00,04,\
  00,ef,be,41,3b,c2,19,44,3b,ae,50,26,00,00,00,7e,57,09,00,00,00,01,00,00,00,\
  00,00,00,00,00,00,00,00,4f,00,72,00,63,00,61,00,00,00,14,00,42,00,31,00,00,\
  00,00,00,44,3b,93,4e,10,00,6c,69,62,00,30,00,07,00,04,00,ef,be,41,3b,c2,19,\
  44,3b,93,4e,26,00,00,00,82,57,09,00,00,00,01,00,00,00,00,00,00,00,00,00,00,\
  00,6c,00,69,00,62,00,00,00,12,00,00,00
"20"=hex:7b,00,33,00,32,00,32,00,33,00,37,00,37,00,39,00,36,00,2d,00,31,00,35,\
  00,30,00,39,00,2d,00,34,00,39,00,44,00,31,00,2d,00,42,00,42,00,37,00,45,00,\
  2d,00,36,00,33,00,41,00,44,00,33,00,36,00,41,00,45,00,38,00,36,00,38,00,43,\
  00,7d,00,00,00,14,00,1f,44,47,1a,03,59,72,3f,a7,44,89,c5,55,95,fe,6b,30,ee,\
  20,00,00,00,1a,00,ee,bb,fe,23,00,00,10,00,30,81,e2,33,1e,4e,76,46,83,5a,98,\
  39,5c,3b,c3,bb,00,00,4c,00,31,00,00,00,00,00,00,00,00,00,10,00,50,68,6f,74,\
  6f,73,00,00,36,00,07,00,04,00,ef,be,00,00,00,00,00,00,00,00,26,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,50,00,68,00,6f,00,74,00,\
  6f,00,73,00,00,00,16,00,60,00,31,00,00,00,00,00,4a,3b,55,0b,10,00,50,41,53,\
  53,50,4f,7e,31,00,00,48,00,07,00,04,00,ef,be,49,3b,79,09,4a,3b,55,0b,26,00,\
  00,00,55,3a,02,00,00,00,26,00,00,00,00,00,00,00,00,00,00,00,50,00,61,00,73,\
  00,73,00,70,00,6f,00,72,00,74,00,20,00,70,00,68,00,6f,00,74,00,6f,00,73,00,\
  00,00,18,00,00,00
"21"=hex:72,00,65,00,67,00,65,00,64,00,69,00,74,00,2e,00,65,00,78,00,65,00,00,\
  00,14,00,1f,44,47,1a,03,59,72,3f,a7,44,89,c5,55,95,fe,6b,30,ee,20,00,00,00,\
  1a,00,ee,bb,fe,23,00,00,10,00,d0,9a,d3,fd,8f,23,af,46,ad,b4,6c,85,48,03,69,\
  c7,00,00,00,00
"23"=hex:54,00,6f,00,72,00,74,00,6f,00,69,00,73,00,65,00,50,00,72,00,6f,00,63,\
  00,2e,00,65,00,78,00,65,00,00,00,14,00,1f,44,47,1a,03,59,72,3f,a7,44,89,c5,\
  55,95,fe,6b,30,ee,20,00,00,00,1a,00,ee,bb,fe,23,00,00,10,00,d0,9a,d3,fd,8f,\
  23,af,46,ad,b4,6c,85,48,03,69,c7,00,00,52,00,31,00,00,00,00,00,00,00,00,00,\
  10,00,49,6e,6b,73,63,61,70,65,00,00,3a,00,07,00,04,00,ef,be,00,00,00,00,00,\
  00,00,00,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  49,00,6e,00,6b,00,73,00,63,00,61,00,70,00,65,00,00,00,18,00,42,00,31,00,00,\
  00,00,00,ef,3a,94,3e,10,00,73,76,6e,00,30,00,07,00,04,00,ef,be,ee,3a,3c,5c,\
  ef,3a,94,3e,26,00,00,00,58,78,06,00,00,00,18,00,00,00,00,00,00,00,00,00,00,\
  00,73,00,76,00,6e,00,00,00,12,00,00,00
"24"=hex:6b,00,76,00,69,00,72,00,63,00,34,00,2e,00,65,00,78,00,65,00,00,00,14,\
  00,1f,50,e0,4f,d0,20,ea,3a,69,10,a2,d8,08,00,2b,30,30,9d,19,00,2f,47,3a,5c,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,54,00,31,00,00,00,\
  00,00,e9,3a,b6,69,14,00,44,4f,43,55,4d,45,7e,31,00,00,3c,00,07,00,04,00,ef,\
  be,dd,3a,a8,22,e9,3a,b6,69,26,00,00,00,b3,cd,02,00,00,00,03,00,00,00,00,00,\
  00,00,00,00,00,00,44,00,6f,00,63,00,75,00,6d,00,65,00,6e,00,74,00,73,00,00,\
  00,18,00,52,00,31,00,00,00,00,00,dd,3a,fa,22,14,00,50,69,63,74,75,72,65,73,\
  00,00,3a,00,07,00,04,00,ef,be,dd,3a,f2,22,dd,3a,fa,22,26,00,00,00,34,cf,02,\
  00,00,00,03,00,00,00,00,00,00,00,00,00,00,00,50,00,69,00,63,00,74,00,75,00,\
  72,00,65,00,73,00,00,00,18,00,46,00,31,00,00,00,00,00,dd,3a,f7,22,10,00,45,\
  67,67,79,00,00,32,00,07,00,04,00,ef,be,dd,3a,f5,22,dd,3a,f7,22,26,00,00,00,\
  48,cf,02,00,00,00,03,00,00,00,00,00,00,00,00,00,00,00,45,00,67,00,67,00,79,\
  00,00,00,14,00,00,00
"17"=hex:76,00,6c,00,63,00,2e,00,65,00,78,00,65,00,00,00,14,00,1f,50,e0,4f,d0,\
  20,ea,3a,69,10,a2,d8,08,00,2b,30,30,9d,19,00,2f,43,3a,5c,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,84,00,31,00,00,00,00,00,01,3b,09,22,\
  11,00,50,52,4f,47,52,41,7e,31,00,00,6c,00,07,00,04,00,ef,be,62,35,51,5a,01,\
  3b,09,22,26,00,00,00,c5,00,00,00,00,00,05,00,00,00,00,00,00,00,00,00,42,00,\
  50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,20,00,46,00,69,00,6c,00,65,00,73,\
  00,00,00,40,00,73,00,68,00,65,00,6c,00,6c,00,33,00,32,00,2e,00,64,00,6c,00,\
  6c,00,2c,00,2d,00,32,00,31,00,37,00,38,00,31,00,00,00,18,00,42,00,31,00,00,\
  00,00,00,01,3b,24,22,10,00,56,4c,43,00,30,00,07,00,04,00,ef,be,01,3b,09,22,\
  01,3b,24,22,26,00,00,00,3c,ac,00,00,00,00,ee,00,00,00,00,00,00,00,00,00,00,\
  00,56,00,4c,00,43,00,00,00,12,00,48,00,31,00,00,00,00,00,01,3b,15,22,10,00,\
  73,6b,69,6e,73,00,34,00,07,00,04,00,ef,be,01,3b,15,22,01,3b,15,22,26,00,00,\
  00,1b,de,06,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,73,00,6b,00,69,00,\
  6e,00,73,00,00,00,14,00,00,00
"6"=hex:53,00,42,00,2e,00,65,00,78,00,65,00,00,00,14,00,1f,44,47,1a,03,59,72,\
  3f,a7,44,89,c5,55,95,fe,6b,30,ee,20,00,00,00,1a,00,ee,bb,fe,23,00,00,10,00,\
  d0,9a,d3,fd,8f,23,af,46,ad,b4,6c,85,48,03,69,c7,00,00,56,00,31,00,00,00,00,\
  00,06,3b,56,57,10,00,53,4d,41,4c,4c,42,7e,31,00,00,3e,00,07,00,04,00,ef,be,\
  06,3b,56,57,06,3b,56,57,26,00,00,00,03,b4,06,00,00,00,17,00,00,00,00,00,00,\
  00,00,00,00,00,53,00,6d,00,61,00,6c,00,6c,00,42,00,61,00,73,00,69,00,63,00,\
  00,00,18,00,4e,00,31,00,00,00,00,00,06,3b,56,57,10,00,53,61,6d,70,6c,65,73,\
  00,38,00,07,00,04,00,ef,be,06,3b,56,57,06,3b,56,57,26,00,00,00,04,b4,06,00,\
  00,00,1c,00,00,00,00,00,00,00,00,00,00,00,53,00,61,00,6d,00,70,00,6c,00,65,\
  00,73,00,00,00,16,00,00,00
"7"=hex:70,00,75,00,74,00,74,00,79,00,67,00,65,00,6e,00,2e,00,65,00,78,00,65,\
  00,00,00,14,00,1f,44,47,1a,03,59,72,3f,a7,44,89,c5,55,95,fe,6b,30,ee,00,00
"2"=hex:57,00,61,00,74,00,65,00,72,00,53,00,75,00,6d,00,73,00,2e,00,65,00,78,\
  00,65,00,00,00,14,00,1f,50,e0,4f,d0,20,ea,3a,69,10,a2,d8,08,00,2b,30,30,9d,\
  19,00,2f,43,3a,5c,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  70,00,31,00,00,00,00,00,d9,3a,4f,5b,11,00,55,73,65,72,73,00,5c,00,07,00,04,\
  00,ef,be,62,35,51,5a,da,3a,04,98,26,00,00,00,94,0e,00,00,00,00,b8,02,00,00,\
  00,00,00,00,00,00,32,00,55,00,73,00,65,00,72,00,73,00,00,00,40,00,73,00,68,\
  00,65,00,6c,00,6c,00,33,00,32,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,32,00,\
  31,00,38,00,31,00,33,00,00,00,14,00,46,00,31,00,00,00,00,00,0f,3b,6e,3d,10,\
  00,75,73,65,72,00,00,32,00,07,00,04,00,ef,be,d6,3a,fc,0d,0f,3b,6e,3d,26,00,\
  00,00,45,c6,00,00,00,00,06,00,00,00,00,00,00,00,00,00,00,00,75,00,73,00,65,\
  00,72,00,00,00,14,00,7c,00,31,00,00,00,00,00,0b,3b,7d,5f,11,00,44,4f,43,55,\
  4d,45,7e,31,00,00,64,00,07,00,04,00,ef,be,d6,3a,fc,0d,0b,3b,7d,5f,26,00,00,\
  00,43,d4,00,00,00,00,05,00,00,00,00,00,00,00,00,00,3a,00,44,00,6f,00,63,00,\
  75,00,6d,00,65,00,6e,00,74,00,73,00,00,00,40,00,73,00,68,00,65,00,6c,00,6c,\
  00,33,00,32,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,32,00,31,00,37,00,37,00,\
  30,00,00,00,18,00,54,00,31,00,00,00,00,00,e8,3a,ab,35,10,00,57,41,54,45,52,\
  53,7e,31,00,00,3c,00,07,00,04,00,ef,be,d9,3a,24,41,e8,3a,ab,35,26,00,00,00,\
  21,ba,00,00,00,00,06,00,00,00,00,00,00,00,00,00,00,00,57,00,61,00,74,00,65,\
  00,72,00,53,00,75,00,6d,00,73,00,00,00,18,00,52,00,31,00,00,00,00,00,e9,3a,\
  55,66,10,00,45,78,61,6d,70,6c,65,73,00,00,3a,00,07,00,04,00,ef,be,d9,3a,24,\
  41,e9,3a,55,66,26,00,00,00,22,ba,00,00,00,00,06,00,00,00,00,00,00,00,00,00,\
  00,00,45,00,78,00,61,00,6d,00,70,00,6c,00,65,00,73,00,00,00,18,00,00,00
"3"=hex:6d,00,73,00,70,00,61,00,69,00,6e,00,74,00,2e,00,65,00,78,00,65,00,00,\
  00,14,00,1f,44,47,1a,03,59,72,3f,a7,44,89,c5,55,95,fe,6b,30,ee,20,00,00,00,\
  1a,00,ee,bb,fe,23,00,00,10,00,30,81,e2,33,1e,4e,76,46,83,5a,98,39,5c,3b,c3,\
  bb,00,00,00,00
"9"=hex:50,00,50,00,54,00,56,00,49,00,45,00,57,00,2e,00,45,00,58,00,45,00,00,\
  00,14,00,1f,50,e0,4f,d0,20,ea,3a,69,10,a2,d8,08,00,2b,30,30,9d,19,00,2f,48,\
  3a,5c,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,46,00,31,00,\
  00,00,00,00,37,39,21,b3,10,00,70,70,74,73,00,00,32,00,07,00,04,00,ef,be,37,\
  39,21,b3,17,3b,00,70,26,00,00,00,e0,03,40,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,70,00,70,00,74,00,73,00,00,00,14,00,00,00
"5"=hex:63,00,68,00,72,00,6f,00,6d,00,65,00,2e,00,65,00,78,00,65,00,00,00,14,\
  00,1f,44,47,1a,03,59,72,3f,a7,44,89,c5,55,95,fe,6b,30,ee,20,00,00,00,1a,00,\
  ee,bb,fe,23,00,00,10,00,90,e2,4d,37,3f,12,65,45,91,64,39,c4,92,5e,46,7b,00,\
  00,52,00,31,00,00,00,00,00,18,3b,a7,35,10,00,49,6e,6b,73,63,61,70,65,00,00,\
  3a,00,07,00,04,00,ef,be,f2,3a,ca,58,18,3b,a7,35,26,00,00,00,87,90,01,00,00,\
  00,12,00,00,00,00,00,00,00,00,00,00,00,49,00,6e,00,6b,00,73,00,63,00,61,00,\
  70,00,65,00,00,00,18,00,00,00
"10"=hex:41,00,73,00,63,00,67,00,65,00,6e,00,20,00,64,00,6f,00,74,00,4e,00,45,\
  00,54,00,2e,00,65,00,78,00,65,00,00,00,14,00,1f,68,80,53,1c,87,a0,42,69,10,\
  a2,ea,08,00,2b,30,30,9d,00,00
"0"=hex:6e,00,6f,00,74,00,65,00,70,00,61,00,64,00,2e,00,65,00,78,00,65,00,00,\
  00,14,00,1f,44,47,1a,03,59,72,3f,a7,44,89,c5,55,95,fe,6b,30,ee,20,00,00,00,\
  1a,00,ee,bb,fe,23,00,00,10,00,d0,9a,d3,fd,8f,23,af,46,ad,b4,6c,85,48,03,69,\
  c7,00,00,00,00
"22"=hex:7b,00,39,00,33,00,45,00,44,00,34,00,38,00,36,00,46,00,2d,00,30,00,44,\
  00,30,00,34,00,2d,00,34,00,38,00,30,00,37,00,2d,00,38,00,43,00,34,00,34,00,\
  2d,00,41,00,43,00,32,00,36,00,43,00,42,00,36,00,43,00,35,00,44,00,33,00,36,\
  00,7d,00,00,00,14,00,1f,44,47,1a,03,59,72,3f,a7,44,89,c5,55,95,fe,6b,30,ee,\
  20,00,00,00,1a,00,ee,bb,fe,23,00,00,10,00,30,81,e2,33,1e,4e,76,46,83,5a,98,\
  39,5c,3b,c3,bb,00,00,4c,00,31,00,00,00,00,00,00,00,00,00,10,00,50,68,6f,74,\
  6f,73,00,00,36,00,07,00,04,00,ef,be,00,00,00,00,00,00,00,00,26,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,50,00,68,00,6f,00,74,00,\
  6f,00,73,00,00,00,16,00,60,00,31,00,00,00,00,00,4a,3b,95,0d,10,00,50,41,53,\
  53,50,4f,7e,31,00,00,48,00,07,00,04,00,ef,be,49,3b,79,09,4a,3b,95,0d,26,00,\
  00,00,55,3a,02,00,00,00,26,00,00,00,00,00,00,00,00,00,00,00,50,00,61,00,73,\
  00,73,00,70,00,6f,00,72,00,74,00,20,00,70,00,68,00,6f,00,74,00,6f,00,73,00,\
  00,00,18,00,00,00
"18"=hex:53,00,51,00,4c,00,69,00,74,00,65,00,20,00,44,00,61,00,74,00,61,00,62,\
  00,61,00,73,00,65,00,20,00,42,00,72,00,6f,00,77,00,73,00,65,00,72,00,2e,00,\
  65,00,78,00,65,00,00,00,14,00,1f,44,47,1a,03,59,72,3f,a7,44,89,c5,55,95,fe,\
  6b,30,ee,20,00,00,00,1a,00,ee,bb,fe,23,00,00,10,00,d0,9a,d3,fd,8f,23,af,46,\
  ad,b4,6c,85,48,03,69,c7,00,00,7e,00,31,00,00,00,00,00,00,00,00,00,10,00,41,\
  70,74,61,6e,61,20,53,74,75,64,69,6f,20,57,6f,72,6b,73,70,61,63,65,00,58,00,\
  07,00,04,00,ef,be,00,00,00,00,00,00,00,00,26,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,41,00,70,00,74,00,61,00,6e,00,61,00,20,00,\
  53,00,74,00,75,00,64,00,69,00,6f,00,20,00,57,00,6f,00,72,00,6b,00,73,00,70,\
  00,61,00,63,00,65,00,00,00,26,00,54,00,31,00,00,00,00,00,00,00,00,00,10,00,\
  2e,6d,65,74,61,64,61,74,61,00,3c,00,07,00,04,00,ef,be,00,00,00,00,00,00,00,\
  00,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,2e,00,\
  6d,00,65,00,74,00,61,00,64,00,61,00,74,00,61,00,00,00,18,00,52,00,31,00,00,\
  00,00,00,00,00,00,00,10,00,2e,70,6c,75,67,69,6e,73,00,00,3a,00,07,00,04,00,\
  ef,be,00,00,00,00,00,00,00,00,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,2e,00,70,00,6c,00,75,00,67,00,69,00,6e,00,73,00,00,00,\
  18,00,94,00,31,00,00,00,00,00,00,00,00,00,10,00,63,6f,6d,2e,61,70,74,61,6e,\
  61,2e,69,64,65,2e,66,72,61,6d,65,77,6f,72,6b,2e,6a,61,78,65,72,00,00,66,00,\
  07,00,04,00,ef,be,00,00,00,00,00,00,00,00,26,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,63,00,6f,00,6d,00,2e,00,61,00,70,00,74,00,\
  61,00,6e,00,61,00,2e,00,69,00,64,00,65,00,2e,00,66,00,72,00,61,00,6d,00,65,\
  00,77,00,6f,00,72,00,6b,00,2e,00,6a,00,61,00,78,00,65,00,72,00,00,00,2e,00,\
  6c,00,31,00,00,00,00,00,00,00,00,00,10,00,6a,61,78,65,72,5f,73,74,75,64,69,\
  6f,5f,64,61,74,61,00,4c,00,07,00,04,00,ef,be,00,00,00,00,00,00,00,00,26,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,6a,00,61,00,78,\
  00,65,00,72,00,5f,00,73,00,74,00,75,00,64,00,69,00,6f,00,5f,00,64,00,61,00,\
  74,00,61,00,00,00,20,00,5a,00,31,00,00,00,00,00,00,00,00,00,10,00,6c,6f,63,\
  61,6c,5f,6a,61,78,65,72,00,40,00,07,00,04,00,ef,be,00,00,00,00,00,00,00,00,\
  26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,6c,00,6f,\
  00,63,00,61,00,6c,00,5f,00,6a,00,61,00,78,00,65,00,72,00,00,00,1a,00,46,00,\
  31,00,00,00,00,00,00,00,00,00,10,00,64,61,74,61,00,00,32,00,07,00,04,00,ef,\
  be,00,00,00,00,00,00,00,00,26,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,64,00,61,00,74,00,61,00,00,00,14,00,4e,00,31,00,00,00,00,\
  00,4d,3b,0f,14,10,00,44,45,46,41,55,4c,54,00,38,00,07,00,04,00,ef,be,3e,3b,\
  e9,45,4d,3b,0f,14,26,00,00,00,e5,53,09,00,00,00,01,00,00,00,00,00,00,00,00,\
  00,00,00,44,00,45,00,46,00,41,00,55,00,4c,00,54,00,00,00,16,00,00,00
"1"=hex:69,00,6e,00,6b,00,73,00,63,00,61,00,70,00,65,00,2e,00,65,00,78,00,65,\
  00,00,00,14,00,1f,44,47,1a,03,59,72,3f,a7,44,89,c5,55,95,fe,6b,30,ee,20,00,\
  00,00,1a,00,ee,bb,fe,23,00,00,10,00,90,e2,4d,37,3f,12,65,45,91,64,39,c4,92,\
  5e,46,7b,00,00,00,00
"19"=hex:72,00,75,00,6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,\
  00,00,00,14,00,1f,50,e0,4f,d0,20,ea,3a,69,10,a2,d8,08,00,2b,30,30,9d,19,00,\
  2f,47,3a,5c,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,54,00,\
  31,00,00,00,00,00,4b,3b,3a,59,14,00,44,4f,43,55,4d,45,7e,31,00,00,3c,00,07,\
  00,04,00,ef,be,dd,3a,a8,22,4b,3b,3a,59,26,00,00,00,b3,cd,02,00,00,00,03,00,\
  00,00,00,00,00,00,00,00,00,00,44,00,6f,00,63,00,75,00,6d,00,65,00,6e,00,74,\
  00,73,00,00,00,18,00,52,00,31,00,00,00,00,00,dd,3a,d7,22,10,00,44,61,6e,64,\
  79,42,45,43,00,00,3a,00,07,00,04,00,ef,be,dd,3a,ae,22,dd,3a,d7,22,26,00,00,\
  00,e1,cd,02,00,00,00,03,00,00,00,00,00,00,00,00,00,00,00,44,00,61,00,6e,00,\
  64,00,79,00,42,00,45,00,43,00,00,00,18,00,48,00,31,00,00,00,00,00,dd,3a,cf,\
  22,10,00,74,61,6c,6b,73,00,34,00,07,00,04,00,ef,be,dd,3a,cc,22,dd,3a,cf,22,\
  26,00,00,00,42,ce,02,00,00,00,03,00,00,00,00,00,00,00,00,00,00,00,74,00,61,\
  00,6c,00,6b,00,73,00,00,00,14,00,4c,00,31,00,00,00,00,00,dd,3a,cf,22,10,00,\
  76,69,65,77,65,72,00,00,36,00,07,00,04,00,ef,be,dd,3a,cd,22,dd,3a,cf,22,26,\
  00,00,00,4a,ce,02,00,00,00,03,00,00,00,00,00,00,00,00,00,00,00,76,00,69,00,\
  65,00,77,00,65,00,72,00,00,00,16,00,00,00
"15"=hex:49,00,63,00,6f,00,46,00,58,00,2e,00,65,00,78,00,65,00,00,00,14,00,1f,\
  50,e0,4f,d0,20,ea,3a,69,10,a2,d8,08,00,2b,30,30,9d,19,00,2f,47,3a,5c,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,5a,00,31,00,00,00,00,00,\
  4f,3b,29,3e,14,00,50,4f,52,54,41,42,7e,31,00,00,42,00,07,00,04,00,ef,be,dd,\
  3a,ab,23,4f,3b,29,3e,26,00,00,00,1d,d3,02,00,00,00,03,00,00,00,00,00,00,00,\
  00,00,00,00,50,00,6f,00,72,00,74,00,61,00,62,00,6c,00,65,00,41,00,70,00,70,\
  00,73,00,00,00,18,00,64,00,31,00,00,00,00,00,53,3b,41,00,10,00,57,49,4e,44,\
  4a,56,7e,31,00,00,4c,00,07,00,04,00,ef,be,dd,3a,64,46,53,3b,41,00,26,00,00,\
  00,0e,b3,03,00,00,00,24,00,00,00,00,00,00,00,00,00,00,00,57,00,69,00,6e,00,\
  44,00,6a,00,56,00,69,00,65,00,77,00,50,00,6f,00,72,00,74,00,61,00,62,00,6c,\
  00,65,00,00,00,18,00,42,00,31,00,00,00,00,00,dd,3a,65,46,10,00,41,70,70,00,\
  30,00,07,00,04,00,ef,be,dd,3a,65,46,dd,3a,65,46,26,00,00,00,11,b3,03,00,00,\
  00,1b,00,00,00,00,00,00,00,00,00,00,00,41,00,70,00,70,00,00,00,12,00,4e,00,\
  31,00,00,00,00,00,54,3b,11,05,10,00,41,70,70,49,6e,66,6f,00,38,00,07,00,04,\
  00,ef,be,dd,3a,65,46,54,3b,11,05,26,00,00,00,17,b3,03,00,00,00,11,00,00,00,\
  00,00,00,00,00,00,00,00,41,00,70,00,70,00,49,00,6e,00,66,00,6f,00,00,00,16,\
  00,00,00
"14"=hex:66,00,69,00,72,00,65,00,66,00,6f,00,78,00,2e,00,65,00,78,00,65,00,00,\
  00,14,00,1f,50,e0,4f,d0,20,ea,3a,69,10,a2,d8,08,00,2b,30,30,9d,19,00,2f,48,\
  3a,5c,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,54,00,31,00,\
  00,00,00,00,7b,3a,64,14,14,00,44,4f,43,55,4d,45,7e,31,00,00,3c,00,07,00,04,\
  00,ef,be,74,38,3a,29,2d,3b,00,68,26,00,00,00,40,c8,f8,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,44,00,6f,00,63,00,75,00,6d,00,65,00,6e,00,74,00,73,\
  00,00,00,18,00,52,00,31,00,00,00,00,00,74,38,54,29,10,00,44,41,4e,44,59,42,\
  45,43,00,00,3a,00,07,00,04,00,ef,be,74,38,54,29,d7,3a,00,68,26,00,00,00,c0,\
  a6,29,71,00,00,00,00,00,00,00,00,00,00,00,00,00,00,44,00,61,00,6e,00,64,00,\
  79,00,42,00,45,00,43,00,00,00,18,00,56,00,31,00,00,00,00,00,74,38,ae,29,10,\
  00,52,45,43,4f,52,44,7e,31,00,00,3e,00,07,00,04,00,ef,be,74,38,ae,29,d4,3a,\
  00,68,26,00,00,00,c0,fb,b6,72,00,00,00,00,00,00,00,00,00,00,00,00,00,00,52,\
  00,65,00,63,00,6f,00,72,00,64,00,69,00,6e,00,67,00,73,00,00,00,18,00,00,00

I am a Christian and a developer and moderator here.

“A soft answer turns away wrath, but a harsh word stirs up anger.” – Proverbs 15:1

richo
richo's picture
Offline
Last seen: 1 month 2 weeks ago
Joined: 2007-01-31 22:03
The index string...

Hope you do well in your exams.

The index string you are looking for is the MRUListEx entry. Except it has changed from a string to an array of dword's. Here is the format as I see it:

0x00000015,
0x0000000e,
0x0000000f,
0x00000013,
0x00000001,
0x00000012,
0x00000016,
0x00000014,
0x0000000b,
0x00000000,
0x00000010,
0x0000000d,
0x0000000c,
0x0000000a,
0x00000005,
0x00000009,
0x00000003,
0x00000002,
0x00000008,
0x00000007,
0x00000006,
0x00000004,
0x00000011,
0x00000018,
0x00000017,
0xffffffff

the last one '0xffffffff' does the same for this format as the 2 null bytes in unicode does.

As for the entries themselves, they are still unicode.

To get the right numbers for the entries, just convert the dword's from hex to decimal.

Microsoft probably changed to this format to support a much bigger amount of entries.

Mark Sikkema
Offline
Last seen: 12 years 7 months ago
Developer
Joined: 2009-07-20 14:55
Need launcher to realize PC switch, for WinampPortable

I need to find another way of making a launcher realize a switch of PC, besides just checking the drive letter. Cause drive letter doesn't all ways change switchin PC's!

I thought my self about checking for windows registration keys, cause they should be personal.

On my XP computer I found the following registry keys:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Registration, ProductId, ?????-???-??????-?????
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion, ProductId, ?????-???-??????-?????
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion, ProductId, ?????-???-??????-?????

I am hoping Vista & Windows 7 are also making use of any of these keys ?
Or would there be a better way of having a launcher realize every switch of PC ?

Formerly Gringoloco
Windows XP Pro sp3 x32

Chris Morgan
Chris Morgan's picture
Offline
Last seen: 8 years 10 months ago
Joined: 2007-04-15 21:08
On Vista

On Vista HEKY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProductId contains the registration key. The other two do not exist.

I'm not sure about this as the best way to handle it, but I don't know what would be a better way. You could read the drive serial number. I'm not sure whether either of these techniques work in WINE though.

Why do you need to detect if it's a different machine? Is it to do with the user or machine or some combination or something else? Knowing why you need it might help.

I am a Christian and a developer and moderator here.

“A soft answer turns away wrath, but a harsh word stirs up anger.” – Proverbs 15:1

Mark Sikkema
Offline
Last seen: 12 years 7 months ago
Developer
Joined: 2009-07-20 14:55
Thanx Chris

for your reply !

I need this for Winamp launcher. The problem is the playlists, when there would be a fair amount of song file names in a playlist but located on the PC it self. Winamp would get 'frozen' on a different PC, cause it spends all it's energy in looking for these files (which don't exist anymore).
The launcher is able to clean up the playlists after a drive letter change, but when ever you would switch to a PC which uses the same drive letter it wont happen.

Maybe detecting HDD serial number could do the trick as well, would it be better?
And how would I make the launcher check this ?

Formerly Gringoloco
Windows XP Pro sp3 x32

Mark Sikkema
Offline
Last seen: 12 years 7 months ago
Developer
Joined: 2009-07-20 14:55
Found some script in NSIS forum !!!
; $0 - Drive to check returns the Disc Serial Number
Function GetDiskVolumeSerialNumber
  !define GetVolumeInformation "Kernel32::GetVolumeInformation(t,t,i,*i,*i,*i,t,i) i"
  System::Call '${GetVolumeInformation}("$0",,${NSIS_MAX_STRLEN},.r0,,,,${NSIS_MAX_STRLEN})'
FunctionEnd  ;GetDiskVolumeSerialNumber

; To view Disc Serial Number in hexsadecimal format
;IntFmt $0 "%08X" $0

This does the trick !
Can I count on the existence of a drive C: on every PC, or could there be PC's about without a C: drive ?
But on a quick test I just done, it doesn't show serial number of my D: drive.
As I am writing this, I realize, probably it doesn't because it's just a partition of the main drive!!!
Will do some testing with it, thanx a lot Chris !

Talking about the NSIS forum, would you be a member of the forum ?
I am having a hard time becoming a member of the Winamp forum (which I suspect/hope is connected to the Winamp forum) !
I just want to get in contact with them, so I could be a member and add some topic(s) about making Winamp Portable. (quite important !!!)
The forum just seems to be closed for anybody, at the moment !

Formerly Gringoloco
Windows XP Pro sp3 x32

Chris Morgan
Chris Morgan's picture
Offline
Last seen: 8 years 10 months ago
Joined: 2007-04-15 21:08
ReadEnvStr $0 SystemDrive

ReadEnvStr $0 SystemDrive will find you the system drive (normally C:). Volume information may or may not do it, but it's definitely worth a try. Personally I would do it like so:

!define _GetVolumeInformationSysCall "Kernel32::GetVolumeInformation(t,t,i,*i,*i,*i,t,i) i"
!macro GetDiskVolumeSerialNumber _SERIAL _DRIVE
  Push $0
  System::Call '${_GetVolumeInformationSysCall}("${_DRIVE}",,${NSIS_MAX_STRLEN},.r0,,,,${NSIS_MAX_STRLEN})'
  Exch $0
  Pop ${_SERIAL}
!macroend
!define GetDiskVolumeSerialNumber "!insertmacro GetDiskVolumeSerialNumber"

Then you could use it so:

ReadEnvStr $0 SystemDrive
${GetDiskVolumeSerialNumber} $1 $0\

And $1 will have the drive serial number in it.

I went and updated the NSIS wiki page about this technique while I was at it as it seemed a good sort of thing to do. I might see if I can get this to go into FileFunc.nsh for the next release of NSIS, it might be useful to people.

I am a Christian and a developer and moderator here.

“A soft answer turns away wrath, but a harsh word stirs up anger.” – Proverbs 15:1

Mark Sikkema
Offline
Last seen: 12 years 7 months ago
Developer
Joined: 2009-07-20 14:55
Super , even better !

Thanx so much for all your feedback!
You are a NSIS genius !
With this code I am getting a serial number for my D: drive (partition) as well. Even it seems to be a different serial number (-534190393) than the system C: drive (2018447845). Strange, but good!

But, you must have made a typing error. I did get the decimal one working after adding some quotes :

ReadEnvStr $0 SystemDrive
${GetDiskVolumeSerialNumber} $1 "$0\"

But the hexadecimal one I got from the Wiki page, I didn't get to work, even with the quotes : (I did use the script from the NSIS wiki page)

; Or find it as hex
${GetDiskVolumeSerialNumberHex} $1 $0\

The error tells me the macro requires 2 parameters, but passed 4 (5 including the qoutes)!

Now I remember your ChrisLauncher script, nice the way you make use of the macros. Maybe I could use them in my script to clean things up a bit.
All I don't like is that they need to be in the start of the script (which I think makes the script a bit messy) or I have to include them as a .nsh file!
By just using functions, I could locate them on the end of the script!

Anyway about the NSIS forum, I meant this one NSIS-Forum
Are you a member on this forum ?
What's the story there, why don't they allow new members ?

Formerly Gringoloco
Windows XP Pro sp3 x32

Chris Morgan
Chris Morgan's picture
Offline
Last seen: 8 years 10 months ago
Joined: 2007-04-15 21:08
GetDiskVolumeSerialNumberHex

GetDiskVolumeSerialNumberHex should be called separate from GetDiskVolumeSerialNumber - don't run one and then the other on the same input.

Also you can try putting quotes around %08X.

I am a Christian and a developer and moderator here.

“A soft answer turns away wrath, but a harsh word stirs up anger.” – Proverbs 15:1

Mark Sikkema
Offline
Last seen: 12 years 7 months ago
Developer
Joined: 2009-07-20 14:55
The only way I seem to get the hex working.....

is by leaving out the backslash on the end !

Is the back slash really that important.

Not sure what you meant with :

don't run one and then the other on the same input.

I have been using the decimal or the hex one in separated tests.
Anyway, it's not such a bad problem, just interested why it is (not) working the way it is !

Formerly Gringoloco
Windows XP Pro sp3 x32

OliverK
OliverK's picture
Offline
Last seen: 2 years 10 months ago
Developer
Joined: 2007-03-27 15:21
Don't check the registration

Don't check the registration key. When I download Windows 7, I got all six of the keys. Then it started repeating. (This is because I had to try to download it a bunch of times.)

What you should do is compare the drive letter in the INI and the current drive letter. OR are you needing it for something different?

Too many lonely hearts in the real world
Too many bridges you can burn
Too many tables you can't turn
Don't wanna live my life in the real world

Mark Sikkema
Offline
Last seen: 12 years 7 months ago
Developer
Joined: 2009-07-20 14:55
Don't check the registration ???

Hi Oliver,

Sorry, but don't really understand your comment ?

Do you mean that I shouldn't make the launcher compare registration keys, to realize switch of PC ?
Because Windows 7 doesn't use one of these registry keys ?

Would it be better to check for HDD serial number ? (see answer to Chris, just above)?

Anyway, comparing drive letters isn't good enough for this job ?

Thanx for the feedback !!!

Formerly Gringoloco
Windows XP Pro sp3 x32

OliverK
OliverK's picture
Offline
Last seen: 2 years 10 months ago
Developer
Joined: 2007-03-27 15:21
Do not use registration keys

Do not use registration keys as a way to tell if the computer has been changed.

They are recycled among Windows PC's

I would definitely use the drive serial as that should never exist anywhere else.

Anyway, comparing drive letters isn't good enough for this job ?

If you say so Wink

Too many lonely hearts in the real world
Too many bridges you can burn
Too many tables you can't turn
Don't wanna live my life in the real world

Log in or register to post comments