Archive for the ‘Operating Systems’ Category.

BSD Licenses good, GPL bad: Microsoft Bans Some Open Source Licenses from WP7 Marketplace

Microsoft is not going to allow GPL onto their phones.
Microsoft Bans Some Open Source Licenses from WP7 Marketplace

Microsoft has stated that its Windows Phone 7 marketplace will reject any apps that use the GPL (GNU General Public License) and similar licenses.

“The Windows Phone Marketplace supports several open source licenses, including BSD, MIT, Apache Software License 2.0, MS-PL and other similar permissive licenses.  We revise our Application Provider Agreement from time to time based on customer and developer feedback, and we are exploring the possibility of modifying it to accommodate additional open source-based applications in upcoming revisions.”

Microsoft is doing the right thing and cannot be blamed in the slightest. The GPL is often termed a viral license and for good reason. Once you use it in your code everything is infected by it. Others say it is a spiderweb license, that once you are in the spider’s web, you can’t get out. The BSD license instead of the GPL is probably the single biggest reason to use FreeBSD over Linux, especially for enterprise business such as Microsoft, Apple, and others.

I don’t like the entrapment of the GPL. Students often first encounter the GPL in college, where they hear that the GPL is free and start using it. Only later do they realize they are trapped. Some don’t mind, wish they would have understood the license better.

Here is a simple rhyme to remember which license to use:

If you want your software to really be free,
    license it with BSD.
If you want your software to be in license hell,
    use the GPL.

This post shows that Microsoft feels the same as many of us who are anti-GPL.

Obviously they don’t want to have those who write their apps ever accidental depend on another app, only to find out the app they depended on is GPL, so their entire work must be GPL as well. They are doing what humanity tries to do with any virus, eradicating it and prevent infection by eliminating the virus, just as we have done with small pox, from the world.

For more information on the differences between the BSD License and the GPL, read this post.
Differences between the BSD/FreeBSD Copyrights and the GNU Public License (GPL)

Backing up PostgreSQL databases nightly on FreeBSD

I didn’t write this post, a blogger named Keith did, but I am definitely going to link to his work on his blog.

Backing up PostgreSQL databases nightly on FreeBSD

He did a good job editing this script to backup postgresql on FreeBSD. While he does say he got some of it from another site he found on using Google…

…Using Google I found a generic script, after some custom tweaks for FreeBSD I had the script I wanted.

…so some of the work should be attributed elsewhere. I want to thank him for the work he did. This was something that was on my to do list and now it is pretty much done for me.

Here is the script he posted.

#!/bin/sh
# Location of binaries
bin="/usr/local/bin"
# Location of the backup logfile.
logfile="/data/backup/postgres/postgres.log"
# Location to place backups.
backup_dir="/data/backup/postgres"
username="pgsql"
database="template1"
touch $logfile
timeslot=`date +%H-%M`
databases=`$bin/psql -h localhost -d $database -U $username -q -c "\l" | sed -n 4,/\eof/p | grep -v rows\) | awk {'print $1'}`

for i in $databases; do
        echo "Backup and Vacuum complete at $timeinfo for time slot $timeslot on database: $i " >> $logfile
        $bin/vacuumdb -z -h localhost -U $username $i >/dev/null 2>&1
        j="60"
        while [ $j -ge 0 ]
        do
                temp0=`expr $j - 1`
                temp1=$j
                j=`expr $j - 1`
                if [ $temp0 -lt 0 ]
                then
                        suffix0=""
                        suffix1=".0"
                else
                        suffix0=".$temp0"
                        suffix1=".$temp1"
                fi
                if [ -f $backup_dir/postgresql-$i-database.gz$suffix0 ]
                then
                        echo "Renaming postgresql-$i-database.gz$suffix0 to postgresql-$i-database.gz$suffix1"
                        mv $backup_dir/postgresql-$i-database.gz$suffix0 $backup_dir/postgresql-$i-database.gz$suffix1
                fi
        done
        if [ $i != 'template0' ]
        then
                $bin/pg_dump -U $username $i -h 127.0.0.1 | gzip > "$backup_dir/postgresql-$i-database.gz"
        fi
done

Here is what I like about his script:

  1. Variables are used at the top of the script that are easily modifiable.
  2. It backs up all databases without having to list the databases, so you don’t have to update the list with every new database.
  3. It does compress using gzip the databases, so uses as little space as possible.

Here are some ideas for future enhancements to the script

  1. The gzip compression level as a variable up top. The default gzip compression level is 6 and 9 could make the file significantly smaller with large databases, while 1 would be faster for machines with weaker processors.
  2. Database to exclude from the backup.  I like the idea to get them all by default, but sometimes you have a test database you just don’t care about and you don’t want a nightly backup of it.
  3. I don’t see the password in the script, and I am not sure how it is authenticating without it, maybe a password feature needs to be added.

BSD Magazine February Issue is out: ZFS and FreeBSD

BSD Magazine February Issue released.

Download it here:

http://bsdmag.org/magazine/1638-zfs-and-freebsd

Review: GhostBSD 2.0 Beta 2 – A FreeBSD LiveCD

GhostBSD 2.0 – Beta 2 Review

Today I downloaded GhostBSD 2.0.  GhostBSD 2.0 is a live CD that you boot off and your operating system loads to a desktop environment from the CD itself.

It is a CD not a DVD. It was 645.3 MB.  That fits one a single CD.  So it is still small and downloaded rather quickly compared to multi-gigabyte DVD images.

The Good

