From 5325ee5eee5a67d53f3761d111902e30cbfc0ad3 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Sat, 24 Oct 2009 12:58:07 +0000 Subject: [PATCH] - Add samplify runonce.exe utility svn path=/trunk/; revision=43710 --- reactos/base/system/runonce/lang/en-US.rc | 11 ++ reactos/base/system/runonce/lang/ru-RU.rc | 11 ++ reactos/base/system/runonce/res/icon.ico | Bin 0 -> 40070 bytes reactos/base/system/runonce/resource.h | 10 ++ reactos/base/system/runonce/rsrc.rc | 2 + reactos/base/system/runonce/runonce.c | 180 +++++++++++++++++++++ reactos/base/system/runonce/runonce.h | 9 ++ reactos/base/system/runonce/runonce.rbuild | 8 + reactos/base/system/runonce/runonce.rc | 12 ++ reactos/base/system/system.rbuild | 3 + 10 files changed, 246 insertions(+) create mode 100644 reactos/base/system/runonce/lang/en-US.rc create mode 100644 reactos/base/system/runonce/lang/ru-RU.rc create mode 100644 reactos/base/system/runonce/res/icon.ico create mode 100644 reactos/base/system/runonce/resource.h create mode 100644 reactos/base/system/runonce/rsrc.rc create mode 100644 reactos/base/system/runonce/runonce.c create mode 100644 reactos/base/system/runonce/runonce.h create mode 100644 reactos/base/system/runonce/runonce.rbuild create mode 100644 reactos/base/system/runonce/runonce.rc diff --git a/reactos/base/system/runonce/lang/en-US.rc b/reactos/base/system/runonce/lang/en-US.rc new file mode 100644 index 00000000000..e5976c4cbc4 --- /dev/null +++ b/reactos/base/system/runonce/lang/en-US.rc @@ -0,0 +1,11 @@ +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +IDD_RUNONCE_DLG DIALOG DISCARDABLE 0, 0, 239, 170 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Setup" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ReactOS is now setting up the following items:", -1, 38, 8, 196, 18 + LISTBOX IDC_COMP_LIST, 36, 32, 197, 131, LBS_OWNERDRAWVARIABLE | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + ICON IDI_ICON, -1, 5, 6, 21, 20 +END diff --git a/reactos/base/system/runonce/lang/ru-RU.rc b/reactos/base/system/runonce/lang/ru-RU.rc new file mode 100644 index 00000000000..c8700bd92ed --- /dev/null +++ b/reactos/base/system/runonce/lang/ru-RU.rc @@ -0,0 +1,11 @@ +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT + +IDD_RUNONCE_DLG DIALOG DISCARDABLE 0, 0, 239, 170 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Установка ReactOS" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ReactOS настраивает следующие компоненты:", -1, 38, 8, 196, 18 + LISTBOX IDC_COMP_LIST, 36, 32, 197, 131, LBS_OWNERDRAWVARIABLE | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + ICON IDI_ICON, -1, 5, 6, 21, 20 +END diff --git a/reactos/base/system/runonce/res/icon.ico b/reactos/base/system/runonce/res/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..530f089eeb61ad0046d99edd1bc25c888838f9d3 GIT binary patch literal 40070 zcmeI5e{f#KdGA-!Ygv|L{r+i5)+%Bzw|)Mkc{pLr`oA$|Bbcdzd4Q;T zDD;=wi~CbBe;)*aIsD*ZbL8j|GxWV-GfX^j{Dc{KZp8E*>oddO=lhc<%)r+MOy6UD zX5{%1Gx*Ix(|5GbjJ_~xX3x)>nVA_g{pPfpd3(mp&d!>-cjip+yTDApF>NMZoiIaB z51D~e17`5sgJ$a2Q)cwVQ8RXS%uM`Z!c6_klo@|z+>E_EX2yRyZYE!wG?TASQtk-v zX1Jd=L*E_d{W$rD06t<4-95r_3~EbR_j|*o=aA^o0>K zMw#Q3G4(H#;G8zIU>-d?Y7X8uNS!9ki#^BFTEoY0&B z^8j_90M7_@9D(+P_(=LG>NNb^F#I1ev($N#v=h{86dc3i31vnM3gsasXuF!I3rcV^8j^*H>{VcKLCnzZ%PqEMJ&qhZVh-JV zh_*k3e9gj#aoSL_F@)SoF8b}q^!MwI$Ukn*ojb=>PXhZf$UApL{&7=WTx@D;YD{~3 zySeJBtIUoaJIwz5`%Q0euetyJ`^}?|K58C+{Bd*o^l9_-(@&cp{NM-X$3OnD`N>ay zVt)SfpPOI(>Q`oZdfJ>nf8M+cSJ>pNe4pndIp0b%;?Zkv9f zzVXnZhSOjB`Zxakkv-r1i@zBBR@YY#Ki&~5ps?Q3@9w?^^jrS4;7~*T?%gMj?b~(x z6Hh*M@{jvT|G=rL=BR)L>2EyR*iiqa8~*Uiw;sFanwCH6`{TzR`O2R>e(Uz;Y5vxZh!E$ z-@A^l*WK}%`wl;F_rC2lEt%7|9ICIWtKELj&d=XV^39v?yZ^Hf+`VgiQ?~SNx$5jt*79;=j43wyEvo-R)I74z%2I@DsP*c9W9V z)XvLLVLj;;l>WxOHBD_DJ;~1NS6~0Joi}aYw|)Qi{k3&9-SZ8$ApLb8tyc2puJ#?* zum9N2UE6Qiy}Pcqrg~3QU9%wl=4(Gv+tc0L)!Es(p?yQ=_PUyy>iYVcnt3>+Z)>x7 zt`bAGY_01_c6Dy(>}pPS_cYPTNZ+unD^9;np`*j5-+c9lYm+{CPm?9zP#Y5;Q`lhB zx3zs}qrw$eZfa^4b;x(LDSbor!v5mZuWhiQdd>Q_j-=3Zv^6Pt(}Lvl^uzQG^&8f8 zHNn-6wzk^phU%`kCPg(08=44U^648I>ejcmC!wtYrM0tgzOK4+>B%ymzM-L}xoTZY zOH1qO=IX|L(z~kIzn7lAwzgJPh~vpgpY#e#O2?Dvbk zdOE3BU#`b-GAt)p{;RDwbom&|kA5Uk-_IGdTGzLXY1cJ7KY26%UUq7dxQ7_osR_RL zkYcCGE**Gsz}cg+C$Z0DQ(F5H`&4#-Y*uf}%1)JydiasU)<%?lDmztnr?peDPh@k- zCY8-9dsVimY*N{vvUOz-%NCX$E8A3ds_b3a#j;}uPK{s>jhWuNM!+=+a@m_>)-LXQ zY}oAG?`%)mWU@<-9L3&zZp_-hvQ1@U4m~|+ZAsajvOkBhX?pJ*GkbSp`^i?s{*wJD zJ54t0iQ~?e9RZu{NZF3EGy9G?J6SgB*z?2Yij5=Kkk0;OW=eMA?$E&t>_R%>0pg>?GsKsO=7uY=3wL7|;(&VQ5z;?J`tOkb z1=7Dv`k#@0lJvhJ{clNMNBZ@orx!o7jr2Q7e>3UtBK=X)pCS#sL?G z4OW%-6I=z4_qKiE_@CZ);)y4}_?2Xje_w4ijH8=2ZTeDY!5@D9%g5SeynJPSXPBT7 zjk>e$Fz-L{g)cNe^!qn{@!?1Q;K=75O~&7M9^AC)p08s;K9bk%Z_}oh`mWlx{nr8H=8qq^W$!xwzEuRS=6zRfQ|FGIyEfghd(Vw~*LB?# z=5JM?{A-)mwRV1F`*k1PasBn%K32PKL;OAYKa57)(b7}7W$U(@&0SqckqwPaP2|6l zVy|kgYuwO?wq4V;xxU^rkoN?s{8u!#@w%?FwWh1S*=INI{f1^jM^6*XK(}vhZkd0- zZXNkM^uD>XeM4(aO;=54to<6-DYV-6&Gl{T@dqXA>gU_ny{~ic{ojVzdvwZm>stI9 zcTIU;TbnySYIxTCPHC;HUl3yS6P2sxwK{jVsxpDY*oRf6W#tP(+1iSE_@r7@ym~<> zS+n3ZhD(Z0oA9JB_tohW{_nYy7f>^ZmBiIyEaI9e`u9q!sC-%DyJ&OhXeZHgd|~z~ zJ*A1bh3NH^AI7!*6g{Q)u3oECNRODCW&XoQE?q%7#LS!cOwl!@e@GXRZ&-eH=@!yI zq-&hOM=TvidW!Uk9Xki`kq$6_s2j-nf!MmKmC-Czve z;FstIIb7c6WzzqQ^pm9j4e5VN`nbzGg*|liF5&^=qr@{r(q~tNOz<-4e@6OA(*K6^ zza@RB3L&YBhTdyGRa;w=nyluIWOr%l)pu4bd{euzpuMcSyr`)A_8V;$JFtJ^Rvxb{ zD=$jc?JK|Sle{P_Wn^c%wvTUFedWHclJ0|gUR+sOS<$e!y|k>Tw7tFjrhRpZy8Yqv z8@85~78hMzw`=!?sy&s-DoQ9UP9`fWb`+F#*A-v8bLX!1)yYJ6t$UvQ=#GN!@@vYk zz5Zhr?N=s>itY16B3ZF@+to$aBzvy?$oAs8qVn$Rls=J2T-C6-J5g6sm#Dfr`QfXJ zw=k0z78eyIDn8WMo-Dy{x3RLkyR2Z7#mUsNp}t{#SyxvHP`ZoPuGYj~SX@gB$J(7tWC-Yusay7Exm#idOl@yjT#ZQ;xu7V}c92v8O9d(7)Q8GeuZ8 ziUnDsf4`dd>G7PYG;f)9R+^v*ZOvm<#3a$rV|!wA7Z0PL^znJj&taM?@}0kAcW0Z! zQs*r{Uulj^ovWgGin%O4KWSdm9A)jw*xWSyeQe6_PGURuQJ;SMS(!ty|MFcIOc^9U zX!haTgMYZvJcke;>c;0)%v!ovj2d$ctl2t{kYqwRm7p`J>tgS9s(^I>u z9J{S>6{gzes|$KcuPEL0;VtEbs}hOU@(*oXU37&kxU2L%(N*8wlc;U4O;oHdT*a_o zo@{7oZSUyZ(6LtEi`wey*R5HUQn>c zelIT}Br2<_t7|Ntwfe4r-BSWS``&+FvkG%33=GDFt61g_!)lGqvEe!#*rQ>ZxBbMW zhJMD*bL`)F3;(XhS=kB?5DTp3z|H&uA756&3J2bw9KeT;OC4(uBaIK{9QQI7-}8X? zo}%%yIy0Q1f)?saxig!v-z(XQh1Dt%YpB4+n^tSi?6G`>?HyU1c6jz{&#~%vh&@Ij)%yB(}e?8;wN>)+}&EfQLm0)>aTCc}5ls z4iCPXeDJUZ&Nq_-Bgqk-H-$%F;EV;s;t6}>SYiPZcvxqlh2t?^@@dFH-_}Ih8JzU~BcvwDS$EKV#IYUM~4p<5v_8O|C z91_61WAV_(ZMS0AAsZiQ5w;$(^N^1RGcM+U=hbn>fkjy)JhQVAXW}>7FzSVejil_6 zgfU{vJL=zT57p=GY4%r!!t>e$`zMhfc2BZ-l65iU84p{C=NIFw&M`#De#sv4#KWdk z_IZjq4$S!(mcH2W$%aq%paO~Z0>6gnZw?_vfMFdEj z(1<=>kmCGdV=c_EBBNn}A%Z1D20a!U`LJD;-KyGfYev|z%5Gh?9e7?Gu`M+Q7?w7{ z!$Pa}ux1Y#@OWTxJU9|1Ffhk~d3zeyDdV2{&MRYVr*&Xl`*P1lUDi?Ab}Kx;7-y}N zHU$s$kS{WO$P*7l9CO5(w`b_}5LcgKxO;g_TYkNyxf_tMZp#*72L?`(o+>OC9{A%% z?-0xzG}aXSp$o$bwk)$_*=|@KVaqZ*mc^VGN7$|mXCg4v0wVeF2jcECFGa62e9iYS zAi$RaB&0HYq9i{oepr#37Oxb3d5*VwHP=(w>VxD*qQTD3CZE?nf zq4P4lh(*r}4+{tmlH&;jf*Ye;6H^zmFFJ+gi3cgA$=FIyP1UB%cNPr%aUbSQ$&zMI z@yBt)VbI{I;Zq@ZW6|wGJa%M=Hx~DHv;X}3&JfL3e+mj)iiwHo$pX+IY*if%?~F6_ zBd;#17udj9p}Ca>k(^-x9*4@dNID)^#4!X;A;2OhIT^u(cq}*KV92%T@#j zeO?%4w&ue$xoDx}Vpi7Yc=%zeW(_I)Jfy`WCR+JrYv4_P2M?75Sc@?M3nA~S>r3c{==uf^=fV(`P4;`eoA(Qs`5VPTg4g9G!tP0GEw{W@?#(M_$Vqa2`je^+0LC;8pp~GFCzKt;a2@ zf=&!s`f%PmCanJ*R~IgC7D&D?hO+>Gm(YTjkK1{B(^(YKrwI3n;fFaOm%eTnS@FPf zh)8FM z+34e`3BlVc=#-VG?}+2XfqQtmIY^~*RAz*eRPu439mOf{h?6p-w-o-!6BPT*^Z&Uq zxrah$x^-S#&o#%lC<~9aTjbybm#m#PrfK4g{D~9iKElsYF<|qAzs`T>1_#`}NRe~1 zI%^8>2zEMgo(RA575XaJQ)!_im6K`ECojo>$6xv5UY&rS&K`rl3)#BxJbmwx95^+? z0XX;J6dVblHc#Ao9w{`W&kE=}bJ@Tz!0+ipDsHrc7Hn$bsGGof>w|X55VPF$oj)by zl3gT=)8`)kV`ETm2-|v-!LR3wjh|HC(U1N@B!xa-VKVqN=6idF0SDMT&pke;(#kNnGQIa-Q? z0Jd-zIR6iviQui=EQtfoKJ$P7v(H~SJLO#QlB%%mi8-UB9`s1)u+x#PB?hu^;E7p) z+1w3K3@mJu!W)=BHM%hKl$z#u+Ibb}KbjC{W|&{n#hzXL@ec>F*jN@3VSs`T;~Nyf z#^B~m3C?Nhn3fMv0CO}9a>9!PUTiyXNFpNIQG|hWR_nyfT+H2|VsP+ebi@FagNfCB zs5^(^2A=!+X~OJ(A;8VA)lYasRP ztTb@y$bH16kWQoAH!9_LtD*ko@(E!O!i?!7**>W6f^h6x@HYj8FZ{A7U$ zf`nd8UATe04hGzVhw)|I1$3wgrxnczkT}XnVnoGBOVmK%1PO8_af;a;j*io{s5N+; zEx_>-NP&un0OO;ov9fECa7a?WITs6YI#7cZj*de`1vz^O1c^7oaDI;CmptSECK+R7 zLV0$0_zRx6?g0kWJbJgAdAZ>$52;sXI$jfl4{(%B6SRlD|0y zN3xL7rFU&idY)t(1Q`bz1mo$+wdi0Mrq6p&TaZ4F!ONx3e~^l&Uwkl{olQxf(#hdK ze9)mO!}NYo$T7Ika3toF=O7YKpU+_7(!1`*eeMx~X$d5exN@Jn^T!jrTs+C~i759+ zclqCBKmU`oMEbk)r?rxDg#+&+4wQgJ$A&dwbcFE=u9>3VE1l9S-{lCR8^@&beDwHq z-Add++)F%Y5~g?W{=I|DOcQAP+SeQ?a<3?jd;H)n2TyQoQvAqwxe7s*L5PlD@T^+*d|f?s*N*6j$;KJ#>yBul_gn_ z{uN=@(JUUM@tu`Bi=87{0nUejLoI=v0cr=_2kIl!dvDw;8CWcMd8rc5g;{*a7C8>Y zGWJMX#3H85!5DU`z)3ESas{l|S>Ah@QD5LdPQW3mfaO83gZ~wWpM}VP#UA)W9XKes z7@4>p|5KK)EHql2oXZM?og-rbXU4!U z85$4tUieup4DhrBID#`TSf$sf#LG_{cj|p6{G2Isa^rC$HyU>|=J1>Lk?eE23>hEA z<1!j>z%1Z+nT_+<>Br)|@Y5$WzJ_g(*IZ!nQ)VjW_;-$@ERcQ9H_&Hw1})^dJ4(q| z32sHk9S(j)Cv z?*fkBxq2j+pN=Cp!Vh*1;aR@Nv5S^yFO~l)+s6g{069vPAIU#w^emqu?C?(Vt8q*C zHHL5)EnwS*>$|iC2lfK?RajZK{lkuz^L!UA@m^Qte>PoO(w}(w@z^t6Q}Jv3;Y^<^ zOMDl0@gDq|^Q0fMf5qwpy0WRl$`o6DoQy=Wg1lIn;VSH*t}Pxg2jn$}T?~HpLCyf$ zc231ET})%TZ3Fl({J2V@I(S)8fA{l+mqGDfvO{{=2I2BVI?v-zE(X8)p=5|dgO+br z-r$+XF8=!{{nGXau6kz2mypjMuN{LKhxJ`ivV;6DY5ui*4CNqIhB#iBHjZcx=8&On z^GI%_%SfjQvD&$n_K-~3`5gJO<4epYv*Uo~5TeFp^3H*Me$^|^>f#0c*^1(0LNM&S-Dp$6;`l#>A z!tC*Tx$)RN|Kr&8OxWqOOTw~Z|QOn;5bQ!f6;+eG7_+5z3sjyY-v(Tijq+)AVRsGlpHuHs>;T;%)R^WWpnbj=sP zuZ!?XenLGyoPV7UOPFQn>b=@QI{5nyzpqC=*A@J3{8Yb+V%Yz@EG<=j^5MHrvuym2 z<4?K&pyT&GP0zFCyuKIwU%{Vw?p8Z42mdt=Ys`-NZ;JeTyTa=&Ij_2kEp>OH>D>&?T@Y?Ii@ER=tHPbn0`~T0KgDsSofuB4|f4&j6B#C>7 z1@_LE{=7VlWLOEgIN;aP{Z(Am9*9hPN3=h}@9|hF_w9N&`K7OjeteILFU##oNth$} zko99$+Cy&jOzCU*P2`)M;6I1bo)zt7Q9jYj8rUN;M4YtoZm#ojO1l!HcxUf4dvSES zVAlG%u>q`)UTdQ4eUaZ@{wU!I^{;6PU2MNd6~1#F07$b5IH`@lZfZf~(6C(tkxipL zAX>xsWk-8ISOd}epnORDuCmrRvbBTdxBS`GpDCYaEOL^YUN*m{gVWsBM{fJ0*5c(8 z*P0~tw*GakE2;kY3$=!AG0-OPBG)=~3B1%9P3M0PufoAe?*--Sw70EyxF&7)F!=oo z)LHu!?A`_W_pOha^v~KZ8Cj1@+POdwDh3fxe?)LX(#;@`EbC})M*_SQf zw0I(!6K}Qts(#?t{=C0Lbyr_z49I$-&eos0+4X=J4>;)_@n3DsX?I(9(Nq7j>tI~% zIt+N!e%=qG^8K14_%tVItjib{l<#qH9XK@-a1K6-oQAjMs+{z35K8$wF0A5=el$=tojcRu=t9+kU?ZbM{qU)3@-}|9$8-zSi zS)Nw>s`6y>3tv=c&0n;&%D3QOPP_}?3+q5uruY>B zbe_J8_Nywd{DRu+4NdtSrNieHJO+Mdz^>V94RondYuo&8(vr*e0EL05{F4_OWkZOL zr@3-{|8c$l!zOJ}p?MYD=1pMmUt`QQ7XJuN-O2JA+S z;nGty)_Yw?-=#;W?~+G-H>v|ar=atdDt|%bxzbx5$kX=wT|I5pM{|hgaXsTV7lK0% z9@g1~h`#8mzVW$-UteJC)>@tY{ROuNoB3SWl}=|OtlrHYPSLiuCc2vH!Mrg`8RC-- zqAy)I(i73$#81xV^K8n|rhL)%^R2hBRhD!sm7#h_*Fz_qA3$!}sqgkQR@Vu;`U{K9;D+PRu?Gzalh4mPSB z)kVBgUaPCZBduR$rB6BzFbAH#mlb}R!SY`8b*6=%d9Zx6^uaIMs-x>BM(rUy(2w@bd;WO(y2@5p`|^7bHocyShP9Kz zb`+nju1=Z!GK9Sk>*?lw%|Tx@ zJZ)Vw;a{|zMd+)YBnOHrL-k#1%)+0oo=0}fMaGtLRllIkrbUAo$-U>lu6nNbzJIB` z@`}hS_0=i*th9YOzKk%fm4zkTXTJW9bsziOk4?JfGe?PrX!-KJOew#fFE$5h9?~3?nqPF5GRH*u z;g6Sbm7nh%l9nGjOPM2levO@q!l3f~7`@mWkeXjK@*d-9+f4aYe(IPfzNU`hlCda% zI6g~;@)@HgOUkQwF=KFQ{-utwvHVLOL)DLjo33c}eeRbuM#l5{?(Avk-D1&~>+@dB LwZFjqAHx414x=ET literal 0 HcmV?d00001 diff --git a/reactos/base/system/runonce/resource.h b/reactos/base/system/runonce/resource.h new file mode 100644 index 00000000000..826805f9cc3 --- /dev/null +++ b/reactos/base/system/runonce/resource.h @@ -0,0 +1,10 @@ +#ifndef _RESOURCE_H__ +#define _RESOURCE_H__ + +#define IDI_ICON 10 + +#define IDD_RUNONCE_DLG 100 + +#define IDC_COMP_LIST 1000 + +#endif /* _RESOURCE_H__ */ diff --git a/reactos/base/system/runonce/rsrc.rc b/reactos/base/system/runonce/rsrc.rc new file mode 100644 index 00000000000..fec3f94c263 --- /dev/null +++ b/reactos/base/system/runonce/rsrc.rc @@ -0,0 +1,2 @@ +#include "lang/en-US.rc" +#include "lang/ru-RU.rc" diff --git a/reactos/base/system/runonce/runonce.c b/reactos/base/system/runonce/runonce.c new file mode 100644 index 00000000000..3bd60518c94 --- /dev/null +++ b/reactos/base/system/runonce/runonce.c @@ -0,0 +1,180 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS runonce.exe + * FILE: base/system/runonce/runonce.c + * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org) + */ + +#include "runonce.h" + + +static +DWORD +WINAPI +StartApplication(LPVOID lpDlg) +{ + HWND hList = GetDlgItem((HWND)lpDlg, IDC_COMP_LIST); + INT Index, Count = SendMessage(hList, LB_GETCOUNT, 0, 0); + PROCESS_INFORMATION pi; + STARTUPINFOW si; + TCHAR szData[MAX_PATH]; + + for (Index = 0; Index < Count; Index++) + { + SendMessage(hList, LB_GETTEXT, Index, (LPARAM)szData); + + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + si.wShowWindow = SW_SHOW; + + if (!CreateProcess(NULL, szData, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + continue; + + WaitForSingleObjectEx(pi.hProcess, INFINITE, TRUE); + + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + + RegDeleteKey(HKEY_LOCAL_MACHINE, + _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce\\Setup")); + + PostMessage((HWND)lpDlg, WM_CLOSE, 0, 0); + + return 0; +} + +static +VOID +InitDialog(HWND hDlg) +{ + TCHAR szAppPath[MAX_PATH], szData[MAX_PATH]; + DWORD dwIndex, dwSize, dwType, dwData, dwThreadId; + HKEY hKey; + + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, + _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce\\Setup"), + 0, + KEY_QUERY_VALUE, + &hKey) == ERROR_SUCCESS) + { + for (dwIndex = 0; ; dwIndex++) + { + dwSize = sizeof(szAppPath); + dwData = sizeof(szData) / sizeof(TCHAR); + + if (RegEnumValue(hKey, + dwIndex, + szAppPath, + &dwSize, + NULL, + &dwType, + (LPBYTE)szData, + &dwData) == ERROR_SUCCESS) + { + if (dwType != REG_SZ) continue; + + SendMessage(GetDlgItem(hDlg, IDC_COMP_LIST), LB_ADDSTRING, 0, (LPARAM)szData); + } + } + + RegCloseKey(hKey); + } + + CloseHandle(CreateThread(NULL, + 0, + StartApplication, + (LPVOID)hDlg, + 0, + &dwThreadId)); +} + +static +INT_PTR +CALLBACK +RunOnceDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + switch (Msg) + { + case WM_INITDIALOG: + InitDialog(hDlg); + break; + + case WM_CLOSE: + EndDialog(hDlg, 0); + break; + } + + return 0; +} + +INT +WINAPI +_tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdShow) +{ + LPCTSTR lpCmd = GetCommandLine(); + TCHAR szAppPath[MAX_PATH], szData[MAX_PATH]; + DWORD dwIndex, dwSize, dwType, dwData; + PROCESS_INFORMATION pi; + STARTUPINFOW si; + BOOL bRunApps = FALSE; + HKEY hKey; + + while (*lpCmd) + { + while (*lpCmd && *lpCmd != _T('/') && *lpCmd != _T('-')) lpCmd++; + if (!*lpCmd) break; + if (*++lpCmd == _T('r')) bRunApps = TRUE; + lpCmd++; + } + + if (bRunApps) + { + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, + _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce"), + 0, + KEY_QUERY_VALUE, + &hKey) == ERROR_SUCCESS) + { + for (dwIndex = 0; ; dwIndex++) + { + dwSize = sizeof(szAppPath); + dwData = sizeof(szData) / sizeof(TCHAR); + + if (RegEnumValue(hKey, + dwIndex, + szAppPath, + &dwSize, + NULL, + &dwType, + (LPBYTE)szData, + &dwData) == ERROR_SUCCESS) + { + RegDeleteValue(hKey, szAppPath); + + if (dwType != REG_SZ) continue; + + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + si.wShowWindow = SW_SHOW; + + if (!CreateProcess(NULL, szData, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + continue; + + WaitForSingleObjectEx(pi.hProcess, INFINITE, TRUE); + + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + } + + RegCloseKey(hKey); + } + + return 1; + } + + DialogBox(hInst, MAKEINTRESOURCE(IDD_RUNONCE_DLG), NULL, RunOnceDlgProc); + + return 0; +} diff --git a/reactos/base/system/runonce/runonce.h b/reactos/base/system/runonce/runonce.h new file mode 100644 index 00000000000..6fb2b59bd64 --- /dev/null +++ b/reactos/base/system/runonce/runonce.h @@ -0,0 +1,9 @@ +#ifndef _RUNONCE_H__ +#define _RUNONCE_H__ + +#include +#include + +#include "resource.h" + +#endif /* _RUNONCE_H__ */ diff --git a/reactos/base/system/runonce/runonce.rbuild b/reactos/base/system/runonce/runonce.rbuild new file mode 100644 index 00000000000..78e732a3453 --- /dev/null +++ b/reactos/base/system/runonce/runonce.rbuild @@ -0,0 +1,8 @@ + + . + advapi32 + kernel32 + user32 + runonce.c + runonce.rc + diff --git a/reactos/base/system/runonce/runonce.rc b/reactos/base/system/runonce/runonce.rc new file mode 100644 index 00000000000..493ce7df7b1 --- /dev/null +++ b/reactos/base/system/runonce/runonce.rc @@ -0,0 +1,12 @@ +#include "runonce.h" + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Run Once Wrapper\0" +#define REACTOS_STR_INTERNAL_NAME "runonce\0" +#define REACTOS_STR_ORIGINAL_FILENAME "runonce.exe\0" +#include + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +IDI_ICON ICON DISCARDABLE "res/icon.ico" + +#include "rsrc.rc" diff --git a/reactos/base/system/system.rbuild b/reactos/base/system/system.rbuild index 61a76f48c95..8dd6d2aa0a4 100644 --- a/reactos/base/system/system.rbuild +++ b/reactos/base/system/system.rbuild @@ -25,6 +25,9 @@ + + +