Custom Monitor Drivers

A common problem I’ve run into is newer monitors not reporting refresh rates and so on correctly to Windows 98 so you end up stuck with 60hz.

Fortunately it isn’t too much of a pain to make your own monitor driver to fix any bad resolutions.

The generic driver

This snippet should be saved as yourmonitor.ini. You can then use the “have disk” option when installing the monitor driver to select this ini file, and it will fix up any resolutions you specify that may be misconfigured in the EDID.

[Version]
Signature="$CHICAGO$"
Class=Monitor
ClassGUID={4d36e96e-e325-11ce-bfc1-08002be10318}
DriverVer=8/17/25, 1.0.0.0
Provider=%MFG%

[Manufacturer]
%MFG%=Generic

[Generic]
%MODEL%=Generic-UXGA.Install

[Generic-UXGA.Install]
DelReg=DEL_CURRENT_REG
AddReg=Generic-UXGA.AddReg,1600,DPMS

[Generic-UXGA.AddReg]
HKR,"MODES\1600,1200",Mode1,,"15.0-98.0,24.0-75.0,-,+"

[DEL_CURRENT_REG]
HKR,MODES
HKR,,MaxResolution
HKR,,DPMS

[1600]
HKR,,MaxResolution,,"1600,1200"

[DPMS]
HKR,,DPMS,,1

[Strings]
MFG="Generic"
MODEL="Generic LCD Panel"

If all you care about is fixing one resolution here are the lines you need to care about:

[Generic-UXGA.Install]
DelReg=DEL_CURRENT_REG
AddReg=Generic-UXGA.AddReg,1600,DPMS

This calls 2 other sections, Generic-UXGA.AddReg and 1600 which both add configuration for the 1600x1200 resolution to work at 75hz, which is supported by my monitor but for some reason it only reports 60hz in the EDID.

[Generic-UXGA.AddReg]
HKR,"MODES\1600,1200",Mode1,,"15.0-98.0,24.0-75.0,-,+"

This allows the frequencies for horizontal and vertical sync ranges to be specified. The first pair is MinHSync to MaxHSync, the second pair is MinVSync to MaxVSync, then the horizontal polarity and vertical polarity.

To get the values you’ll want to consult something like cvt here:

$ cvt 1600 1200 75
# 1600x1200 74.98 Hz (CVT 1.92M3) hsync: 94.09 kHz; pclk: 204.75 MHz
Modeline "1600x1200_75.00"  204.75  1600 1720 1888 2176  1200 1203 1207 1255 -hsync +vsync

I just rounded up the numbers I got from cvt for vsync and hsync and it seemed to work. Also notice that the hsync polarity has been flipped, I’m not an expert on this part but largely I just copied what cvt spat out.

One absolute mystery is I had to add another 3 kHz to the max hsync value (note that it is 98.0 not 95.0 as you might expect) given to Windows before it would do the full 75Hz refresh. I have no idea why this is, but you may also need to do some experimentation to get it right. The vsync values seem to work as is.

Modify to suit the resolution and refresh rate you wish to fix.

[1600]
HKR,,MaxResolution,,"1600,1200"

I don’t know if this is technically necessary but every example monitor driver I could find seemed to have it, and when fixing multiple resolutions, multiple MaxResolution keys are added.

So, for example if you also wanted to fix up 800x600 in addition to 1600x1200 and add 75hz support for that, you would modify the Generic-UXGA.Install section:

[Generic-UXGA.Install]
DelReg=DEL_CURRENT_REG
AddReg=Generic-UXGA.AddReg,1600,800,DPMS

Modify Generic-UXGA.AddReg (note the slightly different values, again taken from cvt):

[Generic-UXGA.AddReg]
HKR,"MODES\800,600",Mode1,,"15.0-48.0,24.0-75.0,-,+"
HKR,"MODES\1600,1200",Mode1,,"15.0-98.0,24.0-75.0,-,+"

Then finally add a new section for 800 above 1600:

[800]
HKR,,MaxResolution,,"800,600"

[1600]
HKR,,MaxResolution,,"1600,1200"

That’s really about it.

For extra points and/or fun you can modify these strings I configured down the bottom to suit your monitor:

[Strings]
MFG="Generic"
MODEL="Generic LCD Panel"
[Strings]
MFG="Arcooda"
MODEL="Arcooda LCD Panel"

The model is what will appear in your Display Properties:

Alt text