It didn’t take long to find some good features.

  1. VMWare resolution wasn’t too bad 1280×720.
  2. Decent backgrounds
  3. Thunderbird setup to take your account immediately and the autodetect is cool.
  4. Firefox worked first time.
  5. Has AbiWord and Gnumeric Spreadshet installed.
  6. Has burning software
  7. As a CD ISO, it is still small and downloaded rather quickly compared to multi-gigabyte DVD images.

What Needs works

The first thing that needs work is this review.  I didn’t test much.  I booted, and looked at features, but as I only use a Live CD when something goes terribly wrong and nothing has, I didn’t really do anything too geeky.  So let me just say there is much more to review.  But here are some things I noticed in just my short time clicking away at this.

There wasn’t much bad to speak of that was bad. I had to get nit picky.

  1. There was a problem that delays boot related to the hostname.
  2. No Flash 10 in Firefox, though the linux kernel was there.
  3. Thunderbird is not configured to open links with Firefox by default.
  4. pkg_info shows the pages but says that the package info is corrupt for every package installed.

Other FreeBSD Live CDs

  • Frenzy – A much smaller CD. Here is a quote from the home page: Frenzy is a “portable system administrator toolkit,” LiveCD based on FreeBSD. It generally contains software for hardware tests, file system check, security check and network setup and analysis. Size of ISO-image is 200 MBytes (3″ CD)
  • FreeSBIE – No longer maintained

I didn’t install Frenzy and I have never used it, so I cannot compare it.  However, it is supposedly only 200 MB, which leaves me wondering what it has.

FreeSBIE has been useful in the past, but is no longer maintained.

The Conclusion

GhostBSD 2.0 is the FreeBSD live CD that I currently recommend. I first came across it when it was 1.5, and 2.0 shows it moving forward quite nicely.

Hopes for the future

I do believe there is a place for them to hook into pc-sysinstall and create an installer.  There is not a GNOME-based FreeBSD distribution that I know about, though PC-BSD might add GNOME as an option, but many of the GNOME users would probably jump on this if an installer was built. They may even convert me from KDE to GNOME.

FreeBSD News: What version of FreeBSD are you using (Poll)?

Over at FreeBSD News, they have a survey asking what version of FreeBSD you are using.

Take a moment and hit this link and enter your FreeBSD version.

What version of FreeBSD are you using (Poll)?

Article: Speed Up Windows by Stripping It Down

I found this article on stripping down Windows.  I have wanted to remove unnecessary services from Windows 7 for a while.  I want to save it for later.

I explains how to remove unnecessary prettiness and services that take a lot of CPU power.

Speed Up Windows by Stripping It Down

Debian one step closer to making the kernel optional

You have heard of options during install, but have you ever thought of swapping out the Kernel? Maybe, for a similar kernel with a different configuration, but what about a completely different kernel, say a Linux or FreeBSD kernel? Well, Debian has thought about this for quite some time, and with their new release of Debian 6, they now have a

Quote on Slashdot: “After two years of work, the Debian Project has announced the release of Debian 6.0. ‘There are many goodies in Debian 6.0 GNU/Linux, not the least of which is the new completely free-as-in-freedom Linux kernel, which no longer contains firmware modules that Debian developers found troublesome,’ says blogger Brian Proffitt. And in addition to Debian GNU/Linux, Debian GNU/kFreeBSD is introduced as a technology preview. ‘Debian GNU/kFreeBSD will port both a 32- and 64-bit PC version of the FreeBSD kernel into the Debian userspace, making them the first Debian release without a Linux kernel,’ says Proffitt. ‘The Debian Project is serious about the technology preview label, though: these FreeBSD-based versions will have limited advanced desktop features.’ The release notes and installation manual have been posted, and installation images may be downloaded right now via bittorrent, jigdo, or HTTP.”

Since FreeBSD is my platform of choice, this idea sounds pretty good to me.

This isn’t hte first time I have commented on this Debian GNU/kFreeBSD release. However, it is in the new again and it is interesting to say the least.

Getting the Microphone to work in FreeBSD on a Lenovo T61p

Hey all,

I am trying to get my Microphone to work on my Lenovo T61p.

Problem

If I talk into my microphone while capturing sound, when I play back, I cannot hear my voice.

Troubleshooting

Let me answer some questions for you:

Does the sound work?
Yes. The sound card works great.

Does the hardware work?
The Microphone works well if I boot to windows 7. I have a hard drive with Windows 7 that used to be in this laptop.

What tools am I using to capture sound?
audacity
xvidcap

Can I get any sound to record?
Yes. If I tap hard with my finger on the microphone, the taps are caught, though faint, by both audacity and xvidcap.

What have I done?

Read the Handbook.
Read the man pages for mixer and snd_hda

  1. Loaded and unloaded snd_hda.ko and sound.ko
  2. Changed every mixer setting there is.
  3. Tested tapping and yelling into the mic, tapping barely registers.
  4. Test hardware on Windows 7, works.
  5. Checked systctl -a |grep snd and sysctl -a |grep hda
  6. Changed the mixer to use monitor instead of mic.

Resolution

Well, it was the last step. Once I changed the mixer to use monitor instead of mic, it worked like a charm.

mixer -rec monitor

mixer monitor 35:35

Twelve windows applications Microsoft should make open source on their CodePlex site

Microsoft is a big company and has a lot of developers, and it wouldn’t seem they need help from the community. However, the have a lot of code and a lot of different projects that keep the developers plenty busy. At least they are too busy to provide some simple features that exist in almost every other operating system.

