mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
3.4 KiB
165 lines
3.4 KiB
/*++
|
|
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
dbmon.c
|
|
|
|
Abstract:
|
|
|
|
A simple program to print strings passed to OutputDebugString when
|
|
the app printing the strings is not being debugged.
|
|
|
|
Author:
|
|
|
|
Kent Forschmiedt (kentf) 30-Sep-1994
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
int _cdecl
|
|
main(
|
|
int argc,
|
|
char ** argv
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
--*/
|
|
{
|
|
HANDLE AckEvent;
|
|
HANDLE ReadyEvent;
|
|
HANDLE SharedFile;
|
|
LPVOID SharedMem;
|
|
LPSTR String;
|
|
DWORD ret;
|
|
DWORD LastPid;
|
|
LPDWORD pThisPid;
|
|
BOOL DidCR;
|
|
|
|
SECURITY_ATTRIBUTES sa;
|
|
SECURITY_DESCRIPTOR sd;
|
|
|
|
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
|
|
sa.bInheritHandle = TRUE;
|
|
sa.lpSecurityDescriptor = &sd;
|
|
|
|
if(!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION)) {
|
|
fprintf(stderr,"unable to InitializeSecurityDescriptor, err == %d\n",
|
|
GetLastError());
|
|
exit(1);
|
|
}
|
|
|
|
if(!SetSecurityDescriptorDacl(&sd, TRUE, (PACL)NULL, FALSE)) {
|
|
fprintf(stderr,"unable to SetSecurityDescriptorDacl, err == %d\n",
|
|
GetLastError());
|
|
exit(1);
|
|
}
|
|
|
|
AckEvent = CreateEvent(&sa, FALSE, FALSE, "DBWIN_BUFFER_READY");
|
|
|
|
if (!AckEvent) {
|
|
fprintf(stderr,
|
|
"dbmon: Unable to create synchronization object, err == %d\n",
|
|
GetLastError());
|
|
exit(1);
|
|
}
|
|
|
|
if (GetLastError() == ERROR_ALREADY_EXISTS) {
|
|
fprintf(stderr, "dbmon: already running\n");
|
|
exit(1);
|
|
}
|
|
|
|
ReadyEvent = CreateEvent(&sa, FALSE, FALSE, "DBWIN_DATA_READY");
|
|
|
|
if (!ReadyEvent) {
|
|
fprintf(stderr,
|
|
"dbmon: Unable to create synchronization object, err == %d\n",
|
|
GetLastError());
|
|
exit(1);
|
|
}
|
|
|
|
SharedFile = CreateFileMapping(
|
|
(HANDLE)-1,
|
|
&sa,
|
|
PAGE_READWRITE,
|
|
0,
|
|
4096,
|
|
"DBWIN_BUFFER");
|
|
|
|
if (!SharedFile) {
|
|
fprintf(stderr,
|
|
"dbmon: Unable to create file mapping object, err == %d\n",
|
|
GetLastError());
|
|
exit(1);
|
|
}
|
|
|
|
SharedMem = MapViewOfFile(
|
|
SharedFile,
|
|
FILE_MAP_READ,
|
|
0,
|
|
0,
|
|
512);
|
|
|
|
if (!SharedMem) {
|
|
fprintf(stderr,
|
|
"dbmon: Unable to map shared memory, err == %d\n",
|
|
GetLastError());
|
|
exit(1);
|
|
}
|
|
|
|
String = (LPSTR)SharedMem + sizeof(DWORD);
|
|
pThisPid = SharedMem;
|
|
|
|
LastPid = 0xffffffff;
|
|
DidCR = TRUE;
|
|
|
|
SetEvent(AckEvent);
|
|
|
|
for (;;) {
|
|
|
|
ret = WaitForSingleObject(ReadyEvent, INFINITE);
|
|
|
|
if (ret != WAIT_OBJECT_0) {
|
|
|
|
fprintf(stderr, "dbmon: wait failed; err == %d\n", GetLastError());
|
|
exit(1);
|
|
|
|
} else {
|
|
|
|
if (LastPid != *pThisPid) {
|
|
LastPid = *pThisPid;
|
|
if (!DidCR) {
|
|
putchar('\n');
|
|
DidCR = TRUE;
|
|
}
|
|
}
|
|
|
|
if (DidCR) {
|
|
printf("%3u: ", LastPid);
|
|
}
|
|
|
|
printf("%s", String);
|
|
DidCR = (*String && (String[strlen(String) - 1] == '\n'));
|
|
SetEvent(AckEvent);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|