GENSHIMSRC
15/08/03

Here is the user documentation that GENSHIMSRC.BAT itself produces:

genshimsrc

	Generate source for a shim DLL and its associated deffile from a supplied deffile

Usage:
	genshimsrc [options] deffile

Where:
	[deffile]     The source deffile

Options:
	--srcpath         the path for the output source file (defaults to CWD)
	--defpath         the path for the output DEF file (defaults to srcpath)
	--name            the name to use for the output files (defaults to shim)
	--version         the version to use for the output DEF file (defaults to 0.0)
	--alignstack      use shims which align the stack to an 8 byte boundary

The following invocation

    genshimsrc.bat --name=xuser-7_0 xuseru.def

would produce two files: xuser-7_0.cia and xuser-7_0{00000000}.def (in CWD). 

The version encoded in the DEF file name can be changed by supplying
the --version option. e.g.

    genshimsrc.bat --name=xuser-7_0 --version=1.0 xuseru.def

would produce two files: xuser-7_0.cia and xuser-7_0{00010000}.def (in CWD). 

The primary purpose of GENSHIMSRC is to allow 'DLL ordinal skew' to be
repaired. It achieves this by generating 'trampoline' functions at the
old ordinal which get linked against import stubs which will be
resolved by the loader at the new ordinal. However the generated files
make it easy for the programmer to inject code into the trampoline if
the need arises by identifying each trampoline with the function it is
derived from. The generated .DEF file also permits a usable IMPORT lib
to be produced for the shim DLL if it is necessary.

As alluded to above, for each entry in the supplied .DEF file
GENSHIMSRC generates an exported (trampoline) function in the .CIA
file and a corresponding entry in the associated .DEF file. Assume the
following entry appears in the supplied .DEF file

AddL__9CObjectIxP7CObject @ 11 NONAME ; CObjectIx::AddL(CObject *)xxxxx

This results in the following source code being generated in the .CIA file

EXPORT_C __NAKED__ int export_at_ordinal_11()
//
// CObjectIx::AddL(CObject *)
//
	{
	asm("B AddL__9CObjectIxP7CObject");
	}

and the following entry being generated in the generated .DEF file

AddL__9CObjectIxP7CObject=export_at_ordinal_11__Fv @ 11 NONAME ; CObjectIx::AddL(CObject *)

These can be incorporated into a buildable project by providing a MMP file which contains:


version			0.0		explicit
target			xuser.dll
targettype		dll
sourcepath		.
source			xuser-7_0.cia
library			xuser{1.0}.lib
systeminclude	..\..\include
deffile			..\..\~\xuser-7_0.def


N.B. There is nothing special about the MMP file.