There are obvious shortcomings in many of the included Microsoft applications.  Open source communities are excellent at rounded out an application.

If Microsoft were to open source some of their software, and allow for at least for read access on whatever source control they use, then allow for not only submitting bugs but submitting patches, that can be reviewed and applied or rejected, then they could see a wave of improvements come from the many different windows users: Enterprise admins, developers, power users, etc.

It is also nice to be able to debug an application for Microsoft.  It is not always easy to duplicate bugs in house, so if a developer experiences an issue that is annoying enough, they would fix it themselves and while yes, Microsoft benefits, more importantly, all the other users of that application benefit.

http://www.CodePlex.com

Microsoft started ww.CodePlex.com, and it is very similar to SourceForge.net.  They have just under five thousand projects that claim to have stable releases.

Why doesn’t Microsoft make more of their own projects available on CodePlex?

Microsoft could have many open source projects that could become large communities.  One open source community that continues to gain popularity is Windows Install XML. It seems to be a large community now and is growing rapidly.  Strangely it is actually hosted at Sourceforge.net, though it has some sort of presence on CodePlex.

How many Open Source project could Microsoft have?

More people develop using Windows than any other operating system.  (Yes, phone OSes may have or may someday take that over…but that is besides the point).  Think of all the software companies in the world. How many of them don’t develop for Windows.  Even Apple spends a lot of time making iTunes work on Windows.  There are so many developers that might contribute that it is impossible to count them all. Some may end up contributing as part of their job. Many developers might contirubte to a project because it makes their development lives easier. Many enterprise customers might contribute to lower the costs of managing their environment. Many consulting and contract companies might contribute for their own reasons.

So what applications should Microsoft start with?

Here are a list of applications that Microsoft should open source immediately.

#1 – Notepad.exe

Yes, this is the most simple editor that we never use. One of the first thing my colleagues and I do whenever we install windows, is install Notepad++.  While we love Notepad++, we don’t love that we have to install all the time.

After more than 15 years since Windows 95 (or is it more, was notepad.exe in Windows 3.11?) notepad.exe should be one of the most functional and efficient editors in the industry.  However, notepad lacks features that are critical to a good text editor. The most important being syntax coloring. Others features such as supporting regular expressions in find and replace, supporting plugins (especially the XML plugin), are features we use in Notepad++ often. There is really no excuse for Microsoft not having these features. The community has provided these feature for you, all you have to do is include them in your base system.

There are actually many different Notepad-like projects on CodePlex. Maybe some as as mature as Notepad++ maybe some arent. The question is whether any of them will ever become a standard part of the base windows install?

Maybe Microsoft keeps notepad.exe simple, but adds a second more advanced application like Notepad++ in the base system. Or why not just include Notepad++, it is free, after all.

#2 – Internet Explorer

Ok, so Mozilla Firefox and Google Chrome are open source. Microsoft is losing ground to both browsers and this is not going to change in the near future.

Brand is important, however, is really anything left to gain by winning the browser war. Maybe using IE to kill Netscape in the late 90s was important back then. But would anyone really care if IE went away and windows shipped with your choice of the other browsers available? We don’t think so. This is actually how Europe installs of Windows are today. The homepage and search engine war is what is important and Microsoft could still control that on its operating system by having the homepage be msn.com and the default search engine be Bing.

So what use is it for Microsoft to spend time and money developing IE? None really.  It is a waste of time and money they could spend elsewhere.  Release this software to the community. Besides, the new IE development community would not be hampered by being part of an organization that is too large to care enough about IE to release in a timely manner anyway.

If IE became open source, it would be rejuvenated in a way Microsoft can’t do in any other way.

For example, This blog’s home page has a boxes with rounded corners. IE is the only browser that doesn’t support the rounded corners feature in CSS. This feature would have been implements years ago were IE Open Source, as many other features would have as well.

#3 – Windows Explorer

If there is anything that needs debugging help from the community, it is Windows Explorer. Like Notepad.exe, Explorer.exe just hasn’t evolved the way an application should. Even on Windows 7 we all have experienced issues including constant unreproducible hangs, crashes, and failure to refresh.Whether these are due to explorer or something that is plugged into explorer, the inability for a user to do anything about it annoying, especially if that use, like me, is a developer and may or may not have the ability to debug and fix the issue.

Also like Notepad.exe, there is a lack of features and plugins.  After almost two decades of existence, Explore.exe should be one of the most feature rich file browsers in the industry.  But instead, Explorer is difficult to work with if you want to do anything other than just work with the file system. One example of this: TortoiseSVN/TortoiseCVS cannot install and plugin to Explorer without prompting for a reboot. If released as a community project, Explorer.exe would become on of the most feature rich tools in windows.

#4 – Windows Live Messenger

So Windows Live Messenger hasn’t worked for me in months. Microsoft updated it with Windows Update.  Guess what.  It hasn’t worked since. And this is true for a lot of people. Many in my office have seen this as well as many others who are posting to their support site. See my previous article: Windows Live Messenger update broke again: Error 8100030d. This isn’t my only complaint, though the fact that they are releasing a product that doesn’t work is quite tainting to the Windows name.

I kindly offered to debug this issue for them, but my post to their support bulletin was ignored.

Even more annoying than the fact that Windows Live Messenger isn’t working for many people missing feature is the conceited attitude that users of Windows Live Messenger don’t also use other messaging tools. Most messenger applications now support logging into AIM, MSN, Yahoo Messenger, and many others.  But not Windows Live Messenger. If released as an open source project, the Windows Live Messenger community wouldn’t let this missing feature remain absent from the project.

