DBMON notes 10/7/94 The first DWORD of the shared memory buffer contains the process ID of the client that sent the debug string. DBMON will print the process ID if the previous line printed was from another process, or if the previous line was from the same process and ended in a newline. The shared memory buffer must be 4096 bytes. If it is larger, it won't do any good. If it is smaller, nothing terrible will happen, but strings larger than the buffer will not be delivered, and a complaining message will be sent to the kernel debugger by the client. Why is it this size? Because shared memory comes in page-sized chunks, so we might as well ask for as much as will be used on the machines with the smallest pages. On machines with larger pages, the remainder of the page will be wasted anyway. Event DBWIN_BUFFER_READY must be an auto-reset event, so that only one client thread will use the buffer at a time. Using a manual reset event with PulseEvent will not work. Event DBWIN_DATA_READY need not be auto-reset, but it is simpler that way. Allowing multiple copies of DBMON to run might be amusing, put not particularly useful. As I originally wrote it, the messages were distributed randomly among the DBMON instances or be garbled. I added a check for ERROR_ALREADY_EXISTS so it won't run twice. The worst you can do to the client is cause it to print a message on the kernel debugger, as above. If DBMON is broken and never calls SetEvent(AckEvent), it will cause a 10 second delay in the client every time OutputDebugString is called, then the message will be printed on the kernel debugger. OutputDebugString will force synchronization of client threads when DBMON is running. Letting the kernel debugger catch the strings will also synchronize threads, but the timing effects may be different. Caveat emptor. In a GUI version of DBMON, use MsgWaitForMultipleObjects.