From ecb4a09535b6a8da0765010489a96e605dbdeb46 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 4 Sep 2010 00:13:11 -0700 Subject: [PATCH 1/1] altosui: Add windows installer build using 'nsis' nsis happens to be packaged in debian, and it appears to build usable installers, which is all very cool. Signed-off-by: Keith Packard --- .../Instdrv/NSIS/Contrib/InstDrv/Example.nsi | 84 +++ .../NSIS/Contrib/InstDrv/InstDrv-Test.exe | Bin 0 -> 51831 bytes .../Instdrv/NSIS/Contrib/InstDrv/InstDrv.c | 704 ++++++++++++++++++ .../Instdrv/NSIS/Contrib/InstDrv/InstDrv.dsp | 110 +++ .../Instdrv/NSIS/Contrib/InstDrv/InstDrv.dsw | 29 + .../Instdrv/NSIS/Contrib/InstDrv/Readme.txt | 141 ++++ .../Instdrv/NSIS/Contrib/InstDrv/ircomm2k.inf | 137 ++++ .../Instdrv/NSIS/Contrib/InstDrv/ircomm2k.sys | Bin 0 -> 30464 bytes .../altosui/Instdrv/NSIS/Plugins/InstDrv.dll | Bin 0 -> 6656 bytes ao-tools/altosui/Makefile | 10 +- ao-tools/altosui/altos-windows.nsi | 102 +++ 11 files changed, 1312 insertions(+), 5 deletions(-) create mode 100644 ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/Example.nsi create mode 100644 ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv-Test.exe create mode 100644 ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv.c create mode 100644 ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv.dsp create mode 100644 ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv.dsw create mode 100644 ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/Readme.txt create mode 100644 ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/ircomm2k.inf create mode 100644 ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/ircomm2k.sys create mode 100644 ao-tools/altosui/Instdrv/NSIS/Plugins/InstDrv.dll create mode 100644 ao-tools/altosui/altos-windows.nsi diff --git a/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/Example.nsi b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/Example.nsi new file mode 100644 index 00000000..3ed821eb --- /dev/null +++ b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/Example.nsi @@ -0,0 +1,84 @@ +# +# InstDrv Example, (c) 2003 Jan Kiszka (Jan Kiszka@web.de) +# + +Name "InstDrv.dll test" + +OutFile "InstDrv-Test.exe" + +ShowInstDetails show + +ComponentText "InstDrv Plugin Usage Example" + +Page components +Page instfiles + +Section "Install a Driver" InstDriver + InstDrv::InitDriverSetup /NOUNLOAD "{4d36e978-e325-11ce-bfc1-08002be10318}" "IrCOMM2k" + Pop $0 + DetailPrint "InitDriverSetup: $0" + + InstDrv::DeleteOemInfFiles /NOUNLOAD + Pop $0 + DetailPrint "DeleteOemInfFiles: $0" + StrCmp $0 "00000000" PrintInfNames ContInst1 + + PrintInfNames: + Pop $0 + DetailPrint "Deleted $0" + Pop $0 + DetailPrint "Deleted $0" + + ContInst1: + InstDrv::CreateDevice /NOUNLOAD + Pop $0 + DetailPrint "CreateDevice: $0" + + SetOutPath $TEMP + File "ircomm2k.inf" + File "ircomm2k.sys" + + InstDrv::InstallDriver /NOUNLOAD "$TEMP\ircomm2k.inf" + Pop $0 + DetailPrint "InstallDriver: $0" + StrCmp $0 "00000000" PrintReboot ContInst2 + + PrintReboot: + Pop $0 + DetailPrint "Reboot: $0" + + ContInst2: + InstDrv::CountDevices + Pop $0 + DetailPrint "CountDevices: $0" +SectionEnd + +Section "Uninstall the driver again" UninstDriver + InstDrv::InitDriverSetup /NOUNLOAD "{4d36e978-e325-11ce-bfc1-08002be10318}" "IrCOMM2k" + Pop $0 + DetailPrint "InitDriverSetup: $0" + + InstDrv::DeleteOemInfFiles /NOUNLOAD + Pop $0 + DetailPrint "DeleteOemInfFiles: $0" + StrCmp $0 "00000000" PrintInfNames ContUninst1 + + PrintInfNames: + Pop $0 + DetailPrint "Deleted $0" + Pop $0 + DetailPrint "Deleted $0" + + ContUninst1: + InstDrv::RemoveAllDevices + Pop $0 + DetailPrint "RemoveAllDevices: $0" + StrCmp $0 "00000000" PrintReboot ContUninst2 + + PrintReboot: + Pop $0 + DetailPrint "Reboot: $0" + + ContUninst2: + Delete "$SYSDIR\system32\ircomm2k.sys" +SectionEnd \ No newline at end of file diff --git a/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv-Test.exe b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv-Test.exe new file mode 100644 index 0000000000000000000000000000000000000000..615bae154c2ef39071a7c8fd9b6b7fbcb04b52cf GIT binary patch literal 51831 zcmeFadwf*Y)jz!Fl4J-IW`IP41RW$O7Nls15{BReG9gp~14CwPmd&WTx8pDW@^ZTxSCL~(>^m*UU z^T+#nKONX}_GRt0*Is+Awb#C!Ny$$(F&$$}kDw@w?Z%TnHvawJf5|8wcE$6<*fT?3 z8@pRG@3pauy_NNr+Pa!M>dIDGR+Lp&*9ex|J(fDL+EQ6e#uT_x|brm-~bGV&}`}ke>9b7XJMEi~C;gL0ZJKkHc+wc_p64Uj<(N0?$W(^?ROw z-P4b7_(hc~yoBq!lsoK<&C}@FHO~q&`^!!-lV+$UnXx6vc_5Ex|A0!(2(^^7sd25! zAIc#<@sDNt#RQ7+K_#kp@tH_c7Cr~+7<+~yX4KY-0pE*kvfybDQ1bk( z_@Z{HuNOOkI6fA}Zkt?JUM7@*PJ#hWHUi-`gh3x07&2J}V=t@$zc!(eaG`I5KQ_i9 zlk4j1R!}D4qdpJAb2ViQd~E+SF&n7xpVshIECV0jy*$qyYyRCS*&68A-OSY71u}vcG{Q`&v}e9z?@>y+TQ7_KEzjR)YW@?ExUqGbk+HU=@wOwa zONW|vecll@DE2<97#EU4Vmy`vQ1Ma~Su0g2?YW5NxkPQBw(ZC=wH`-&r=lpPU2j-R z5ZST_(;N<|!>5b`fdW)pezEH76 zD(MM1GNsaZsMsKtbcbrwm$%+Bd|Akm6)HB~da$35RZeNC!R7X4hMz764}To?Z~o#p zroA_tgB@SyM1o(9Fl`tM1K=|(Q?kR^m)V#zY&WB#iW5+Y4RUyo(7(mpcp%Y&eO#%ssgH^&?U9ZQ$DB|wVs%(EMWap;C*-(t0IZ|w5*-2wsH zqY97+0b0I{OBnjqR|&GZ5ypr54p_;!$ML|+a;@qhwObyNnd!r(xz!mmd=Www{Er?)1dqQ z&2w5yd#wH)sM`2y(DM+B-8n%1rSgYKDi=233G&4x#eOKJQ%Vj6{f9KBjnkn%h^3qE zor2gv#Y^PhCo0ZQRQ!Wvf2ghGP-R353DDU$qjx*+S9@pQY_)G~{G(!jNV0Fwvp?h? z14M^>NyOs}`L+b2Bs__`hlxlG%smpB5C7JjH+&ZB`DLNf&Fdzj4Yh%=iXDtJ?b2(k zFR#-|hpnA{t<(*6=Ao;9mrBsuLzM@KoXUs+6Q*1D%A)YbQACw%VYoHx@QnovF*3Nuoa3FvOk^^3E7_sVFXJy zhYF=Bst&-RW9vTgnf59s#%>AkF<>Ct4(zx0A;}^i=-W#Bv`1PuUw)|X1~wnVw)WHT zd`)r46#Puz67e4odLk@r-|TeAe*o1aqR)K8dEcdo$H1~ohde1!a0E`IWbcwnjs?HM z7;OZcR4QBbZR@Tn2$dWIo8M8jdzAbYKnd5wY872%sQsOgy({*LRC;EjzAa`S03IVB zN&x@#+rUBpF|=|OwNi2n4Rw5=wdzw%_l95zIhs^cs{y6?#B@{mn?3^Umh?>_`|g-d zvhTLqA2&6x05nu`NHDH3wG07duw1msn zqO=-QipAbGyP>t2=S3eOro@A%OdX%;!yESy0-Z+c2KRV5xM#g?-H33IkhLvNR$9}O z=UcB^-=k<+ly#RWL!|419eoQVOgv>!%KUaK*oRt32q@h$W44920{du8g zDZwC&q(gobqCv9z`1!#DndOkP69osU%l5A5tq?xNek?kLM0EC~oL+0EY2#|tvf3l2 z@G3+CD~7Y2H)e(E)1{Z8OWM%WQ=m(v!5f35Rl0e>Nf;i=gmF>l5tObwl_y3*;^uYJ zpy{BJlLt;p%^bAj14Fo(kLeHtdV)A1P`GU;>lbM}0CE6Ky$aQ5cF367E&XX{CK4Sh zEe6xBNN9FeP9)m-m7*LSZet&hw6P&0Y-|$30)!C4M+gnbe+c0v1eRfA&!*ehI)t1{ zZ0rt%x=U^Bw+PlzHntgQsW96JuTW~tPS0zY;J-$4=v&?p?28gUqi?!%r+nW+s)&ShA>0Hvx?X- zt-WldM)bi33ll39TbAU=vO3ZmlTaEfm*!;~_S-DiW0Xw0HmB0W6mrayHvgQ=Y{=n| z9P=vQAQK(loJyuRv1A}?V=7tgQ1LBNu|t6uTWrgTylfx`7+zbtOA<44 z4qC-5w{&9tl{t|-yJcO5Y1fQQ>v=In@|#2Ydkbtudo7ZiKVeS=U{=<*wz=;w`ryo1i!kp@vP)G@JeItmMMMw2iR-$jx=T}%rWXPTw7 z)|5NJ2fafP&5CGLM1ztsug=DzO;8LBxVL+=jqzLuazl1w*xn6TKrKdE^7lbQE|~85 z4XIDsZs3x}JcDnz7N%WCO;2{3o;<00`TleMzK}iLwCh#VuD|lkzv?G;qv^zb4jqqx?_!pro)1Y3Mc5#uf&b0`_NfDlDY zM-~V(Dj7@EH2MK}=?lz>R1@8+m&6Jv; zWH_j9m-RiNGHCBM2kkwEm%4vpLk+OS&HH~Fn(=9Pi;DrQE?vqv=CSaQ7!i z(?{f7PVe|fYRBJFLnUXzKf0j1pnEU)Rk3Nq!An43cDUpQj5L$K%Eb72 zyPmQ!c{FyLqR&%l(o}RPm`_@S#qaNsUL@ssU@ z3T%a}#j1QsN-hxs{-XWfx=T43n8}2l6;0EoFAW}UX^sd(0V8#{CC^wQo<;O#sayQ~p9-LoZI=hGVsbP13oVFjF8h(z#ha9G;5Yh5Nco%4ym#v+-c2WHhdt<1GBzR?Y)*6e zPRV<$X#7bC2G+}H`4PkbBku)op*hX>Qab5zkVRGH-q~QR?}OL@pGNkPAa#fBamOCo z%yR>OMyrZBTe8QkovW`3Ok=`Wm;6(XOc)l7OafQp@{uCOVnft%3|vhsb!KXrh?bmg zx02Be9MLgI`4l-BZG=k<3*BC70y0d(9pH_aTD~GziL(_*qA{f0KIVOB6S{2qnzXzT zfU)Dg>tvD?DeeyWd*to{kowZ$2RH`|ZrM(>j8X-}E#HWgL!JW|2sJU!EoVZ0_8flH z1~R*ucnJt>K>iMmU<-C@97vK}qD&|L&@FGkfVD*S+q+?#sXPCEeJB@po%Xzk~*P0d8~4Kbr+1h$|RraRqPgM=qz_ZU@CK`5`=fXT66X zhD;wSq`6TJQPv1G%VBle+nk zxZLueQ0SJ=-h^>)X@n3sAXQ$pBXtG8#;i#TlU`n67CqsX9R%U_ZbVyvqqZboh!!zI zLurJNPa}lK3wS{6Q(eA)$or;Y*t5xO2$`yUyL=zXe?+d2xnvUrAeJyR2{JH8S}iEiR?J%{>MrpJX zY0`gGmAYMWC)7&UNu*|>3xR1%#AKKJ3DAL|E_n$eE_u=j6}yh=$FUB83jPCmm={qS zY<&~L6a70CXyqqR;L}N6@^*?~=_J2^NJ7^__PAhZdE3;y8^8{EE~;bhGw8Zat-nQ% zwHsRzFxGKU63Di)XeA;(i@b=Mybevy zMTGh^LFHRDmKD*VW}-))j3QEduGVgckgjA*QlZSMMq5(A|BNZf3;a&eK|7*D2|JUI zlF(3x{)~vVyD@X!j@aeM-_xJ}6wj~6BIZ=|*VwLD-748nM}L7B+WjR#p?C5|M5F_N z3C4%6@haIZKfTe$bZ28rC!US{*!1M<(%IOemV-i()Or88ucYpnedyU(!ML-r{G79~ zymKdFxjB)RUeo4C>~Af-;;@(j8?;xp^a^p*>A^;AECZ1tYUR(VRPB{3T1s{e{qLtk zkBGx{QBRD~Y^`bjSxP;H6n2aIRpu^8>ox)pM)VGs zT;HE`Q(7)ZGWvR)3_OH=Jk@_5sc?}Vqf3@fN_MqVZ6#wG*d1+0p;wQQm5*a;fMCPM z16IBT28Op1N)B=2qH6)^)5!%iq`a`ARG*eHzgxPoM%~_7#Zq+Rtc6@P?qq z6r`mtG7i;?DGVG zkOnWpTmo+;x-^Y?ATOs*4qF|<4KpuH?1u)}WBhTI=41xNps|JTJ zhE^_B!KMHVjnV2Ln#<|v>GzcgHO;99NN=W60(>bwHnH@Obl@C% zd>gz36kX?F7hoyJ<{wDWakAc@I;;G&)buJ$r8TX2#Ed{km3dZes^!K(LLLQ8dHHDx5 z5{C3ie4)*U(Etpw??d@9AW|{7+j|tnCBJo}+VeA}=3gMgfrYMHein6L zk@ARk9J)BX0Stp8o{_hx1r`XaQfqL^3&^{sIF|E$asiQ*M)(06{S}QrgrONcQd_0X zQZw)xxg+EIIO?TdcFU=Z;W2*L!lwV1_A#?HlcHz5-zAw)5Q(|1OG0?=@Nm^g|?BV!(KP5dI3 zispSW`5r=+(F)R|jbDJsQ?du`_;7Y{M!uC|WbGDFL zB{3 z4#}Xvx#UZnkR1bR;5pfn|MXtME$#1!8^(1Cso1A+ER=>Ti)H{uI@xjFEEyI#l!a3R zRwkq&Z`=j9lh7|LL_!f|9-qYHr+7Ror#DaRZoD2o5p-P>9rN$!ySh5hyjwo8~CnhsGepQeG2w2nuoAnN->UInH*xaZD&QOp43A69?> z40lL8u$NZSPFKjkFSPVTMaX_geswa9#0!usfe*Z?`B!J54Zct1U!o)$L_#IgTT7D9 zg;DCtQLOI^wNft0qIU@joXQDrAw8jVh)zS~=nNX+Z!wgi0we{kH%Ix=0cm zJ=Kk!rh|EDv~0uXhoo3;sUC41Fa( z|CQpt*W?!DJNVLWDq(H}W?1hU(gJu3e3k|?l$7Gm3(y8~5sRBliBI+9oiWtbzEF-WH(H;q>WXQhCP=)Qc;TiSAxPRE~rZNu#E_U}@pAJG`Tq zmewWQo#lg<#drE&(SqQ53jRVS~2;9#h`#kJ1X6_UzLj)}6?3$aerC z$KL^9^udRdQa;(Zyx7vp`?u|{vj`RBtXLK@@Wtx4cFly{Wu=1WoOmHogiN3|l<<8jKn5%G1cfvYP;-<0#XL zf%pvxm%9FT%J-{C)a9?KImFAls*PTT=E7lGuhTXMt=BP5;xN^@fS(baqqf^8 z=Kxt^-R_JoN9`PCZv}1L$d>^JoY&COxP0>zQWd9=wuc7ODQ`uk*p*7|L-)bN@*R+S zh$i{rAM)G4C>V%CAS$CQT_(T99!$}!?yt(+~<8T zGHRJqz8mpvHri8dXi$WkmD)!6HG=QPfs!Z-(|H+kv1Y4nkgtWL#4eF$Vm0QLlJTv3 z#pRGUfqdOLY%7X?hvin+RXI@BGj2@NM1rapBy=#@wCcjX7Y0s|-z6S&bFJZZU2~Bo`nIFtFLD)`Vb(4e^DlO2}anZrN9C< z#xg*f+j}XfRC2eVBkGC*Q)l3$0%EsDQ?G-k*0pWKDFCz3ITz`X&rCV(5CIk<{283CFU5qdV@k%@ugcVoX z*e?*b;=432OKYo>2t-H8wT|;bw%F z5N7-U!-Mb_gtZgV2EvRh zOQc+~;V&ftEH)}{sac#AZs~!t!v%+f{~SgVtDF&Pp4)-yeaZ<~zT*_(vvfZ~Gtlrc zH^QhV%E(s7=&VKEEmfvA$xopnhrDYFeUHXB=;Y@@Exm3DS7gq0Ng1>!DIExYVCsnL zm8oqwok=>3EQh=kHld|giu;q@@{;Qz{QH+vKdFIp3{Hh2UenZ||7`CQ?}?VC2J_tN zdO^IjslixZQz3}Mni>rA#i}YXNwQ@Ui~2ca0Yxr&W2b#Mv%g)>XY%IXFxWEtX@~p> z=YXksGcur+@`FD>yWQcIQ{Yh!ZBSm^l+KC-fNgrq{G@SM+?T3&l z{|bn#SRLGV}Aeb~>4p<{MTX%+eje{h_o?Fa@zk`p?Uxv_e9sZvnMz z;sHs6fdzoBLuKZ|g|HVm*@fS{zcEWnBO2Vg4!5J7h*NT@*Xji4(=T($Us7N8n>Kz# z#Mt|!F*L2Z$?1Xrp#mR;Th;su%JayEJ&y>?lqQ$Z$-8)UEEr82w-bclEUttfZo20l zr1l;dy_UViY?N>C>u~yw7BGdoad^bZ0A^v87572CVS74vQTt#hp-^PIQI?hGPZux6 zG^er0udy36Nz^8}BkO-3o8r3=%RyJI_Vh;F97@N&mYe)d^B~-~LfEHP0)_Bsa1-{M zTeyPY-1UsvS?bDp+Z|exZB{aNKqw^Mr=%VTsIiHhGZPE5vvo;C zR6DgDqlHWVW{K0S9ETP8BsSBh@87ElfXn&mb8JkwMrD8%{aroA+wgPv0Z-(^$oguO zT!zC}C=_5pt=UTy?N2fgT@N-OW<-nyuuzRO{`~n3`WegoC6S%Sy>rntP%nBM zfPsAKBonU2v_K@tzrf~y7~+dHzg&tqW`aZ8h(y?@bg=_qe4$Z=BAHGatex#N-lmof zz=rEwe7+TyPt!?X2*ZkKp>Q4+{H`O^*39LiF|bZ^lb9S>r_C3V=3Bq0|CmajrqT)p zCqFuuykMMaivJ6JLUUY3@4TAF`K^a)#JMpJG|Xb+khU}$mDb`}^1Z0gJ_CtuB#H1c zc;{)cv5jUtm>=ZbI*>_pqk9IQ*&**3OT6Gq4Xg?@e4QchMdr3!pbvl|KF$LwC6`)I zH>K1|2&C*}o%iHnSoTiC*NZZE%2nRknM4^^%FjVZyqh5*{H6jwuf?67bnxvD=sVwT zEbTYC4tX&r+tjiHSsYE?Ejass0I9u}FUUsM&XYaZj&<-trM6gh z4@wovSHQk(B}kakJ7!!dj=6X#24|jzz*kp-Rm#aW!}P!4K7OW49s{!;E}YVb%N>)v zjo{`*zT*ub^=1T#lzxXMC|y+R&zd5CeiDnPet+l{+>Bkg5UU2fgFu%m5~F`%ET*sw z5)=5(IdA7EEpM#5j-!y$NL-{^eFfGZZ&u{kLr~HAA z`baYB`y6{jyU~R2Ywu;~yHkD@Wxj8`qj_RC61>CkL~3WqFP+?!I{_&yd9(l^W!Mhh$DbuwNd^V$AIxck#y}dX!xZ#sN2SY zk_ZvjfKnPobltpVYq420QS(#enW)V3aA_3npwskDgbEFpc;oX(0o>F~^A?URy`y+1 zz5r)@IuOfQ1Lk<~#w|IBQ~Fl|#l*92sKx}`{{l_f7aTk}Nj>P6iZX+zaB{`VjezAD zS~cT1yxd&Q;p03Tca3w2$;xp)m~OeiLd2Ne@=Qc@`yF!C6%6;;a7>4m;HWU~P>_QQ zwlqrot|+leFFTHNM~biArDPa`jVEBv@rI+A9?U0OjsEXL4(=)*r~W1oa7SOsn`zqE z3C#%Q$M1rmCU>0Dxs{z+&@ZR5GZT+~wW5WMb$>fGF5Cf2Vs?1XW6%@af&r#`0z4mC zJBi{9Y$poY7793xQK^0$1#V@vL4NQUw&JjsP_v0wZnrn-JN?V!M2XiV_?EE)wPU0E zD^UlOTrXIN7Pq4)N5R{m6M`4!h$DR?-T1)7)pBN0vr<*|q~L`ltdn0YCJhUoO1h{! z)PB>2G&GM@^&tLWwwz$zI~-gS$E%|yjoAuZ3RdKzKS36)&VP#85^dY_@FkX;p8XQ< ze$wr!YOpqVK_{B>@<~+J&BgBOPmqU8oz^czYhL~{B-At=Ku49@sd5mj!_XM&RO}L^ zcA8wzSBv8C{YjJuLYS{Xh7F_j)s#~Dl9wRWzg{!5Kx4MPK}_AxZ{!lZX)pGiuy*s3 z`nQw*43=iB@PNc9cVau8CIBN}6p_RlNd%D-q4k{ll5YQc(rs!vOuRWHe}j_}FD>kH=oA7c(YS88-yZM0 z8MwG&X*hqzZ!BP@{Ky?Sry#*cZwt zn&h@D;BtF&2NmM3F})>_6A9$~%(R)VSI!+&>U+(H`^E-&9W+zPOf^V@NhDBPP<#Krc3lKOZ zN+9OOVxrhrgsZxjpboB>Fz?I(VtBb%yB-XLXv5Xw2Rv9uH{VAifTejk(0kbcKw?J^ zv<250EuzsI8Ylyu40PTqjs}e+vf_x~I&+!`UtL~?^&suE(rVpIWBUj)uqCJtXks+Q ziM|smbIMTaJMJ4pj4DN3_0IV4Qr4CX2J&$0griyvfP`c;otXyS03BIOr!?jO$alH- zehsk@vl4eM$P4Ft21gS<-=8pq{S-`A^RN|%%b?ex8Q&W|?BpK7JmCX(-12^k9r2~( z><%$hBO`$$SNeX|Znk!cnNo?lBWkX|n+Q0IJq&vG+l?mBlOF{cc&QnnLC+!POTjBM zVgF(NP6b|p!R}wn0SE=%$2*EBdc}(z-agb*^H3b}9}3xzspWY6kPhtk+fUuM(8fak z)BEl36hH!SNfsTan<=K|eMlz|({>l~vB?Ot?Ij3%A8Z)zVYqSYA{{C9k_6WY_{8$> z={zOwmcL4;P0+e38?9a{9P)#sAoOr~<}X32zwSIV1VB1bOJvbV$vZ~!5h5lEY2Z1{7p4{wjO1e)^z^~D(YOZx zs(fo`e+PVO$=+IMYsilKtZ%@&1@eE2rMW|(yd}bKqzhNz4!zU#r2Py!h)x;N zT{^2+Z|%TFNrx1d_%f^I;JQ)UXu})#w0mtm8X-wCYfAfqk<7W`XWM8iJGh(HS4?pD zj?0%uNkHUb=mS6eh@e2d_&|ILjDTnAK_gCf z?Im~3OTVAt@{-DaUvS_{afJ1|Ond*Li}+HH z#+M(xaQ``Fk;}Ugl0i1-J=j2<-H5TEtwYIf4DQS1)Ei(VfDttA6+pdDV|wX8hirC* z(kKafGfgi=e5}2JQW=MMUzm6JaNd`!#3>}^P$~W!d~o2yU!`k0!(DNg>Tg1anbeOV@*5)0jv<~?h zGtASfb^`2o){X(dcbMBy+%*}Eoi^WJeROInn<)Oe56Whcb%=ZKS^`j9xyLaW-PLS= z0cf^8j<3Xq)Ku`-pP=aTn*Pl0;>}eEK#t z9_H}D-2up^Mlkt~%0maiVuimOlz8U@H8pq?SH*IPQ`l5C-9wAyv0{9z*uymqzhDub zq1i@wq1zMklBlX+k>(h%aWG19<0z1Fj-Ky*StIC;nwU2GLTHXbN}&aJFWQ$%jJQ1- zD%rH(jvuj6@b2}NG-QXw7v!BIQ9Q?h_Z|1!chJ^GbH{%Bc1t((SLf6Ic!ycg1v_*d z9~gHSLM2=AjzGy)GXSOlV24()21~Zsa+EncEFu4HL61U9*uDvEd09V$r8F)X{xc!{ ze{ms^^gHohVytY3UYMa~;Fn4Cn*DaVR{)cDAZ*`RvU!<^f zN%m&&0fAs7CP6Ogbb>GT6Klo=F-W=nfT?*7CoLVMqZW+piV9hwR}uNX-`KSHz)<1!s^wP z@*BtxHW)6b8-FxOHv{Ie#~u@|K;6;*`}NAf1=&8*v9e)8!j7z*SPD z{q|NHu=UzoD}>t;W8v}|(G3u6L0sAQM>uSM9x^EwQY27-8tz z)uikTt{9{dmr^zTz2XNMA{fRU3|wJHo9Kt38lxi)Q)-vEyrVcz(a1$#C5mP%n*8Rk z;GP^OSJG~Vv8%|}U`~A%X_w1Ot8cDG@bpd1JCSMS%GgeNVQRh~7`Po$WkbrR`3qxM zViW|t?J2npy)T=^rK%di?UTBXe$=u?k8NCS@XwlCV!Ggm7jk+-ZbROU!i`X-#Nc(D zGD<^m6B4}(mEaCKAMOFkg;$gq%&8zKXgBJE`!ki2bn#x;slkGlPSTU$33^SwAOz(* zwv7u;!q$;p4drsZ;`d5WiF^%H%PwHzcE_dc+ytcZJFn6$GdSj7BbCR^SxD?L-E-g~ zM>ralBk+*OV*DIsN=ZC;6BE{wjY$^kq+#fwlx73lg3kp|uEE~toPN85pB~V_p-=@k z34M(fKpygulVB8SDanv3JS9C~@$)p}9z7+M92z%A&o`2qK49H8>ygn13#=XDNU#d` zgXmtjsig+;O9Ua&I08Q|gljnJ@R~MGLkaIN?B`A*Ow5q{J$MiLqG1i?lMD_O?crTDkKr4$$bvC##N4bZSx05^^;bzq%!pZ#W z>n{10Po&jN;||g1aDmcKLHoij-4JnyoJ8+5xaH??$}!*utsO#b^e+!`ajPuhqhJe9 zoo}%BmnRFc47Sh>XwF(J=tFb#(9Jc5j!%ukSlU8>1z#4tpcm=K zkZ5lmcjU3~H;bdO2Vf>g$ETsC`2^Y~!1j?vd;%xxx@Ewd-qH(fLOP-6Mhs9L9~nby z44CKE=%EZmgKltb2-ymZ2CeXa{A1OlAP>nH^cb02$|tu$TBfHJohk~3{mI;*oIF=# zpqnN_rBsxC(X2=?E4>|NA<3tM{*mwF2l+`p?JY5lt>e_t;0Fev8rs3B(?u{up(4Zn zBBQw*ygW(20bn-KtAgAg#~jC8p=Ek&}*qd0+2hU8wF9;ZOBF^AYy@OLm%TZd8 z<3c;pd~Ps@HS>brV>l0cJbig4d`wSvg1WMuOM{fmS=dd|6m;3m2m6%q-e*QN^ciIrtMH z%~}!{lR~BDm~Kd^nbvC`81qW;Ds-2a6f|gHpDY)`_QRxR>Wl+<g9fh>`WD=PfmgbMx}4 z0il4u8@?wFm328oJWoC{lnA3@mpl$}uFK^1Zv=Yzd<2`kF8Og3aBSeM8SVmTQ*y~i zR5H3?EfWd_VK-2a*S|yB2;HXhekZPZkD-^TU2gR>2q0$pHekf%LddyXim0wzb@l5T zDeI-$YM@5sJ1=hbCeaJw8lgbly>U9ddNWZ^*x^SzQ0VlgAgg^bqW$^U|D&XLBntZT zR7_eS4SSMPs5akTML$4rFrSXNKrSZu+{K7;mMFD_@|lf+bx_5SOyZO~EU<>U|@Un+jhsuv(=pN%8k{T?MEt`G~0E%Qp7oEe@6R#IBJt$g{>-#}%rU;b-E49p>Hwyh)QJ4cCXh0JC<|888w4CK%{5INC{+aAM2Y6cL2bp+Z7B z)NRLJTY*-{R;e5^s1TkPfm;T^iKH_S3S8{~!(z!2Cl_KtJ0W70y4?sq&0l5%yOfMm zSc2g}C&K{Z``FWVlQ2|}9d9`bx#8EzKqq$na^80OQd9>jp;&`@ORw7cjr2yQ_*3=p zOt{3?Ft9Bx2eBo=e=Y?#Gx6f(joXM&2Q;12N|^Y8;7Pvs;ET%#)K~E4p&B+!cA!5| zS`codGZBY`S%SKVWh9l5$8Kt&A1Q*L4ww9EQ_H1De8&t}U%~8Ry5}2MA9WQ^Sb9+1 z*M(cd^51ZhhxaFG+E6mOkuB|qfuO;J+lz(0(_wmPKVByTVh(Z!AUSW(w!WhJ|3S}T z{Ll-ws5XIcY_+L}bML?iFTlp{wS%OqMF}s_X~n;Tco{g9jMMmb`erE^@6dRV)@5`d z7W5dfIfwNY{al?Rv~&lW4f(f!3s+1t2lwN}^A-D3(o*NlQRoF#+~teo$Ngx1bqr`o za5NZe-qbtvebMJBz~)cFMDzXf#klX-OBSLhBz8acn9uwe_8wu?!~UILJhtEdcp+z9 z1JRZ^KgU~B{I_nx_QxU5M!Y^jujtd8ou>hXW%KYnvHulQ5;N>|(RMCwfsOAYQZOm- z<1IvRvce@GgF(dzLcqC%O=XH|<$`A{wD;qZ&w&o$wqo3wOPCz=oPr;Jnx++bY!bHZ z%BN_+y)#%8p2Br_M+JWBAYHG%FGVkG%OJ$%`%Ly=TZ$9IukE_zze9R;gI{pR+kUjk zhu+Xuqtr=PbQ7?&khgZ$Yo*SBg;747F7yFEf$#{hNMq;~d5-HSF3w1CAv18(62XKk zn@90R-B7$dFU7^P(*Bq(Ttq_v1aSZK_bP)LE(kq-^&It7PN$?$-M059cL?_1S zo}2Ik>BPjv*=DlB_*EUexHw%S8VcIa}aFY)HCAj1Evcu0CW|PEFSn}WR&3+U$8tInh($2 z8~6n&S0Tgw@kf1bQ5*2#H1*FAIqByx zU_y3Mf$RzwPE5rMuzJdhBMZxH+(I=qzX(9+qz|Xe89fAwUu!Zo{~Ebo2U>K>xp2&J z95FJipU86@au+%td^I&z8jPfR=K;ten*qe%;=M`wdg2A$H*R?ujy2pa2c3S)MJRPc ze6y*?5PFUi@oe>8_rx#g_t2zH?0jGaBfW|ei|!T95Qm(Kx=vjc!FGc@+-V{ghHs{- z6O)VB%ikoz;|xIX;FbiC>anH~!UMst@`{1_+#1>@w?B0DAjOBWS5sdh5ev!POT7Xx(DQ5TYW8H_E$@kQ@5~=;SA% z>cvmhWEs4hz%hdAAM6Bqcp+ZBPaep-7H`+?Ono{})E3MM-9SgPv00g-ykFf&fg;HcA5)JdxsYUQEW8r{la=;eNyn_DX~#A%=iu8&x0SmAG}b| zI4XFdXnlI{!<695Lri6Nk2GTa$}s zMQ0%^92^gY2*$^mHqf?;X;7WNU>@N9TjCJ%&R1F8S0Zng1Sa8M25v3*q zX~~BgdK7FC+A-NWdY#gfld{-Z&DkXzO#7 z*n!05xxb=m6{k4MyBQduhoql)44wlgbMV-xg$Y%TWl+oj4#$S_+lMZh?$b4W-3{v2 z;naU6o-TO}@^szm0D!%1+UAI+d5s0?@HZo^CobEz#V!mn3J@5Qd6!$I$9V*QuANK6C1iI_W`@-+Me3KCAZb|-OP z7?VLOektg6ykB>7-crMw)HdA=i*Oc`$tSSr-1{K0Yy?rt_y+zh;QN2)GXuxYKSEfB zP>Zk=VJpHt2mypi2=uvXHKU#LfEmx}2=qxu+2`vRdk5hF!fu2=AUuq44+5Qsufvl* zU27Qo7$J_3+`w2S!eoS52o8jDga(9WgiQ$B5ne!e1K}+M86l3K$9iD|!UTjr16MJg zKS7|wM;!jMUm2*o?3p;VFcD z2qzFeM(9H@Vk|C4n1nDBVG%+(!UW*H1i^st`Og^p2;nV+*AaFj>_B)3;U0uWgert( z2rh&ogewt7ATWf_!N(5~x)2T_Jdf~4ghvssCm4Jl4KTJ5;Z6kl+!g>I5T+y0hdhK& z(_!22iSTb$r1?&IC=3&QBK(^bZLe1&^gSQEpHR!#=|Op$(Y_aXabW+r&wq69Kf3q- zHQk%a=B_Hc!!xh4URYjGUS3jGztU6AZXA?5yUtT4cwm7B6{*+sItoAsHvVYZrOS$|(yrOXseu6g)h!Su@8Y zIO-}_qYX!0O$7j)LS1F`9R-ZtufqL{(kGd{p%PVVR(R^`*>u7)Tdb?|RA0` zP3>EK0dsJy0|lNefF0zeMU{2+iDEXH@p{D|08AgzKO&1OS9w?tn_aW2wychi0nc#}JshzB z_TMfF9uUb6Qto2Us#+?UU$zR(ve&gvPg&gxucJ)x7O*D>!s)H46DX~MlyO{m9d{s$ zm1|3CR`cdiN9|#m0Bm-q%2#1!9T-?sw-$NdpoRXi9Gq|L??b_08t3SoRUS_*D@kBd zxpSOTUb$lB>>9Bec034 zA)+;F>IdWB)z2xk{{oL!dB8OG9Kk!+)(f6hgTQaLFPd+^XhjY%5auX@-9TMdSXZ`Y zF=W1g@extmQZv|xkol^rMWlGFie!dI6^1ruS5-pWcsh;E^4w8boxpexw5CGELM#GJ zR@AI6FM;mE4kG;lw=0QG*&Fb72?ndSOjzL^fKfCKk7wmT+Q`RrHhW1!wu4(#U=jwn z!zl?6jVj`KHQd4t=k==YmZ9lKj8UfD+-vKT7{wV+))QrC{HwSpB75HroT0v)=^V0EEFq+M4#CG z;1jp;36Rpn_!m}|Rn^?#D8nE8LJzA4dYI_Z-2;70jMANyLlk2cco@8-`m<^p5-57r z(JHI2pIco~Q*cp!2YPXoOXUys3fysA&1@SkGnfJ&>_oyST1w#Y#s_ ztyo*)sfHJ8Ua;KF_Yj5wwhH>1m@e52s!NqrHnK}7J!>Vbv4`dLTb!C|Nb$Xi*{;8)BT?$Csj4iW zRVUVav7Q)IV{UahpHT|fN89s1lZDkTp4Ps2^!`U&P|Z}rUnvb zuNGIi%Bn<|hU5L|n?0DO&QNNh=&4)Fi%CggsgZ{+4CEZ59CeE0wGQ$$P3TCnHz=h} zj9 z1sIYq2odIsJ!*>PsG_=>RdWl;^FuAX6H+{@4rbf~Q&Ch?RqlZxBhNms-!PjogQ^{& z-`*&zUV(W-uUSy#DXp%ot`wlxG@E|HkTZ86T~p;ra5I%*f*ar$urtzqB0n+nsTM%< zJ-IYd7ciH7k#p{X`Kq(|eG9DrnNWB(ucl_DSbGsJA-Rl^*e3iAUWwW$D_>n!TiLJw*mFVN z_cm>XQ*NoL!(WwL0mqfx-pOgH zX{r40Pp+sDtIFxmP6}T9=}AvLd@V~&g{90=QHFk$Tc}f2Fway!fee~rset$c2(GzU z&ymfou#|i1xh8ogS%kW^9N`b?*9K6JdwP~CxO$fQHI?uNEEDE0Sd8|l2qx20ehu~4 zURQ@^)?j@D56J>MS!<~P6-=y#r?-;w=npDRw~Q|zKc3*}w*(5-&3DdqipwW^8lY4C zII7CT>J?t9QAzqnyg->{`Azu*bEO4a5uUorinZT@xQLiATI`D!Em)-TQ-eD6w=(VJ z*H7tJAT?bnTtB6NRiOO*&DdhbbK4^PL=v9q^KlZ4=iisv@U4E}jnJwJ;TX>XvZxXHjh!i5atDS9Ti06ohPqECh1hAp}%> z@q@XKPn}MotWL0~Ga|g8l|oG|<9T8&gM8B;JLPy&Z^cVHi#*j>7cEUog>0{ZA%y9h zj4whuzCM3^Jqr3)K4i~Vdg`h@RRj7k9-26)Z*yt2T{M-ITe(k@=5B!V#P5&Z)>%Yj~iTud$>C8*aOME6|Ovg{3_NTBs|io>QbNo{yUriIk|>^{QvHm0Pliq(8vGpp8fc{ z(x~QP|35ubsNGtBSK@gQ{{TEW-_T0%|BRopG!DOJ zjh~(u@wc{a_+I=B4G{h{Xy9A$XyAMCzsu4%{JU%X--2J$y5ali2i1(=-+lMwn!)gE z)-<$!AAa;G0sroI;MV~DpZNp$!z%uFPktN!nudRYpZAwI_Z|4b{P`cs17X3ZtE-iN z{QvG5PJGmA|Nfiw%z|J;=-0ErAiYNRz$d^|{lb&Spj-SOo}_Do)C}dMbEI#iYovVq zlY*n9L7$X{@Vl_S^l6C0Y_7kz_1*i`jP>^hYEw4Ezj^ci*8cJhDGlpe-`t|6QQoj- z!-n{qtd+0Q-meN$-uqU)LWy1zuzFz6x@Uz_y zzNqwnTYvWAyRAfbYpt42@xR*|fJXGE zP3P9ESx+uRErT+(wsK{G{(=Oa=9uX#kfJE(46P~ZD7S7vF##Z#e~1LsHKd>|d`z4q z0DLPAU`ltJ66Msyx6;6Yw4!vY^$F)crA-R52A9*&4NecVpQ!(>@3r!Y$-gJs=13lX-5DbO$l>C8=RQUJ**1C{#ELI_VDYck5run$U-<+5cfbVe~?i6RYBSwwTqS*B<7=UaN<# z!QT1xgBl&ozXOIp2aR^s;E?Sxb`Nk5kyd~p9se$@W| zKbIeq8?O!zibd)0OfL@{@=Fz!EO%qwJDI`TtbDFn$>S6t)@tOCB_S#5oPKSj_m=bI+Be>p!3WzjA;^mwrT- zel3?))3nbr%!~=C2)p3ys*S2``0u_W!M&fnp0;dH?Th8wGmjTfKY4TVM+exlOCHWU zc=($76}#q5eD5>e+s}Pgv+VORtDhYv?Ea1Qd4JB-`>w8fq~cRC_Q?}HukAK|_QY$k z-wk~z{N^v0oxAlF@uN@vAe(-6UHTK}a%!jF`DO8ypZ?=Vm%4BH?D^O4{mF^vHaz$2 znrD9`^dx`TWD!q3yE}D3#krgZ7cM&fhdb(@*z^3#-|f2n^e3-1cw5I6dZ#i&&tp`@qASrdk3v+=6;w>fw?4qn7M9r)VGEa{rD$uf6JlwI#pE ze&n}JTaV9JDDQjtcYnHm_2@C3dDQT& z518jQ>72*&fB(S!W82>>8F%cPlHnh2nbV%6ODoxtU-IbG{Nd5GG~@l3|L*r&FK<5l zCCiz+6+dr*x$1E8-2tZAnw>pMubrAZ<(dbKzfJzd$hl9A^i@8yptw5}9#`bM{m$VZ zS3dCY10&zaDZH%mxA&*)IGlFF?{;{5?!Nn~2bga5ynvVKN{nGvIq&z+Y`MFwQZD$o z@}<%n9^QK3=AXi`=|T`&LjCn_a6T9gU*uC&LdNgE^u}hKX}zO zALn0vU->t)j~#pKfjhk$wmp-YKd;AmtY-1l^0Ny{EMMj?@P=g1^>>DMWX~P4X~=Jb zws}Q&-8NE_KXTkvL)x#pKR18QZ->li$sd(dcx1-in{T}D>ieCa8;*Um;0HfjeD=`= z&esY*_a3`*^x~ceW<2oV8^J$c?>&6@%j9r!)1RhZSd~@%`U9Cy{=ECeLp>i{Hsj3E zCyy6cZ=dgJJ*Ohw^!TKl~D8(3~ z8k8`_0s{a&Cz6Siqj^)t9~6C+0xh(ib`gLf`J=N+!gSXp0((H}x@zX>Ie$Wc0 zz2_|e?BgbH#sST8_99Jexqa+@qV^rHaV#3UUBM+$-xS8{-xD48i))PDD>-|=|B zdnCt@d1a5QWa0e@m!UBihPbkXmXi^R#CX`Su|FI(05<$M5g0x@N#`s!Y{3D1 z0DWOM9Nb;Yz};trQx#=XV`F1&yLP4y<)05M3;D%ZRCZF2pUeMN*UPB(c+bpGJ>KXa zU|mZx1terXO-DNejg#wr>r4rK_-WlT11x0=8jlR%;^(A{yvrUB#>zjJ4i5J}heeF( z1O_wP{4J_qv4^{(8_wU|LYU9iFgxF`&nDUdVazv&6t4NIyybnK!iDZ1iKT#L(!1+e zIA#_G7Co=7v_!j2Kn%<4CyCu)EyDU1JFYLW0(3URuKv^kP8&TG1()jj{2&6r9$I>E zo%z7v>JR6vjaI5TOxj?(&GZk-W%%UlJcUfte>YA5?CkxyR5e+o2bj>gLqM!B5rj6F zDjF!7I_)LYU`*1aViYoG`h%%~)*23Nd?^-QE{|?WS!HG6dzhHmZ_@TOLLPQpeELIqY8ar)av@*(T1$C(zr3&IR6m*N-T-FgY8%jeP^w@3D5R!xT2y*v1XEHipMr zJTh#wEiDM$!~#sQ`sp!Xkne5gHHL)(kr}n+qNzij<7_qj|aiGdFFlnB3Z1T2_x+u*o zO31*>c80cZMAmI3XxWTbh(p1pE-FG*N`kzYgkcP!Kr$_x@DEP?y>Z_^-6Rb)nmr3D z=+T@Kj@ z%dTIZzI72(f7& z(X9@by!)O<74+``CDpMAE?I;xL7^^5lLZYSEY>Z(+2w}Hn3Sf36SOT$N376|g=j|I z#t2ljq|k7fm*wgHp4^!ASU2Vk34GLb8hxaz^r=s)8E7%EIo37uufF6=qr*Auv9qrOGkq<+7}s9fm~vafX8y5<})y0uL|LKg%0g zfV{)yePRPCtR1PX0}l_Rx@SY?fvdMgiAeo;k&owNmD#7ODnyqt+soBH*dvb}feS;ePnsCZ%;6Yd0$I8}t6&q}6 z@BjPeeZIz_dN;DuGUxmK+kw#==(vpP3>XYXQU{74?ON%SSO+3cwU1*wv%#FYHO^$1 zw$~zXDXZj6wi^G5Dfp0uNy9#H1$&uhcm{EsZA|>aTFo~iS;!A}bY}npWsU5YXtYs| zqyb$p2B5xnOhiyv38RQL@+3@a3X(fCX+M`~h$M-n-PX0pKP2047Ta%o7tJiowtV*C zpn*ncA&wAnuwsmGaWxp2#z>-yNI3?iAsiZuAI&#cF&NE`6LT@X_k|VT_?T*1luS)D zN6^wxr#%FwYujbgOM6Jl9u?caVwtU2z7CRDcHpUGNjBPX~ zfhNR^3{a4mm$1l4O`)d3xZq;lFhocj1~$gq0k$@X)KVze(rq!QG^1cQyvT|n5^Xk{ zOdCTR7{t?KX^YUXAeb?L+D$Yq^CNAxlN&=r8xv_TOhX$6Hk)AE7{=0Uvq2a#NSg-J zZMNGy9~NOI3tN2#a%IbBMY^7U)T{L@~d2ROb;kN1P-dG$92<=91z1^{Y=rN{FKfgb~Qc1KZxe{Q;OtyL#$6Y-;G9Uog zc{`>`4bDpXGBG~W zJDW1kWegi%BTWW_soSCfv9vL##`=5jPi;UHG&YdfF^F`sHn@d(xqWD(FK-p54mAHC zZ9zL=vom~7uUA|Ug22Xk|7H2zz|-@UyTZq?1!OHXK{tSjp2b(bA@DHhGZFj}Bwx_$$y z7#vxEPR1}kByZdM6Ys&rAqa?|wRW6ik3G-6M|FN&O>RlHck|U&cihZboL*M(y$S)V zp>^GFdX;kc1`lEM!Rd2(>_NcTqWa?tr%B7Rf@h%cxVq<;JDHpto~oV79+kt3m^S8G zGah&;lqMl8t>v=Ig4TL=?jqF|#OzLMbiOC02iBTpCIe3{1wcswy#)!R=jeUaJXVkx5~`iRaUV?#tRT{mP?ufpWkB+% zw)dalo|>-Io&tna1W~IKKx%RhK+jIPL?HXjf(kIht=8Ad?#*X2l3EM)o#(wrTP0r- zfFP@MaNfwOAo#W1GQ9!pn4vVYE2y-rtTh1;9Du5gZPvsA&8U(b!Conu@!IBepw#{N zB3w(V1W%2;%AW#!%%?>0yv_7n{yq2e?w3hq6|W!A_eX`=B~YpYmzWv8kwm@JPcxir zfP+f9N0h8@VF7arJ=(-G5xI6`K64+(u359>)v8~=y{Pqf85N7q9G%i7rdNAGc~4jz7xxTMZxNzptwH zp`eQOarf?WhlJs9xkG@j>Kk;#JHYxTBI(wWx?-v@*f+o1bz*Kq^9^akEVTd!27VWb z8b?FKXTGOG04bp*7KJ}R)W|Umg1K^8I032@734@GiPCZJXYm;AL?93mHti0a%J7NP zhm}?3TznJwtb<0YYSRN5NgCnsQK#>pHv2^9H2p4Mcw*!0JxH$gr#PP3Ue4#KsOdLy zB40z1It!w_nt(4wuAVI48>mlMQF5rPa9Y9|a}^uHkSvoSxFIg>7>s7)Z;vXe5+Pie zg3WRm_x(muRcqf!gD@EagBfHcjf)D(C@845UJ+4D-6j{w_xN>+eK81?F{Ix*_v3*! z0p!TR?!^wcD2#&lfeeR?=QU3OAnJdwY3yV4nssL<4jWDo{pYMNSMqcKxcpca_>B~;m* zF)vvFYbedYUQ-3++R`1Gx?F>2JzmhjLv>`OEHcSqa^;4`Hrkd@E?&+d;L$;jDukD4 zhEp!X6e1$>hibB;)pOY(S??w_9ZBYT`;Ve|@XjM34GCf_?WTDkMy&lkja^=I9P3sA zprn);zF+R2H4)YtP575GCS|{FKw1dv2%a~?fu&95sWRoEVoWObVvyN|{3Sb>2?U-9zDP1zF<$EFKHg9u?q9pd zAok%6dK*6OKDDdb`HG9q+4wg=;20tm^6&CgN-$zqxcY$=sDvw5Om8yyDa*!x#c&9t zB@j}o;wKQ`5RGI~B7UT2Ob^KYhF_~S1zGbjYBUoHxA=HLhR;8vFG@WUupM21TEPV+ za=Iy`3Ap~gMB5s(E30-FR?R3Z>^h%!;GO*m2+3e3nYmWHSs$LvR=xl0z;3G(Jp?R95@1N{xD=zUbI!@@R#Y&%)u*53u6xd`WJVFT8 zT2dCW_rmTDCqvD{f|(bzx0KQiPul-exk<`Jcfryz;gT)Ow-}kZA)=2xnZ}dKvta^K1bRFN%fuk{54@ z+~$GaD@<$-k@jtbtgl^qca`o`@(8N+M-r_8Cze1qqenT?keVPs(!UxC2ms^)4&T!{gyjU_E~3eV{L^l)28E~4E8n%-teGGOhRMTL|2e=;RZmA8G|D+Stx@jN~AQgnP+&bZbeURR|6K=z7HQ_Slr@= zCzrz)0*@v9oHt1KwWMIxeLCX#4Qkkw8-2h+L_`Q@dGStQ0Q?mN?}qc{SEq?whzNxV zxRu>;=%ozMwY0{gRRh)48AXP6VT3BJ;z@Hu4J;Q0;d&fZ zV@(htzm7&OkrS3hLDlmbc!m%YmeWx*H-1or+z83Qyji>u&&7=7eP=^bN%gx-b; zP3*J#)tkk8zI;rN3gx6s!{a0tKLmx_+oA~ofp#1{mgLGl*S8kwQ2+2O^F-}Yv*O8) zLp|p4wU~YZRZu+kDZnjojjKpDAFIMP!|*iJf?5q3dl;{$yISuxhY8Fbk)NTUwGdEX zuxkfx4&7DBkSS4@D32i*=tdQriABii9t3EJfgCw#Rx*NIDuhIiC2(3?%y2>1;YpBA z@(LgXkS?Wccs2`Qw=AvOHifgcWD=qz6WW9zm4gfD_sOflWh|;lIP-yDA-k~B91U^KzwL>y#K(oGyClyJCbzNNXHQ!z7_>t>s? z5Yjj0V|ac+mXba3><6(8;%LN`St{{pSh>)qb-hrH4b$@b4u^&-xEiLS4qVCr-lmMu zsp-@-jS7FeRourmn8AxlasEYcNd@#qtH^(7_wC z-(qbfw;SD=ni-k>dIi8WW={I;ktIoNmt%9o-bCw2;Nq*yL6@W7`$ohf*N(Rdp1h

