For each service pack, we will create a new subdirectory. The first service pack to use
this method is sp1, so the first directory created is sp1.
When you build the resourcedll\sp1 directory, a couple of things happen:
The first thing is that it creates a dll called sp1res.dll. This dll doesn't
contain any code or entry points; it just has resources in it. Adding new
string resources is simply a matter of editing the sp1res.mc file in this
directory and recompiling.
The second thing that happens is that it creates sp1res.h, and copies it to the
\nt\private\inc directory. This header file contains the resource IDs for all
the resources in sp1res.dll.
Now, how does this get used? There are two different scenarios:
(1) a binary wants to add a resource string to be used in logging
event log messages.
(2) a binary wants to use an resource string for some other reason, such as
displaying in a message box.
In both scenarios, the programmer will include the sp1res.h file in his source
code, so that he has access to the correct resource IDs.
In scenario (1), you simply add the path and name of sp1res.dll to the appropriate
registry key for the component that logs the error message; for example in W2K
bug 12918, dmboot.sys is the component that logs the error message, so under
the key HKLM,"SYSTEM\CurrentControlSet\Services\EventLog\System\dmboot", you would
change EventFileLog from its current value of %SystemRoot%\System32\Drivers\dmboot.sys
to a new value of %SystemRoot%\System32\Drivers\dmboot.sys; %SystemRoot%\System32\sp2res.dll.
When event viewer encounters an error message logged with a source of dmboot, it
will look for the resource string first in dmboot.sys, and then in sp2res.dll.
In scenario (2), the coder needs to manually do a LoadLibraryEx() on sp1res.dll,
and a LoadString() for whatever resource he is looking for. You should use the
LOAD_LIBRARY_AS_DATAFILE flag when using LoadLibraryEx(). This will be completely
straightforward in the cases where the existing code already requires a LoadLibrary
and LoadString to get at its resources; you'll just need to load an additional
library. It will be slightly less straightforward in those cases where the
existing binary is just getting resources out of its own resource section, since
this will involve adding new code to load a library that was not necessary
before; however, even in those cases, it's not exactly rocket science.