#5 – MSPaint

MSPaint finally had its first bump in features with Windows 7.  However, it is still a shell of what it could be. What could it be? It could be Paint.NET and users love Paint.NET. Paint.NET is everything that MSPaint should be but isn’t. Paint.exe should be a well developed, feature rich application by now. However, Microsoft doesn’t spend any time on it.

So why not put the Paint.net project out there for the community. I don’t quite install Paint.NET as often as Notepad++, but I use it and install it quite often. Why do we have to go out and download and install Paint.NET.  Why after more than a decade and a half can MSPaint be such a basic featureless application.  Because there is no plan for it. Nobody is assigned to create a project plan and drive improvement for it. Even a one person project would be more developed than this after a decade and a half. If there hadn’t been a push to make it more Vista/Windows 7 like, it wouldn’t have gotten the recent update it received.

Look at the successful projects that exist: Paint.NET, Gimp, Pinta, and others. If Microsoft had sponsored such a project years ago or when MSPaint first came to existence, it might be rivaling Adobe Photoshop by now.

#6 – Hyperterminal / Telnet / FTP, etc…

Microsoft doesn’t have an SSH tool of an SFTP tool by default. Are you as frustrated as I am when downloading PuTTY and WinSCP for the hundredth time. Almost every open source operating system has these features as part of their base operating system. Yet Microsoft has somehow found a way to not include them.

An ssh/sftp tool set, both a command line and gui version, should be an open source project on CodePlex. Sure, leave them off of Windows Home Edition and make them have to be installed late. But these features should be included in a standard installation of Windows Ultimate.

#7 – Windows Command Prompt / PowerShell

The PowerShell is a little late to the game. Look at all the shell scripting abilities in open source operating system with sh, csh, ksk, bash, tcsh, etc…  Even OS X can use these.  Microsoft is so far behind when it comes to shell scripting. Let the shell be managed by the community.  Or replace it with a shell, or include a shell.

We can of course install Cygwin but again, why should we have to?

#8 – Hashing tools

On any other platform, we can easily download a file, and check the md5, sha1, or sha256 hash on that file. This is important because when you download software, especially from sites such as SourceForge.net, they always include a list of hashes you can use to make sure that the file was downloaded correctly and that it wasn’t tampered with.

Open a command prompt in windows and type md5, sha1, or sha256 and you will be told that such files are not found.

#9 – .NET Framework

Microsoft is trying to port .NET Framework and one source at Novell SUSE informed me that Microsoft was paying them to deliver open source versions of Silverlight (Moonlight) and .NET Framework (Mono) for open source platforms.  If they open sourced .NET Framework, porting it over would be much more simple and the project might have more community developers.

The ability for software vendors who have so many .NET applications already developed to be able to port them to run on MAC and Linux is going to drive this technology into the forefront over the next decade.

The entire .NET Framework library doesn’t have to be released, but if it was, it would be beneficial to more than just developers for Mono. Developers for Windows would also like to know how something is done in code, and Microsoft has thousands of examples, they just aren’t sharing them.

#10 – Windows Media Player

We want one Media app to rule them all. Windows users are tired of having multiple media players installed. Nobody wants to have all the following apps on their box: WMP, QuickTime, RealPlayer, MPlayer, FlashPlayer, and other one off players.

We are all tired of not being able to play a specific file or media type. If the WMP project were open sourced, it could become the one and only player a user would ever need, with the ability to play media types other codexes that it cannot play now.

Someone would surely write code for it to manage the music on iPods and other MP3 players in a quality manner. This is also strategic for the brand and tactical business act in that this would essentially kill iTunes, and lead the music buying industry back to whatever site Windows Media Player delivered, probably something that gives Microsoft a percentage of the purchase price.

#11 – An Application update service for all applications

Every single application thinks it needs to write its own software to update itself.  And they all have to run their own icon in my task bar, and check for their own software. There should be a project started called the application update services and applications register with this service.  Then one single icon in the task bar can look up the update needs for any application on the system.  No more separate updates from Java, Adobe, and others.

#12 – Regedit.exe

Many of you who are like me are in the registry all the time, developing it, testing it, troubleshooting it, checking settings, changing settings, tweaking performance.  There are dozens of simple features that Regedit.exe is lacking.  Such as the ability to past in a long registry key and have the tool browse to that key, like Explorer.exe allows for directories.  No, you have to click on every last key yourself.

Not to mention that there could be dozens of plugins that allow for making all the things we do in the registry easier (remember the earlier list: developing it, testing it, troubleshooting it, checking settings, changing settings, tweaking performance).

Why is each root key on the same screen, maybe they should be separate tabs?  If this were open source, someone could create that option.

Why can’t we go to an Ethernet tab and have a some easy options to optimize for 100 M or 1GB or the dozens of other advanced but common settings for Ethernet controllers, such as MTU.

Why can’t we do any of this?  Because the Microsoft developers are not being told to develop these in their road maps. But system administrators and desktop administrators and power users who live in the Windows world would love such features and many would add them if they only could have access to the source to do so.

Conclusion

Microsoft is starting to come around to the benefits of open source. They are much more open to it than they have been in the past and they can get the vision of open sources projects that they don’t need to maintain, then everyone will benefit in their own way.

How to read the 64 bit registry from a 32 bit application or vice versa

I found out that I needed to read the 64 bit registry from a 32 bit app today.

