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).… 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=…
==============================================================================
--- 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?r…
==============================================================================
--- 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);