Hi Alex,
I hope you are fine now, after the party and a restful night... ;-)
I'm currently working/researching on the LPC
implementation and I'm
about to soon start reworking some of our code. Just to avoid any
duplication, are you also working on such a thing, or simply exploring?
David Welch wrote our initial LPC code to resemble the BSD sockets
general design (an LPC port behaves exactly like a BSD socket; there are
ports in listening state and connected ports to send/receive datagrams).
That is, of course, not the way NT LPC works, but at the time David
wrote the code, we knew almost nothing about LPC, but the incomplete
information Prasad Dabak wrote in "Undocumented Windows NT" (1999). That
code was good enough to start with user mode subsystem servers, but till
now it has prevented us from testing real system components like the SM,
CSR and friends etc. for compatibility in ROS. This is what I have done
for the last three years. What I got from the researching is some better
understanding of how LPC works, but not a complete picture. I am glad to
see you are working or planning to work on LPC, because there is at
least one API that is incompatible with NT's, and the general semantics
of the path connect->request->reply is wrong. In short, it is the the
listening port that receives the messages from the clients even after
the connection happens and not the server side connected port). This
could be deducted by studing more carefully the sample code provided by
Dabak, but I found it indipendently with some simple c/s test code. I
told it to David, Eric and others and they agreed that should be
correct. I will share what I know and I can send my unfinished code if
it may be of interest (not that I am that a skilled coder, but you could
just tour it for fun).
Recalling what David Welch told me in many occasions, NT LPC has many
flaws, many are security related (this led Microsoft to introduce secure
ports with NT 5.0, mostly to armour the LSA). The overall problem with
the real LPC is that it looks like really old, not well understood in
Microsoft and almost untouched for years (many unfixed LPC bugs still
plague Windows). You could even imagine it was part of the Prism project
at DEC, in the '80s, perhaps with the name "Channel" for what we now
know as "port" (undocumented and unimplemented APIs existed in NT 3.1,
NT 3.5, NT 3.51, NT 4.0 and NT 5.0, but disappeared in NT 5.1 and NT
5.2). It seems that only lately (1999+) Microsoft forced the NT kernel
team to face the old LPC code to improve it.
Alex, what are your plans for rewriting the LPC code?
Emanuele