The problem

If you happen to own the excellent L245WP-BN and/or L246WP-BN monitor and also have it connected over HDMI to an NVIDIA card with fairly recent drivers installed under Windows Vista (and possibly other versions of Windows as well), you may encounter an issue where the image at resolution 1900x1200 is cropped and off-center. More specifically, only the right-hand side of the image seems to be displayed while a sizable portion of the left-hand side (containing the start menu etc.) is cropped off.

Here's an image of what it looks like.

The current consensus is that, because an HDMI connection is used, the NVIDIA drivers assume that it is talking to a TV. This causes it to apply some extra filters and overscan compensation before sending the image to the monitor, which in turn results in the cropped image. This seems to be a fairly common issue with recent NVIDIA drivers, and one that they are apparently unwilling to fix. In all known cases, it has been reported that the standard Windows drivers display the 1900x1200 resolution flawlessly, confirming that it is indeed a driver problem.

The fix

Note: None of the information on this page is new; all of the information presented here is the hard work of other people (specifically at HardForum and Guru3D). I am merely attempting to provide a detailed view of my version of the process and point out some pitfalls along the way.

Note: This guide was written for and confirmed to work on Windows Vista 32-bit Home Premium SP2 and a GeForce GTS 250 video card with the ForceWare 257.21 driver. If you're having the problem described here, then this fix is likely to resolve it, as many different people with widely varying setups have reported success with this method. Regardless, following this guide is at your own risk and I will not be held responsible for any damage this may cause to your computer.

Here's a non-comprehensive list of configurations for which this fix has been known to work. If you've succesfully followed this guide and your configuration is not in here, shoot me an e-mail and I'll add it to the list.

OSGraphics CardDriver VersionConnection
Windows Vista 32 bit Home Premium SP2GeForce GTS 250257.21HDMI-out to HDMI-in
Windows 7 64 bit Home PremiumGeForce GTX 470197.75DVI-out to HDMI-in
Windows 7 64 bit Home PremiumGeForce 8800

People smarter than me figured out that the problem boils down to an EDID mismatch. Wikipedia's description of what EDID data is is pretty good, so I'll just copy it verbatim here:

Extended display identification data (EDID) is a data structure provided by a digital display to describe its capabilities to a video source 
(e.g. graphics card, Set-top box). It is what enables a modern personal computer  to know what kind of monitor is connected. EDID is defined by a 
standard published by the Video Electronics Standards Association (VESA). The EDID includes manufacturer name and serial number, product type, 
phosphor or filter type, timings supported by the display, display size, luminance data and (for digital displays only) pixel mapping data.

So it turns out there are two ways of solving the issue: flash your monitor's EDID data, or override the EDID data as presented to the driver. Luckily for us, with NVIDIA's drivers you can do the latter using a particular registry key. By modifying the EDID data in the right way, this will stop the driver from assuming it's talking to a TV and put you back in control of the scaling mode, thus also fixing the problem.

The value you need to set for the registry key depends on your computer's particular configuration. Specifically, you need 4 bytes that are part of your monitor's EDID data. To get these 4 bytes, you'll need a program that can read EDID data, such as Phoenix EDID designer (see below for a local mirror of the version I used if the link doesn't work).

In Phoenix, hit the Extract Registry EDID button (marked below with a red circle) to load EDID data from the registry.

A dialog will pop up that looks like this:

This listing seems to contain entries for every monitor you've ever connected to your computer. The first 3 letters of the Hardware ID field indicate the manufacturer of the monitor; some are readily apparent such as DEL for Dell, HWP for HP (Hewlett-Packard), SAM for Samsung, VSC for ViewSonic etc., but others may not be so obvious. For instance, the 3-letter code for LG is apparently GSM, which I am told stands for GoldStar Manufacturing, the old name of LG Electronics.

Take a look at the description field as well, as it sometimes contains the model name of the monitor at the end. Often though, you'll just find it described as "Generic PnP monitor". (For reference, note also that most of these values appear to correspond directly to the registry data found under HKLM\SYSTEM\CurrentControlSet\Enum\DISPLAY.)

Still, even the description field or knowing the brand name may not be enough as I have two entries for LG. If this is the case, we'll need to use another tool called DumpEDID to find out which one you need (see below for a local mirror of the version I used if the link doesn't work). DumpEDID will produce more detailed output for each entry, including such information as the monitor's full model name, supported resolutions, etc. Note that the entry you need is different on every computer and depends on your particular configuration! Just because I used some entry does not mean it is also the entry you need.

To use DumpEDID, simply start a command prompt (Windows+R, enter "cmd" and hit return), navigate to the directory where you've placed the executable and execute it. It's useful to redirect the output to a file, like so:

