Howto: Adding a new kernel module

By Michael Schöbel

The Windows Research Kernel contains multiple kernel modules, e.g. for memory management or for the executive layer. Each module has its own subdirectory in base/ntos. If you want to extend the WRK it might be useful to collect all your new files in a new kernel module. This post explains the necessary steps for adding a new kernel module. Basically, all it takes is tweaking a few makefiles.

First step: creating the kernel module subdirectory: base/ntos/foo. The WRK build process expects the kernel module makefile and directories for binary files in another subdirectory BUILD. So, you have to create this sub-subdirectory as well. The directories for binary files are obji386 and objamd64. Finally, your directory structure should be as follows:

Kernelmodule directory structure

The directories base/ntos/foo/amd64/ and base/ntos/foo/i386/ are required if you have platform specific source code.

Second step: creating the kernel module makefile: base/ntos/foo/BUILD/makefile. This makefile is used to build the new kernel module. The following listing shows a basic stub for a kernel module makefile.

library = $(module)
!if "$(targ)" == "i386"
# i386 specific
asobjs= \
ccarchobjs= \
# amd64 specific
# ...
ccobjs= \
	$(OBJ)\foo.obj \
!include $(ntos)\BUILD\

The makefile contains three different kinds of object file information: (1) Object files assigned to asobjs are built using assembler, the asm files are located in a platform dependent subdirectory of the kernel module. E.g. base/ntos/foo/i368/bar.asm. (2) Further platform dependent object files which are generated from regular C files are assigned to ccarchobjs. (3) All remaining (platform independent) kernel module object files are assigned to ccobjs.

You have to add object file entries for the files your kernel module implementation contains at the appropriate makefile location.

Final step: integrating the module into the regular WRK build process. The main WRK makefile is base/ntos/makefile. This file defines the available kernel modules:

modules = rtl config ex ob se mm ke ps io\iomgr io cache lpc dbgk raw fstub fsrtl wmi perf init

Just extend this line with the newly created kernel module.


Comments are closed.