Generally the changes from v1.0 through to v1.1b have been... In-formative: to assist in successful installation. Con-formative: to ensure naming standards, error reporting and best practises are delivered. Most importantly though the feed-back has hopefully addressed the niggling little nuances, that creep into solutions when applied to a fleet of systems on an ocean of variables!
I want to thank everyone who has fed-back and commented on this plug-in. !!!ALL!!! have really helped and contributed in ensuring the end result comes as close as possible to the intention. THANKYOU! :clap2:
Changes:
- Re-documented the plug-in process and critical details to deliver a speedy, successful outcome.
- Added error trapping with message reporting to scripts to assist in avoiding the easy pitfalls.
- Ability to disable error reporting with the WZCErrorCtrl variable flag.
- Check the WZC service in WZCLITE.CMD and start if it is not already running.
- Comprehensive Detail, Help and Check-List content added to WZCLite.htm.
This is my Wireless Zero Configuration plug-in for BartPE, that allows you to; load your network hardware devices; initialise wireless networking services; set the wireless configuration to your personal SSID, WEP, WPA, etc... parameters.
XP works for me but I have included a Vista version of the wireless configuration utility for those who may be interested in experimenting further.
Final testing was performed on CD media, using BartPE v3.1.10a, XP-SP2, then XP-SP3 and the following reduced plug-in set...
- Bart Lagerweij's [BARTPE: Network Support]
- Bart Lagerweij's [Customise] inf (default values)
- Thuun's [File-Based Write Filter] (tested with v02.07.WW1)
~ Palmer666 & Ceroni modified (Jun 2008)
~ WolfWare modified v02.07.WW1 (Feb 2010) - Boris Mebarek's [Keyboard Layout] (default values)
- Bart Lagerweij's [Nu2Menu] and [NU2Shell]
- Gavotte's [RAM Disk v1.0.2003.1209]
- Erwin Veermans [Startup Group]
- WolfWare's [Wireless Zero Configuration Lite v1.1b]
Additional plug-ins may affect functionality. If you get problems strip back to the basics listed above first.
There are 3 items you need to customize to your environment.
- Your preferred Computer and Workgroup names, in 'autorun_wzclite.cmd' (line 50)
- Your remote SSID service name, in 'WiFiCfg.cmd' (lines 16 & 22)
- All the -add parameters for your WiFi system, in 'WiFiCfg.cmd' (line 22)
Example: /NetworkKey:1234 ABC 4321
Becomes: /NetworkKey:31323334204142432034333231
Not: /NetworkKey:%31%32%33%34%20%41%42%43%20%34%33%32%31
- Load your bootable media
- Manually load, or auto-pre-load your preferred FBWF plug-in (tested with v02.07.WW1a)
- Manually load, or auto-pre-load network services using 'autorun_wzclite.cmd'
- Launch the 'WifiCfg.cmd' to apply your preferred wireless security settings
- You need a RAMDisk configured so that the stripped down Event Log service has somewhere to create its Application and System logs. Without a RAMDisk this service will not start and subsequently WifiCfg will fail when trying to write to the Event Log
- The 'autorun_wzclite.cmd' needs to be run to pre-load the network services
- If you don't run the 'autorun_wzclite.cmd' you must at least register the msxml3.dll (regsvr32 msxml3.dll) and netcfgx.dll and then load the network services yourself.
Boot-Up Check List:
- The RAMDisk should be loaded (without RAMDisk, the Event Log service will fail)
- When booting from CD the FBWF should be loaded (without FBWF, DHCP address registration will time-out)
- The Event Log service should be running (without the Event Log, WifiCfg will fail to apply profiles)
- The Remote Procedure Call (RPC) is running (a general must be there)
- Set your preferred Computer and Workgroup names - edit 'autorun_wzclite.cmd' (line 50)
- Run the 'autorun_wzclite.cmd' to load the network services
- Make sure all clients, protocols, services were loaded error free
- Make sure all network adaptors were loaded error free
- Make sure all services started error free
- Set your remote SSID service name - edit 'WiFiCfg.cmd' (lines 16 & 22)
- Set the -add parameters for your WiFi system - edit 'WiFiCfg.cmd' (line 22)
- Run the 'WifiCfg.cmd' to apply your wireless security settings
- Make sure you get...
~ CoInitialze Succeeded
~ CoCreateInstances Succeeded
~ CoCreateProfile succeeded
You can download the 'Wireless Zero Configuration Lite' plug-in here...
WolfWareWeb
...there are a few other simple but purposeful PlugIns available there for consideration. These include my modified version of Thuun's FBWF PlugIn, the classic Windows File Manager (WINFILE) PlugIn, a solution to manage "Shell Folder Mappings" and a PlugIn for Piriforms excellent Defraggler disc management tool.
Hope this helps, feel free to get back to me as needed, WolfWare.
WZCLITE.INF
;; PE Builder v3 plug-in for Wireless Zero Configuration Lite in BartPE ;; Created by WolfWare ;; http://www.g2online.co.uk ;; Email: daw@g2online.co.uk ;; Version 1.1b [Version] Signature= "$Windows NT$" [PEBuilder] Name="Wireless Zero Configuration Lite" Enable=1 [WinntDirectories] a=Programs\WZCLite,2 z=PROVISIONING\SCHEMAS,0 [Strings] ;; To (optionally) enable local Error Trapping and Event Logging for the ;; services added by this plug-in, set the WZCErrorCtrl flag to numeric 1. ;; Note: To view logged events you will need to include the MMC plug-in. WZCErrorCtrl="1" [SourceDisksFiles] ;; 2=system32 ;; 4=system32\drivers ;; 20=inf files\*.*=a ;; .exe... sc.exe=2 ;; .sys... ndisuio.sys=4 ;; .inf... ndisuio.inf=20 netmscli.inf=20 netwzc.inf=20 netrass.inf=20 netnb.inf=20 netserv.inf=20 nettcpip.inf=20 ;; \ras\ .inf... switch.inf=7 pad.inf=7 ;; Registerable .dll... clbcatq.dll=2 dssenh.dll=2 msctf.dll=2 msxml3.dll=2 ;; General .dll... advpack.dll=2 comres.dll=2 eventlog.dll=2 kmddsp.tsp=2 msxml3r.dll=2 ntlsapi.dll=2 psbase.dll=2 raschap.dll=2 rasmans.dll=2 rasppp.dll=2 rastapi.dll=2 rastls.dll=2 sens.dll=2 tapisrv.dll=2 ;; WZC Templates... xmlp_bec.xdr=z, BASEEAPCONNECTIONPROPERTIESV1.XDR,0 xmlp_beu.xdr=z, BASEEAPUSERPROPERTIESV1.XDR,0 xmlp_bdg.xdr=z, BRANDING.XDR,0 xmlp_ecp.xdr=z, EAPCONNECTIONPROPERTIESV1.XDR,0 xmlp_ecu.xdr=z, EAPUSERPROPERTIESV1.XDR,0 xmlp_fcw.xdr=z, FLASHCONFIG.XDR,0 xmlp_fcd.xdr=z, FLASHCONFIGDEVICE.XDR,0 xmlp_hlp.xdr=z, HELP.XDR,0 xmlp_loc.xdr=z, LOCATIONS.XDR,0 xmlp_mas.xdr=z, MASTERFILE.XDR,0 xmlp_mcc.xdr=z, MSCHAPV2CONNECTIONPROPERTIESV1.XDR,0 xmlp_mcu.xdr=z, MSCHAPV2USERPROPERTIESV1.XDR,0 xmlp_mpc.xdr=z, MSPEAPCONNECTIONPROPERTIESV1.XDR,0 xmlp_mpu.xdr=z, MSPEAPUSERPROPERTIESV1.XDR,0 xmlp_reg.xdr=z, REGISTER.XDR,0 xmlp_ssd.xdr=z, SSID.XDR,0 xmlp_wp.xdr=z, WIRELESSPROFILE.XDR,0 xmlp_wiz.xdr=z, WIZARD.XDR,0 [Append] ;nu2menu.xml, wzclite_nu2menu.xml [SetupReg.AddReg] ;; Event Log 0x1,"ControlSet001\Services\Eventlog","Description","Log messages issued by Windows-based programs and components." 0x1,"ControlSet001\Services\Eventlog","DisplayName","Event Log" 0x4,"ControlSet001\Services\Eventlog","ErrorControl",0x0000000%WZCErrorCtrl% 0x1,"ControlSet001\Services\Eventlog","Group","Event log" 0x2,"ControlSet001\Services\Eventlog","ImagePath","%SystemRoot%\system32\services.exe" 0x1,"ControlSet001\Services\Eventlog","ObjectName","LocalSystem" 0x4,"ControlSet001\Services\Eventlog","PlugPlayServiceType",0x00000003 0x4,"ControlSet001\Services\Eventlog","Start",0x00000002 0x4,"ControlSet001\Services\Eventlog","Type",0x00000020 0x1,"ControlSet001\Services\Eventlog","ComputerName","MiniXP" 0x4,"ControlSet001\Services\Eventlog\Application","DisplayNameID",0x00000100 0x2,"ControlSet001\Services\Eventlog\Application","File","%ramdrv%\AppEvent.Evt" 0x4,"ControlSet001\Services\Eventlog\System","DisplayNameID",0x00000102 0x2,"ControlSet001\Services\Eventlog\System","File","%ramdrv%\SysEvent.Evt" ;; RASMan 0x4,"ControlSet001\Services\RasMan","Type",0x00000020 0x4,"ControlSet001\Services\RasMan","Start",0x00000003 0x4,"ControlSet001\Services\RasMan","ErrorControl",0x0000000%WZCErrorCtrl% 0x2,"ControlSet001\Services\RasMan","ImagePath","%SystemRoot%\system32\svchost.exe -k netsvcs" 0x1,"ControlSet001\Services\RasMan","DisplayName","Remote Access Connection Manager" 0x7,"ControlSet001\Services\RasMan","DependOnService","TAPISrv" 0x1,"ControlSet001\Services\RasMan","ObjectName","LocalSystem" 0x1,"ControlSet001\Services\RasMan","Description","Creates a network connection." 0x7,"ControlSet001\Services\RasMan\Parameters","Medias","rastapi" 0x2,"ControlSet001\Services\RasMan\Parameters","ServiceDll","%SystemRoot%\System32\rasmans.dll" 0x4,"ControlSet001\Services\RasMan\Parameters","IpOutLowWatermark",0x00000001 0x4,"ControlSet001\Services\RasMan\Parameters","IpOutHighWatermark",0x00000005 0x4,"ControlSet001\Services\RasMan\Parameters\Quarantine","Enabled",0x00000001 0x4,"ControlSet001\Services\RasMan\Parameters\Quarantine","AutoRefreshEnabled",0x00000000 0x4,"ControlSet001\Services\RasMan\Parameters\Quarantine","AutoRefreshTimeout",0x01808580 0x4,"ControlSet001\Services\RasMan\Parameters\Quarantine","WorkItemTimeout",0x00000bb8 0x4,"ControlSet001\Services\RasMan\PPP","MaxConfigure",0x0000000a 0x4,"ControlSet001\Services\RasMan\PPP","MaxFailure",0x0000000a 0x4,"ControlSet001\Services\RasMan\PPP","MaxReject",0x00000005 0x4,"ControlSet001\Services\RasMan\PPP","MaxTerminate",0x00000002 0x4,"ControlSet001\Services\RasMan\PPP","Multilink",0x00000000 0x4,"ControlSet001\Services\RasMan\PPP","NegotiateTime",0x00000096 0x4,"ControlSet001\Services\RasMan\PPP","RestartTimer",0x00000003 0x2,"ControlSet001\Services\RasMan\PPP\ControlProtocols\BuiltIn","Path","%SystemRoot%\System32\rasppp.dll" 0x2,"ControlSet001\Services\RasMan\PPP\ControlProtocols\Chap","Path","%SystemRoot%\System32\raschap.dll" 0x2,"ControlSet001\Services\RasMan\PPP\EAP","Path","%SystemRoot%\System32\rasppp.dll" 0x4,"ControlSet001\Services\RasMan\PPP\EAP\13","RolesSupported",0x00000002 0x1,"ControlSet001\Services\RasMan\PPP\EAP\13","FriendlyName","Smart Card or other Certificate" 0x2,"ControlSet001\Services\RasMan\PPP\EAP\13","Path","%SystemRoot%\System32\rastls.dll" 0x2,"ControlSet001\Services\RasMan\PPP\EAP\13","ConfigUiPath","%SystemRoot%\System32\rastls.dll" 0x2,"ControlSet001\Services\RasMan\PPP\EAP\13","IdentityPath","%SystemRoot%\System32\rastls.dll" 0x2,"ControlSet001\Services\RasMan\PPP\EAP\13","InteractiveUIPath","%SystemRoot%\System32\rastls.dll" 0x4,"ControlSet001\Services\RasMan\PPP\EAP\13","InvokeUsernameDialog",0x00000000 0x4,"ControlSet001\Services\RasMan\PPP\EAP\13","InvokePasswordDialog",0x00000000 0x4,"ControlSet001\Services\RasMan\PPP\EAP\13","MPPEEncryptionSupported",0x00000001 0x1,"ControlSet001\Services\RasMan\PPP\EAP\13","ConfigCLSID","{58AB2366-D597-11d1-B90E-00C04FC9B263}" 0x4,"ControlSet001\Services\RasMan\PPP\EAP\13","StandaloneSupported",0x00000000 0x4,"ControlSet001\Services\RasMan\PPP\EAP\13","NoRootRevocationCheck",0x00000001 0x1,"ControlSet001\Services\RasMan\PPP\EAP\25","FriendlyName","Protected EAP (PEAP)" 0x2,"ControlSet001\Services\RasMan\PPP\EAP\25","Path","%SystemRoot%\System32\rastls.dll" 0x2,"ControlSet001\Services\RasMan\PPP\EAP\25","ConfigUiPath","%SystemRoot%\System32\rastls.dll" 0x2,"ControlSet001\Services\RasMan\PPP\EAP\25","IdentityPath","%SystemRoot%\System32\rastls.dll" 0x2,"ControlSet001\Services\RasMan\PPP\EAP\25","InteractiveUIPath","%SystemRoot%\System32\rastls.dll" 0x4,"ControlSet001\Services\RasMan\PPP\EAP\25","InvokeUsernameDialog",0x00000000 0x4,"ControlSet001\Services\RasMan\PPP\EAP\25","InvokePasswordDialog",0x00000000 0x4,"ControlSet001\Services\RasMan\PPP\EAP\25","MPPEEncryptionSupported",0x00000001 0x1,"ControlSet001\Services\RasMan\PPP\EAP\25","ConfigCLSID","{58AB2366-D597-11d1-B90E-00C04FC9B263}" 0x4,"ControlSet001\Services\RasMan\PPP\EAP\25","StandaloneSupported",0x00000001 0x4,"ControlSet001\Services\RasMan\PPP\EAP\25","NoRootRevocationCheck",0x00000001 0x4,"ControlSet001\Services\RasMan\PPP\EAP\25","RolesSupported",0x0000001a 0x1,"ControlSet001\Services\RasMan\PPP\EAP\26","FriendlyName","Secured password (EAP-MSCHAP v2)" 0x2,"ControlSet001\Services\RasMan\PPP\EAP\26","Path","%SystemRoot%\System32\raschap.dll" 0x2,"ControlSet001\Services\RasMan\PPP\EAP\26","ConfigUiPath","%SystemRoot%\System32\raschap.dll" 0x2,"ControlSet001\Services\RasMan\PPP\EAP\26","IdentityPath","%SystemRoot%\System32\raschap.dll" 0x2,"ControlSet001\Services\RasMan\PPP\EAP\26","InteractiveUIPath","%SystemRoot%\System32\raschap.dll" 0x4,"ControlSet001\Services\RasMan\PPP\EAP\26","InvokeUsernameDialog",0x00000000 0x4,"ControlSet001\Services\RasMan\PPP\EAP\26","InvokePasswordDialog",0x00000000 0x4,"ControlSet001\Services\RasMan\PPP\EAP\26","MPPEEncryptionSupported",0x00000001 0x1,"ControlSet001\Services\RasMan\PPP\EAP\26","ConfigCLSID","{2af6bcaa-f526-4803-aeb8-5777ce386647}" 0x4,"ControlSet001\Services\RasMan\PPP\EAP\26","StandaloneSupported",0x00000001 0x4,"ControlSet001\Services\RasMan\PPP\EAP\26","RolesSupported",0x00000004 0x4,"ControlSet001\Services\RasMan\PPP\EAP\4","RolesSupported",0x0000000a 0x1,"ControlSet001\Services\RasMan\PPP\EAP\4","FriendlyName","MD5-Challenge" 0x2,"ControlSet001\Services\RasMan\PPP\EAP\4","Path","%SystemRoot%\System32\raschap.dll" 0x4,"ControlSet001\Services\RasMan\PPP\EAP\4","InvokeUsernameDialog",0x00000001 0x4,"ControlSet001\Services\RasMan\PPP\EAP\4","InvokePasswordDialog",0x00000001 0x1,"ControlSet001\Services\RasMan\Enum","0","Root\LEGACY_RASMAN\0000" 0x4,"ControlSet001\Services\RasMan\Enum","Count",0x00000001 0x4,"ControlSet001\Services\RasMan\Enum","NextInstance",0x00000001 ;; TAPI 0x7,"ControlSet001\Services\TapiSrv","DependOnService","PlugPlay","RpcSs" 0x1,"ControlSet001\Services\TapiSrv","Description","Provides Telephony API (TAPI) support for programs that control telephony devices and IP based voice connections on the local computer and, through the LAN, on servers that are also running the service." 0x1,"ControlSet001\Services\TapiSrv","DisplayName","Telephony" 0x4,"ControlSet001\Services\TapiSrv","ErrorControl",0x0000000%WZCErrorCtrl% 0x2,"ControlSet001\Services\TapiSrv","ImagePath","%SystemRoot%\System32\svchost.exe -k netsvcs" 0x1,"ControlSet001\Services\TapiSrv","ObjectName","LocalSystem" 0x4,"ControlSet001\Services\TapiSrv","Start",0x00000002 0x4,"ControlSet001\Services\TapiSrv","Type",0x00000020 0x2,"ControlSet001\Services\TapiSrv\Parameters","ServiceDll","%SystemRoot%\System32\tapisrv.dll" 0x1,"ControlSet001\Services\TapiSrv\Performance","Close","CloseTapiPerformanceData" 0x1,"ControlSet001\Services\TapiSrv\Performance","Collect","CollectTapiPerformanceData" 0x1,"ControlSet001\Services\TapiSrv\Performance","Library","tapiperf.dll" 0x1,"ControlSet001\Services\TapiSrv\Performance","ObjectList","1150" 0x1,"ControlSet001\Services\TapiSrv\Performance","Open","OpenTapiPerformanceData" 0x3,"ControlSet001\Services\TapiSrv\Performance","WbemAdapFileSignature",69,51,b8,9b,4f,59,1a,a6,94,04,8a,6c,d0,e5,22,4a 0x3,"ControlSet001\Services\TapiSrv\Performance","WbemAdapFileTime",00,e0,60,91,1a,7a,c4,01 0x4,"ControlSet001\Services\TapiSrv\Performance","WbemAdapFileSize",0x00001600 0x4,"ControlSet001\Services\TapiSrv\Performance","WbemAdapStatus",0x00000000 0x1,"ControlSet001\Services\TapiSrv\Enum","0","Root\LEGACY_TAPISRV\0000" 0x4,"ControlSet001\Services\TapiSrv\Enum","Count",0x00000001 0x4,"ControlSet001\Services\TapiSrv\Enum","NextInstance",0x00000001
AUTORUN_WZCLITE.INF
;; PE Builder v3 Autorun plug-in for Wireless Zero Configuration Lite in BartPE ;; Created by WolfWare ;; http://www.g2online.co.uk ;; Email: daw@g2online.co.uk ;; Version 1.1b [Version] Signature= "$Windows NT$" [PEBuilder] Name="Wireless Zero Configuration Lite (Auto Run)" Enable=0 [SourceDisksFiles] files\autorun_wzclite.cmd=2
AUTORUN_WZCLITE.CMD
@Echo Off :: ------------------------------------------------------------ :: Script to launch Network and Wireless Configuration services :: Created by WolfWare :: http://www.g2online.co.uk :: Email: daw@g2online.co.uk :: Version 1.1b :: ------------------------------------------------------------ Title Starting Network and Wireless Configuration Processes... For /f "Skip=4 Tokens=3" %%x In ('reg query HKLM\System\ControlSet001\Services\Eventlog /v ErrorControl') Do If %%x EQU 0x0 GoTo Skip1 For /f "Skip=3 Tokens=4" %%x In ('sc query EventLog') Do If %%x EQU RUNNING GoTo Skip1 Echo Prerequisite service [Event Log] not started. & Echo Please investigate and resolve before running this script. & Echo. & Pause & Exit :Skip1 Echo. Echo Registering critical libraries... start /wait regsvr32 /s msxml3.dll start /wait regsvr32 /s netcfgx.dll Echo. Echo Registering non-critical libraries... start /wait regsvr32 /s atl.dll start /wait regsvr32 /s clbcatq.dll start /wait regsvr32 /s dssenh.dll start /wait regsvr32 /s msctf.dll start /wait regsvr32 /s netman.dll start /wait regsvr32 /s netshell.dll :: For %%x in (*.dll) Do start /wait regsvr32 /s %%x Echo. Echo Initiating network support... Echo. Echo Create DHCP, IPSec, LMHosts, NetBT and TCP/IP protocols and services... bartpe -v -c p -i ms_tcpip Echo. Echo Create LanManWks, NetBIOS, NetLogon clients and services... bartpe -v -c c -i ms_msclient Echo. Echo Create NDIS User I/O protocol and service... bartpe -v -c p -i ms_ndisuio Echo. Echo Create Remote Access Connection Mgr service... bartpe -v -c s -i ms_rasman Echo. Echo Create Wireless Zero Configuration service... bartpe -v -c s -i ms_wzcsvc Echo. Echo Load network devices... bartpe -v -pnp -cn MiniXP -wg WORKGROUP Echo. Echo Starting services... net start tcpip net start nla net start netman net start lmhosts net start tapisrv net start rasman net start ndisuio net start wzcsvc net start dhcp Echo. net start Pause Exit
WIFICFG.CMD
@Echo Off :: ---------------------------------------------------- :: Script to launch Apply/Remove Wireless Configuration :: Created by WolfWare :: http://www.g2online.co.uk :: Email: daw@g2online.co.uk :: Version 1.1b :: ---------------------------------------------------- Title Apply/Remove Wireless Configuration... For /f "Skip=4 Tokens=3" %%x In ('reg query HKLM\System\ControlSet001\Services\Eventlog /v ErrorControl') Do If %%x EQU 0x0 GoTo Skip1 For /f "Skip=3 Tokens=4" %%x In ('sc query WZCSVC') Do If %%x EQU STOPPED net start wzcsvc For /f "Skip=3 Tokens=4" %%x In ('sc query WZCSVC') Do If %%x EQU RUNNING GoTo Skip1 Echo Prerequisite service [Wireless Zero Configuration] not started. & Echo Please investigate and resolve before running this script. & Echo. & Pause & Exit :Skip1 If %1!==! GoTo EOF If %1==/1 GoTo Apply Echo Remove WZC values... \Programs\WZCLite\WifiCfg_XP.exe -delete /SSID:WolfWare /DebugLog:TRUE Pause GoTo EOF :Apply Echo Apply WZC values... \Programs\WZCLite\WifiCfg_XP.exe -add /SSID:WolfWare /Authentication:WPAPSK /Encryption:TKIP /NetworkKey:07111957 /DebugLog:TRUE Pause :EOF
WZCLITE_NU2MENU.XML
<!-- Nu2Menu entry for WZCLite --> <NU2MENU> <MENU ID="Programs"> <MITEM TYPE="POPUP" MENUID="WZCLite">WCZLite</MITEM> </MENU> <MENU ID="WZCLite"> <MITEM TYPE="ITEM" DISABLED="@Not(@FileExists(@GetProgramDrive()\Programs\WZCLite\autorun_wzclite.cmd))" CMD="RUN" FUNC="@GetProgramDrive()\Programs\WZCLite\autorun_wzclite.cmd">Activate WZCLite Networking</MITEM> <MITEM TYPE="ITEM" DISABLED="@Not(@FileExists(@GetProgramDrive()\Programs\WZCLite\wificfg.cmd))" CMD="RUN" FUNC="@GetProgramDrive()\Programs\WZCLite\wificfg.cmd /1">Apply WZCLite Configuration</MITEM> <MITEM TYPE="ITEM" DISABLED="@Not(@FileExists(@GetProgramDrive()\Programs\WZCLite\wificfg.cmd))" CMD="RUN" FUNC="@GetProgramDrive()\Programs\WZCLite\wificfg.cmd /2">Remove WZCLite Configuration</MITEM> </MENU> </NU2MENU>
All done, WolfWare. :happyrollsick:
View the full article