Why you might ask?

Well, I need to get the RegisteredOrganization value from HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion and unfortunately Microsoft has a bug where the WOW6432 version of this key always says Microsoft, so a 32 bit application would always return Microsoft as the RegisteredOrganization, regardless of what the user entered when they installed the OS. This is hardly desired.

Note: This is also why all Visual Studio projects created in Windows 7 64 bit have Microsoft in the project’s Assembly Information. Change the WOW6432 version of the RegisteredOrganization and you fix this Visual Studio issue.
Well, turns out C# doesn’t have functionality until .NET 4, so prior to .NET 4, to choose the 64 bit hive when running a 32 bit app, so we have to do use a DLLImport and use RegOpenKeyEx, RegCloseKey, and RegQueryValueEx.

I don’t have this well commented, and it is not very newbie proof, but here are three different ways to do this. Hopefully you can understand one or more of these.

Example 1 – .NET 4 Example

Here is how to do this in .NET 4.

using Microsoft.Win32;

namespace Read64bitRegistryFrom32bitApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string value64 = string.Empty;
            string value32 = string.Empty;

            RegistryKey localKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
            localKey = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
            if (localKey != null)
            {
                value64 = localKey.GetValue("RegisteredOrganization").ToString();
            }
            RegistryKey localKey32 = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
            localKey32 = localKey32.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
            if (localKey32 != null)
            {
                value32 = localKey32.GetValue("RegisteredOrganization").ToString();
            }
        }
    }
}

.NET 3.5 SP1 and Prior

This can also be done in .NET 3.5 and prior but it is not easy.
We have to do use a DLLImport and use RegOpenKeyEx, RegCloseKey, and RegQueryValueEx. Here are some examples.

Example 1 – A console application to read the 64 bit registry from a 32 bit application or vice versa

Here is the code in a simple one file project:
using System;
using System.Runtime.InteropServices;
using System.Text;

namespace Read64bitRegistryFrom32bitApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string value64 = GetRegKey64(RegHive.HKEY_LOCAL_MACHINE, @"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "RegisteredOrganization");
            Console.WriteLine(value64);
            string value32 = GetRegKey32(RegHive.HKEY_LOCAL_MACHINE, @"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "RegisteredOrganization");
            Console.WriteLine(value32);
        }

        public enum RegSAM
        {
            QueryValue = 0x0001,
            SetValue = 0x0002,
            CreateSubKey = 0x0004,
            EnumerateSubKeys = 0x0008,
            Notify = 0x0010,
            CreateLink = 0x0020,
            WOW64_32Key = 0x0200,
            WOW64_64Key = 0x0100,
            WOW64_Res = 0x0300,
            Read = 0x00020019,
            Write = 0x00020006,
            Execute = 0x00020019,
            AllAccess = 0x000f003f
        }

        public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);
        public static UIntPtr HKEY_CURRENT_USER = new UIntPtr(0x80000001u);

        #region Member Variables
        #region Read 64bit Reg from 32bit app
        [DllImport("Advapi32.dll")]
        static extern uint RegOpenKeyEx(
            UIntPtr hKey,
            string lpSubKey,
            uint ulOptions,
            int samDesired,
            out int phkResult);

        [DllImport("Advapi32.dll")]
        static extern uint RegCloseKey(int hKey);

        [DllImport("advapi32.dll", EntryPoint = "RegQueryValueEx")]
        public static extern int RegQueryValueEx(
            int hKey, string lpValueName,
            int lpReserved,
            ref uint lpType,
            System.Text.StringBuilder lpData,
            ref uint lpcbData);
        #endregion
        #endregion

        #region Functions
        static public string GetRegKey64(UIntPtr inHive, String inKeyName, String inPropertyName)
        {
            return GetRegKey64(inHive, inKeyName, RegSAM.WOW64_64Key, inPropertyName);
        }

        static public string GetRegKey32(UIntPtr inHive, String inKeyName, String inPropertyName)
        {
            return GetRegKey64(inHive, inKeyName, RegSAM.WOW64_32Key, inPropertyName);
        }

        static public string GetRegKey64(UIntPtr inHive, String inKeyName, RegSAM in32or64key, String inPropertyName)
        {
            //UIntPtr HKEY_LOCAL_MACHINE = (UIntPtr)0x80000002;
            int hkey = 0;

            try
            {
                uint lResult = RegOpenKeyEx(RegHive.HKEY_LOCAL_MACHINE, inKeyName, 0, (int)RegSAM.QueryValue | (int)in32or64key, out hkey);
                if (0 != lResult) return null;
                uint lpType = 0;
                uint lpcbData = 1024;
                StringBuilder AgeBuffer = new StringBuilder(1024);
                RegQueryValueEx(hkey, inPropertyName, 0, ref lpType, AgeBuffer, ref lpcbData);
                string Age = AgeBuffer.ToString();
                return Age;
            }
            finally
            {
                if (0 != hkey) RegCloseKey(hkey);
            }
        }
        #endregion
    }
}

Example 2 – A static class to read the 64 bit registry from a 32 bit application or vice versa

Or if you want this in its own separate class, here is a static class you can add to your project.
using System;
using System.Runtime.InteropServices;
using System.Text;

namespace Read64bitRegistryFrom32bitApp
{
    public enum RegSAM
    {
        QueryValue = 0x0001,
        SetValue = 0x0002,
        CreateSubKey = 0x0004,
        EnumerateSubKeys = 0x0008,
        Notify = 0x0010,
        CreateLink = 0x0020,
        WOW64_32Key = 0x0200,
        WOW64_64Key = 0x0100,
        WOW64_Res = 0x0300,
        Read = 0x00020019,
        Write = 0x00020006,
        Execute = 0x00020019,
        AllAccess = 0x000f003f
    }

