Microsoft Windows NT 3.51 [build 1057] (May 1995 - December 2001)



Overview



PREFACE


Installing Windows NT from CD, HDD or floppies as usual on modern hardware (I mean Pentium4-based and later PCs) it is a difficult task due to installer incompatibility with faster/newer hardware & CPUs. That doesnt mean that Windows NT cannot RUN on such hardware. You CAN install Windows NT in virtialization software (QEMU, VirtualBox, VmWare, VirtualPC, Bochs ...) and then copy intalled OS image on "real" PC harddrive.


General installation notes


On modern systems like Pentium-II CPUs or higher you may expect problems when installing NT 3.51 or updating it with service pack. To resolve these problems you must edit these files:

Windows NT 3.51 SuperPack ver.7 (POST SP5)



While treating NT3.51 after installing 80Gb HDD I've met trouble with accessing partitions above 2Gb (FAT32) under NT3.51. And I've got BSOD - INACCESSIBLE_BOOT_DEVICE. The problem was found inside scsidisk.sys (it is called disk.sys in NT4). It doesn't detect ExtendedX, FAT32, FAT32x, FAT16x partitions. I've rebuilt scsidisk.sys from NT4DDK in NT3.51 DDK. And now everything works fine. Along with this there are still some useful things in my collection. They help running NT 3.51 on new hardware and with some new applications.

Correction one: If after booting FAT32 partitioned drives are not visible you may install it manually by entering this value in registry (for example):

Hive: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices]
Key: Z: String Value: \\Device\\Harddisk0\\Partition2

Correction two: Windows NT 3.51 may not boot from (or not see) FAT32 volume if it is "dirty" i.e. has allocation/fat errors. Please check bootable FAT32 partitions via NDD.EXE or SCANDISK.EXE

Correction three: Some components from superpack also suitable for Windows NT 3.5, for example:
\FONT - ISO 9241 Part 3 Compliant 8x16 and 8x8 Fonts for DOS fullscreen/console sessions (12 codepages including Cyrillic 866) - very readable at screen, replace original ega.cpi ***.
\SYS\RENEW - recompiled atapi.sys, scsidisk.sys to support LBA large drives (without LBA48/137Gb+ support yet).

Download IT HERE ([?],[?],[?])

Directories: *- also suitable for NT4.
**- also suitable for NT4/2000.
***- also suitable for NT4/2000/XP/2003.

Making Windows NT 3.51 up-to-date MINI FAQ



Problem 1: Installing NT 3.51 on new PC's (PII/III-P4 or newer Class CPUs) (remove 8gb HDD limitation, enable AGP support, successful booting on new systems etc.) Note that NT 3.51 cannot boot from installation CD. You must use boot floppies. But you may copy installation CD to FAT16 harddisk partition and start install process from there (wINNT /B /X).
Solution: NT Service Pack Integration (Slipstreaming) Guide
Prerequisites: Let's start:
  1. This guide can also be used to update installation media for ALPHA/MIPS/PPC architecture on i386/AMD64 compatible computer. Just replace \I386 to either \ALPHA, \MIPS or \PPC folder
  2. Make directory C:\NT3INST. Extract there SSKIT.ZIP.
  3. Make directory C:\NT3INST\SP5. Extract there Service Pack 5:
    SP5_351I.EXE -D C:\NT3INST\SP5
    
  4. Of course you can also copy there any newer files from other (newer) updates overwriting older ones, like from IDE-FIXI.EXE package from hotfixes-postSP5 mentioned below. It is discovered that you MUST copy some files in C:\NT3INST\SP5 directory before using SSKIT:
    C:\NT3INST\SP5\WINNT\*.* to C:\NT3INST\SP5 ; updating NT351 Workstation.
    C:\NT3INST\SP5\NTAS\*.* to C:\NT3INST\SP5 ; updating NT351 Server.
  5. Copy comctl32.dll, ega.cpi files to C:\NT3INST\SP5 with replacing existing files.
  6. Make directory C:\NT3INST\I386. Copy there \I386 directory content (with sub-dirs) from NT351 Distributive.
  7. Make directory C:\NT3INST\OUT. It is a temporary directory for SSKIT.
  8. Make directory C:\NT3INST\SRC\I386. There will be placed final distributive.
  9. Go to C:\NT3INST directory. Start SSKIT from command line:
    sskit.exe C:\NT3INST\SP5\ C:\NT3INST\I386\ C:\NT3INST\OUT\
    
  10. After SSKIT make its work:
  11. Copy atapi.sys, atdisk.sys, ntldr, ntdetect.com files to C:\NT3INST\SRC\I386 with replacing existing files. If you are using UniATA driver also copy uniata.sys to C:\NT3INST\SRC\I386.
  12. If you want to integrate storage controller driver - make these changes in C:\NT3INST\SRC\I386\txtsetup.sif (viadsk.sys, for example) :
    [SCSI.Load]
    viadsk = viadsk.sys,4 ; first line, for I386
    ...
    
    [SCSI]
    ...
    viadsk = "VIA SATA/PATA Controller"
    ...
    
    Make these changes in C:\NT3INST\SRC\I386\dosnet.inf
    [Files]
    ...
    d1,viadsk.sys
    ...
    
  13. Go to C:\NT3INST directory. Start CDIMAGE.EXE from command line:
    CDIMAGE.EXE -e -h -lNT351SP5 -m -nt -o -pNT351SP5 -y5 -x C:\NT3INST\SRC nt351sp5.iso
    
    cdimage (or oscdimg) taken from WindowsPE ( xpsp2_2180_usa_x86fre_opk.zip or ensp1opk.zip )
  14. Burn nt351sp5.iso onto CD/DVD media using your favorite burning program and as a result we have an NT351 installation disk with slipstreamed/integrated Service Pack. :)
  15. Don't forget that after NT351 installation process using this disk you MUST apply SP5 from "native" distributive (to cover SP5 existence in registry):
    update.exe
    
    And then - reboot.
  16. I don't recommend to install NT network support until you apply latest service pack. Later you may install Post-SP5 patches, hofixes and install IE5 16-bit, if needed.

