Author: hbelusca Date: Sun Jun 28 18:52:51 2015 New Revision: 68306
URL: http://svn.reactos.org/svn/reactos?rev=68306&view=rev Log: [NTOS] - Do not forget to initialize LoadDll->NamePointer in DbgkMapViewOfSection!! - Just copy the NamePointer (pointer to pointer to file name) in DbgUiConvertStateChangeStructure. See the description of the lpImageName member of the LOAD_DLL_DEBUG_INFO structure in https://msdn.microsoft.com/en-us/library/windows/desktop/ms680351(v=vs.85).a... for more details.
This fixes some debugging stuff with GDB (see the below-mentioned report).
Adapted from a patch by andy-123 (whom I don't remember his name^^), CORE-7019 #resolve #comment Fixed in r68306 CORE-8622 #comment An updated fix was committed in r68306
Modified: trunk/reactos/dll/ntdll/dbg/dbgui.c trunk/reactos/ntoskrnl/dbgk/dbgkutil.c
Modified: trunk/reactos/dll/ntdll/dbg/dbgui.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/dbg/dbgui.c?rev=6... ============================================================================== --- trunk/reactos/dll/ntdll/dbg/dbgui.c [iso-8859-1] (original) +++ trunk/reactos/dll/ntdll/dbg/dbgui.c [iso-8859-1] Sun Jun 28 18:52:51 2015 @@ -62,13 +62,8 @@ OUT PVOID Win32DebugEvent) { NTSTATUS Status; - OBJECT_ATTRIBUTES ObjectAttributes; THREAD_BASIC_INFORMATION ThreadBasicInfo; LPDEBUG_EVENT DebugEvent = Win32DebugEvent; - HANDLE ThreadHandle; - HANDLE ProcessHandle; - PTEB Teb; - PVOID Pointer;
/* Write common data */ DebugEvent->dwProcessId = (DWORD)WaitStateChange-> @@ -80,7 +75,7 @@ { /* New thread */ case DbgCreateThreadStateChange: - + { /* Setup Win32 code */ DebugEvent->dwDebugEventCode = CREATE_THREAD_DEBUG_EVENT;
@@ -109,10 +104,11 @@ ThreadBasicInfo.TebBaseAddress; } break; + }
/* New process */ case DbgCreateProcessStateChange: - + { /* Write Win32 debug code */ DebugEvent->dwDebugEventCode = CREATE_PROCESS_DEBUG_EVENT;
@@ -160,30 +156,33 @@ DebugEvent->u.CreateProcessInfo.lpImageName = NULL; DebugEvent->u.CreateProcessInfo.fUnicode = TRUE; break; + }
/* Thread exited */ case DbgExitThreadStateChange: - + { /* Write the Win32 debug code and the exit status */ DebugEvent->dwDebugEventCode = EXIT_THREAD_DEBUG_EVENT; DebugEvent->u.ExitThread.dwExitCode = WaitStateChange->StateInfo.ExitThread.ExitStatus; break; + }
/* Process exited */ case DbgExitProcessStateChange: - + { /* Write the Win32 debug code and the exit status */ DebugEvent->dwDebugEventCode = EXIT_PROCESS_DEBUG_EVENT; DebugEvent->u.ExitProcess.dwExitCode = WaitStateChange->StateInfo.ExitProcess.ExitStatus; break; + }
/* Any sort of exception */ case DbgExceptionStateChange: case DbgBreakpointStateChange: case DbgSingleStepStateChange: - + { /* Check if this was a debug print */ if (WaitStateChange->StateInfo.Exception.ExceptionRecord. ExceptionCode == DBG_PRINTEXCEPTION_C) @@ -225,84 +224,40 @@ WaitStateChange->StateInfo.Exception.FirstChance; } break; + }
/* DLL Load */ case DbgLoadDllStateChange: - + { /* Set the Win32 debug code */ DebugEvent->dwDebugEventCode = LOAD_DLL_DEBUG_EVENT;
/* Copy the rest of the data */ + DebugEvent->u.LoadDll.hFile = + WaitStateChange->StateInfo.LoadDll.FileHandle; DebugEvent->u.LoadDll.lpBaseOfDll = WaitStateChange->StateInfo.LoadDll.BaseOfDll; - DebugEvent->u.LoadDll.hFile = - WaitStateChange->StateInfo.LoadDll.FileHandle; DebugEvent->u.LoadDll.dwDebugInfoFileOffset = WaitStateChange->StateInfo.LoadDll.DebugInfoFileOffset; DebugEvent->u.LoadDll.nDebugInfoSize = WaitStateChange->StateInfo.LoadDll.DebugInfoSize; - - /* Open the thread */ - InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); - Status = NtOpenThread(&ThreadHandle, - THREAD_QUERY_INFORMATION, - &ObjectAttributes, - &WaitStateChange->AppClientId); - if (NT_SUCCESS(Status)) - { - /* Query thread information */ - Status = NtQueryInformationThread(ThreadHandle, - ThreadBasicInformation, - &ThreadBasicInfo, - sizeof(ThreadBasicInfo), - NULL); - NtClose(ThreadHandle); - } - - /* If we got thread information, open the process */ - if (NT_SUCCESS(Status)) - { - Status = NtOpenProcess(&ProcessHandle, - PROCESS_VM_READ, - &ObjectAttributes, - &WaitStateChange->AppClientId); - } - - if (NT_SUCCESS(Status)) - { - /* Read the image name from the TIB */ - Teb = ThreadBasicInfo.TebBaseAddress; - Status = NtReadVirtualMemory(ProcessHandle, - &Teb->NtTib.ArbitraryUserPointer, - &Pointer, - sizeof(Pointer), - NULL); - NtClose(ProcessHandle); - } - - if (NT_SUCCESS(Status)) - { - /* If everything was successful, set the image name */ - DebugEvent->u.LoadDll.lpImageName = Pointer; - } - else - { - /* Otherwise, no name */ - DebugEvent->u.LoadDll.lpImageName = NULL; - } + DebugEvent->u.LoadDll.lpImageName = + WaitStateChange->StateInfo.LoadDll.NamePointer;
/* It's Unicode */ DebugEvent->u.LoadDll.fUnicode = TRUE; break; + }
/* DLL Unload */ case DbgUnloadDllStateChange: - + { /* Set Win32 code and DLL Base */ DebugEvent->dwDebugEventCode = UNLOAD_DLL_DEBUG_EVENT; DebugEvent->u.UnloadDll.lpBaseOfDll = WaitStateChange->StateInfo.UnloadDll.BaseAddress; break; + }
/* Anything else, fail */ default: return STATUS_UNSUCCESSFUL;
Modified: trunk/reactos/ntoskrnl/dbgk/dbgkutil.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/dbgk/dbgkutil.c?re... ============================================================================== --- trunk/reactos/ntoskrnl/dbgk/dbgkutil.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/dbgk/dbgkutil.c [iso-8859-1] Sun Jun 28 18:52:51 2015 @@ -405,6 +405,7 @@ LoadDll->BaseOfDll = BaseAddress; LoadDll->DebugInfoFileOffset = 0; LoadDll->DebugInfoSize = 0; + LoadDll->NamePointer = &NtCurrentTeb()->NtTib.ArbitraryUserPointer;
/* Get the NT Headers */ NtHeader = RtlImageNtHeader(BaseAddress);