From djberg96 at gmail.com Thu Nov 1 21:22:45 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Thu, 01 Nov 2007 19:22:45 -0600 Subject: [Win32utils-devel] Win32::Daemon rewrite? Message-ID: <472A7BE5.70301@gmail.com> All, Now that we have callback support, and with the recent additions to the Windows::Synchronize and Windows::Thread modules in the windows-pr library (in CVS), is there any reason Win32::Daemon can't be made pure Ruby? Regards, Dan From djberg96 at gmail.com Sat Nov 3 09:37:02 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Sat, 03 Nov 2007 07:37:02 -0600 Subject: [Win32utils-devel] Service.services bug (pure Ruby version) Message-ID: <472C797E.5030403@gmail.com> Hi all, I've hit a curious bug in the Service.services method. This is in the pure Ruby version in CVS. Check it out and run this snippet: Service.services{ |s| p s.service_name p s.display_name } That will segfault after about 14 entries for me. It appears to be a problem with memcpy on line 658, but I couldn't tell you why. The interesting thing is that the more I use 'puts', the less likely this error is to occur. To show you what I mean, try this snippet: Service.services{ |s| puts s.service_name p s.display_name } That gets further, but will still segfault. Now try this: Service.services{ |s| puts s.service_name puts s.display_name } That one gets me through all services without segfaulting. I know I've seen various reports over the years of a 'puts' that made bugs mysteriously disappear, so I'm wondering if I've hit upon something. Can anyone tell me what's going on? Thanks, Dan From phasis at gmail.com Sat Nov 3 12:37:54 2007 From: phasis at gmail.com (Heesob Park) Date: Sun, 4 Nov 2007 01:37:54 +0900 Subject: [Win32utils-devel] Service.services bug (pure Ruby version) In-Reply-To: <472C797E.5030403@gmail.com> References: <472C797E.5030403@gmail.com> Message-ID: Hi, 2007/11/3, Daniel Berger : > > Hi all, > > I've hit a curious bug in the Service.services method. This is in the > pure Ruby version in CVS. Check it out and run this snippet: > > Service.services{ |s| > p s.service_name > p s.display_name > } > > That will segfault after about 14 entries for me. It appears to be a > problem with memcpy on line 658, but I couldn't tell you why. > > The interesting thing is that the more I use 'puts', the less likely > this error is to occur. To show you what I mean, try this snippet: > > Service.services{ |s| > puts s.service_name > p s.display_name > } > > That gets further, but will still segfault. Now try this: > > Service.services{ |s| > puts s.service_name > puts s.display_name > } > > That one gets me through all services without segfaulting. > > I know I've seen various reports over the years of a 'puts' that made > bugs mysteriously disappear, so I'm wondering if I've hit upon > something. Can anyone tell me what's going on? > > Thanks, > > Dan The segfaulting is due to the memcpy in service.rb dep_buf = 0.chr * 260 memcpy(dep_buf, config_buf[24,4].unpack('L').first, dep_buf.size) dependencies = dep_buf.split("\000\000").first.split(0.chr) Here is an agly but working code: dep_buf = "" psz_depend = config_buf[24,4].unpack('L').first while psz_depend!=0 char_buf = 0.chr memcpy(char_buf, psz_depend, 1) psz_depend += 1 dep_buf += char_buf break if dep_buf[-2,2]=="\0\0" end dependencies = [] if dep_buf != "\0\0" dependencies = dep_buf.split("\000\000").first.split(0.chr) end Regards, Park Heesob -------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/win32utils-devel/attachments/20071104/58155fa9/attachment.html From djberg96 at gmail.com Sat Nov 3 21:12:46 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Sat, 03 Nov 2007 19:12:46 -0600 Subject: [Win32utils-devel] Service.services bug (pure Ruby version) In-Reply-To: References: <472C797E.5030403@gmail.com> Message-ID: <472D1C8E.1050109@gmail.com> Heesob Park wrote: > The segfaulting is due to the memcpy in service.rb > > dep_buf = 0.chr * 260 > memcpy(dep_buf, config_buf[24,4].unpack('L').first, > dep_buf.size) > dependencies = dep_buf.split("\000\000").first.split(0.chr) > > Here is an agly but working code: > > dep_buf = "" > psz_depend = config_buf[24,4].unpack('L').first > while psz_depend!=0 > char_buf = 0.chr > memcpy(char_buf, psz_depend, 1) > psz_depend += 1 > dep_buf += char_buf > break if dep_buf[-2,2]=="\0\0" > end > dependencies = [] > if dep_buf != "\0\0" > dependencies = dep_buf.split("\000\000").first.split(0.chr) > end > > Regards, > > Park Heesob Excellent, that works, thanks! It does seem like there ought to be a more efficient way, but we can worry about that later. Thanks, Dan From djberg96 at gmail.com Thu Nov 8 22:28:19 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Thu, 08 Nov 2007 20:28:19 -0700 Subject: [Win32utils-devel] RubyConf 2007 - Thoughts? Message-ID: <4733D3D3.9080502@gmail.com> Hi, For those of you that attended RubyConf 2007, what were your impressions? Any more thoughts on JRuby, Rubinius, IronRuby or Wuby? Regards, Dan From djberg96 at gmail.com Fri Nov 9 12:31:54 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Fri, 09 Nov 2007 10:31:54 -0700 Subject: [Win32utils-devel] [Fwd: win32-service problems with patch] Message-ID: <4734998A.5010403@gmail.com> All, I've been tinkering with Kevin's patch. Seems to work much better as far as service control goes. The only thing that initially concerned me was the service_init code, but doing a 10 second sleep caused no problems in testing. Unless there are any objections, I'm going to put out win32-service 0.5.3 this weekend. This will be the last C version I put out. The next version will be 0.6.0, and will be pure Ruby (and is partially complete). Regards, Dan -------------- next part -------------- An embedded message was scrubbed... From: Kevin Burge Subject: win32-service problems with patch Date: Thu, 07 Dec 2006 07:45:12 -0600 Size: 17686 Url: http://rubyforge.org/pipermail/win32utils-devel/attachments/20071109/255e9e41/attachment-0001.eml From phurley at gmail.com Sun Nov 11 11:00:07 2007 From: phurley at gmail.com (Patrick Hurley) Date: Sun, 11 Nov 2007 11:00:07 -0500 Subject: [Win32utils-devel] RubyConf 2007 - Thoughts? In-Reply-To: <4733D3D3.9080502@gmail.com> References: <4733D3D3.9080502@gmail.com> Message-ID: <554ac39c0711110800p35119362n7483077b50135967@mail.gmail.com> On Nov 8, 2007 10:28 PM, Daniel Berger wrote: > Hi, > > For those of you that attended RubyConf 2007, what were your impressions? > > Any more thoughts on JRuby, Rubinius, IronRuby or Wuby? > > Regards, > > Dan > _______________________________________________ > win32utils-devel mailing list > win32utils-devel at rubyforge.org > http://rubyforge.org/mailman/listinfo/win32utils-devel > JRuby is moving ahead with amazing speed. There current version appears to be on par or slightly faster than MRI, and their beta compiler will provide additional speed and the ability to lightly hide Ruby code for commercial deployment. Rubinius is a sound approach and appears to be gaining a relatively large community, but it remains a work in progress -- I have high hopes, but there is a lot left to do. IronRuby is still pretty early in its cycle as well, it appears to be the long term best choice for Windows and Ruby, but is at least a year from being usable (my wild guess not theirs) - it is encouraging that they have a reasonable license and are hosting on RubyForge, but it does not appear that they much community support yet (I guess microsoft has to work to gain open source developer trust, go figure). My overall impression is that for long running (non-script) applications JRuby is pretty much ready and developing rapidly. For everything else we still have one real Ruby. 1.9 is scheduled for Christmas this year, but Matz hedged his bets on its stability, but still encouraged everyone to use it, as without users it will never get stable. As for Wuby, as a packaging -- basically taking the one click installer, adding in some of the Win32 gems and possibly building with a recent version of VC (along with building all of the open source support libraries as well). That may have some value, but in the long term IronRuby is probably a better bet -- but that is at least a year off. pth From djberg96 at gmail.com Sun Nov 11 11:49:39 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Sun, 11 Nov 2007 09:49:39 -0700 Subject: [Win32utils-devel] RubyConf 2007 - Thoughts? In-Reply-To: <554ac39c0711110800p35119362n7483077b50135967@mail.gmail.com> References: <4733D3D3.9080502@gmail.com> <554ac39c0711110800p35119362n7483077b50135967@mail.gmail.com> Message-ID: <473732A3.1040304@gmail.com> Hi Patrick! Patrick Hurley wrote: > On Nov 8, 2007 10:28 PM, Daniel Berger wrote: >> Hi, >> >> For those of you that attended RubyConf 2007, what were your impressions? >> >> Any more thoughts on JRuby, Rubinius, IronRuby or Wuby? >> >> Regards, >> >> Dan >> _______________________________________________ >> win32utils-devel mailing list >> win32utils-devel at rubyforge.org >> http://rubyforge.org/mailman/listinfo/win32utils-devel >> > > JRuby is moving ahead with amazing speed. There current version > appears to be on par or slightly faster than MRI, and their beta > compiler will provide additional speed and the ability to lightly hide > Ruby code for commercial deployment. I have two problems with JRuby. First and foremost is the complete lack of an FFI. The whole "Just rewrite it in Java!" mentality that some people have is simply impractical. Second, the spec is nowhere near as complete as they would have you think. Check out my personal test suite: cvs -d :pserver:anonymous at rubyforge.org:/var/cvs/shards login cvs -d :pserver:anonymous at rubyforge.org:/var/cvs/shards checkout ruby_test Then try running JRuby against it. And then consider that I've explicitly commented out some tests for JRuby because it doesn't support certain methods. Like most of the Process module functions, for example. > Rubinius is a sound approach and > appears to be gaining a relatively large community, but it remains a > work in progress -- I have high hopes, but there is a lot left to do. I really, really, really wish Evan hadn't gone this route. Sydney was so promising, and actually had some cool new features. I don't see any practical advantage to targeting a two year old spec. Nor do I see Windows support materializing in the next year. Or two. > IronRuby is still pretty early in its cycle as well, it appears to be > the long term best choice for Windows and Ruby, but is at least a year > from being usable (my wild guess not theirs) - it is encouraging that > they have a reasonable license and are hosting on RubyForge, but it > does not appear that they much community support yet (I guess > microsoft has to work to gain open source developer trust, go figure). Yeah, I actually considered applying for a position working with John at one point, but I just can't bring myself to work for Microsoft. I have considered applying for 501(3)(C) status for the Win32Utils project, and seeing if Microsoft would contribute. > My overall impression is that for long running (non-script) > applications JRuby is pretty much ready and developing rapidly. For > everything else we still have one real Ruby. 1.9 is scheduled for > Christmas this year, but Matz hedged his bets on its stability, but > still encouraged everyone to use it, as without users it will never > get stable. I'm really not too happy with what I'm hearing about 1.9. So, we've added a VM, and a GIL. And a bunch of highly dubious methods to the core classes. I just don't see the ROI, especially when I think we simply could have made some really good improvements in the 1.8.6 branch. Anyone remember Eric Mahurin's array.c patch? I still want to get that into the 1.8.x branch. http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/5861 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/5869 And I've seen some interesting work on the garbage collector: http://izumi.plan99.net/blog/index.php/2007/10/15/making-ruby%e2%80%99s-garbage-collector-copy-on-write-friendly-part-6-final/ > As for Wuby, as a packaging -- basically taking the one click > installer, adding in some of the Win32 gems and possibly building with > a recent version of VC (along with building all of the open source > support libraries as well). That may have some value, but in the long > term IronRuby is probably a better bet -- but that is at least a year > off. I'd like Wuby to be more than packaging, though. I'd like complete rewrites of some of the core classes. Any, thanks for your input Patrick. Much appreciated. Regards, Dan From Daniel.Berger at qwest.com Tue Nov 13 16:11:38 2007 From: Daniel.Berger at qwest.com (Berger, Daniel) Date: Tue, 13 Nov 2007 15:11:38 -0600 Subject: [Win32utils-devel] win32-api idea - wide method first based on $KCODE Message-ID: <7524A45A1A5B264FA4809E2156496CFB023D2C89@ITOMAE2KM01.AD.QINTRA.COM> All, Currently, the Win32::API.new method will search for the function name, then the 'A' (ANSI) name, and finally the 'W' (Wide) name. The code looks something like this: fProc = GetProcAddress(hLibrary, TEXT(RSTRING(v_proc)->ptr)); if(!fProc){ VALUE v_ascii = rb_str_new3(v_proc); v_ascii = rb_str_cat(v_ascii, "A", 1); fProc = GetProcAddress(hLibrary, TEXT(RSTRING(v_ascii)->ptr)); if(!fProc){ VALUE v_unicode = rb_str_new3(v_proc); v_unicode = rb_str_cat(v_unicode, "W", 1); fProc = GetProcAddress(hLibrary, TEXT(RSTRING(v_unicode)->ptr)); ... So, for example, when you do this: Win32::API.new('SomeFunc',...) It looks for SomeFunc. If that fails it looks for SomeFuncA (which is what most of the functions actually default to). If that fails it looks for SomeFuncW. If that fails, then an error is raised. What about switching the order so that it looks for SomeFuncW -first- and SomeFuncA -second- if $KCODE = u? Does that seem reasonable? Regards, Dan This communication is the property of Qwest and may contain confidential or privileged information. Unauthorized use of this communication is strictly prohibited and may be unlawful. If you have received this communication in error, please immediately notify the sender by reply e-mail and destroy all copies of the communication and any attachments. From waynev at gmail.com Tue Nov 13 20:45:22 2007 From: waynev at gmail.com (Wayne Vucenic) Date: Tue, 13 Nov 2007 17:45:22 -0800 Subject: [Win32utils-devel] win32-api idea - wide method first based on $KCODE In-Reply-To: <7524A45A1A5B264FA4809E2156496CFB023D2C89@ITOMAE2KM01.AD.QINTRA.COM> References: <7524A45A1A5B264FA4809E2156496CFB023D2C89@ITOMAE2KM01.AD.QINTRA.COM> Message-ID: <88c9ce410711131745i79afa29clb3287d82cb8286e4@mail.gmail.com> Hi Dan, I'm hardly an expert on any of this, but what you propose makes sense to me. Best regards, Wayne On Nov 13, 2007 1:11 PM, Berger, Daniel wrote: > All, > > Currently, the Win32::API.new method will search for the function name, > then the 'A' (ANSI) name, and finally the 'W' (Wide) name. The code > looks something like this: > > fProc = GetProcAddress(hLibrary, TEXT(RSTRING(v_proc)->ptr)); > > if(!fProc){ > VALUE v_ascii = rb_str_new3(v_proc); > v_ascii = rb_str_cat(v_ascii, "A", 1); > fProc = GetProcAddress(hLibrary, TEXT(RSTRING(v_ascii)->ptr)); > > if(!fProc){ > VALUE v_unicode = rb_str_new3(v_proc); > v_unicode = rb_str_cat(v_unicode, "W", 1); > fProc = GetProcAddress(hLibrary, TEXT(RSTRING(v_unicode)->ptr)); > ... > > So, for example, when you do this: > > Win32::API.new('SomeFunc',...) > > It looks for SomeFunc. If that fails it looks for SomeFuncA (which is > what most of the functions actually default to). If that fails it looks > for SomeFuncW. If that fails, then an error is raised. > > What about switching the order so that it looks for SomeFuncW -first- > and SomeFuncA -second- if $KCODE = u? Does that seem reasonable? > > Regards, > > Dan > > > > This communication is the property of Qwest and may contain confidential > or > privileged information. Unauthorized use of this communication is strictly > prohibited and may be unlawful. If you have received this communication > in error, please immediately notify the sender by reply e-mail and destroy > all copies of the communication and any attachments. > _______________________________________________ > win32utils-devel mailing list > win32utils-devel at rubyforge.org > http://rubyforge.org/mailman/listinfo/win32utils-devel > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/win32utils-devel/attachments/20071113/694d840a/attachment.html From djberg96 at gmail.com Sun Nov 18 13:06:05 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Sun, 18 Nov 2007 11:06:05 -0700 Subject: [Win32utils-devel] Need help with win32-service, failure actions Message-ID: <47407F0D.1000905@gmail.com> Hi all, I'm trying to get failure action support working. I've modified the Service.configure method to accept the following options: failure_reset_period failure_command failure_reboot_message failure_actions failure_delay I've got the failure_command and failure_reboot message working, but the rest aren't working properly. I'm mostly focused on failure_reboot_actions. Here's an example: Service.configure('some_service', nil, :failure_reset_period => 10, :failure_command => "notepad.exe", :failure_delay => 5000, :failure_actions => [ Service::ACTION_RESTART, Service::ACTION_RUN_COMMAND, Service::ACTION_REBOOT ] ) I've probably just packed the data structures wrong, but I couldn't see how. Please take a look at Service.configure in CVS. Thanks, Dan From phasis at gmail.com Mon Nov 19 00:41:21 2007 From: phasis at gmail.com (Heesob Park) Date: Mon, 19 Nov 2007 14:41:21 +0900 Subject: [Win32utils-devel] Need help with win32-service, failure actions In-Reply-To: <47407F0D.1000905@gmail.com> References: <47407F0D.1000905@gmail.com> Message-ID: Hi, 2007/11/19, Daniel Berger : > > Hi all, > > I'm trying to get failure action support working. I've modified the > Service.configure method to accept the following options: > > failure_reset_period > failure_command > failure_reboot_message > failure_actions > failure_delay > > I've got the failure_command and failure_reboot message working, but the > rest aren't working properly. I'm mostly focused on > failure_reboot_actions. > > Here's an example: > > Service.configure('some_service', nil, > :failure_reset_period => 10, > :failure_command => "notepad.exe", > :failure_delay => 5000, > :failure_actions => [ > Service::ACTION_RESTART, > Service::ACTION_RUN_COMMAND, > Service::ACTION_REBOOT > ] > ) > > I've probably just packed the data structures wrong, but I couldn't see > how. Please take a look at Service.configure in CVS. > > Thanks, > > Dan The main reason of not working is the wrong definition of SC_ACTION_RESTART and SC_ACTION_REBOOT and the lack of privileges. 1. Modify SC_ACTION_RESTART and SC_ACTION_REBOOT constant value. windows-pr/lib/windows/service.rb #23 SC_ACTION_NONE = 0 SC_ACTION_RESTART = 1 SC_ACTION_REBOOT = 2 SC_ACTION_RUN_COMMAND = 3 2. Define some constants and API functions. windows-pr/lib/windows/process.rb #53 TOKEN_ADJUST_PRIVILEGES = 0x20 TOKEN_QUERY = 0x8 SE_PRIVILEGE_ENABLED = 0x2 API.new('OpenProcessToken', 'LLP', 'L', 'advapi32') API.new('LookupPrivilegeValue', 'PPP', 'L', 'advapi32') API.new('AdjustTokenPrivileges', 'LLPLPP', 'L', 'advapi32') 3. Modify service.rb configure method. Modify line # 443 handle_scs = OpenService(handle_scm, service, SERVICE_CHANGE_CONFIG) to handle_scs = OpenService(handle_scm, service, SERVICE_CHANGE_CONFIG | SERVICE_START) Insert following line after line #503 hdlTokenHandle = 0.chr * 4 OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, hdlTokenHandle) hdlTokenHandle = hdlTokenHandle.unpack('L').first #Get the LUID for shutdown privilege. tmpLuid = 0.chr * 8 LookupPrivilegeValue("", "SeShutdownPrivilege", tmpLuid) tkp = [1].pack('L') + tmpLuid + [SE_PRIVILEGE_ENABLED].pack('L') # Enable the shutdown privilege in the access token of this process. AdjustTokenPrivileges(hdlTokenHandle, 0,tkp, tkp.length , nil, nil) Regards, Park Heesob -------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/win32utils-devel/attachments/20071119/1763f96b/attachment-0001.html From Daniel.Berger at qwest.com Mon Nov 19 14:13:44 2007 From: Daniel.Berger at qwest.com (Berger, Daniel) Date: Mon, 19 Nov 2007 13:13:44 -0600 Subject: [Win32utils-devel] So much for "Wuby" Message-ID: <7524A45A1A5B264FA4809E2156496CFB023D2CD6@ITOMAE2KM01.AD.QINTRA.COM> Looks like someone else snagged the name: http://wuby.org/ Dan This communication is the property of Qwest and may contain confidential or privileged information. Unauthorized use of this communication is strictly prohibited and may be unlawful. If you have received this communication in error, please immediately notify the sender by reply e-mail and destroy all copies of the communication and any attachments. From djberg96 at gmail.com Mon Nov 19 20:12:50 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Mon, 19 Nov 2007 18:12:50 -0700 Subject: [Win32utils-devel] Need help with win32-service, failure actions In-Reply-To: References: <47407F0D.1000905@gmail.com> Message-ID: <47423492.3000005@gmail.com> Heesob Park wrote: > The main reason of not working is the wrong definition of > SC_ACTION_RESTART and SC_ACTION_REBOOT and the lack of privileges. > > 1. Modify SC_ACTION_RESTART and SC_ACTION_REBOOT constant value. > windows-pr/lib/windows/service.rb #23 > > SC_ACTION_NONE = 0 > SC_ACTION_RESTART = 1 > SC_ACTION_REBOOT = 2 > SC_ACTION_RUN_COMMAND = 3 Whoops, they reversed the value order on the doc page. Fixed, thanks. > 2. Define some constants and API functions. > windows-pr/lib/windows/process.rb #53 > > TOKEN_ADJUST_PRIVILEGES = 0x20 > TOKEN_QUERY = 0x8 > SE_PRIVILEGE_ENABLED = 0x2 > > API.new('OpenProcessToken', 'LLP', 'L', 'advapi32') > API.new('LookupPrivilegeValue', 'PPP', 'L', 'advapi32') > API.new('AdjustTokenPrivileges', 'LLPLPP', 'L', 'advapi32') Ok, I've added these along with several other token related methods and constants. > 3. Modify service.rb configure method. > > Modify line # 443 > handle_scs = OpenService(handle_scm, service, > SERVICE_CHANGE_CONFIG) > to > handle_scs = OpenService(handle_scm, service, > SERVICE_CHANGE_CONFIG | SERVICE_START) Ok, I added SERVICE_START to the desired_access if I detect a SC_ACTION_REBOOT in the opts['failure_actions']. > Insert following line after line #503 > > hdlTokenHandle = 0.chr * 4 > OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES > | TOKEN_QUERY, hdlTokenHandle) > hdlTokenHandle = hdlTokenHandle.unpack('L').first > > #Get the LUID for shutdown privilege. > tmpLuid = 0.chr * 8 > LookupPrivilegeValue("", "SeShutdownPrivilege", tmpLuid) > tkp = [1].pack('L') + tmpLuid + [SE_PRIVILEGE_ENABLED].pack('L') > > # Enable the shutdown privilege in the access token of this > process. > AdjustTokenPrivileges(hdlTokenHandle, 0,tkp, tkp.length , > nil, nil) Awesome, thanks! The only tweak I made is that I only do this if the opts['failure_actions'] option is set. I still don't think the opts['failure_reset_period'] or if opts['failure_reset_period'] are working right, though. Not sure why. Thanks, Dan From phasis at gmail.com Mon Nov 19 20:46:34 2007 From: phasis at gmail.com (Heesob Park) Date: Tue, 20 Nov 2007 10:46:34 +0900 Subject: [Win32utils-devel] Need help with win32-service, failure actions In-Reply-To: <47423492.3000005@gmail.com> References: <47407F0D.1000905@gmail.com> <47423492.3000005@gmail.com> Message-ID: Hi, 2007/11/20, Daniel Berger : > > Heesob Park wrote: > > > > > The main reason of not working is the wrong definition of > > SC_ACTION_RESTART and SC_ACTION_REBOOT and the lack of privileges. > > > > 1. Modify SC_ACTION_RESTART and SC_ACTION_REBOOT constant value. > > windows-pr/lib/windows/service.rb #23 > > > > SC_ACTION_NONE = 0 > > SC_ACTION_RESTART = 1 > > SC_ACTION_REBOOT = 2 > > SC_ACTION_RUN_COMMAND = 3 > > Whoops, they reversed the value order on the doc page. Fixed, thanks. > > > 2. Define some constants and API functions. > > windows-pr/lib/windows/process.rb #53 > > > > TOKEN_ADJUST_PRIVILEGES = 0x20 > > TOKEN_QUERY = 0x8 > > SE_PRIVILEGE_ENABLED = 0x2 > > > > API.new('OpenProcessToken', 'LLP', 'L', 'advapi32') > > API.new('LookupPrivilegeValue', 'PPP', 'L', 'advapi32') > > API.new('AdjustTokenPrivileges', 'LLPLPP', 'L', 'advapi32') > > Ok, I've added these along with several other token related methods and > constants. > > > 3. Modify service.rb configure method. > > > > Modify line # 443 > > handle_scs = OpenService(handle_scm, service, > > SERVICE_CHANGE_CONFIG) > > to > > handle_scs = OpenService(handle_scm, service, > > SERVICE_CHANGE_CONFIG | SERVICE_START) > > Ok, I added SERVICE_START to the desired_access if I detect a > SC_ACTION_REBOOT in the opts['failure_actions']. > > > Insert following line after line #503 > > > > hdlTokenHandle = 0.chr * 4 > > OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES > > | TOKEN_QUERY, hdlTokenHandle) > > hdlTokenHandle = hdlTokenHandle.unpack('L').first > > > > #Get the LUID for shutdown privilege. > > tmpLuid = 0.chr * 8 > > LookupPrivilegeValue("", "SeShutdownPrivilege", tmpLuid) > > tkp = [1].pack('L') + tmpLuid + > [SE_PRIVILEGE_ENABLED].pack('L') > > > > # Enable the shutdown privilege in the access token of this > > process. > > AdjustTokenPrivileges(hdlTokenHandle, 0,tkp, tkp.length , > > nil, nil) > > Awesome, thanks! The only tweak I made is that I only do this if the > opts['failure_actions'] option is set. > > I still don't think the opts['failure_reset_period'] or if > opts['failure_reset_period'] are working right, though. Not sure why. Be careful of the UI display unit. The following code works fine in my test. Service.configure('Service_Desktop', nil, :failure_reset_period => 172800, # 3600 * 24 * 2 seconds -> 2 days :failure_command => "notepad.exe", :failure_delay => 180000, # 1000 * 60 * 3 milliseconds -> 3 minutes :failure_reboot_message => "This is a test of the Notepad service!", :failure_actions => [ Service::ACTION_RESTART, Service::ACTION_RUN_COMMAND, Service::ACTION_REBOOT ] ) Regards, Park Heesob -------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/win32utils-devel/attachments/20071120/9c42894f/attachment.html From djberg96 at gmail.com Tue Nov 20 00:36:12 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Mon, 19 Nov 2007 22:36:12 -0700 Subject: [Win32utils-devel] Need help with win32-service, failure actions In-Reply-To: References: <47407F0D.1000905@gmail.com> <47423492.3000005@gmail.com> Message-ID: <4742724C.7010007@gmail.com> Heesob Park wrote: > Be careful of the UI display unit. > > The following code works fine in my test. > > Service.configure('Service_Desktop', nil, > :failure_reset_period => 172800, # 3600 > * 24 * 2 seconds -> 2 days > :failure_command => "notepad.exe ", > :failure_delay => 180000, > # 1000 * 60 * 3 milliseconds -> 3 minutes > :failure_reboot_message => "This is a test of the Notepad service!", > :failure_actions => [ > Service::ACTION_RESTART, > Service::ACTION_RUN_COMMAND, > Service::ACTION_REBOOT > ] > ) Aha, you're correct. I just hadn't set the values high enough. :) With that done (and rubygems 0.9.5 released), things are looking good for an 0.6.0 release soon. I just want to add some more tests, and tidy up the documentation. Regards, Dan From djberg96 at gmail.com Sat Nov 24 08:09:23 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Sat, 24 Nov 2007 06:09:23 -0700 Subject: [Win32utils-devel] Service.start arguments failing or causing segfault Message-ID: <47482283.20002@gmail.com> Hi, Unless I'm mistaken the final arguments to Service.start should be passed to the Daemon's service_main method. Correct? I modified the Service.start method (now in CVS) to look something like this: def self.start(service, host=nil, *args) ... num_args = args.length if args.empty? args = nil else args.unshift(service) # Necessary? args = [args.join("\000")].pack('p*') # Must pack? end unless StartService(handle_scs, num_args, args) ... end I wasn't sure if I needed to explicitly push the service name onto the array, but it does segfault without it. I also wasn't sure if I needed to explicitly pack the array. Again, it segfaulted without it. To test, I modified the demo_daemon.rb file's service_main method so that it looks like this: def service_main(args = nil) msg = 'service_main entered at: ' + Time.now.to_s File.open(LOG_FILE, 'a+'){ |f| f.puts msg f.puts "Args: " + args.join(',') if args } ... end In the demo_daemon_ctl.rb script, I modified the start option like so: Service.start(SERVICE_NAME, nil, 'hello', 'world') As things stand now I get: C:/ruby/lib/ruby/site_ruby/1.8/win32/service.rb:684:in `start': The service did not respond to the start or control requ est in a timely fashion. (Win32::Service::Error) from demo_daemon_ctl.rb:66 Any ideas? Thanks, Dan From phasis at gmail.com Sat Nov 24 09:17:11 2007 From: phasis at gmail.com (Heesob Park) Date: Sat, 24 Nov 2007 23:17:11 +0900 Subject: [Win32utils-devel] Service.start arguments failing or causing segfault In-Reply-To: <47482283.20002@gmail.com> References: <47482283.20002@gmail.com> Message-ID: Hi, 2007/11/24, Daniel Berger : > > Hi, > > Unless I'm mistaken the final arguments to Service.start should be > passed to the Daemon's service_main method. Correct? > > I modified the Service.start method (now in CVS) to look something like > this: > > def self.start(service, host=nil, *args) > ... > num_args = args.length > > if args.empty? > args = nil > else > args.unshift(service) # Necessary? > args = [args.join("\000")].pack('p*') # Must pack? > end > > unless StartService(handle_scs, num_args, args) > ... > end > > I wasn't sure if I needed to explicitly push the service name onto the > array, but it does segfault without it. > > I also wasn't sure if I needed to explicitly pack the array. Again, it > segfaulted without it. Don't ask me why, just follow the rule of the microsoft :) Acording to http://msdn2.microsoft.com/en-US/library/ms686321.aspx , StartService function requires NULL or an argument which the first element must be service name. And argument type is not LPCSTR, but LPCTSTR* ( pointer of string), so it need to be packed. To test, I modified the demo_daemon.rb file's service_main method so > that it looks like this: > > def service_main(args = nil) > msg = 'service_main entered at: ' + Time.now.to_s > File.open(LOG_FILE, 'a+'){ |f| > f.puts msg > f.puts "Args: " + args.join(',') if args > } > ... > end > > In the demo_daemon_ctl.rb script, I modified the start option like so: > > Service.start(SERVICE_NAME, nil, 'hello', 'world') > > As things stand now I get: > > C:/ruby/lib/ruby/site_ruby/1.8/win32/service.rb:684:in `start': The > service did not respond to the start or control requ > est in a timely fashion. (Win32::Service::Error) > from demo_daemon_ctl.rb:66 > > Any ideas? Regards, Park Heesob -------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/win32utils-devel/attachments/20071124/05e4ce86/attachment-0001.html From djberg96 at gmail.com Sat Nov 24 09:29:06 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Sat, 24 Nov 2007 07:29:06 -0700 Subject: [Win32utils-devel] Service.start arguments failing or causing segfault In-Reply-To: References: <47482283.20002@gmail.com> Message-ID: <47483532.6050907@gmail.com> Heesob Park wrote: > I wasn't sure if I needed to explicitly push the service name onto the > array, but it does segfault without it. > > I also wasn't sure if I needed to explicitly pack the array. Again, it > segfaulted without it. > > > Don't ask me why, just follow the rule of the microsoft :) > > Acording to http://msdn2.microsoft.com/en-US/library/ms686321.aspx , > StartService function requires NULL or an argument which the first > element must be service name. > And argument type is not LPCSTR, but LPCTSTR* ( pointer of string), so > it need to be packed. Ok, then what I have should work. I did notice a mistake in the demo_daemon_ctl.rb program (which I fixed in CVS), so now it runs ok, but the args don't appear to get passed to service_main. Are you seeing the same thing? Regards, Dan From djberg96 at gmail.com Sat Nov 24 09:40:38 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Sat, 24 Nov 2007 07:40:38 -0700 Subject: [Win32utils-devel] Service.start arguments failing or causing segfault In-Reply-To: References: <47482283.20002@gmail.com> Message-ID: <474837E6.9090609@gmail.com> Heesob Park wrote: > Don't ask me why, just follow the rule of the microsoft :) > > Acording to http://msdn2.microsoft.com/en-US/library/ms686321.aspx , > StartService function requires NULL or an argument which the first > element must be service name. > And argument type is not LPCSTR, but LPCTSTR* ( pointer of string), so > it need to be packed. Oops, I did see a mistake with num_args. It should be like this I think: num_args = 0 if args.empty? args = nil else args.unshift(service) num_args = args.length args = [args.join("\000")].pack('p*') end I forgot to add 1 for the service name. The only problem is, now it segfaults. :( Dan From phasis at gmail.com Sat Nov 24 11:05:26 2007 From: phasis at gmail.com (Heesob Park) Date: Sun, 25 Nov 2007 01:05:26 +0900 Subject: [Win32utils-devel] Service.start arguments failing or causing segfault In-Reply-To: <474837E6.9090609@gmail.com> References: <47482283.20002@gmail.com> <474837E6.9090609@gmail.com> Message-ID: Hi, 2007/11/24, Daniel Berger : > Heesob Park wrote: > > > > > Don't ask me why, just follow the rule of the microsoft :) > > > > Acording to http://msdn2.microsoft.com/en-US/library/ms686321.aspx , > > StartService function requires NULL or an argument which the first > > element must be service name. > > And argument type is not LPCSTR, but LPCTSTR* ( pointer of string), so > > it need to be packed. > > Oops, I did see a mistake with num_args. It should be like this I think: > > num_args = 0 > > if args.empty? > args = nil > else > args.unshift(service) > num_args = args.length > args = [args.join("\000")].pack('p*') > end > > I forgot to add 1 for the service name. > > The only problem is, now it segfaults. :( > > Dan I figured it out finally. First, fix argument type. you don't need to put the first element as service name as documented. The code service.rb before StartService should be like this: num_args = 0 if args.empty? args = nil else # args.unshift(service) --> this is optional num_args = args.length args = args.map {|x| [x].pack('p*')}.join end Second, you did'nt send argument from Service_Main C function to service_main ruby methods. The code daemon.c shoud be like this: Before RegisterServiceCtrlHandler of Service_Main function if(dwArgc>1) { int i; Argc = dwArgc-1; // declared STATIC int Arg; on top Argv = malloc(sizeof(VALUE)*Argc); // declared STATIC VALUE *Argv; on top for(i=1;i References: <47482283.20002@gmail.com> <474837E6.9090609@gmail.com> Message-ID: <474864FF.1040005@gmail.com> Heesob Park wrote: > Hi, > > 2007/11/24, Daniel Berger >: > > Heesob Park wrote: > > > > > Don't ask me why, just follow the rule of the microsoft :) > > > > Acording to http://msdn2.microsoft.com/en-US/library/ms686321.aspx , > > StartService function requires NULL or an argument which the first > > element must be service name. > > And argument type is not LPCSTR, but LPCTSTR* ( pointer of > string), so > > it need to be packed. > > Oops, I did see a mistake with num_args. It should be like this I > think: > > num_args = 0 > > if args.empty? > args = nil > else > args.unshift(service) > num_args = args.length > args = [args.join("\000")].pack('p*') > end > > I forgot to add 1 for the service name. > > The only problem is, now it segfaults. :( > > Dan > > > I figured it out finally. > > First, fix argument type. you don't need to put the first element as > service name as documented. > The code service.rb before StartService should be like this: > > num_args = 0 > if args.empty? > args = nil > else > # args.unshift(service) --> this is optional > num_args = args.length > args = args.map {|x| [x].pack('p*')}.join > end > > Second, you did'nt send argument from Service_Main C function to > service_main ruby methods. > The code daemon.c shoud be like this: > > Before RegisterServiceCtrlHandler of Service_Main function > > if(dwArgc>1) { > int i; > Argc = dwArgc-1; // declared STATIC > int Arg; on top > Argv = malloc(sizeof(VALUE)*Argc); // declared STATIC VALUE *Argv; > on top > for(i=1;i Argv[i-1]=rb_str_new2(lpszArgv[i]); > } > > daemon_mainloop_protect function > > static VALUE daemon_mainloop_protect(VALUE self) > { > if(rb_respond_to(self,rb_intern("service_main"))) > { > if(Argc==0) > rb_funcall(self,rb_intern("service_main"),0); > else > rb_funcall2(self,rb_intern("service_main"),Argc,Argv); > } > return self; > } Awesome, that works! Thanks! I think that was the last thing I wanted to get worked out for 0.6.0. I'll get a release out today or tomorrow. Thanks, Dan From djberg96 at gmail.com Sat Nov 24 22:32:59 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Sat, 24 Nov 2007 20:32:59 -0700 Subject: [Win32utils-devel] Win2k box dead Message-ID: <4748ECEB.1080702@gmail.com> All, I dunno if any of you were using my Win2k box for anything, but it looks like it's having serious issues. It's shut off for now and might be dead permanently. Shame, really. That was the box that also had BeOS 5 on it still. :) Dan From djberg96 at gmail.com Sun Nov 25 09:48:53 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Sun, 25 Nov 2007 07:48:53 -0700 Subject: [Win32utils-devel] Win32-Service and threading In-Reply-To: <554ac39c0606181018v400d0869ib3d35e58e1a02f3a@mail.gmail.com> References: <554ac39c0606181018v400d0869ib3d35e58e1a02f3a@mail.gmail.com> Message-ID: <6037b70c0711250648k1c94b2f6v8f479890475a1d9f@mail.gmail.com> On Jun 18, 2006 10:18 AM, Patrick Hurley wrote: > First off I just want to pass on a big thank you to everyone who has > worked on the win32 packages, they have helped me numerous times. But > (of course you knew it had > to be coming :-)... > > I have just started doing some work with win32-service -- I was > creating a wrapper around it and daemon.rb, so I could write one body > of code that depending upon platform would provide a reasonable > interface for both windows and Unix platforms. During my testing I > noticed some odd behavior in my test program. Having written a couple > win32 services before I suspected some threading issues, so I did some > digging first just in Ruby using DL, I created a call to > GetCurrentThreadID and in logging I displayed the Current TID -- and > we are switching system threads in the ruby interpreter. > > Looking at service.c, I see you are using RegisterServiceCtrlHandler, > there is no guarantee that it will be called from the main thread > (matter of fact it generally won't). In Service_Ctrl, you make an > rb_funcall using the call back hash, which then calls back into the > interpreter while the main thread is still running under mainloop. > > My side effect was some scrambled ruby file handles and some pipe > closed on stopping errors. I would be happy to give back and fix this > issue, but wanted your input on how to proceed. > > I have written a few extensions (primarily wrapping in house C/C++ > libraries), but have never used ruby threads explicitly in an > extension previously. What I am considering is to create a ruby thread > and have it politely wait for messages in a queue. In Service_Ctrl, > just place entries in the queue. When a message arrives in the queue > have it make the call back (from the Ruby "green" thread). > > If you think I am off my rocker and completely misunderstand the > problem, sorry for wasting your time :-); however, if you think I > understand the issue and would like me to take a stab at a patch, > please let me know if my approach sounds reasonable. I guess we need to revisit this now that 0.6.0 is out. Note that I plan on rewriting the Daemon class in pure Ruby, too, now that we have callback support. Thoughts anyone? Regards, Dan From djberg96 at gmail.com Tue Nov 27 20:15:05 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Tue, 27 Nov 2007 18:15:05 -0700 Subject: [Win32utils-devel] Can't write to "Windows PowerShell" source with win32-eventlog Message-ID: <474CC119.8010200@gmail.com> Hi all, Tim Uckun reported, and I've confirmed, that you can't write to the Windows PowerShell event source for some reason. Tim thought it might be because of the space in the name, but my attempt to quote it did not seem to help. In order to follow along, install PowerShell, create the foo.dll using the foo.mc file in the 'test' directory, and try the following code: require 'win32/eventlog' include Win32 EventLog.add_event_source( :source => 'Windows PowerShell', :key_name => 'foo', :category_count => 2, :event_message_file => 'foo.dll', :category_message_file => 'foo.dll' ) EventLog.open('Windows PowerShell') do |log| log.report_event( :source => "foo", :event_type => EventLog::WARN, :category => "0x00000002L".hex, :event_id => "0x00000003L".hex, :data => "I'm warning you!" ) end As Tim mentioned, this doesn't raise an error. It just doesn't seem to do anything. Any ideas? Anything special about the Windows PowerShell source? In unrelated news, my attempts to replace RegCreateKey with RegCreateKeyEx in EventLog.add_event_source failed. Or shouldn't I bother with it? Regards, Dan From djberg96 at gmail.com Tue Nov 27 21:25:41 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Tue, 27 Nov 2007 19:25:41 -0700 Subject: [Win32utils-devel] Can't write to "Windows PowerShell" source with win32-eventlog In-Reply-To: <474CC119.8010200@gmail.com> References: <474CC119.8010200@gmail.com> Message-ID: <6037b70c0711271825m69ee8f63md303e7a095e24e9@mail.gmail.com> On Nov 27, 2007 6:15 PM, Daniel Berger wrote: > Hi all, > In unrelated news, my attempts to replace RegCreateKey with > RegCreateKeyEx in EventLog.add_event_source failed. Or shouldn't I > bother with it? Scratch that. Got it working. The PowerShell log issue is still there, though. dan From phasis at gmail.com Tue Nov 27 21:43:00 2007 From: phasis at gmail.com (Heesob Park) Date: Wed, 28 Nov 2007 11:43:00 +0900 Subject: [Win32utils-devel] Can't write to "Windows PowerShell" source with win32-eventlog In-Reply-To: <474CC119.8010200@gmail.com> References: <474CC119.8010200@gmail.com> Message-ID: Hi, 2007/11/28, Daniel Berger : > > Hi all, > > Tim Uckun reported, and I've confirmed, that you can't write to the > Windows PowerShell event source for some reason. > > Tim thought it might be because of the space in the name, but my attempt > to quote it did not seem to help. > > In order to follow along, install PowerShell, create the foo.dll using > the foo.mc file in the 'test' directory, and try the following code: > > require 'win32/eventlog' > include Win32 > > EventLog.add_event_source( > :source => 'Windows PowerShell', > :key_name => 'foo', > :category_count => 2, > :event_message_file => 'foo.dll', > :category_message_file => 'foo.dll' > ) > > EventLog.open('Windows PowerShell') do |log| > log.report_event( > :source => "foo", > :event_type => EventLog::WARN, > :category => "0x00000002L".hex, > :event_id => "0x00000003L".hex, > :data => "I'm warning you!" > ) > end > > As Tim mentioned, this doesn't raise an error. It just doesn't seem to > do anything. > > Any ideas? Anything special about the Windows PowerShell source? > > In unrelated news, my attempts to replace RegCreateKey with > RegCreateKeyEx in EventLog.add_event_source failed. Or shouldn't I > bother with it? > > Regards, > > Dan I guess Custom Log event must have log file name. After inserting following code at add_event_source methods, it works fine. # The key_name must be specified unless hash['key_name'] raise Error, 'no event_type specified' end ########### insert begin key = key_base + hash['source'] if RegCreateKey(HKEY_LOCAL_MACHINE, key, hkey) != ERROR_SUCCESS error = 'RegCreateKey() failed: ' + get_last_error raise Error, error end hkey = hkey.unpack('L')[0] data = "%SystemRoot%\\System32\\config\\#{hash['source']}.evt" rv = RegSetValueEx( hkey, 'File', 0, REG_EXPAND_SZ, data, data.size ) if rv != ERROR_SUCCESS error = 'RegSetValueEx() failed: ', get_last_error RegCloseKey(hkey) raise Error, error end RegCloseKey(hkey) hkey = [0].pack('L') key = key_base + hash['source'] + "\\" + hash['key_name'] ########### insert end if RegCreateKey(HKEY_LOCAL_MACHINE, key, hkey) != ERROR_SUCCESS error = 'RegCreateKey() failed: ' + get_last_error raise Error, error end Regards, Park Heesob -------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/win32utils-devel/attachments/20071128/9fe8e52d/attachment.html From djberg96 at gmail.com Wed Nov 28 23:06:43 2007 From: djberg96 at gmail.com (Daniel Berger) Date: Wed, 28 Nov 2007 21:06:43 -0700 Subject: [Win32utils-devel] Can't write to "Windows PowerShell" source with win32-eventlog In-Reply-To: References: <474CC119.8010200@gmail.com> Message-ID: <474E3AD3.6060604@gmail.com> Heesob Park wrote: > I guess Custom Log event must have log file name. Is that documented somewhere? I didn't see it. Just curious. > After inserting following code at add_event_source methods, it works fine. Odd, I still couldn't make it work. The first thing I noticed is that the .evt file names don't necessarily match the source name. I see "Internet.evt", not "Internet Explorer.evt", for example. The WindowsPowerShell.evt file has no space in it on my system. But, even after I changed the key value I still couldn't write to the Windows PowerShell event log. Hmm. I'm on vacation this weekend so I'll have to take a look at it next week. In the meantime botp sent me an eventlog he says is suffering from missing description issues, but only on Win2k3. Attached if anyone wants to take a look. Regards, dan -------------- next part -------------- A non-text attachment was scrubbed... Name: botp_sample_dmpi_security_log_2007_nov_27.evt Type: application/octet-stream Size: 38184 bytes Desc: not available Url : http://rubyforge.org/pipermail/win32utils-devel/attachments/20071128/894aae27/attachment-0001.obj From phasis at gmail.com Fri Nov 30 01:03:58 2007 From: phasis at gmail.com (Heesob Park) Date: Fri, 30 Nov 2007 15:03:58 +0900 Subject: [Win32utils-devel] Can't write to "Windows PowerShell" source with win32-eventlog In-Reply-To: <474E3AD3.6060604@gmail.com> References: <474CC119.8010200@gmail.com> <474E3AD3.6060604@gmail.com> Message-ID: Hi, 2007/11/29, Daniel Berger : > > Heesob Park wrote: > > > > > I guess Custom Log event must have log file name. > > Is that documented somewhere? I didn't see it. Just curious. > > > After inserting following code at add_event_source methods, it works > fine. > > Odd, I still couldn't make it work. The first thing I noticed is that > the .evt file names don't necessarily match the source name. I see > "Internet.evt", not "Internet Explorer.evt", for example. The > WindowsPowerShell.evt file has no space in it on my system. > > But, even after I changed the key value I still couldn't write to the > Windows PowerShell event log. Hmm. Event file name does not matter. I attached the modified eventlog.rb I'm on vacation this weekend so I'll have to take a look at it next > week. In the meantime botp sent me an eventlog he says is suffering from > missing description issues, but only on Win2k3. Attached if anyone wants > to take a look. The attached eventlog has no problem on WinXP and Win2k3 in my test. Regards, > > dan Regards, Park Heesob -------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/win32utils-devel/attachments/20071130/4c617d97/attachment-0001.html -------------- next part -------------- A non-text attachment was scrubbed... Name: eventlog.rb Type: application/octet-stream Size: 28171 bytes Desc: not available Url : http://rubyforge.org/pipermail/win32utils-devel/attachments/20071130/4c617d97/attachment-0001.obj