how does dllmain execute the dll ? and how does it go from running in kernel mode to executing the dll within the user space of the program?