Awesome Windows 7 Logon background

November 20, 2009 by Dave · 2 Comments

Just something I thought may be good enough to share.


Click for full sized image.

How To: Set logon background in Windows 7:

- Save the image as backgroundDefault.jpg.

- Place the image in c:\Windows\System32\oobe\info\backgrounds\

Note that you’ll need to create the info and backgrounds folders.

- Open gpedit.msc, the Group Policy editor and Navigate to:

Computer Configuration -> Administrative Templates -> System -> Logon

- Set the Always use custom logon background policy to Enabled.

Windows will now load the custom background each time the logon screen is invoked.

Screenshot of Windows 7 Logon UI:

GVNotifier brings Google Voice SMS to the desktop

November 18, 2009 by Dave · 63 Comments

Welcome Lifehacker!  Follow @davux on twitter!

This is an old version, get the latest GVNotifier here.

This project is superseding the DigsbyGV project.  GVNotifier brings Google Voice services to the desktop in the form of a notification app.

GVNotifier.net supports one-click calling right from the SMS window.

Click the tray icon to display your personalized favorite list.  Contacts are placed on this list if they appear in the inbox.

Send messages to users not in the recent list.

Download:

GVNotifier requires the .NET Framework 3.5 and Windows XP, Windows Vista or Windows 7.  Aero recommended.

GVNotifier.net 1.0 [ClickOnce Install]

Update: 11/19/09 (Build 20)

- A bug that prevented the ‘call’ button from working has been fixed.

Update 11/20/09 (Build 50)

- Fixed a bug loading contacts without names.

- Fixed a UI animation bug.

- Included dialog to send a message to any number.

- Fixed ‘Check for updates’ in About dialog.

- Added option to check for new SMS messages by middle-clicking the tray icon, or selecting the menu option.

- Smooth loading of contact list.

Update 11/21/09 (Build 52)

- ClickOnce installer now manages updates.

- Possible fix for sending SMS on certain GV accounts.

Update 11/22/09

- If you’re having trouble sending SMS and would be willing to let me log into your account so I can figure out why, please let me know!  Several users have reported being unable to send SMS.  I’m unable to reproduce the problem with any of my accounts.

Update 11/25/09 (Build 70)

- Fixed an issue that was causing HTTP 500 errors for some users.  Try using –mobile if it still isn’t working.

Update 11/26/09 (Build 80)

- Fixed some possible issues with logging in.  If you were unable to login (RNR_SE is missing, Invalid User/Pass), get the update and try again.  Restart twice to get the updater to launch.

HowTo: Google Voice SMS in Digsby with DigsbyGV 1.1

October 23, 2009 by Dave · 4 Comments

This product has been deprecated, Use GVNotifier.net instead.

Start by downloading DigsbyGV 1.1, and unpacking the ZIP archive.

Unpack the DigsbyGV files to a directory with read/write permissions. A good place is the My Documents folder.

Double-click DigsbyGV.exe to start DigsbyGV for the first time. DigsbyGV will register itself the first time it is run.

After DigsbyGV has obtained it’s registration file, it won’t attempt to register again.

The configuration file is validated, and a message is shown if errors are present.

These errors will be corrected after selecting OK.

Enter your Google Voice account details.

  • Username:  Your Google Voice username (you@gmail.com, etc).
  • Password: Your Google Account password
  • Callback Number:  The number which Google Voice will call when selecting to call a contact.  This number must exist in Google Voice as a phone on your account.

Click Test Account to check if the settings are correct.

Select XMPP Server to configure the Connection from Digsby.  The password must be configured manually, no default password is present.  This is the password which will be used when connecting from Digsby.

Save by clicking OK or Apply.  Upon doing so, Google Voice will begin connecting, and XMPP connections will be allowed.

DigsbyGV will remain in the notification area, the icon may be hidden by selecting Hide Icon from the right-click menu.

Add the DigsbyGV XMPP account in Digsby

Create a new account in Digsby, press Ctrl + P to access the Preferences menu.

Create a new IM account with the type Jabber.

The Jabber ID is always voice@localhost.  The password is configured in the XMPP Server tab of DigsbyGV.  Advanced settings do not need to be changed.

Once the Jabber connection connects to DigsbyGV, contacts will be placed in the Google Voice group.  Note: it may take a minute or more to authenticate with Google Voice for the first time.

If a friendly name is configured within Google Voice, it will be shown on the contact list.  Selecting the Website link will connect a call between the selected user, and your callback number.