Problem 2: I need a driver for NEW (E)IDE/(S)ATA storage controller with busmastering, LBA48 & UDMA support
Solution: Windows NT has two internal drivers for (E)IDE/(S)ATA devices - atdisk.sys and atapi.sys. However it has some limitations: it cannot access drives above 8 Gb, no DMA support. You can get updated version from separate package 'Q153296: Write Cache on IDE/ATAPI Disks Is Not Flushed on Shut Down', IDE-FIXI.EXE. However this update does not solve such problems. I provide patched NT4 atapi.sys driver (and optional atdisk.sys from NT4SP6a). This updated atapi.sys driver supports DMA and LBA24 (+Int13 Extentions), but does NOT support LBA48 (> 137 Gb) and UDMA (only PIO, SWDMA, MWDMA modes).
For some controllers, chipsets updated storage driver is available:
Intel Corp. PIIX-PIIX4e - PIIX Bus Master IDE Driver 1.70.
VIA Technologies - Via Service Pack.
For newer controllers visit UniATA - Universal (E)IDE/(S)ATA driver for Windows NT3/NT4/2000/XP/2003. It supports a wide range of SATA/PATA controllers (see BM_DEVS.H in UniATA sources) but only in these modes: when you set 'AHCI' (experimental since summer 2012), 'Native IDE' or 'Legacy IDE' option in your computer's BIOS. RAIDs are unsupported. In some cases SCSIPORT.SYS fix is REQUIRED, problem described here.

For optical drives (CD, DVD, etc.) I recommend DVDWriteNow or Patch for cdrom.sys (NT4) :

CDROMX driver v.5 (replacement for CDROM.SYS, made by Alter)

Release version: cdromx_v5.rar
Debug version: cdromx_v5_dbg.rar

Note that regardless of storage driver Windows NT cannot install on a partition larger then 4Gb due to installer limitation since it creates NTFS partition from FAT16 one and FAT16 limit is 4Gb (with 64k clusters). However if we copy installed OS image to a larger partition, NT system will work fine from there.

Problem 3: I need a driver for new VIDEO adapter
Solution: For generic VESA BIOS extensions (VBE) driver visit VBEMP x86 Project

