/*++ wstdump.c Dump routines for WST History: 10-26-92 RezaB - created. --*/ #include #include #include #include #include #include #include #include #include "wstdump.h" // // dump clear switches and defaults // WORD fDump = FALSE; WORD fClear = FALSE; WORD fPause = TRUE; HANDLE hDoneEvent; HANDLE hDumpEvent; HANDLE hClearEvent; HANDLE hPauseEvent; HANDLE hdll; SECURITY_DESCRIPTOR SecDescriptor; // // error handling // #define LOG_FILE "wstdump.log" FILE *pfLog; void ClearDumpInfo (void); INT_PTR APIENTRY DialogProc(HWND, UINT, WPARAM, LPARAM); /*++ Main Routine --*/ int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow) { NTSTATUS Status; STRING EventName; UNICODE_STRING EventUnicodeName; OBJECT_ATTRIBUTES EventAttributes; // Prevent compiler from complaining.. // hPrevInst; lpCmdLine; nCmdShow; // Open the log file for logging possible errors // pfLog = fopen (LOG_FILE, "w"); if (!pfLog) { exit (1); } // Create public share security descriptor for all the named objects // Status = RtlCreateSecurityDescriptor ( &SecDescriptor, SECURITY_DESCRIPTOR_REVISION1 ); if (!NT_SUCCESS(Status)) { fprintf (pfLog, "WSTDUMP: main () - RtlCreateSecurityDescriptor() " "failed - %lx\n", Status); exit (1); } Status = RtlSetDaclSecurityDescriptor ( &SecDescriptor, // SecurityDescriptor TRUE, // DaclPresent NULL, // Dacl FALSE // DaclDefaulted ); if (!NT_SUCCESS(Status)) { fprintf (pfLog, "WSTDUMP: main () - RtlSetDaclSecurityDescriptor() " "failed - %lx\n", Status); exit (1); } // Initialization for DONE event creation // RtlInitString (&EventName, DONEEVENTNAME); Status = RtlAnsiStringToUnicodeString (&EventUnicodeName, &EventName, TRUE); if (NT_SUCCESS(Status)) { InitializeObjectAttributes (&EventAttributes, &EventUnicodeName, OBJ_OPENIF | OBJ_CASE_INSENSITIVE, NULL, &SecDescriptor); } else { fprintf (pfLog, "WSTDUMP: main () - RtlAnsiStringToUnicodeString() " "failed for DUMP event name - %lx\n", Status); exit (1); } // // Create DONE event // Status = NtCreateEvent (&hDoneEvent, EVENT_QUERY_STATE | EVENT_MODIFY_STATE | SYNCHRONIZE, &EventAttributes, NotificationEvent, TRUE); if (!NT_SUCCESS(Status)) { fprintf (pfLog, "WSTDUMP: main () - NtCreateEvent() " "failed to create DUMP event - %lx\n", Status); exit (1); } // Initialization for DUMP event creation // RtlInitString (&EventName, DUMPEVENTNAME); Status = RtlAnsiStringToUnicodeString (&EventUnicodeName, &EventName, TRUE); if (NT_SUCCESS(Status)) { InitializeObjectAttributes (&EventAttributes, &EventUnicodeName, OBJ_OPENIF | OBJ_CASE_INSENSITIVE, NULL, &SecDescriptor); } else { fprintf (pfLog, "WSTDUMP: main () - RtlAnsiStringToUnicodeString() " "failed for DUMP event name - %lx\n", Status); exit (1); } // // Create DUMP event // Status = NtCreateEvent (&hDumpEvent, EVENT_QUERY_STATE | EVENT_MODIFY_STATE | SYNCHRONIZE, &EventAttributes, NotificationEvent, FALSE); if (!NT_SUCCESS(Status)) { fprintf (pfLog, "WSTDUMP: main () - NtCreateEvent() " "failed to create DUMP event - %lx\n", Status); exit (1); } // Initialization for CLEAR event creation // RtlInitString (&EventName, CLEAREVENTNAME); Status = RtlAnsiStringToUnicodeString (&EventUnicodeName, &EventName, TRUE); if (NT_SUCCESS(Status)) { InitializeObjectAttributes (&EventAttributes, &EventUnicodeName, OBJ_OPENIF | OBJ_CASE_INSENSITIVE, NULL, &SecDescriptor); } else { fprintf (pfLog, "WSTDUMP: main () - RtlAnsiStringToUnicodeString() " "failed for CLEAR event name - %lx\n", Status); exit (1); } // // Create CLEAR event // Status = NtCreateEvent (&hClearEvent, EVENT_QUERY_STATE | EVENT_MODIFY_STATE | SYNCHRONIZE, &EventAttributes, NotificationEvent, FALSE); if (!NT_SUCCESS(Status)) { fprintf (pfLog, "WSTDUMP: main () - NtCreateEvent() " "failed to create CLEAR event - %lx\n", Status); exit (1); } // Initialization for PAUSE event creation // RtlInitString (&EventName, PAUSEEVENTNAME); Status = RtlAnsiStringToUnicodeString (&EventUnicodeName, &EventName, TRUE); if (NT_SUCCESS(Status)) { InitializeObjectAttributes (&EventAttributes, &EventUnicodeName, OBJ_OPENIF | OBJ_CASE_INSENSITIVE, NULL, &SecDescriptor); } else { fprintf (pfLog, "WSTDUMP: main () - RtlAnsiStringToUnicodeString() " "failed for PAUSE event name - %lx\n", Status); exit (1); } // // Create PAUSE event // Status = NtCreateEvent (&hPauseEvent, EVENT_QUERY_STATE | EVENT_MODIFY_STATE | SYNCHRONIZE, &EventAttributes, NotificationEvent, FALSE); if (!NT_SUCCESS(Status)) { fprintf (pfLog, "WSTDUMP: main () - NtCreateEvent() " "failed to create PAUSE event - %lx\n", Status); exit (1); } // // show dialog box // DialogBox(hInstance, "DumpDialog", NULL, DialogProc); return (0); } /* main */ /*++ Clears and/or dump profiling info to the dump file. Input: -none- Output: -none- --*/ void ClearDumpInfo (void) { NTSTATUS Status; // // Pause profiling? // if (fPause) { Status = NtPulseEvent (hPauseEvent, NULL); if (!NT_SUCCESS(Status)) { fprintf (pfLog, "WSTDUMP: ClearDumpInfo () - NtPulseEvent() " "failed for PAUSE event - %lx\n", Status); exit (1); } } // // Dump data? // else if (fDump) { Status = NtPulseEvent (hDumpEvent, NULL); if (!NT_SUCCESS(Status)) { fprintf (pfLog, "WSTDUMP: ClearDumpInfo () - NtPulseEvent() " "failed for DUMP event - %lx\n", Status); exit (1); } } // // Clear data? // else if (fClear) { Status = NtPulseEvent (hClearEvent, NULL); if (!NT_SUCCESS(Status)) { fprintf (pfLog, "WSTDUMP: ClearDumpInfo () - NtPulseEvent() " "failed for CLEAR event - %lx\n", Status); exit (1); } } // // Wait for the DONE event.. // Sleep (500); Status = NtWaitForSingleObject (hDoneEvent, FALSE, NULL); if (!NT_SUCCESS(Status)) { fprintf (pfLog, "WSTDUMP: ClearDumpInfo () - NtWaitForSingleObject() " "failed for DONE event - %lx\n", Status); exit (1); } } /* ClearDumpInfo() */ /*++ Dump dialog procedure -- exported to windows. Allows user to change defaults: dump, clear, and ".dmp" as dump file extension. Input: Messages from windows: - WM_INITDIALOG - initialize dialog box - WM_COMMAND - user input received Output: returns TRUE if message processed, false otherwise SideEffects: global flags fDump and fClear may be altered --*/ INT_PTR APIENTRY DialogProc(HWND hDlg, UINT wMesg, WPARAM wParam, LPARAM lParam) { HICON hIcon; lParam; //Avoid Compiler warnings switch (wMesg) { case WM_CREATE: hIcon = LoadIcon ((HINSTANCE)hDlg, "WSTDUMP.ICO"); SetClassLongPtr (hDlg, GCLP_HICON, (LONG_PTR)hIcon); return TRUE; case WM_INITDIALOG: CheckDlgButton(hDlg, ID_DUMP, fDump); CheckDlgButton(hDlg, ID_CLEAR, fClear); CheckDlgButton(hDlg, ID_PAUSE, fPause); return TRUE; case WM_COMMAND: switch (wParam) { case IDOK: if (fDump) { SetWindowText(hDlg, "Dumping Data.."); } else if (fClear) { SetWindowText(hDlg, "Clearing Data.."); } else if (fPause) { SetWindowText(hDlg, "Stopping WST.."); } ClearDumpInfo(); SetWindowText(hDlg, "WST Dump Utility"); return (TRUE); case IDEXIT: EndDialog(hDlg, IDEXIT); return (TRUE); case ID_DUMP: fDump = TRUE; fPause = FALSE; fClear = FALSE; CheckDlgButton(hDlg, ID_DUMP, fDump); CheckDlgButton(hDlg, ID_PAUSE, fPause); CheckDlgButton(hDlg, ID_CLEAR, fClear); return (TRUE); case ID_CLEAR: fClear = TRUE; fPause = FALSE; fDump = FALSE; CheckDlgButton(hDlg, ID_CLEAR, fClear); CheckDlgButton(hDlg, ID_PAUSE, fPause); CheckDlgButton(hDlg, ID_DUMP, fDump); return (TRUE); case ID_PAUSE: fPause = TRUE; fClear = FALSE; fDump = FALSE; CheckDlgButton(hDlg, ID_PAUSE, fPause); CheckDlgButton(hDlg, ID_CLEAR, fClear); CheckDlgButton(hDlg, ID_DUMP, fDump); return (TRUE); } } return (FALSE); /* did not process a message */ } /* DialogProc() */