SMS Messages, and Voicemail transcripts will be sent as detected.  Note:  Messages will only be shown if detected while DigsbyGV is running.  SMS Messages and Voicemail messages received while DigsbyGV is not running will not be shown.

Google Voice support comes to Digsby (DigsbyGV)

October 20, 2009 by Dave · Leave a Comment
Google Voice for Digsby

Google Voice support is few and far between on the desktop.  I’ve created a plugin for Digsby which allows SMS messages to be sent and received as if they were sent from the Google Voice web interface.

Messages are sent and received from the phone number itself, contact name support is not enabled yet. To send a new message, use the Digsby->New IM… option, and enter a phone number as 1235554567 or (123)555-4567.

Download DigsbyGV and run the application.  Enter your Google Voice information, and create a password which you will use to connect from Digsby.  Create a new Jabber account in Digsby, with the username voice@localhost, and the password that is set in DigsbyGV.  Once the account is connected, new SMS messages will be routed to Digsby as an IM!

Update: DigsbyGV has been replaced by GVNotifier.net

iPhone 3.1 Jailbreak “No Service” fix.

October 1, 2009 by Dave · 1 Comment

After upgrading my iPhone with pwnage tool 3.1, I no longer had AT&T cellular service. The phone would not display the AT&T Carrier text, and data could only be transferred via WiFi.  The text would alternate between Searching… and No Service.

I’ve realized that the issue is that pwnage tool will automatically select “Activate” when Jailbreaking the firmware image.

In order to use your iPhone with OS 3.1 and AT&T, remember not to select Activate when jailbreaking.

pwn_gens

Select General to modify Activation options.

pwn_gen

Remember to unselect Activate the Phone.  This will allow the iPhone to work on AT&T with the proper activation.

Ping remote host in Javascript using WMI

September 27, 2009 by Dave · Leave a Comment

I’ve been working on a simple Windows Sidebar Gadget that will determine if a remote host is online or not. For the connectivity test I chose ping, since it’s lightweight and unlikely to disturb any services on a device.

Ping using WMI

function Ping(host)
{
	var wmi = GetObject("Winmgmts:");
	var eStatus = new Enumerator(wmi.ExecQuery(
"Select StatusCode from Win32_PingStatus Where Address='" + host + "'"));
	return eStatus.item().StatusCode == 0;
}

The function Ping will return true if the host is online, false otherwise. Optionally, a Timeout parameter may be specified in the WMI query.

Faster Windows Gadget development & testing

September 27, 2009 by Dave · Leave a Comment

Testing and debugging of Windows Sidebar Gadgets may be painful if you wish to test or debug a gadget that has a configuration. Removing and re-creating a gadget by dragging it out of the Gadget window will delete any saved configuration. I’ve found that I would like to restart the sidebar and refresh all the gadgets at once. Restarting the Sidebar process is also the only way to flush the image cache. If you’re having caching problems, restarting the Sidebar will reload the data from disk.

To restart the sidebar with just a click – create the following batch file:

taskkill /F /IM sidebar.exe && "c:\Program Files\Windows Sidebar\sidebar.exe"

Save the file as restart_sidebar.bat. Elevation is not required to restart the sidebar.

C#: Don’t display the startup form.

September 26, 2009 by Dave · Leave a Comment

Something that often seems to be a problem with beginning C# developers is the display of the initial form.  Normally one would always want the startup form to be displayed as soon as possible–but sometimes the application lives in the tray, or should not initially display a window.

One may first think that an event in System.Windows.Forms.Form can be handled, and the form may be directed to Hide.  Unfortunately, this won’t work as expected, the Form will always get the SW_SHOW message when Application.Run() is executed.

When creating a new project, Visual Studio will generate a Program.cs which looks similar to the following:

namespace CamOn
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

When Application.Run is invoked with a Form parameter, it will create and show the window. The easiest way to override this behavior is to simply not call Application.Run with the form:

namespace CamOn
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            new Form1();
            Application.Run();
        }
    }
}

Form1 will still be created and pump messages – but it won’t initially be shown.

Reading Motion-JPEG camera streams

September 26, 2009 by Dave · Leave a Comment

I’ve recently come across a Hawking HNC230G network camera, which shares internals with the Edimax IC-1500Wg. These cameras pump out a Motion-JPEG stream which is unlike many other “Motion-JPEG” IP cameras.