    public static class RegHive
    {
        public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);
        public static UIntPtr HKEY_CURRENT_USER = new UIntPtr(0x80000001u);
    }

    public static class RegistryWOW6432
    {
        #region Member Variables
        #region Read 64bit Reg from 32bit app
        [DllImport("Advapi32.dll")]
        static extern uint RegOpenKeyEx(
            UIntPtr hKey,
            string lpSubKey,
            uint ulOptions,
            int samDesired,
            out int phkResult);

        [DllImport("Advapi32.dll")]
        static extern uint RegCloseKey(int hKey);

        [DllImport("advapi32.dll", EntryPoint = "RegQueryValueEx")]
        public static extern int RegQueryValueEx(
            int hKey, string lpValueName,
            int lpReserved,
            ref uint lpType,
            System.Text.StringBuilder lpData,
            ref uint lpcbData);
        #endregion
        #endregion

        #region Functions
        static public string GetRegKey64(UIntPtr inHive, String inKeyName, String inPropertyName)
        {
            return GetRegKey64(inHive, inKeyName, RegSAM.WOW64_64Key, inPropertyName);
        }

        static public string GetRegKey32(UIntPtr inHive, String inKeyName, String inPropertyName)
        {
            return GetRegKey64(inHive, inKeyName, RegSAM.WOW64_32Key, inPropertyName);
        }

        static public string GetRegKey64(UIntPtr inHive, String inKeyName, RegSAM in32or64key, String inPropertyName)
        {
            //UIntPtr HKEY_LOCAL_MACHINE = (UIntPtr)0x80000002;
            int hkey = 0;

            try
            {
                uint lResult = RegOpenKeyEx(RegHive.HKEY_LOCAL_MACHINE, inKeyName, 0, (int)RegSAM.QueryValue | (int)in32or64key, out hkey);
                if (0 != lResult) return null;
                uint lpType = 0;
                uint lpcbData = 1024;
                StringBuilder AgeBuffer = new StringBuilder(1024);
                RegQueryValueEx(hkey, inPropertyName, 0, ref lpType, AgeBuffer, ref lpcbData);
                string Age = AgeBuffer.ToString();
                return Age;
            }
            finally
            {
                if (0 != hkey) RegCloseKey(hkey);
            }
        }
        #endregion

        #region Enums
        #endregion
    }
}
Here is an example of using this class.
using System;
using System.Runtime.InteropServices;
using System.Text;

namespace Read64bitRegistryFrom32bitApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string value64 = RegistryWOW6432.GetRegKey64(RegHive.HKEY_LOCAL_MACHINE, @"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "RegisteredOrganization");
            string value32 = RegistryWOW6432.GetRegKey32(RegHive.HKEY_LOCAL_MACHINE, @"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "RegisteredOrganization");
        }
    }
}

Example 3 – Adding extension methods to the managed RegistryKey object that read the 64 bit registry from a 32 bit application or vice versa

You know what else is a cool idea? Making it an extension class to the normal managed registry C# code. So you can create a regular managed RegistryKey and then just call an extension function off it.
using System;
using System.Runtime.InteropServices;
using System.Text;
using Microsoft.Win32;

namespace Read64bitRegistryFrom32bitApp
{
    /// <summary>
    /// An extension class to allow a registry key to allow it to get the
    /// registry in the 32 bit (Wow6432Node) or 64 bit regular registry key
    /// </summary>
    public static class RegistryWOW6432
    {
        #region Member Variables
        #region Read 64bit Reg from 32bit app
        public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);
        public static UIntPtr HKEY_CURRENT_USER = new UIntPtr(0x80000001u);

        [DllImport("Advapi32.dll")]
        static extern uint RegOpenKeyEx(
            UIntPtr hKey,
            string lpSubKey,
            uint ulOptions,
            int samDesired,
            out int phkResult);

        [DllImport("Advapi32.dll")]
        static extern uint RegCloseKey(int hKey);

        [DllImport("advapi32.dll", EntryPoint = "RegQueryValueEx")]
        public static extern int RegQueryValueEx(
            int hKey, 
            string lpValueName,
            int lpReserved,
            ref RegistryValueKind lpType,
            StringBuilder lpData,
            ref uint lpcbData);

        [DllImport("advapi32.dll", CharSet = CharSet.Unicode, EntryPoint = "RegQueryValueEx")]
        private static extern int RegQueryValueEx(
            int hKey,
            string lpValueName,
            int lpReserved,
            ref RegistryValueKind lpType,
            [Out] byte[] lpData,
            ref uint lpcbData);
        #endregion
        #endregion

        #region Functions
        public static string GetRegKey64(this RegistryKey inKey, String inPropertyName)
        {
            string strKey = inKey.ToString();
            string regHive = strKey.Split('\\')[0];
            string regPath = strKey.Substring(strKey.IndexOf('\\') + 1);
            return GetRegKey64(GetRegHiveFromString(regHive), regPath, RegSAM.WOW64_64Key, inPropertyName);
        }

        public static string GetRegKey32(this RegistryKey inKey, String inPropertyName)
        {
            string strKey = inKey.ToString();
            string regHive = strKey.Split('\\')[0];
            string regPath = strKey.Substring(strKey.IndexOf('\\') + 1);
            return GetRegKey64(GetRegHiveFromString(regHive), regPath, RegSAM.WOW64_32Key, inPropertyName);
        }