As for official mainstream support drivers, here is the shortlist:

  1. ATI (now AMD) Radeon cards: all cards below Rage128 chips, including mobile ones, i.e. Rage IIC, 3D Rage, Rage Pro and below. But there are the rumors that Rage128 cards has unreleased or hidden driver for this OS.
  2. Intel integrated graphics: all cards below/equal 810/815 chips i.e. all up to 740/810/815
  3. nVidia GeForce cards: all cards below/equal Riva128/TNT/TNT2 Series - unsure :(
  4. Matrox chips: Millennium/Mystique/Productivia/G100/G200 cards and below/equal.
  5. to be continued...

Problem 4: I need a driver for new NETWORK (W)LAN card
Solution: First of all - NT 3.51 Network NDIS3 driver model is Windows 95/NT 4.0 compatible. Some of the manufacturers dropped 95/NT 4.0 support in their drivers, some - not. You should visit sites showed below to find appropriate drivers.
  1. Intel Corp. - http://www.intel.com/support/index.htm
    *** 8086 Intel ****
    8086:1029  82559 Ethernet Controller
    8086:1229  82557/8/9/0/1 Ethernet Pro 100
    8086:2449  82801BA/BAM/CA/CAM Ethernet Controller
    
    Driver E100BNT.EXE, 3400952 bytes, released in April 1999.
    Driver warrenton382.exe, 16351744 bytes, released in June 2000.
    Driver IntelLAN_5.0.3_Win9x_WinME_Raw.exe*, 505879 bytes, released in January 2002.
    * Partialy compatible, however can be copied over older version installation.
    
    *** 1011 DEC ****
    1011:0002    ;Intel 21040
    1011:0014    ;Intel 21041
    1011:0009    ;Intel 21140
    1011:0019    ;Intel 21143
    1011:0039    ;Intel 21145
    
    *** 8086 Intel ****
    8086:0039    ;Intel 21145
    
    Driver dc21x4.zip, 711856 bytes, released in November 1999.
    
  2. 3Com Corp. - http://www.3com.com/products/en_US/downloadsindex.jsp
  3. Marvell Semiconductor, Inc. - http://www.marvell.com/drivers
  4. Broadcom Corp. - http://www.broadcom.com/support/
  5. Realtek Semiconductor Corp. - http://www.realtek.com.tw/downloads/
    *** 10ec Realtek ****
    10ec:8139  RTL-8139/8139C/8139C+
    
    Driver nt351.zip, 24277 bytes, released in September 1998.
    
Note that even when your Network adapter doesn't have suitable driver for Windows NT 3.51 you can connect computers using null-modem serial cable over serial RS-232 port. In some cases it is better than nothing.

Problem 5: I need a driver for FAT32 filesystem
Solution: Use UPDATED fastfat.sys from Superpack or from FASTFAT.ZIP package by unknown author (151450 bytes) [?],[?],[?] for this filesystem support. To install it replace %SystemRoot%/System32/Drivers/fastfat.sys with file from this archive and reboot. It is possible to BOOT from FAT32 partition in NT351, loaders from Windows 2000/XP/2003 and later (ntldr/ntdetect.com) are required!

But remember that this driver cannot repair filesystem errors on FAT32 partitions. You must use third-party tool for it. I recommend to use NT351 installed on FAT32 partition ONLY in dualboot with any system that supports FAT32 natively (Windows 95/98/ME/2K/XP/2003...)

Problem 6: I want to use autologon feature with BLANK password as in Windows 2000/XP and later
Solution: Use TweakUI Autologon option & make a patch in MSGINA.DLL
EN-US version of MSGINA.DLL from Windows NT3.51 Workstation SP5 SP5_351I.EXE

.76E3218F: 68BC90E376      push        076E390BC -- 1                         
.76E32194: 683091E376      push        076E39130 ;'DefaultPassword'           
.76E32199: 681C91E376      push        076E3911C ;'Winlogon'                  
.76E3219E: FF151C11E376    call        GetProfileStringW ;KERNEL32            
.76E321A4: 85C0            test        eax,eax                                
.76E321A6: 7412            je         .076E321BA -- 4 (74 12 change to EB 00)
.76E321A8: 8D45BC          lea         eax,[ebp][-44]                         
.76E321AB: 50              push        eax                                    
.76E321AC: 68CF000000      push        0000000CF ;'   ¦'                      
.76E321B1: 56              push        esi                                    
.76E321B2: FF15A411E376    call        SetDlgItemTextW ;USER32                
.76E321B8: EB15            jmps       .076E321CF -- 5                         
.76E321BA: 681891E376     4push        076E39118 -- 6                         
.76E321BF: 68F890E376      push        076E390F8 ;'AutoAdminLogon'            
.76E321C4: 680090E376      push        076E39000 ;'Winlogon'                  
.76E321C9: FF151811E376    call        WriteProfileStringW ;KERNEL32          
.76E321CF: 83BFF00A000000 5cmp         d,[edi][00000AF0],0                    
.76E321D6: 7559            jne        .076E32231 -- 9                         
.76E321D8: 6A00            push        0                                      
.76E321DA: 68BC90E376      push        076E390BC -- 1                         
.76E321DF: 68D490E376      push        076E390D4 ;'DefaultDomainName'         
.76E321E4: 68C090E376      push        076E390C0 ;'Winlogon'                  
.76E321E9: E840FAFFFF      call       .076E31C2E -- C                         
Don't forget to recalculate checksum of MSGINA.DLL. You can use editbin tool from Microsoft's Visual Studio or Platform SDK:
editbin /RELEASE MSGINA.DLL


Windows NT: Проблемы и их решение / Troubleshooting


А известно ли Вам что система NT/2K/XP позволяет грузится с HDD который не определяется BIOS-ом на весь свой размер. (>504 Mb, > 8 Gb, > 137 Gb и т.д.) Также возможна установка NT/2K/XP на такой диск.
Делается так:

  1. В BIOS-е определить диск в ЛЮБОЙ геометрии, в.т.ч AUTO - Обязательно!
  2. Отформатировать дискету A: (можно использовать "быстрый" формат)
  3. Переписать на нее ntldr / ntdetect.com (лучше from W2K/XP/2003)
  4. Кинуть на нее ataboot.sys, он есть в дистрибутиве W2K/XP/2003 (или любой другой LEGACY [т.е. не-PNP] драйвер совместимый с NT4); переименовать его в ntbootdd.sys
  5. Составить примерно такой boot.ini:
    [boot loader]
    timeout=30
    default=scsi(0)disk(0)rdisk(0)partition(1)\WINNT
    [operating systems]
    scsi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows NT"
    scsi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows NT [VGA mode]" /basevideo /sos
    
    т.е. поменять префикс multi(0) на scsi(0).
  6. Теперь при вставленной дискете NT будет грузиться нормально!


Software Compatibilty List


First of all, instead of Windows NT 3.1/NT 3.50 - NT 3.51 has a great level of system libraries compatbility with Windows 95/NT4.0. So any program successfully running under Windows 95/NT4.0 will also run on Windows NT 3.51 system (about 99%). And don't remember that NT 3.51 is much more stable than Winodws 95 and any other "weak" Windows 9x line product. It requires only 8 MB of RAM. So here is software compatibility list:
* If you are unable to access sites by HTTPS protocol using SeaMonkey 1.1.x - you must replace SHGetSpecialFolderPathW entry with SHGetPathFromIDList in the freebl3.dll file.

Setup & Updating Windows NT 3.51



NB! Updates Checklist:

Quick registry defragmentation and backup in Windows NT


Use these toolkits - ERUNT and NTREGOPT. It also supports NT4/2000/XP. If you want to use builtin methods, run from Windows NT:

rdisk /s-

And your registry will be backed up to %SystemRoot%\REPAIR and defragmented there. You can extract hives from %SystemRoot%\REPAIR to %SystemRoot%\SYSTEM32\CONFIG as them packed in Micrsoft CAB-format. But note that you cannot replace hives in %SystemRoot%\SYSTEM32\CONFIG while Windows NT is running, you must dualboot of enter DOS session.


Windows NT 3.51 and Debugging


For "user-mode" program debugging any debugger is suitable, even NT4/W2K/XP ones. But for remote KERNEL debugging I recommend using ONLY "native" i386kd.exe debugger from NT 3.51 Device Development Kit (DDK). NT4/W2K DDK can start remote debugging connections to NT 3.51 but their output and stability is worse than with "native" DDK. Also note that NT 3.51 cdb/ntsd/i386kd debugger cannot recognize PDB debug symbols, which is standard starting with Visual Studio 97/6.0 and later (i.e. VC5/VC6). You must use DBG symbols. Here is DBG-making procedure for Microsoft Visual C/C++ compilers:

  1. Read these articles - http://support.microsoft.com/kb/216356 and http://support.microsoft.com/kb/121366
  2. Change link/compile options:
    1. In link.exe linker command line parameters remove /incremental:yes
    2. In cl.exe compiler command line parameters remove /Gm
    3. In link.exe linker command line parameters add /DEBUG /DEBUGTYPE:COFF
  3. Compile & make your program - it generates somefile.exe for example.
  4. Run from command line:
    dumpbin /headers somefile.exe
    then search for:
    OPTIONAL HEADER VALUES
                 10B magic #
                6.00 linker version
               15000 size of code
                8000 size of initialized data
                   0 size of uninitialized data
                1100 RVA of entry point
                1000 base of code
               16000 base of data
              400000 image base            // bingo!
    
  5. Run from command line:
    rebase -b 0x400000 -x . somefile.exe
  6. Now you can see somefile.dbg in current directory.

Windows NT CreateDesktop() undocumented behaviour


First of all, look up into MSDN site or any SDK documentation:

The CreateDesktop function creates a new desktop on the window station associated with the calling process. It retrieves a handle that can be used to access the new desktop. The calling process must have an associated window station, either assigned by the system at process creation time or set by SetProcessWindowStation. A desktop is a secure object contained within a window station object. A desktop has a logical display surface and contains windows, menus, and hooks.

HDESK CreateDesktop(
  LPCTSTR lpszDesktop,         // name of new desktop
  LPCTSTR lpszDevice,          // reserved; must be NULL
  LPDEVMODE pDevmode,          // reserved; must be NULL
  DWORD dwFlags,               // desktop interaction
  ACCESS_MASK dwDesiredAccess, // access of returned handle
  LPSECURITY_ATTRIBUTES lpsa   // security attributes
);

CreateDesktop exists in Unicode variant - CreateDesktopW(), and "normal" - CreateDesktopA().

Here I can explain what for lpszDevice and pDevmode are needed. When I first "met" NT 3.5x line I asked myself a question: why NT 3.5x cannot change screen resolution on-the-fly without rebooting, but otherways can test ANY mode for visibility in "Control Panel->Display" about some seconds.

These two reserved parameters made for creating new desktop surface with any chosen screen resolution.

lpszDevice parameter is a pointer to ASCIIz name of display device, as usual it is "\\.\Display1", "\\.\Display2", "\\.\Display3"...

pDevmode parameter is a pointer to standard DEVMODE structure (see MSDN), it can be obtained using EnumDisplaySettings(), EnumDisplaySettingsEx() or filled manually.

When these two field are NULL any CreateDesktop() call will create empty desktop with the same resolution as the system desktop, but when they are filled - it is possible to create desktop with any resoltion your videocard supports. This functionality also present in later NT incarnations - NT4/2000/XP/2003...


64-bit integer arithmetic NTOSKRNL calls and Windows NT 3.51


Starting from Windows NT 4.0, NTOSKRNL.EXE contains some basic 64-bit integer arithmetic API:

LONGLONG WINAPI _allmul( LONGLONG a, LONGLONG b )  return a * b;
LONGLONG WINAPI _alldiv( LONGLONG a, LONGLONG b )  return a / b;
LONGLONG WINAPI _allrem( LONGLONG a, LONGLONG b )  return a % b;
LONGLONG WINAPI _allshr( LONGLONG a, LONGLONG b )  return a >> b;
ULONGLONG WINAPI _aullmul( ULONGLONG a, ULONGLONG b )  return a * b;
ULONGLONG WINAPI _aulldiv( ULONGLONG a, ULONGLONG b )  return a / b;
ULONGLONG WINAPI _aullrem( ULONGLONG a, ULONGLONG b )  return a % b;
ULONGLONG WINAPI _aullshl( ULONGLONG a, ULONGLONG b )  return a << b;
ULONGLONG WINAPI _aullshr( ULONGLONG a, ULONGLONG b )  return a >> b;

But in NT 3.51 NTOSKRNL.EXE or NTDLL.DLL does not contains such functions. Use INT64.LIB static library for them. Please be aware while compiling drivers or native-mode programs for NT 3.51 using Windows 2000 DDK and higher!


Windows NT 3.51 and OpenGL


It has official software OpenGL 1.0 support via internal opengl32.dll. But note that some APIs are missing and present only in Windows 98/NT4/2000/XP and later (opengl32.dll with OpenGL 1.1 support):

  1. glBindTexture, glGenTextures, glDeleteTextures
  2. glColorPointer, glIndexPointer, glNormalPointer, glTexCoordPointer, glVertexPointer
  3. glDrawArrays, glDrawElements, glInterleavedArrays
Full list:
glAreTexturesResident
glArrayElement
glBindTexture
glColorPointer
glCopyTexImage1D
glCopyTexImage2D
glCopyTexSubImage1D
glCopyTexSubImage2D
glDebugEntry
glDeleteTextures
glDisableClientState
glDrawArrays
glDrawElements
glEdgeFlagPointer
glEnableClientState
glGenTextures
glGetPointerv
glIndexPointer
glIndexub
glIndexubv
glInterleavedArrays
glIsTexture
glNormalPointer
glPolygonOffset
glPopClientAttrib
glPrioritizeTextures
glPushClientAttrib
glTexCoordPointer
glTexSubImage1D
glTexSubImage2D
glVertexPointer

So, you MUST avoid using these APIs in your programs. However, some of them are available in Windows NT 3.5x in GL_EXT_vertex_array extension using wglGetProcAddress() API:

glArrayElementEXT
glColorPointerEXT
glDrawArraysEXT
glEdgeFlagPointerEXT
glGetPointervEXT
glIndexPointerEXT
glNormalPointerEXT
glTexCoordPointerEXT
glVertexPointerEXT
There is a hardware OpenGL support via third-party installable client driver (OpenGL ICD) for some cards:
OPGL351.EXE  714,6 kB  28.8.1998  Display Driver with OpenGL support for ATI 3D RAGE II/II+.

To overcome these limits you can use software MESA OpenGL driver that is compatible with NT 3.51 and provides OpenGL 2.1 API (Mesa 6.5.3, 7.x and later), this driver is preferred over internal OpenGL support. However it is slower. You can compile it using MinGW or Microsoft C/C++.


Windows NT 3.51 and Shell Technology Preview


In 1996 Microsoft release a special "update" for NT 3.51 - Shell Technology Preview and later - Shell Technology Preview Update the second beta release. It provides Windows 95/NT4.0 "look and feel" visual update for this OS. It is an unsupported and test-only release.

To install TechPreview unpack ZIP archive ( 05/26/95 or 08/09/95 release ) with it to somewhere and run:

shupdate.cmd
To uninstall, run:
shupdate.cmd /u

Special notes: I do not recommend this update to be installed. If you anyway wish to install it make sure that you install all hotfixes and updates BEFORE installing this TechPreview. Note that when this TechPreview is installed Windows NT 3.51 is now reported as Windows NT 4.0 (i.e. for example it reports itself as Windows NT 4.0 Service Pack 5 if before it was Windows NT 3.51 Service Pack 5). This is normal and made for compatibility reasons. Some programs which cannot run under NT 3.51 may run under this "updated" OS, some - may have different compatibility problems due to its beta status.


Windows NT and UDP Sockets Datagram Sizing


According to MSDN, The Windows Sockets WSAStartup function initiates use of sockets DLL (Ws2_32.dll/Wsock32.dll) by a process.


int WSAStartup(
  WORD wVersionRequested,
  LPWSADATA lpWSAData
);

WSAData.iMaxUdpDg contains an actual maximum UDP message size specific to a particular Windows Sockets 1.x service provider and socket type.

The Windows Sockets getsockopt function retrieves a Winsock 2.0 socket option.


int getsockopt(
  SOCKET s,         
  int level,        
  int optname,      
  char FAR *optval, 
  int FAR *optlen  
);

The getsockopt function retrieves the current value for a socket option associated with a socket of any type, in any state, and stores the result in optval. Options can exist at multiple protocol levels, but they are always present at the uppermost socket level. Options affect socket operations, such as the packet routing and OOB data transfer.

When optval is SO_MAX_MSG_SIZE it returns maximum size of a message for message-oriented socket types (for example, SOCK_DGRAM). Has no meaning for stream oriented sockets.

Windows version,        WSAData.iMaxUdpDg         getsockopt(SO_MAX_MSG_SIZE) 
Service Pack            Winsock 1.x (Wsock32.dll) Winsock 2.0 (Ws2_32.dll)    
----------------------- ------------------------- ---------------------------
NT3.51                                     65527,                       -n/a-
NT4(SP6a)/2000(pre-SP3)                    65467,                       65527
2000(SP3+)/XP/2003                         65467,                       65507
According to this MS Article MSKB: Getsockopt() Function Returns a Different Maximum UDP Message Size Than You Expect in Windows 2000 SP3 (Q822061) this is wrong. Don't be fooled that this article is covers Windows 2000, that problem also exists in previous Windows versions. But it fixed only in Windows 2000 SP3, thanks to Microsoft :).

The correct maximum UDP message size is 65507, as determined by the following formula: 0xffff - (sizeof(IP Header) + sizeof(UDP Header)) = 65535-(20+8) = 65507

If we try to send or receive message larger than 65507, we receive an error. So it is a good idea to check this value and make it <= 65507 bytes.


Failure to install printer in Windows NT 3.51


When you perform a clean install of NT 3.51 OS you may face a problem that you cannot install any local printer and/or select a port for it. You may also see such message as "Could not create printer: The printer name is invalid." and see no ports available for output. This is due to some missing registry entries:

; Default Print Processor

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows NT x86\Print Processors\winprint]
"Driver"="winprint.dll"