Many of these devices will create video with a constantly updating jpeg file, served via HTTP. This is generally a better solution than what exists in my camera. Reading these streams is simple in many languages. The HNC230G took a little more probing and experimentation before I could read data without artifacts.

Camera Services

HTTP Administration website – Port 80
Motion-JPEG stream – Port 4321

There does not appear to be any images on the HTTP administration website. All video data passes through the service on 4321. Video data is not encrypted or secured in any way – there is no authentication.

Finished Protocol

After a socket is connected to the service on 4321, it should send the single command which is supported: 0110\n. Sending 0110 followed by a linebreak will signal the device to send a JFIF frame.

The camera will send 4 bytes of data before the JFIF header, these bytes can be interpreted as follows:

  • Byte 1: High 8 bits of the frame size
  • Byte 2: Low 8 bits of the frame size
  • Byte 3: Active users on the camera
  • Byte 4: Unknown reserved byte

The size of the frame is calculated only after the 4-byte header. The process can be repeated once the frame has been received by the client. The image data received will contain a JFIF (JPEG File Interchange Format) frame.

I’ve been able to achieve approximately 10fps at 640×480 with this method.

Limitations

The key limitations with this method relate to the firmware design for this camera.

  • Image size can only be set through the HTTP web service.
  • LED state can only be queried or set through the HTTP web service.
  • The device will sometimes disconnect the client or return invalid data. This is solved by reconnecting the client.
  • As the number of users increase, the possible frames-per-second decreases. Frame rates are 25-50% less when adding a second user.

Sample C# Code

       public byte[] GetFrame()
        {
            if (!conn.Connected)
            {
                Connect();
                if (!conn.Connected)
                {
                    throw new Exception("Cannot fetch frame from camera.  Not Connected.");
                }
            }
 
            StreamWriter sw = new StreamWriter(conn.GetStream());
 
            // request a frame
            sw.WriteLine("0110");
            sw.Flush();
 
                // get the high 8bits of the size
                int size = conn.GetStream().ReadByte() &lt;&lt; 8;
                // get the low 8bits of the size
                size += conn.GetStream().ReadByte();
 
                // active users
                int j1 = conn.GetStream().ReadByte();
                ActiveUsers = j1;
                // unknown byte
                int j2 = conn.GetStream().ReadByte();
 
                if (size == 0)
                {
                    return null;
                }
 
                return new BinaryReader(conn.GetStream()).ReadBytes(size);
        }

Get to your Windows desktop faster – secure automatic logon.

September 26, 2009 by Dave · Leave a Comment

The common advice for automatically locking the computer after logging in is to create a batch file and add it to the startup folder. Unfortunately the experience isn’t very elegant, or secure. The desktop and shell will appear while applications are loading, long before the computer will lock itself. The possibility exists for someone to tamper with the computer while it is in this intermediate loading state.

A solution to this problem is to lock the computer sooner in the logon process. There are several good places within the logon process to put a task, but the one that may execute the soonest is certainly Userinit. Userinit is the first program which is executed after logon.

From MSDN: http://msdn.microsoft.com/en-us/library/aa378750(VS.85).aspx

Userinit.exe is an application that is executed when the user has logged on. It runs in the newly logged-on user’s context and on the application desktop. Its purpose is to set up the user’s environment, including restoring network uses, establishing profile settings such as fonts and screen colors, and running logon scripts. After completing those tasks, Userinit.exe executes the user shell programs. The shell programs inherit the environment that Userinit.exe sets up. The specific shell programs that Userinit.exe executes are stored in the Shell key value under the Winlogon registry key.

Add the lock command to Userinit

Create a batch file that will lock the computer:

rundll32.exe user32.dll,LockWorkStation

Name the file lock.bat and place it in the System Root. (c:\windows\system32).

Open regedit and navigate to:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon

The registry value Userinit should contain the path to Userinit.exe

C:\Windows\system32\userinit.exe

Change the value to contain the lock batch file before the Userinit.exe, with a comma between.

C:\Windows\System32\lock.bat, C:\Windows\system32\userinit.exe

Windows Registry at Winlogon key

Log off to see the result. Note that using a batch file does not discriminate between automatic logon, and user-initiated logon. One could write a program that would only call LockWorkStation if the computer was up for less than 10 minutes.

To enable automatic logon

If automatic logon isn’t already enabled, execute control userpasswords2 at the Run prompt, and uncheck Users must enter a username and password to use this computer.

« Previous PageNext Page »