There is a specific HAL implementation for each bype of computer system so applications, OS functions and even device drivers in NT do not have to be machine specific. The good news is that the HAL is transparent to both the user and the applications programmer. The NT kernel creates the basic unit of computation and provides the foundation for multitasking but does not specify a particular policy for management of files, processes, memory or devices. The kernel provides object and threads on top of the HAL and the hardware. It may appear to the client software that it is interfacing directly with the system hardware but it is actually working with the objects and threads provided by the kernel as primitives.
Control objects implment mechanisms to control the hardware and other resources.
Dispatcher objects manage threads using scheduling and synchronization operations. Thread objects are abstractions of computations that each represent one execution within a process. The threads of a process all share the same address space and are typically working on different parts of the same task. The trap handler is the only mechanism for accessing some system functions, because the OS must be sure that the functions being executed are trusted. In NT the trap handler authenticates the call using the DLL ntdll.dll and the interrupted application then links ntdll.dll into its own address space and calls the proper entry points.