Author: ion Date: Thu Nov 30 22:02:22 2006 New Revision: 24999
URL: http://svn.reactos.org/svn/reactos?rev=24999&view=rev Log: - Update Dbgk test application to test Win32 as well (definable by a compile-time #define).
Modified: trunk/reactos/ntoskrnl/tests/TestDebug.c
Modified: trunk/reactos/ntoskrnl/tests/TestDebug.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/tests/TestDebug.c?... ============================================================================== --- trunk/reactos/ntoskrnl/tests/TestDebug.c (original) +++ trunk/reactos/ntoskrnl/tests/TestDebug.c Thu Nov 30 22:02:22 2006 @@ -1,16 +1,30 @@ +#define NATIVE 0 + +#if NATIVE #define _X86_ #include "ntndk.h" +#else +#include "stdio.h" +#include "windows.h" +#endif
VOID Main(VOID) { +#if NATIVE NTSTATUS Status; - HANDLE hProcess; OBJECT_ATTRIBUTES ObjectAttributes; CLIENT_ID ClientId; DBGUI_WAIT_STATE_CHANGE State; +#else + DWORD Error, BytesRead; + DEBUG_EVENT DebugEvent; + WCHAR ImageName[MAX_PATH]; +#endif + HANDLE hProcess; BOOLEAN Alive = TRUE;
+#if NATIVE printf("*** Native (DbgUi) Debugging Test Application\n"); printf("Press any key to connect to Dbgk..."); getchar(); @@ -19,8 +33,13 @@ printf(" Connection Established. Status: %lx\n", Status); printf("Debug Object Handle: %lx\n", NtCurrentTeb()->DbgSsReserved[1]); printf("Press any key to debug services.exe..."); +#else + printf("*** Win32 (Debug) Debugging Test Application\n"); + printf("Press any key to debug services.exe..."); +#endif getchar();
+#if NATIVE InitializeObjectAttributes(&ObjectAttributes, NULL, 0, 0, 0); ClientId.UniqueThread = 0; ClientId.UniqueProcess = UlongToHandle(168); @@ -29,20 +48,41 @@ &ObjectAttributes, &ClientId); Status = DbgUiDebugActiveProcess(hProcess); +#else + Error = DebugActiveProcess(2648); +#endif + +#if NATIVE printf(" Debugger Attached. Status: %lx\n", Status); +#else + printf(" Debugger Attached. Error: %lx\n", Error); +#endif printf("Press any key to get first debug event... "); getchar();
while (Alive) { +#if NATIVE Status = DbgUiWaitStateChange(&State, NULL); printf(" Event Received. Status: %lx\n", Status); printf("New State: %lx. Application Client ID: %lx/%lx\n", State.NewState, State.AppClientId.UniqueProcess, State.AppClientId.UniqueThread); +#else + Error = WaitForDebugEvent(&DebugEvent, -1); + printf(" Event Received. Error: %lx\n", Error); + printf("New State: %lx. Application Client ID: %lx/%lx\n", + DebugEvent.dwDebugEventCode, + DebugEvent.dwProcessId, DebugEvent.dwThreadId); +#endif
+#if NATIVE switch (State.NewState) +#else + switch (DebugEvent.dwDebugEventCode) +#endif { +#if NATIVE case DbgCreateProcessStateChange: printf("Process Handle: %lx. Thread Handle: %lx\n", State.StateInfo.CreateProcessInfo.HandleToProcess, @@ -51,40 +91,98 @@ State.StateInfo.CreateProcessInfo.NewProcess.FileHandle); printf("Process image base: %lx\n", State.StateInfo.CreateProcessInfo.NewProcess.BaseOfImage); +#else + case CREATE_PROCESS_DEBUG_EVENT: + printf("Process Handle: %lx. Thread Handle: %lx\n", + DebugEvent.u.CreateProcessInfo.hProcess, + DebugEvent.u.CreateProcessInfo.hThread); + printf("Process image handle: %lx\n", + DebugEvent.u.CreateProcessInfo.hFile); + printf("Process image base: %lx\n", + DebugEvent.u.CreateProcessInfo.lpBaseOfImage); + hProcess = DebugEvent.u.CreateProcessInfo.hProcess; +#endif break;
+#if NATIVE case DbgCreateThreadStateChange: printf("New thread: %lx\n", State.StateInfo.CreateThread.HandleToThread); printf("Thread Start Address: %p\n", State.StateInfo.CreateThread.NewThread.StartAddress); +#else + case CREATE_THREAD_DEBUG_EVENT: + printf("New thread: %lx\n", DebugEvent.u.CreateThread.hThread); + printf("Thread Start Address: %p\n", + DebugEvent.u.CreateThread.lpStartAddress); +#endif break;
+#if NATIVE case DbgLoadDllStateChange: printf("New DLL: %lx\n", State.StateInfo.LoadDll.FileHandle); printf("DLL LoadAddress: %p\n", State.StateInfo.LoadDll.BaseOfDll); +#else + case LOAD_DLL_DEBUG_EVENT: + printf("New DLL: %lx\n", DebugEvent.u.LoadDll.hFile); + printf("DLL LoadAddress: %p\n", DebugEvent.u.LoadDll.lpBaseOfDll); + Error = ReadProcessMemory(hProcess, + DebugEvent.u.LoadDll.lpImageName, + &DebugEvent.u.LoadDll.lpImageName, + sizeof(DebugEvent.u.LoadDll.lpImageName), + &BytesRead); + if (DebugEvent.u.LoadDll.lpImageName) + { + Error = ReadProcessMemory(hProcess, + DebugEvent.u.LoadDll.lpImageName, + ImageName, + sizeof(ImageName), + &BytesRead); + printf("DLL Name: %S\n", ImageName); + } +#endif break;
+#if NATIVE case DbgBreakpointStateChange: printf("Initial breakpoint hit at: %p!\n", State.StateInfo.Exception.ExceptionRecord.ExceptionAddress); +#else + +#endif break;
+#if NATIVE case DbgExitThreadStateChange: printf("Thread exited: %lx\n", State.StateInfo.ExitThread.ExitStatus); +#else + +#endif break;
+#if NATIVE case DbgExitProcessStateChange: printf("Process exited: %lx\n", State.StateInfo.ExitProcess.ExitStatus); Alive = FALSE; +#else + +#endif break; }
printf("Press any key to continue debuggee..."); getchar();
+#if NATIVE ClientId.UniqueProcess = State.AppClientId.UniqueProcess; ClientId.UniqueThread = State.AppClientId.UniqueThread; Status = DbgUiContinue(&ClientId, DBG_CONTINUE); printf(" Debuggee Resumed. Status: %lx\n", Status); +#else + Error = ContinueDebugEvent(DebugEvent.dwProcessId, + DebugEvent.dwThreadId, + DBG_CONTINUE); + printf(" Debuggee Resumed. Error: %lx\n", Error); +#endif + printf("Press any key to get next debug event... "); getchar(); };