        public static byte[] GetRegKey64AsByteArray(this RegistryKey inKey, String inPropertyName)
        {
            string strKey = inKey.ToString();
            string regHive = strKey.Split('\\')[0];
            string regPath = strKey.Substring(strKey.IndexOf('\\') + 1);
            return GetRegKey64AsByteArray(GetRegHiveFromString(regHive), regPath, RegSAM.WOW64_64Key, inPropertyName);
        }

        public static byte[] GetRegKey32AsByteArray(this RegistryKey inKey, String inPropertyName)
        {
            string strKey = inKey.ToString();
            string regHive = strKey.Split('\\')[0];
            string regPath = strKey.Substring(strKey.IndexOf('\\') + 1);
            return GetRegKey64AsByteArray(GetRegHiveFromString(regHive), regPath, RegSAM.WOW64_32Key, inPropertyName);
        }

        private static UIntPtr GetRegHiveFromString(string inString)
        {
            if (inString == "HKEY_LOCAL_MACHINE")
                return HKEY_LOCAL_MACHINE;
            if (inString == "HKEY_CURRENT_USER")
                return HKEY_CURRENT_USER;
            return UIntPtr.Zero;
        }

        static public string GetRegKey64(UIntPtr inHive, String inKeyName, RegSAM in32or64key, String inPropertyName)
        {
            //UIntPtr HKEY_LOCAL_MACHINE = (UIntPtr)0x80000002;
            int hkey = 0;

            try
            {
                uint lResult = RegOpenKeyEx(inHive, inKeyName, 0, (int)RegSAM.QueryValue | (int)in32or64key, out hkey);
                if (0 != lResult) return null;
                RegistryValueKind lpType = 0;
                uint lpcbData = 1024;
                StringBuilder strBuffer = new StringBuilder(1024);
                RegQueryValueEx(hkey, inPropertyName, 0, ref lpType, strBuffer, ref lpcbData);
                string value = strBuffer.ToString();
                return value;
            }
            finally
            {
                if (0 != hkey) RegCloseKey(hkey);
            }
        }

        static public byte[] GetRegKey64AsByteArray(UIntPtr inHive, String inKeyName, RegSAM in32or64key, String inPropertyName)
        {
            int hkey = 0;

            try
            {
                uint lResult = RegOpenKeyEx(inHive, inKeyName, 0, (int)RegSAM.QueryValue | (int)in32or64key, out hkey);
                if (0 != lResult) return null;
                RegistryValueKind lpType = 0;
                uint lpcbData = 2048;

                // Just make a big buffer the first time
                byte[] byteBuffer = new byte[1000];
                // The first time, get the real size
                RegQueryValueEx(hkey, inPropertyName, 0, ref lpType, byteBuffer, ref lpcbData);
                // Now create a correctly sized buffer
                byteBuffer = new byte[lpcbData];
                // now get the real value
                RegQueryValueEx(hkey, inPropertyName, 0, ref lpType, byteBuffer, ref lpcbData);

                return byteBuffer;
            }
            finally
            {
                if (0 != hkey) RegCloseKey(hkey);
            }
        }
        #endregion

        #region Enums
        public enum RegSAM
        {
            QueryValue = 0x0001,
            SetValue = 0x0002,
            CreateSubKey = 0x0004,
            EnumerateSubKeys = 0x0008,
            Notify = 0x0010,
            CreateLink = 0x0020,
            WOW64_32Key = 0x0200,
            WOW64_64Key = 0x0100,
            WOW64_Res = 0x0300,
            Read = 0x00020019,
            Write = 0x00020006,
            Execute = 0x00020019,
            AllAccess = 0x000f003f
        }
        #endregion
    }
}
Here is an example of using these extension functions.
using Microsoft.Win32;

namespace Read64bitRegistryFrom32bitApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string value64 = string.Empty;
            string value32 = string.Empty;

            byte[] byteValue64 = new byte[1024];
            byte[] byteValue32 = new byte[1024];
            RegistryKey localKey = Registry.LocalMachine;
            
            localKey = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
            if (localKey != null)
            {
                value32 = localKey.GetRegKey32("RegisteredOrganization");
                value64 = localKey.GetRegKey64("RegisteredOrganization");

                // byteValue32 = localKey.GetRegKey32AsByteArray("DigitalProductId"); // Key doesn't exist by default in 32 bit
                byteValue64 = localKey.GetRegKey64AsByteArray("DigitalProductId");
            }
        }
    }
}
If anything is confusing please comment.
Resources:
  • RegOpenKeyEx Function – http://msdn.microsoft.com/en-us/library/ms724897%28v=VS.85%29.aspx
  • RegQueryValueEx Function – http://msdn.microsoft.com/en-us/library/ms724911%28VS.85%29.aspx
  • http://www.pinvoke.net/default.aspx/advapi32/RegQueryValueEx.html
  • http://www.pinvoke.net/default.aspx/advapi32/RegOpenKeyEx.html
  • http://www.pinvoke.net/default.aspx/advapi32/RegCreateKeyEx.html
  • http://www.pinvoke.net/default.aspx/advapi32/RegCloseKey.html
  • http://stackoverflow.com/questions/1470770/accessing-registry-using-net
  • http://connect.microsoft.com/VisualStudio/feedback/details/400597/registeredorganization-reg-key-on-x64-vista-7