DumpEDID.exe > edid.txt

When the command completes, you will find a file called "edid.txt" in the same directory as the executable containing the output of the program. In it, you will find many detailed EDID data entries that look like this:

*****************************************************************

Registry Key             : DISPLAY\GSM5624\5&38c580a8&0&UID16777488
Monitor Name             : L245WP
Manufacture Week         : 7 / 2007
ManufacturerID           : 27934 (0x6D1E)
ProductID                : 22052 (0x5624)
Serial Number (Numeric)  : 10574 (0x0000294E)
EDID Version             : 1.3
Display Gamma            : 2.20
Vertical Frequency       : 56 - 75 Hz
Horizontal Frequency     : 28 - 84 KHz
Image Size               : 43.2 X 32.4 cm (21.3 Inch)
Maximum Image Size       : 52 X 32 cm (24.0 Inch)
Maximum Resolution       : 1680 X 1050
Support Standby Mode     : Yes
Support Suspend Mode     : Yes
Support Low-Power Mode   : Yes
Support Default GTF      : No
Digital                  : Yes

Supported Display Modes  :
     720 X  400  70 Hz
     640 X  480  60 Hz
     640 X  480  75 Hz
     800 X  600  60 Hz
     800 X  600  75 Hz
    1024 X  768  60 Hz
    1024 X  768  75 Hz
    1280 X 1024  75 Hz
    1600 X 1200  60 Hz
    1680 X 1050  60 Hz
    1280 X  960  75 Hz
    1280 X 1024  60 Hz

This is one of many entries that has L245WP as the monitor name, many of which look virtually identical. Note that on the first line, you can see the entry names as they are also reported in Phoenix. This is apparently a GSM5624 entry. My output also has very similar GSM5623 entries, but the difference is that all the GSM5623 entries have the Digital field set to No, while all the GSM5624 entries have Digital set to Yes. Since my monitor is connected through HDMI, which is a digital connection, I went with GSM5624.

Again, this is only for my particular computer and configuration -- yours may very well be different. It shouldn't be too hard for you to figure out which Phoenix entry you need. In most cases simply the brand identifier will suffice, but it's a good idea to double-check with DumpEDID anyway. On a side note, I have no idea why 1900x1200 is not listed here, or in any other L245WP entry for that matter.

So load up your entry in Phoenix (in my case, GSM5624) and hit the Byte Viewer button (marked below with a red circle):

This will open the raw EDID data byte view. The bytes you need are displayed here as bytes 8 through 11 (marked below with a red rectangle); in my case, 1E 6D 24 56. Note that the last two bytes happen to coincide with the product ID 5624 as also found in GSM5624. Again, your values may be different -- typically the 24 byte is a different value like 3F or something.

With our 4 bytes found, we're ready to edit the registry. Before we continue, please, please remember to make a backup of any registry values you change. This cannot be stressed enough.

Open the registry editor (Windows+R, enter "regedit", hit return) and navigate to HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Video. This key contains many subkeys with GUID names (you know, those strings that look like {15687F68-86E0-41BC-BD74-189D6CBF4F2C}). Exactly one of these GUID subkeys will contain subkeys 0000 and 0001 and, within both of those 0000 and 0001 subkeys, will have further subkeys Display, Settings, Uninstall and VolatileSettings. Note that there may be multiple GUID keys that contain the 0000 and 0001 subkeys, but there should be only one for which the 0000 and 0001 keys themselves contain further subkeys. This is the GUID key you need.

Within the correct GUID key you just found (in my case, {15687F68-86E0-41BC-BD74-189D6CBF4F2C}), navigate to the 0000 subkey. You should see a bunch of registry values already present in this key.

We're now going to create a new binary registry value within this 0000 subkey that will tell the NVIDIA drivers to override some EDID data which will fix our problem. The binary value we'll be assigning looks like this:

?? ?? ?? ?? 00 00 FF FF 04 00 00 00 7E 01 00

... where the first four bytes are given by those extracted from Phoenix (this is very important!). Since in my case the four bytes were 1E 6D 24 56, my binary value would become

1E 6D 24 56 00 00 FF FF 04 00 00 00 7E 01 00

But again, you may have a different four bytes and thus also a different binary value.

Ok, so let's create the registry value now. First, back up your GUID registry key (right-click > Export). Right-click on the 0000 subkey within the GUID subkey and pick New > Binary Value. Give it the name OverrideEdidFlags0, enter the binary value as you've constructed above (in hex) and hit OK.

That's it. Close the registry editor and reboot your computer. When it's back, you should now be able to enjoy a full 1900x1200 display and be able to select your scaling mode again from the NVIDIA Control Panel (under Adjust desktop size and position).

Resources