; Local Computer Printing

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Local Port]
"Driver"="localmon.dll"

; TCP-IP Printing, LPD

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\LPR Port]
"Driver"="lprmon.dll"

You may use regedt32.exe to make these changes. Before making them, make sure that these files are installed from NT 3.51 distribution media:

winprint.dll must be in %SystemRoot%\SYSTEM32\sPOOL\PRTPROCS\W32X86
localmon.dll must be in %SystemRoot%\SYSTEM32
lprmon.dll must be in %SystemRoot%\SYSTEM32

Microsoft confirmed some of these problems, see articles:


How to install any POSTSCRIPT- or HPGL2-based printer in Windows NT


Some theory: Most of POSTSCRIPT printer drivers in Windows NT is module-based, and consists of three parts:

  1. POSTSCRIPT "core" driver, which is the same for all models:
    PSCRIPT.DLL 
    PSCRPTUI.DLL 
    PSCRIPT.CNT
    PSCRIPT.HLP 
    PSCRIPT.SEP
    
  2. Installation script, i.e. printer.inf.
  3. PPD-file, which is unique for each model of printer. This component is NOT OS dependant!
In case of HPGL2, model is the same:
  1. HPGL2 "core" driver, which is the same for all models:
    PLOTTER.DLL
    PLOTUI.DLL
    PLOTUI.CNT
    PLOTUI.HLP
    
  2. Installation script, i.e. printer.inf.
  3. PCD-file, which is unique for each model of plotter. This component is NOT OS dependant!