Copyright ® Rhyous.com – Linking to this post is allowed without permission and as many as ten lines of this page can be used along with this link. Any other use of this page is allowed only by permission of Rhyous.com.

Installing and testing PC-BSD 8.2 RC2

I am installing PC-BSD 8.2 RC2.

I really love that I can just choose ZFS as the file system and I don’t have to really make a huge effort to get it to work.

I found polish issues, but nothing serious yet.

Take a moment to install and share your experience here:

http://forums.pcbsd.org/showthread.php?p=85374&posted=1#post85374

VirtualBox on FreeBSD – Don’t use lagg0 and don’t use NAT

So my networking on my host has been extremely slow and choppy on my VM guests. I read somewhere to not use NAT but when I tried to turn off NAT, I could never get and IP address. Turns out that was the fault of lagg.

I have disabled lagg and configured my VMs to use bridging mode and suddenly my host is extremely fast.

Also, when I accidently configured my VM to use iwn0 instead of wlan0, the system hung, followed by a reboot.

So lets sum up the three tips for using VirtualBox on FreeBSD:

  1. Don’t use lagg on the host.
  2. Don’t use NAT.
  3. Don’t configure the guest to use your wireless device using iwn0, but make sure to use wlan0.

Russian Government going Open Source…and the future

Well, I have seen governments claim they are going to open source before, but not from Russia, and not with such a realistic plan to migrate over a few years.

Here is a link to the article via Google translate:

Putin ordered the transfer of power on Linux

The now

Business drives software development.  Open Source communities help, but even today much of the ongoing development for Linux is driven by businesses such as Red Hat and Novell and others.  If you think your Linux code is being written by unpaid developers in their spare time, you are somewhat correct but only partially.  Most changes are made by developers who are paid.

While communities are nice, they can’t match the hours or output of experienced developers working forty to sixty hours a week.

Looking Ahead…the Apps…and C# (Mono)

The more open source is used in business, the more development power it will have.  But it is not the open source Operatings Systems that prevent people from moving to Linux or BSD.  Ubuntu, SUSE, Fedora, CentOS, PC-BSD, and numerous others are all very usable desktops that are user friendly.  It is the software that runs on them that everyone is waiting for.

The market is already there to make millions extra if you application runs cross platform, one Windows, MAC, Linux, and BSD.

But most the applications written for Windows, the business desktop of today, are using .NET Framework. So naturally those companies are going to want to make their code cross platform.  And they are going to find it is easier than they thought to move their applications between platforms using C#.  I have recently decided that C# is the future of applications on all platforms.

Some MAC and Linux users don’t like Microsoft and will fight off the idea of a Microsoft provided development platform such as C# (Mono) on their systems.  But when a corporation decides that you must run software X, and software X requires .NET, and you have to either give up your MAC or Linux box for a Windows box, or use C# (Mono), then users will come around.

If you are a company writing software for Windows only today and using C#, you need to take a look at Mono. Even if the return on investment of developing a C# (Mono) based version of your product is a slight loss to break even, it is an investment in the future.  Once written, maintenance costs will be less than the original development costs and that slight loss to break even margin will turn to a small profit.  And with the experience, you next app will migrate to C# (Mono) that much easier and soon, all you apps will run anywhere that C# (Mono) can run.

This is going to take off in a way Java hasn’t because developers for windows prefer and will continue to prefer .NET over Java.  And when it comes to business apps, Java just isn’t the language of choice.  Business applications are written in C#.

How to tranfer a TiVo recording and watch it on FreeBSD?

I broke my TiVo remote to my TiVo series II.

I wanted to watch a TiVo recording on my laptop…running FreeBSD. I had never done this, so I wasn’t sure if it was going to happen.

Gratefully, I succeeded. Here is what I had to do.

Step 1 – Find my media access key.

You can find this on your TiVo, but since I didn’t have a remote, I couldn’t look on my TiVo.  So I went to http://www.Tivo.com, logged in, and sure enough under My Account, there was a link to see my Media Access Key.

Step 2 – Download a video recording from your Tivo

  1. Connect to you Tivo using your favorite web browser using https.
    Note: I wasn’t sure of my Tivo’s IP Address so I had to connect to my Wireless router and look at its DHCP leases.
  2. Login using these credentials:
    User: tivo
    Password: [your media access key]Once in, you will see a list of recordings in a table and you can download them as you desire.
  3. Download your recording.  Your recordings are .tivo files.

Step 3 – Install tivodecode

When I tried to play the .TiVo file with mplayer, it failed. So I looked at how to convert it.

Turns out there is a port called tivodecode.  Install it as follows.

# cd /usr/ports/multimedia/tivodecode
# make install

Step 4 – Decode the .TiVo file

Run the following command to decode your .TiVo file.

tivodecode “Some Video.TiVo” -o “Some Video.mpg”

And now you can play decoded video in mplayer.

Windows Live Messenger update broke again: Error 8100030d

Hey a few months ago, Windows Live Messenger was update by Microsoft.

Afterwards, it would not let me log in. It gave me this error and took me to this page:
Error 8100030d: Cannot Sign-in to Windows Live Messenger

That page did not help at all.

This page worked the first time:
How to perform Clean Installation of Windows Live Messenger

However, it was still very annoying.  And I complained the first time it happened.

Well, Windows Live was updated by Windows Update again, and yes, you guessed it, this same issue happened again.

A second time is just unacceptable.

Especially since neither of the websites above fix this.  I expected the second one to fix this again, but alas, it does not!