This is from TECHNET Q142676.
This reg hack has fixed errors with screen savers causing the crash and with many apps being open at once (i.e. multiple schedules. Although it mentions servers I've used with success on workstations only.
Good Luck
SYMPTOMS
========
When you try to start a service a pop-up dialog box appears with the following
message:
- DLL initialization failure Initialization of the
dynamic link library c:\windows\system32\user32.dll failed. The process is
terminating abnormally.
CAUSE
=====
The system has run out of memory to create a new desktop heap for the service
being started.
RESOLUTION
==========
Fixing this problem requires editing of the Registry and restarting the computer
concerned.
WARNING: Using Registry Editor incorrectly can cause serious, system-wide
problems that may require you to reinstall Windows NT to correct them. Microsoft
cannot guarantee that any problems resulting from the use of Registry Editor can
be solved. Use this tool at your own risk.
1. Run the Registry Editor(Regedt32.exe).
2. Under the HKEY_LOCAL_MACHINE subtree, go to the following subkey:
\System\CurrentControlSet\Control\Session Manager\ SubSystems\Windows
The default data for this value will look something like the following (all on
one line):
%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows
SharedSection=1024,3072 Windows=On SubSystemType=Windows
ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3
ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off
MaxRequestThreads=16
You will need to make the following change to this value:
Scan along the line until you reach the part that defines the SharedSection
values and add ",512" after the second number (without quotes). This value should now look
something like the following:
%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows
SharedSection=1024,3072,512 Windows=On SubSystemType=Windows
ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3
ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off
MaxRequestThreads=16
After making this change, close Regedt32 and restart the server.
This change will limit the size of desktop heaps created by noninteractive
services to 512 KB, which should be ample for most services.