IP plug-in: Difference between revisions
From NSIS Wiki
Jump to navigationJump to search
m (Updated author links.) |
m (Added category links.) |
||
Line 282: | Line 282: | ||
Exch $0 | Exch $0 | ||
FunctionEnd</highlight-nsis> | FunctionEnd</highlight-nsis> | ||
[[{{ns:14}}:Plugins]] |
Revision as of 20:45, 30 April 2005
Author: sunjammer (talk, contrib) |
Links
Ipdll.zip (9 KB)
Description
Written by Hendri Adriaens aka Smile2Me...
The Script
outfile IpTest.exe name IpTest ; get_ip example ; by Hendri Adriaens ; HendriAdriaens@hotmail.com ; ; Usage: ; CallInstDll ip.dll get_ip ; OUtput: 'ip1;ip2;ip3;ip4;' ; (semi-colon delimited IP's list, on stack) ; ; Uses NSIS script to retrieve ; separate IP-addresses and to ; test whether or not it is an ; internet IP-address. Based on ; information by Joost Verburg: ; These ranges are for local networks: ; 10.x.x.x / 255.0.0.0 ; 172.16.x.x / 255.255.0.0 to 172.31.x.x / 255.255.0.0 ; 192.168.x.x / 255.255.255.0 ; 169.254.x.x / 255.255.0.0 ; and: ; 169.254.x.x is an Automatic Private IP Address, ; which you get when there is no DHCP server available, ; for example, Windows gives these addresses when you check ; "Obtain an IP address automatically" and you have no DHCP server. ; ; Further information has also been found at: ; http://home.t-online.de/home/TschiTschi/ip_adressierung.htm ; ; Script supplies two funcions: ; GetNextIp : get any IP (network and internet) ; CheckIP : determine IP type (see function header for available types) ; Script uses the VersionCheck ; function to test IP's. Section ; Code to use actual ExtensionDLL ; Current script provides an example ;SetOutPath $TEMP ;File ip.dll ;CallInstDll $TEMP\ip.dll get_ip ;Pop $0 ; test entry StrCpy $0 '192.168.0.100;127.0.0.1;152.168.0.101;169.254.0.1;' Loop: Push $0 Call GetNextIp Call CheckIp Pop $2 ; Type of current IP-address Pop $1 ; Current IP-address Pop $0 ; Remaining addresses StrCmp $2 '1' '' NoLoopBackIp MessageBox MB_OK "LoopBack IP-address: $1" Goto Continue NoLoopBackIp: StrCmp $2 '2' '' NoAPA MessageBox MB_OK "Automatic Private IP-address: $1" Goto Continue NoAPA: StrCmp $2 '3' '' NoLanIp MessageBox MB_OK "Network IP-address: $1" Goto Continue NoLanIp: MessageBox MB_OK "Internet IP-address: $1" Continue: StrCmp $0 '' ExitLoop Loop ExitLoop: ;Delete $TEMP\ip.dll SectionEnd ; Function GetNextIp ; input: head of stack ; format: 'ip1;ip2;ip3;ip4;' ; output: 'ip1' head of stack ; 'ip2;ip3;ip4;' second entry of stack Function GetNextIp Exch $0 Push $1 Push $2 Strcpy $2 0 ; Counter Loop: IntOp $2 $2 + 1 StrCpy $1 $0 1 $2 StrCmp $1 '' ExitLoop StrCmp $1 ';' '' Loop StrCpy $1 $0 $2 ; IP-address IntOp $2 $2 + 1 StrCpy $0 $0 '' $2 ; Remaining string ExitLoop: Pop $2 Push $0 Exch 2 Pop $0 Exch $1 FunctionEnd ; Function CheckIP ; input: IP-address on stack ; output: additional entry on stack ; 1 - LoopBack IP (localhost, indicates no connection to a LAN or to the internet). ; 2 - Automatic Private IP Address (no DHCP server). ; 3 - Network IP. ; 4 - Internet IP. ; Eg: ; Push '192.168.0.100' ; Call CheckIP ; Pop $0 ; Contains '3' ; Pop $1 ; Contains '192.168.0.100' Function CheckIP Exch $0 Push $1 ; Check 127.x.x.x Push '127.0.0.0' Push $0 Call VersionCheck Pop $1 StrCmp $1 2 '' Range1 ; IP cannot be in range of LoopBack addresses Push '127.255.255.255' Push $0 Call VersionCheck Pop $1 StrCmp $1 1 LoopBack ; We found a LoopBack IP ; Check 10.x.x.x Range1: Push '10.0.0.0' Push $0 Call VersionCheck Pop $1 StrCmp $1 2 '' Range2 ; IP cannot be in range 1 Push '10.255.255.255' Push $0 Call VersionCheck Pop $1 StrCmp $1 1 LanIp ; We found a LanIp ; Check 172.16.x.x to 172.31.x.x Range2: Push '172.16.0.0' Push $0 Call VersionCheck Pop $1 StrCmp $1 2 '' Range3 ; IP cannot be in range 2 Push '172.31.255.255' Push $0 Call VersionCheck Pop $1 StrCmp $1 1 LanIp ; We found a LanIp ; Check 192.168.x.x Range3: Push '192.168.0.0' Push $0 Call VersionCheck Pop $1 StrCmp $1 2 '' Range4 ; IP cannot be in range 3 Push '192.168.255.255' Push $0 Call VersionCheck Pop $1 StrCmp $1 1 LanIp ; We found a LanIp ; Check 169.254.x.x Range4: Push '169.254.0.0' Push $0 Call VersionCheck Pop $1 StrCmp $1 2 '' InternetIp ; It should be an internet IP Push '169.254.255.255' Push $0 Call VersionCheck Pop $1 StrCmp $1 1 APA ; We found an Automatic Private IP Address Goto InternetIp ; Remaining addresses are internet IPs LoopBack: StrCpy $1 1 Goto Exit APA: StrCpy $1 2 Goto Exit LanIp: StrCpy $1 3 Goto Exit InternetIp: StrCpy $1 4 Exit: Exch $1 Exch 1 Exch $0 Exch 1 FunctionEnd ; Function VersionCheck ; input: 'v1', 'v2' on stack ; output 1 - if number 1 is newer ; 2 - if number 2 is newer ; 0 - if it is the same verion ; Eg: ; Push '3.5.1.4' ; Push '3.5' ; Call VersionCheck ; Pop $0 ; now contains 1 Function VersionCheck Exch $0 ;second versionnumber Exch Exch $1 ;first versionnumber Push $R0 ;counter for $0 Push $R1 ;counter for $1 Push $3 ;temp char Push $4 ;temp string for $0 Push $5 ;temp string for $1 StrCpy $R0 "-1" StrCpy $R1 "-1" Start: StrCpy $4 "" DotLoop0: IntOp $R0 $R0 + 1 StrCpy $3 $0 1 $R0 StrCmp $3 "" DotFound0 StrCmp $3 "." DotFound0 StrCpy $4 $4$3 Goto DotLoop0 DotFound0: StrCpy $5 "" DotLoop1: IntOp $R1 $R1 + 1 StrCpy $3 $1 1 $R1 StrCmp $3 "" DotFound1 StrCmp $3 "." DotFound1 StrCpy $5 $5$3 Goto DotLoop1 DotFound1: Strcmp $4 "" 0 Not4 StrCmp $5 "" Equal Goto Ver2Less Not4: StrCmp $5 "" Ver2More IntCmp $4 $5 Start Ver2Less Ver2More Equal: StrCpy $0 "0" Goto Finish Ver2Less: StrCpy $0 "1" Goto Finish Ver2More: StrCpy $0 "2" Finish: Pop $5 Pop $4 Pop $3 Pop $R1 Pop $R0 Pop $1 Exch $0 FunctionEnd