Hey, Lost...
Nice job with what you're doing. I think this is heading in the right direction.
I thought I'd drop this lil tidbit to you, as I think it could be useful. Basically, it's an undocumented feature of the ObReferenceObjectByHandle function to return the address of an EPROCESS block when you pass in a process id.
Take a look here for details:
http://www.ntdev.org/archive/ntdev9908/msg0108.html
The user level process can enum all processes then call a driver IOCTL with the target process id and memory address as the parameters.
Fez Ajer
EDIT: Ok, this wants a PROCESS HANDLE instead of a PROCESS ID... Back to the reference