%PQw`G&P#NW(5t>@pu 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 literal 0 HcmV?d00001 diff --git a/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv.c b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv.c new file mode 100644 index 00000000..efe866e9 --- /dev/null +++ b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv.c @@ -0,0 +1,704 @@ +/* + +InstDrv.dll - Installs or Removes Device Drivers + +Copyright © 2003 Jan Kiszka (Jan.Kiszka@web.de) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute +it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; + you must not claim that you wrote the original software. + If you use this software in a product, an acknowledgment in the + product documentation would be appreciated but is not required. +2. Altered versions must be plainly marked as such, + and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any distribution. + +*/ + + +#include +#include +#include +#include "../exdll/exdll.h" + + +char paramBuf[1024]; +GUID devClass; +char hwIdBuf[1024]; +int initialized = 0; + + + +void* memset(void* dst, int val, unsigned int len) +{ + while (len-- > 0) + *((char *)dst)++ = val; + + return NULL; +} + + + +void* memcpy(void* dst, const void* src, unsigned int len) +{ + while (len-- > 0) + *((char *)dst)++ = *((char *)src)++; + + return NULL; +} + + + +int HexCharToInt(char c) +{ + if ((c >= '0') && (c <= '9')) + return c - '0'; + else if ((c >= 'a') && (c <= 'f')) + return c - 'a' + 10; + else if ((c >= 'A') && (c <= 'F')) + return c - 'A' + 10; + else + return -1; +} + + + +BOOLEAN HexStringToUInt(char* str, int width, void* valBuf) +{ + int i, val; + + + for (i = width - 4; i >= 0; i -= 4) + { + val = HexCharToInt(*str++); + if (val < 0) + return FALSE; + *(unsigned int *)valBuf += val << i; + } + + return TRUE; +} + + + +BOOLEAN StringToGUID(char* guidStr, GUID* pGuid) +{ + int i; + + + memset(pGuid, 0, sizeof(GUID)); + + if (*guidStr++ != '{') + return FALSE; + + if (!HexStringToUInt(guidStr, 32, &pGuid->Data1)) + return FALSE; + guidStr += 8; + + if (*guidStr++ != '-') + return FALSE; + + if (!HexStringToUInt(guidStr, 16, &pGuid->Data2)) + return FALSE; + guidStr += 4; + + if (*guidStr++ != '-') + return FALSE; + + if (!HexStringToUInt(guidStr, 16, &pGuid->Data3)) + return FALSE; + guidStr += 4; + + if (*guidStr++ != '-') + return FALSE; + + for (i = 0; i < 2; i++) + { + if (!HexStringToUInt(guidStr, 8, &pGuid->Data4[i])) + return FALSE; + guidStr += 2; + } + + if (*guidStr++ != '-') + return FALSE; + + for (i = 2; i < 8; i++) + { + if (!HexStringToUInt(guidStr, 8, &pGuid->Data4[i])) + return FALSE; + guidStr += 2; + } + + if (*guidStr++ != '}') + return FALSE; + + return TRUE; +} + + + +DWORD FindNextDevice(HDEVINFO devInfoSet, SP_DEVINFO_DATA* pDevInfoData, DWORD* pIndex) +{ + DWORD buffersize = 0; + LPTSTR buffer = NULL; + DWORD dataType; + DWORD result; + + + while (1) + { + if (!SetupDiEnumDeviceInfo(devInfoSet, (*pIndex)++, pDevInfoData)) + { + result = GetLastError(); + break; + } + + GetDeviceRegistryProperty: + if (!SetupDiGetDeviceRegistryProperty(devInfoSet, pDevInfoData, SPDRP_HARDWAREID, + &dataType, (PBYTE)buffer, buffersize, + &buffersize)) + { + result = GetLastError(); + + if (result == ERROR_INSUFFICIENT_BUFFER) + { + if (buffer != NULL) + LocalFree(buffer); + + buffer = (LPTSTR)LocalAlloc(LPTR, buffersize); + + if (buffer == NULL) + break; + + goto GetDeviceRegistryProperty; + } + else if (result == ERROR_INVALID_DATA) + continue; // ignore invalid entries + else + break; // break on other errors + } + + if (lstrcmpi(buffer, hwIdBuf) == 0) + { + result = 0; + break; + } + } + + if (buffer != NULL) + LocalFree(buffer); + + return result; +} + + + +DWORD FindFirstDevice(HWND hwndParent, const GUID* pDevClass, const LPTSTR hwId, + HDEVINFO* pDevInfoSet, SP_DEVINFO_DATA* pDevInfoData, + DWORD *pIndex, DWORD flags) +{ + DWORD result; + + + *pDevInfoSet = SetupDiGetClassDevs((GUID*)pDevClass, NULL, hwndParent, flags); + if (*pDevInfoSet == INVALID_HANDLE_VALUE) + return GetLastError(); + + pDevInfoData->cbSize = sizeof(SP_DEVINFO_DATA); + *pIndex = 0; + + result = FindNextDevice(*pDevInfoSet, pDevInfoData, pIndex); + + if (result != 0) + SetupDiDestroyDeviceInfoList(*pDevInfoSet); + + return result; +} + + + +/* + * InstDrv::InitDriverSetup devClass drvHWID + * + * devClass - GUID of the driver's device setup class + * drvHWID - Hardware ID of the supported device + * + * Return: + * result - error message, empty on success + */ +void __declspec(dllexport) InitDriverSetup(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +{ + EXDLL_INIT(); + + /* convert class GUID */ + popstring(paramBuf); + + if (!StringToGUID(paramBuf, &devClass)) + { + popstring(paramBuf); + pushstring("Invalid GUID!"); + return; + } + + /* get hardware ID */ + memset(hwIdBuf, 0, sizeof(hwIdBuf)); + popstring(hwIdBuf); + + initialized = 1; + pushstring(""); +} + + + +/* + * InstDrv::CountDevices + * + * Return: + * result - Number of installed devices the driver supports + */ +void __declspec(dllexport) CountDevices(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +{ + HDEVINFO devInfoSet; + SP_DEVINFO_DATA devInfoData; + int count = 0; + char countBuf[16]; + DWORD index; + DWORD result; + + + EXDLL_INIT(); + + if (!initialized) + { + pushstring("Fatal error!"); + return; + } + + result = FindFirstDevice(hwndParent, &devClass, hwIdBuf, &devInfoSet, &devInfoData, + &index, DIGCF_PRESENT); + if (result != 0) + { + pushstring("0"); + return; + } + + do + { + count++; + } while (FindNextDevice(devInfoSet, &devInfoData, &index) == 0); + + SetupDiDestroyDeviceInfoList(devInfoSet); + + wsprintf(countBuf, "%d", count); + pushstring(countBuf); +} + + + +/* + * InstDrv::CreateDevice + * + * Return: + * result - Windows error code + */ +void __declspec(dllexport) CreateDevice(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +{ + HDEVINFO devInfoSet; + SP_DEVINFO_DATA devInfoData; + DWORD result = 0; + char resultBuf[16]; + + + EXDLL_INIT(); + + if (!initialized) + { + pushstring("Fatal error!"); + return; + } + + devInfoSet = SetupDiCreateDeviceInfoList(&devClass, hwndParent); + if (devInfoSet == INVALID_HANDLE_VALUE) + { + wsprintf(resultBuf, "%08X", GetLastError()); + pushstring(resultBuf); + return; + } + + devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); + if (!SetupDiCreateDeviceInfo(devInfoSet, hwIdBuf, &devClass, NULL, + hwndParent, DICD_GENERATE_ID, &devInfoData)) + { + result = GetLastError(); + goto InstallCleanup; + } + + if (!SetupDiSetDeviceRegistryProperty(devInfoSet, &devInfoData, SPDRP_HARDWAREID, + hwIdBuf, (lstrlen(hwIdBuf)+2)*sizeof(TCHAR))) + { + result = GetLastError(); + goto InstallCleanup; + } + + if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, devInfoSet, &devInfoData)) + result = GetLastError(); + + InstallCleanup: + SetupDiDestroyDeviceInfoList(devInfoSet); + + wsprintf(resultBuf, "%08X", result); + pushstring(resultBuf); +} + + + +/* + * InstDrv::InstallDriver infPath + * + * Return: + * result - Windows error code + * reboot - non-zero if reboot is required + */ +void __declspec(dllexport) InstallDriver(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +{ + char resultBuf[16]; + BOOL reboot; + + + EXDLL_INIT(); + popstring(paramBuf); + + if (!initialized) + { + pushstring("Fatal error!"); + return; + } + + if (!UpdateDriverForPlugAndPlayDevices(hwndParent, hwIdBuf, paramBuf, + INSTALLFLAG_FORCE, &reboot)) + { + wsprintf(resultBuf, "%08X", GetLastError()); + pushstring(resultBuf); + } + else + { + wsprintf(resultBuf, "%d", reboot); + pushstring(resultBuf); + pushstring("00000000"); + } +} + + + +/* + * InstDrv::DeleteOemInfFiles + * + * Return: + * result - Windows error code + * oeminf - Path of the deleted devices setup file (oemXX.inf) + * oempnf - Path of the deleted devices setup file (oemXX.pnf) + */ +void __declspec(dllexport) DeleteOemInfFiles(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +{ + HDEVINFO devInfo; + SP_DEVINFO_DATA devInfoData; + SP_DRVINFO_DATA drvInfoData; + SP_DRVINFO_DETAIL_DATA drvInfoDetail; + DWORD index; + DWORD result; + char resultBuf[16]; + + + if (!initialized) + { + pushstring("Fatal error!"); + return; + } + + result = FindFirstDevice(NULL, &devClass, hwIdBuf, &devInfo, &devInfoData, &index, 0); + if (result != 0) + goto Cleanup1; + + if (!SetupDiBuildDriverInfoList(devInfo, &devInfoData, SPDIT_COMPATDRIVER)) + { + result = GetLastError(); + goto Cleanup2; + } + + drvInfoData.cbSize = sizeof(SP_DRVINFO_DATA); + drvInfoDetail.cbSize = sizeof(SP_DRVINFO_DETAIL_DATA); + + if (!SetupDiEnumDriverInfo(devInfo, &devInfoData, SPDIT_COMPATDRIVER, 0, &drvInfoData)) + { + result = GetLastError(); + goto Cleanup3; + } + + if (!SetupDiGetDriverInfoDetail(devInfo, &devInfoData, &drvInfoData, + &drvInfoDetail, sizeof(drvInfoDetail), NULL)) + { + result = GetLastError(); + + if (result != ERROR_INSUFFICIENT_BUFFER) + goto Cleanup3; + + result = 0; + } + + pushstring(drvInfoDetail.InfFileName); + if (!DeleteFile(drvInfoDetail.InfFileName)) + result = GetLastError(); + else + { + index = lstrlen(drvInfoDetail.InfFileName); + if (index > 3) + { + lstrcpy(drvInfoDetail.InfFileName+index-3, "pnf"); + pushstring(drvInfoDetail.InfFileName); + if (!DeleteFile(drvInfoDetail.InfFileName)) + result = GetLastError(); + } + } + + Cleanup3: + SetupDiDestroyDriverInfoList(devInfo, &devInfoData, SPDIT_COMPATDRIVER); + + Cleanup2: + SetupDiDestroyDeviceInfoList(devInfo); + + Cleanup1: + wsprintf(resultBuf, "%08X", result); + pushstring(resultBuf); +} + + + +/* + * InstDrv::RemoveAllDevices + * + * Return: + * result - Windows error code + * reboot - non-zero if reboot is required + */ +void __declspec(dllexport) RemoveAllDevices(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +{ + HDEVINFO devInfo; + SP_DEVINFO_DATA devInfoData; + DWORD index; + DWORD result; + char resultBuf[16]; + BOOL reboot = FALSE; + SP_DEVINSTALL_PARAMS instParams; + + + EXDLL_INIT(); + + if (!initialized) + { + pushstring("Fatal error!"); + return; + } + + result = FindFirstDevice(NULL, &devClass, hwIdBuf, &devInfo, &devInfoData, &index, 0); + if (result != 0) + goto Cleanup1; + + do + { + if (!SetupDiCallClassInstaller(DIF_REMOVE, devInfo, &devInfoData)) + { + result = GetLastError(); + break; + } + + instParams.cbSize = sizeof(instParams); + if (!reboot && + SetupDiGetDeviceInstallParams(devInfo, &devInfoData, &instParams) && + ((instParams.Flags & (DI_NEEDRESTART|DI_NEEDREBOOT)) != 0)) + { + reboot = TRUE; + } + + result = FindNextDevice(devInfo, &devInfoData, &index); + } while (result == 0); + + SetupDiDestroyDeviceInfoList(devInfo); + + Cleanup1: + if ((result == 0) || (result == ERROR_NO_MORE_ITEMS)) + { + wsprintf(resultBuf, "%d", reboot); + pushstring(resultBuf); + pushstring("00000000"); + } + else + { + wsprintf(resultBuf, "%08X", result); + pushstring(resultBuf); + } +} + + + +/* + * InstDrv::StartSystemService serviceName + * + * Return: + * result - Windows error code + */ +void __declspec(dllexport) StartSystemService(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +{ + SC_HANDLE managerHndl; + SC_HANDLE svcHndl; + SERVICE_STATUS svcStatus; + DWORD oldCheckPoint; + DWORD result; + char resultBuf[16]; + + + EXDLL_INIT(); + popstring(paramBuf); + + managerHndl = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + if (managerHndl == NULL) + { + result = GetLastError(); + goto Cleanup1; + } + + svcHndl = OpenService(managerHndl, paramBuf, SERVICE_START | SERVICE_QUERY_STATUS); + if (svcHndl == NULL) + { + result = GetLastError(); + goto Cleanup2; + } + + if (!StartService(svcHndl, 0, NULL) || !QueryServiceStatus(svcHndl, &svcStatus)) + { + result = GetLastError(); + goto Cleanup3; + } + + while (svcStatus.dwCurrentState == SERVICE_START_PENDING) + { + oldCheckPoint = svcStatus.dwCheckPoint; + + Sleep(svcStatus.dwWaitHint); + + if (!QueryServiceStatus(svcHndl, &svcStatus)) + { + result = GetLastError(); + break; + } + + if (oldCheckPoint >= svcStatus.dwCheckPoint) + { + if ((svcStatus.dwCurrentState == SERVICE_STOPPED) && + (svcStatus.dwWin32ExitCode != 0)) + result = svcStatus.dwWin32ExitCode; + else + result = ERROR_SERVICE_REQUEST_TIMEOUT; + } + } + + if (svcStatus.dwCurrentState == SERVICE_RUNNING) + result = 0; + + Cleanup3: + CloseServiceHandle(svcHndl); + + Cleanup2: + CloseServiceHandle(managerHndl); + + Cleanup1: + wsprintf(resultBuf, "%08X", result); + pushstring(resultBuf); +} + + + +/* + * InstDrv::StopSystemService serviceName + * + * Return: + * result - Windows error code + */ +void __declspec(dllexport) StopSystemService(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +{ + SC_HANDLE managerHndl; + SC_HANDLE svcHndl; + SERVICE_STATUS svcStatus; + DWORD oldCheckPoint; + DWORD result; + char resultBuf[16]; + + + EXDLL_INIT(); + popstring(paramBuf); + + managerHndl = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + if (managerHndl == NULL) + { + result = GetLastError(); + goto Cleanup1; + } + + svcHndl = OpenService(managerHndl, paramBuf, SERVICE_STOP | SERVICE_QUERY_STATUS); + if (svcHndl == NULL) + { + result = GetLastError(); + goto Cleanup2; + } + + if (!ControlService(svcHndl, SERVICE_CONTROL_STOP, &svcStatus)) + { + result = GetLastError(); + goto Cleanup3; + } + + while (svcStatus.dwCurrentState == SERVICE_STOP_PENDING) + { + oldCheckPoint = svcStatus.dwCheckPoint; + + Sleep(svcStatus.dwWaitHint); + + if (!QueryServiceStatus(svcHndl, &svcStatus)) + { + result = GetLastError(); + break; + } + + if (oldCheckPoint >= svcStatus.dwCheckPoint) + { + result = ERROR_SERVICE_REQUEST_TIMEOUT; + break; + } + } + + if (svcStatus.dwCurrentState == SERVICE_STOPPED) + result = 0; + + Cleanup3: + CloseServiceHandle(svcHndl); + + Cleanup2: + CloseServiceHandle(managerHndl); + + Cleanup1: + wsprintf(resultBuf, "%08X", result); + pushstring(resultBuf); +} + + + +BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) +{ + return TRUE; +} diff --git a/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv.dsp b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv.dsp new file mode 100644 index 00000000..874e66c7 --- /dev/null +++ b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv.dsp @@ -0,0 +1,110 @@ +# Microsoft Developer Studio Project File - Name="InstDrv" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** NICHT BEARBEITEN ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=InstDrv - Win32 Debug +!MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE +!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl +!MESSAGE +!MESSAGE NMAKE /f "InstDrv.mak". +!MESSAGE +!MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "InstDrv.mak" CFG="InstDrv - Win32 Debug" +!MESSAGE +!MESSAGE Für die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "InstDrv - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library") +!MESSAGE "InstDrv - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "InstDrv - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "INSTDRV_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O1 /I "C:\Programme\WINDDK\3790\inc\ddk\w2k" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "INSTDRV_EXPORTS" /FD /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib setupapi.lib newdev.lib /nologo /entry:"_DllMainCRTStartup" /dll /machine:I386 /nodefaultlib /out:"../../Plugins/InstDrv.dll" /libpath:"C:\Programme\WINDDK\3790\lib\w2k\i386" /opt:nowin98 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "InstDrv - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "INSTDRV_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "INSTDRV_EXPORTS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /entry:"_DllMainCRTStartup" /dll /debug /machine:I386 /pdbtype:sept +# SUBTRACT LINK32 /nodefaultlib + +!ENDIF + +# Begin Target + +# Name "InstDrv - Win32 Release" +# Name "InstDrv - Win32 Debug" +# Begin Group "Quellcodedateien" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\InstDrv.c +# End Source File +# End Group +# Begin Group "Header-Dateien" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Ressourcendateien" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv.dsw b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv.dsw new file mode 100644 index 00000000..b3d02f0e --- /dev/null +++ b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/InstDrv.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! + +############################################################################### + +Project: "InstDrv"=.\InstDrv.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/Readme.txt b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/Readme.txt new file mode 100644 index 00000000..e5877aa6 --- /dev/null +++ b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/Readme.txt @@ -0,0 +1,141 @@ +InstDrv.dll version 0.2 - Installs or Removes Device Drivers +------------------------------------------------------------ + + +The plugin helps you to create NSIS scripts for installing device drivers or +removing them again. It can count installed device instances, create new ones +or delete all supported device. InstDrv works on Windows 2000 or later. + + + +InstDrv::InitDriverSetup devClass drvHWID +Return: result + +To start processing a driver, first call this function. devClass is the GUID +of the device class the driver supports, drvHWID is the device hardware ID. If +you don't know what these terms mean, you may want to take a look at the +Windows DDK. This function returns an empty string on success, otherwise an +error message. + +InitDriverSetup has to be called every time after the plugin dll has been +(re-)loaded, or if you want to switch to a different driver. + + + +InstDrv::CountDevices +Return: number + +This call returns the number of installed and supported devices of the driver. + + + +InstDrv::CreateDevice +Return: result + +To create a new deviced node which the driver has to support, use this +function. You may even call it multiple times for more than one instance. The +return value is the Windows error code (in hex). Use CreateDevice before +installing or updating the driver itself. + + + +InstDrv::InstallDriver infPath +Return: result + reboot + +InstallDriver installs or updates a device driver as specified in the .inf +setup script. It returns a Windows error code (in hex) and, on success, a flag +signalling if a system reboot is required. + + + +InstDrv::DeleteOemInfFiles +Return: result + oeminf + oempnf + +DeleteOemInfFiles tries to clean up the Windows inf directory by deleting the +oemXX.inf and oemXX.pnf files associated with the drivers. It returns a +Windows error code (in hex) and, on success, the names of the deleted files. +This functions requires that at least one device instance is still present. +So, call it before you remove the devices itself. You should also call it +before updating a driver. This avoids that the inf directory gets slowly +messed up with useless old setup scripts (which does NOT really accelerate +Windows). The error code which comes up when no device is installed is +"00000103". + + + +InstDrv::RemoveAllDevices +Return: result + reboot + +This functions deletes all devices instances the driver supported. It returns +a Windows error code (in hex) and, on success, a flag signalling if the system +needs to be rebooted. You additionally have to remove the driver binaries from +the system paths. + + + +InstDrv::StartSystemService serviceName +Return: result + +Call this function to start the provided system service. The function blocks +until the service is started or the system reported a timeout. The return value +is the Windows error code (in hex). + + + +InstDrv::StopSystemService serviceName +Return: result + +This function tries to stop the provided system service. It blocks until the +service has been shut down or the system reported a timeout. The return value +is the Windows error code (in hex). + + + +Example.nsi + +The example script installs or removes the virtual COM port driver of IrCOMM2k +(2.0.0-alpha8, see www.ircomm2k.de/english). The driver and its setup script +are only included for demonstration purposes, they do not work without the +rest of IrCOMM2k (but they also do not cause any harm). + + + +Building the Source Code + +To build the plugin from the source code, some include files and libraries +which come with the Windows DDK are required. + + + +History + + 0.2 - fixed bug when calling InitDriverSetup the second time + - added StartSystemService and StopSystemService + + 0.1 - first release + + + +License + +Copyright © 2003 Jan Kiszka (Jan.Kiszka@web.de) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute +it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; + you must not claim that you wrote the original software. + If you use this software in a product, an acknowledgment in the + product documentation would be appreciated but is not required. +2. Altered versions must be plainly marked as such, + and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any distribution. diff --git a/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/ircomm2k.inf b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/ircomm2k.inf new file mode 100644 index 00000000..ccda1d87 --- /dev/null +++ b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/ircomm2k.inf @@ -0,0 +1,137 @@ +; IrCOMM2k.inf +; +; Installation file for the Virtual Infrared-COM-Port +; +; (c) Copyright 2001, 2002 Jan Kiszka +; + +[Version] +Signature="$Windows NT$" +Provider=%JK% +Class=Ports +ClassGUID={4d36e978-e325-11ce-bfc1-08002be10318} +;DriverVer=03/26/2002,1.2.1.0 + +[DestinationDirs] +IrCOMM2k.Copy2Drivers = 12 +IrCOMM2k.Copy2Winnt = 10 +IrCOMM2k.Copy2System32 = 11 +IrCOMM2k.Copy2Help = 18 + + +; +; Driver information +; + +[Manufacturer] +%JK% = JK.Mfg + +[JK.Mfg] +%JK.DeviceDescIrCOMM% = IrCOMM2k_inst,IrCOMM2k + + +; +; General installation section +; + +[IrCOMM2k_inst] +CopyFiles = IrCOMM2k.Copy2Drivers ;,IrCOMM2k.Copy2System32,IrCOMM2k.Copy2Help,IrCOMM2k.Copy2Winnt +;AddReg = IrCOMM2k_inst_AddReg + + +; +; File sections +; + +[IrCOMM2k.Copy2Drivers] +ircomm2k.sys,,,2 + +;[IrCOMM2k.Copy2System32] +;ircomm2k.exe,,,2 +;ircomm2k.dll,,,2 + +;[IrCOMM2k.Copy2Help] +;ircomm2k.hlp,,,2 + +;[IrCOMM2k.Copy2Winnt] +;IrCOMM2k-Setup.exe,Setup.exe,,2 + + +; +; Service Installation +; + +[IrCOMM2k_inst.Services] +AddService = IrCOMM2k,0x00000002,IrCOMM2k_DriverService_Inst,IrCOMM2k_DriverEventLog_Inst +;AddService = IrCOMM2kSvc,,IrCOMM2k_Service_Inst + +[IrCOMM2k_DriverService_Inst] +DisplayName = %IrCOMM2k.DrvName% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 0 ; SERVICE_ERROR_IGNORE +ServiceBinary = %12%\ircomm2k.sys + +;[IrCOMM2k_Service_Inst] +;DisplayName = %IrCOMM2k.SvcName% +;Description = %IrCOMM2k.SvcDesc% +;ServiceType = 0x00000120 ; SERVICE_WIN32_SHARE_PROCESS, SERVICE_INTERACTIVE_PROCESS +;StartType = 2 ; SERVICE_AUTO_START +;ErrorControl = 0 ; SERVICE_ERROR_IGNORE +;ServiceBinary = %11%\ircomm2k.exe +;Dependencies = IrCOMM2k +;AddReg = IrCOMM2kSvcAddReg + + +[IrCOMM2k_inst.nt.HW] +AddReg=IrCOMM2kHwAddReg + +[IrCOMM2kHwAddReg] +HKR,,PortSubClass,REG_BINARY,0x00000001 +;HKR,,TimeoutScaling,REG_DWORD,0x00000001 +;HKR,,StatusLines,REG_DWORD,0x00000000 + +;[IrCOMM2k_inst_AddReg] +;HKR,,EnumPropPages32,,"ircomm2k.dll,IrCOMM2kPropPageProvider" +;HKLM,%UNINSTALL_KEY%,DisplayIcon,0x00020000,"%windir%\IrCOMM2k-Setup.exe" +;HKLM,%UNINSTALL_KEY%,DisplayName,,"IrCOMM2k 1.2.1 " +;HKLM,%UNINSTALL_KEY%,DisplayVersion,,"1.2.1" +;HKLM,%UNINSTALL_KEY%,HelpLink,,"http://www.ircomm2k.de" +;HKLM,%UNINSTALL_KEY%,Publisher,,%JK% +;HKLM,%UNINSTALL_KEY%,UninstallString,0x00020000,"%windir%\IrCOMM2k-Setup.exe" + +;[IrCOMM2kSvcAddReg] +;HKR,Parameters,ActiveConnectOnly,REG_DWORD,0x00000000 + + +[IrCOMM2k_DriverEventLog_Inst] +AddReg = IrCOMM2k_DriverEventLog_AddReg + +[IrCOMM2k_DriverEventLog_AddReg] +HKR,,EventMessageFile,REG_EXPAND_SZ,"%SystemRoot%\System32\IoLogMsg.dll;%SystemRoot%\System32\drivers\ircomm2k.sys" +HKR,,TypesSupported,REG_DWORD,7 + + +[Strings] + +; +; Non-Localizable Strings +; + +REG_SZ = 0x00000000 +REG_MULTI_SZ = 0x00010000 +REG_EXPAND_SZ = 0x00020000 +REG_BINARY = 0x00000001 +REG_DWORD = 0x00010001 +SERVICEROOT = "System\CurrentControlSet\Services" +UNINSTALL_KEY = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\IrCOMM2k" + +; +; Localizable Strings +; + +JK = "Jan Kiszka" +JK.DeviceDescIrCOMM = "Virtueller Infrarot-Kommunikationsanschluss" +IrCOMM2k.DrvName = "Virtueller Infrarot-Kommunikationsanschluss" +;IrCOMM2k.SvcName = "Virtueller Infrarot-Kommunikationsanschluß, Dienstprogramm" +;IrCOMM2k.SvcDesc = "Bildet über Infarot einen Kommunikationsanschluß nach." diff --git a/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/ircomm2k.sys b/ao-tools/altosui/Instdrv/NSIS/Contrib/InstDrv/ircomm2k.sys new file mode 100644 index 0000000000000000000000000000000000000000..7882583beb6f8ee8d4f9da38939415a50a536adf GIT binary patch literal 30464 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 literal 0 HcmV?d00001 diff --git a/ao-tools/altosui/Instdrv/NSIS/Plugins/InstDrv.dll b/ao-tools/altosui/Instdrv/NSIS/Plugins/InstDrv.dll new file mode 100644 index 0000000000000000000000000000000000000000..482e955e5a65643662f25b0c6e7a4acbfde9dee4 GIT binary patch literal 6656 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 literal 0 HcmV?d00001 diff --git a/ao-tools/altosui/Makefile b/ao-tools/altosui/Makefile index cc9a440d..58acb26e 100644 --- a/ao-tools/altosui/Makefile +++ b/ao-tools/altosui/Makefile @@ -75,12 +75,12 @@ LINUX_APP=altosui DARWIN_ZIP=Altos-Mac.zip -WINDOWS_ZIP=Altos-Windows.zip +WINDOWS_EXE=Altos-Windows.exe LINUX_TGZ=Altos-Linux.tgz all: altosui.jar $(LINUX_APP) -fat: altosui.jar $(LINUX_APP) $(DARWIN_ZIP) $(WINDOWS_ZIP) $(LINUX_TGZ) +fat: altosui.jar $(LINUX_APP) $(DARWIN_ZIP) $(WINDOWS_EXE) $(LINUX_TGZ) $(CLASSFILES): @@ -137,7 +137,7 @@ clean: rm -rf windows linux distclean: clean - rm -f $(DARWIN_ZIP) $(WINDOWS_ZIP) $(LINUX_TGZ) + rm -f $(DARWIN_ZIP) $(WINDOWS_EXE) $(LINUX_TGZ) rm -rf darwin fat FAT_FILES=$(FATJAR) $(FREETTSJAR) $(HEXFILES) @@ -165,9 +165,9 @@ $(DARWIN_ZIP): $(DARWIN_FILES) WINDOWS_FILES = $(FAT_FILES) ../libaltos/altos.dll ../../telemetrum.inf -$(WINDOWS_ZIP): $(WINDOWS_FILES) +$(WINDOWS_EXE): $(WINDOWS_FILES) altos-install.nsi rm -f $@ mkdir -p windows/AltOS rm -f windows/AltOS/* cp $(WINDOWS_FILES) windows/AltOS - cd windows && zip -j -r ../$@ AltOS + makensis altos-windows.nsi diff --git a/ao-tools/altosui/altos-windows.nsi b/ao-tools/altosui/altos-windows.nsi new file mode 100644 index 00000000..abb0823b --- /dev/null +++ b/ao-tools/altosui/altos-windows.nsi @@ -0,0 +1,102 @@ +!addplugindir Instdrv/NSIS/Plugins + +Name "Altus Metrum Installer" + +OutFile "Altos-Windows.exe" + +; Default install directory +InstallDir "$PROGRAMFILES\AltusMetrum" + +; Tell the installer where to re-install a new version +InstallDirRegKey HKLM "Software\AltusMetrum" "Install_Dir" + +LicenseText "GNU General Public License Version 2" +LicenseData "../../COPYING" + +; Need admin privs for Vista or Win7 +RequestExecutionLevel admin + +ShowInstDetails Show + +ComponentText "Altus Metrum Software and Driver Installer" + +; Pages to present + +Page license +Page components +Page directory +Page instfiles + +UninstPage uninstConfirm +UninstPage instfiles + +; And the stuff to install + +Section "Install Driver" InstDriver + InstDrv::InitDriverSetup /NOUNLOAD {4D36E96D-E325-11CE-BFC1-08002BE10318} "Altus Metrum" + Pop $0 + DetailPrint "InitDriverSetup: $0" + + InstDrv::DeleteOemInfFiles /NOUNLOAD + InstDrv::CreateDevice /NOUNLOAD + SetOutPath $TEMP + File "../../telemetrum.inf" + InstDrv::InstallDriver /NOUNLOAD "$TEMP\telemetrum.inf" +SectionEnd + +Section "AltosUI Application" + SetOutPath $INSTDIR + + File "windows/AltOS/*.jar" + File "windows/AltOS/*.dll" + + CreateShortCut "$SMPROGRAMS\AltusMetrum.lnk" "$INSTDIR\altosui.jar" +SectionEnd + +Section "AltosUI Desktop Shortcut" + CreateShortCut "$DESKTOP\AltusMetrum.lnk" "$INSTDIR\altosui.jar" +SectionEnd + +Section "TeleMetrum and TeleDongle Firmware" + + SetOutPath $INSTDIR + + File "windows/AltOS/telemetrum-v1.0.ihx" + File "windows/AltOS/teledongle-v0.2.ihx" + +SectionEnd + +Section "Uninstaller" + + ; Deal with the uninstaller + + SetOutPath $INSTDIR + + ; Write the install path to the registry + WriteRegStr HKLM SOFTWARE\AltusMetrum "Install_Dir" "$INSTDIR" + + ; Write the uninstall keys for windows + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "DisplayName" "Altus Metrum" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "UninstallString" '"$INSTDIR\uninstall.exe"' + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "NoModify" "1" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "NoRepair" "1" + + WriteUninstaller "uninstall.exe" +SectionEnd + +Section "Uninstall" + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" + DeleteRegKey HKLM "Software\AltusMetrum" + + Delete "$INSTDIR\*.*" + RMDir "$INSTDIR" + + ; Remove devices + InstDrv::InitDriverSetup /NOUNLOAD {4D36E96D-E325-11CE-BFC1-08002BE10318} "Altus Metrum" + InstDrv::DeleteOemInfFiles /NOUNLOAD + InstDrv::RemoveAllDevices + + ; Remove shortcuts, if any + Delete "$SMPROGRAMS\AltusMetrum.lnk" + Delete "$DESKTOP\AltusMetrum.lnk" +SectionEnd -- 2.30.2