Included in this directory is a set of programs that allow a Windows NT POSIX process to be able to make RPC requests to a WIN32 server. This is to allow access to system facilities such as command execution that is not available in the native Windows NT POSIX environment. These programs can be used to run the compiler from a make or shell program, start and wait for WIN16, DOS, WIN32 or OS/2 applications, or provide an interface to the WINSOCK API in order to send remote communications requests to an X-server. These functions could be used as a transport to allow the X Windows Client libraries to be supported under the POSIX subsystem. The X-server could be on a remote UNIX workstation over WINSOCK, or could be a local WIN32 X-server implementation. Users are encouraged to extend the functions and feed back client and server libraries that expose WIN32 API's to POSIX client applications. I do recommend implementing RPC's that mimic existing UNIX functionality that is missing from the POSIX subsystem, as opposed to just 'exposing' native WIN32 services to POSIX applications. This will be in keeping with Windows NT guidelines in not mixing the API's of different programming environments. An example of this approach would be to implement the X-libraries and have the RPC's send X-wire protocol requests to an X-server running on WIN32. This is much more preferable than exposing WIN32 GDI routines to the POSIX subsystem through RPC's. This will allow a program that conforms to the UNIX API environment to talk to its graphics display in its native manner, and not be developed into a 'mutant' that is half UNIX, half WIN32. I have attempted to demonstrate this by emulating the functionality of the UNIX 'system()' function, as opposed to exposing WIN32 'CreateProcess()', as an RPC. The WIN32 server implements this using CreateProcess(), but this should be as transparent as possible to the UNIX program. Compiling and using the programs: In order to compile the programs, you must install the Micrsoft Windows NT SDK from October 1992. You have to setup the POSIX environment as documented in the release notes. Once that has been done, doit.bat will run nmake on all of the supplied makefiles for each program. A list of each program and what it does follows: win32srv.c: Main WIN32 server program. It automaticly starts the psxagent program. psxagent.c: POSIX 'agent' program that passes RPC requests received from POSIX named pipes to the WIN32 server. rpcclt.c: Library of functions that is linked with POSIX client programs to request RPC services of the WIN32 server. It knows how to establish a connection with the psxagent process. psxclt.c: Example POSIX client that does a NULL RPC and runs a command line. rpctime.c: Example POSIX client that measures RPC performance. In order to have the WIN32 server and the POSIX client output to the same console window, start the win32srv program with "start /b win32srv". This will return the prompt to you with the win32srv and psxagent programs running in the background. POSIX client applications may now be run from the command line and execute DOS, WIN16, WIN32 or OS/2, (or even POSIX) applications through the RPC facility. Output from these subprograms will go to the current console. If you do not use the /b parameter to start, console output from applications started by the WIN32 server will go to a new window separate from the POSIX client. You can also just run win32srv without start, but will have to switch to a new window in order to run POSIX client applications. Concerns: One area of concern is performance. I get 104 round trip NULL RPC's per second on my 33MHz 80386. This is approx. 10 ms per RPC round trip. For remote command execution, or even X-Lib requests, this is not too bad. But for other more timing sensitive system services, this might be to slow. A last area of concern is that only WIN32 calls that return results to the program, or perform some visible action such as launching a command line can be run. Any WIN32 calls that effect the calling process such as FileMapping() would only effect the WIN32 servers address space, and not the POSIX programs. Possible Improvements: Once possible improvment is to implement the run time transport library for MS (DCE) RPC so that a more standard client-server application may be developed. I have not had the time to tackle this right now, and this could also be limited by not having select() or poll() available to the POSIX agent process who must pass the data between the POSIX client and WIN32 server. Unless this program knows the amount of data in a given request, it could block waiting to send more data while ignoring the reply. This could possibly be handled by having the POSIX agent use fork() to have a read-side and a write-side process. A final improvment would be to support multiple named pipes so that more than one POSIX client may make requests at any given time. Please send comments to: John Richardson CompuServe 70541,672 Internet jr@sni-usa.com Also keep me abreast of any UNIX functions others have written for the Windows NT POSIX subsystem.