Now we know it. But how to install a new printer or plotter (which of course, doesn't have a suitable driver, since mainstream NT 3.51 support for printers was already cancelled) ? I'll take for example HP Color LaserJet 3800N, which is officialy unsupported in Windows 3.51.

Here are the steps:

  1. Get printer.inf from any PS-compatible NT 3.51 printer driver.
  2. Get POSTSCRIPT "core" mentioned above from NT 3.51 distributive (SP5 is preferred) or from any PS-compatible NT 3.51 printer driver. In this case I use HP's PS-driver for HP LaserJet 4000 ( lj243en.exe ).
  3. Get PSD-file mentioned above from modern Windows 2000/XP/2K3 driver.
  4. Modify printer.inf
    [Identification]
        OptionType = PRINTER
    [Options]
    "HP Color LaserJet 3800 PS" = pscrptui, hpc3800s,  pscript
    [Identify]
    ...
    
    ...
    [Files-PrinterData]
    hpc3800s = 2,hpc3800s.ppd
    ...
    
    ...
    [OptionsTextENG]
    "HP Color LaserJet 3800 PS" = "HP Color LaserJet 3800 PS" 
    
    Note that name, which I use - "HP Color LaserJet 3800 PS", I reprint from header of hpc3800s.ppd. This is important!
So if our printer/Plotter is: - we had a good chance to successfully install it in Windows NT 3.51. We also can somewhat modify this method and use it with Windows NT 4.0, Windows 9x, OS/2 or even with Windows 3.x. They have a similar "separated" printer driver model.

SCSIPORT.SYS PCI/PCIe Bus Enumeration Bug in Windows NT


In Windows NT SCSIPORT.SYS driver, which performes most operations between storage driver (atapi.sys, intelata.sys, uniata.sys, viaide.sys, atdisk.sys or any other) and NT's kernel, there is a serious bug which prevents detection of storage controllers in some chipsets. Now problem confirmed with some of Intel ICH8, ICH9, ICH10 chipsets in any working mode (RAID, AHCI, Native IDE and Legacy).

When storage driver tries to setup and initialize controller resources on a PCI/PCIe bus it calls SCSIPORT.ScsiPortInitialize() from its DriverEntry() for each detected controller. This function scans all buses and tries to find and initialize controller with given device/vendor id. It scans sequental first for buses, second for devices (from 0 to 31), third for functions (from 0 to 7). When it sees that there is no given function, it breaks loop and scans for next device/bus.

PCI Busses, Devices and Device Functions Tree
 
--Bus 0 (PCI Express)
   +-- Device  0 - 8086h:2990h  Q963/Q965 Memory Controller Hub
   +-- Device  2 - 8086h:2992h  Q963/Q965 Integrated Graphics Controller
   +-- Device  3 - 8086h:2994h  Q963/Q965 HECI Controller
   +-- Device 25 - 8086h:104Bh  82566DC Gigabit Network Connection
   +-- Device 26
   ¦     +-- Function 0 - 8086h:2834h  82801H (ICH8 Family) USB UHCI #4
   ¦     +-- Function 1 - 8086h:2835h  82801H (ICH8 Family) USB UHCI #5
   ¦     L-- Function 7 - 8086h:283Ah  82801H (ICH8 Family) USB2 EHCI #2
   +-- Device 28
   ¦     +-- Function 0 - 8086h:283Fh  82801H (ICH8 Family) PCIe Port 1
   ¦     ¦     L--> Bus 1
   ¦     +-- Function 1 - 8086h:2841h  82801H (ICH8 Family) PCIe Port 2
   ¦     ¦     L--> Bus 2
   ¦     +-- Function 2 - 8086h:2843h  82801H (ICH8 Family) PCIe Port 3
   ¦     ¦     L--> Bus 3
   ¦     +-- Function 3 - 8086h:2845h  82801H (ICH8 Family) PCIe Port 4
   ¦     ¦     L--> Bus 4
   ¦     L-- Function 4 - 8086h:2847h  82801H (ICH8 Family) PCIe Port 5
   ¦           L--> Bus 5
   +-- Device 29
   ¦     +-- Function 0 - 8086h:2830h  82801H (ICH8 Family) USB UHCI #1
   ¦     +-- Function 1 - 8086h:2831h  82801H (ICH8 Family) USB UHCI #2
   ¦     +-- Function 2 - 8086h:2832h  82801H (ICH8 Family) USB UHCI #3
   ¦     L-- Function 7 - 8086h:2836h  82801H (ICH8 Family) USB2 EHCI #1
   +-- Device 30 - 8086h:244Eh  82801HB Hub Interface to PCI Bridge (ICH8 B0 step)
   ¦     L--> Bus 6
   L-- Device 31
         +-- Function 0 - 8086h:2810h  82801HB/HR (ICH8/R) LPC Interface Controller
         +-- Function 2 - 8086h:2824h  82801HR/HO/HH (ICH8R/DO/DH) SATA AHCI Controller        
         L-- Function 3 - 8086h:283Eh  82801H (ICH8 Family) SMBus Controller
 
--Bus 1 (PCI)
   L-- No Devices Currently Present
 
--Bus 2 (PCI Express)
   L-- Device  0 - 11ABh:6101h  6101 SATA2 Controller
 
--Bus 3 (PCI)
   L-- No Devices Currently Present
 
--Bus 4 (PCI)
   L-- No Devices Currently Present
 
--Bus 5 (PCI)
   L-- No Devices Currently Present
 
--Bus 6 (PCI)
   L-- Device  2 - 8086h:1026h  82545GM Gigabit Ethernet Controller
 
A total of 22 Items Found
It is a PCI dump from ICH8 AHCI system. Look above at Device 29, Device 31. In Device 29 there is NO Function 3, in Device 31 there is NO Function 1. So all function below this absent one will be skipped due to bug in SCSIPORT.SYS. Skipped Device 31 Function 2 is a SATA Controller! Not good!

However there are systems that free of such bug:

PCI Busses, Devices and Device Functions Tree
 
--Bus 0 (PCI Express)
   +-- Device  0 - 8086h:29C0h  P35/G33 (Bearlake) Processor to I/O Controller
   +-- Device  1 - 8086h:29C1h  P35/G33 (Bearlake) PCIe Root Port
   ¦     L--> Bus 1
   +-- Device  2 - 8086h:29C2h  P35/G33 (Bearlake) Integrated Graphics Controller
   +-- Device 27 - 8086h:27D8h  82801G (ICH7 Family) High Definition Audio
   +-- Device 29
   ¦     +-- Function 0 - 8086h:27C8h  82801G (ICH7 Family) USB Universal Host Controller
   ¦     +-- Function 1 - 8086h:27C9h  82801G (ICH7 Family) USB Universal Host Controller
   ¦     +-- Function 2 - 8086h:27CAh  82801G (ICH7 Family) USB Universal Host Controller
   ¦     +-- Function 3 - 8086h:27CBh  82801G (ICH7 Family) USB Universal Host Controller
   ¦     L-- Function 7 - 8086h:27CCh  82801G (ICH7 Family) USB 2.0 Enhanced Host Controller
   +-- Device 30 - 8086h:244Eh  82801GB Hub Interface to PCI Bridge (ICH7 A1 step)
   ¦     L--> Bus 2
   L-- Device 31
         +-- Function 0 - 8086h:27B8h  82801GB/GR (ICH7 Family) LPC Interface Controller
         +-- Function 1 - 8086h:27DFh  82801G (ICH7 Family) Ultra ATA Storage Controller
         +-- Function 2 - 8086h:27C0h  82801GB/GR/GH (ICH7 Family) Serial ATA Storage Controller
         L-- Function 3 - 8086h:27DAh  82801G (ICH7 Family) SMBus Controller
 
--Bus 1 (PCI)
   L-- No Devices Currently Present
 
--Bus 2 (PCI)
   L-- Device  8 - 8086h:1094h  PRO/100 VE Network Connection
 
A total of 15 Items Found
There is NO Device 29, Function 4, but our bug is storage controller related. Device 31 is OK, so we don't care this Device 29. We also can consider that this bug is also can be BIOS-related, and can be solved by bugfix BIOS update from motherboard manufacturer.

Partition detection/mapping problems in Windows NT


In some cases drive letters mapped according to exising partitions are not created correctly.

This is due to NT 3.51 cannot detect some nonstandard partition types.

However, with a registry modification it is possible to forcibly assign a UNC path to a drive letter during startup so it will be persist.

Start REGEDT32.EXE and create a new registry entry "String Value" in the following key:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices

The name should be "X:" where X is the drive letter (which must be unused!).

The value should be the path in the form:

\Device\HarddiskA\PartitionB

Where A is starting from 0 and B is starting from 1.


Windows NT 3.51 and 3D Look in User Interface


  1. General method: In conjunction with one of these installed libraries in %WINDIR%\SYSTEM32 :


    ctl3d.dll
    ctl3dv2.dll
    ctl3d32.dll
    Use this code in WinMain() :

    HINSTANCE hCtl3d;
    
    void WINAPI Ctl3dLoad(HINSTANCE hInst)
    {
      BOOL (WINAPI *Ctl3dRegister)(HANDLE);
      BOOL (WINAPI *Ctl3dAutoSubclass)(HANDLE);
    
      SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
      hCtl3d = LoadLibrary(TEXT("ctl3d32.dll"));
      if ((UINT)hCtl3d <= HINSTANCE_ERROR)
        hCtl3d = LoadLibrary(TEXT("ctl3dv2.dll"));
      if ((UINT)hCtl3d <= HINSTANCE_ERROR)
        hCtl3d = LoadLibrary(TEXT("ctl3d.dll"));
    
      if ((UINT)hCtl3d <= HINSTANCE_ERROR)
      {
        hCtl3d = 0;
        return;
      }	
    
      Ctl3dRegister = (BOOL (WINAPI *)(HANDLE))GetProcAddress(hCtl3d, "Ctl3dRegister");
      Ctl3dAutoSubclass = (BOOL (WINAPI *)(HANDLE))GetProcAddress(hCtl3d, "Ctl3dAutoSubclass");
    
      if (Ctl3dRegister && Ctl3dAutoSubclass)
      {
        Ctl3dRegister(hInst);
        Ctl3dAutoSubclass(hInst);
     }
    
     SetErrorMode(0);
    }
    
    void WINAPI Ctl3dUnload(HINSTANCE hInst)
    {
     BOOL (WINAPI *Ctl3dUnRegister)(HANDLE);
    
      if (hCtl3d)
      {
        Ctl3dUnRegister = (BOOL (WINAPI *)(HANDLE))GetProcAddress(hCtl3d, "Ctl3dUnRegister");
        if (Ctl3dUnRegister)
          Ctl3dUnRegister(hInst);
    
        FreeLibrary(hCtl3d);
      }
    }
    
  2. Method for dialog boxes:

    Add DS_3DLOOK style to exising dialog styles.

  3. Method for MFC (Microsoft Foundation CLasses):

    In CMFCApp::InitInstance() add this code :

      if ((GetVersion() & 0xFF) < 5)  // Before Windows 2000
    #ifdef _AFXDLL
      Enable3dControls();  // Call this when using MFC in a shared DLL
    #else
      Enable3dControlsStatic();  // Call this when linking to MFC statically
    #endif
    

Direct3D, DirectDraw, DirectShow, DirectX, Microsoft, MS-DOS, Visual C++, Win32, Win32s, Windows, Windows XP, Windows 2003 Server and Windows NT are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries/regions.

The names of actual companies and products mentioned herein may be the trademarks of their respective owners.

Home page

E-Mail: bearwindows_at_fastmail_dot_com | Last update: December 1st 2017