Sfoglia il codice sorgente

Implemented Linux pointer dereferencing.

woollybah 7 anni fa
parent
commit
4cbafc778d

+ 19 - 0
appstub.mod/appstub.linux.c

@@ -2,6 +2,8 @@
 #include <brl.mod/blitz.mod/blitz.h>
 
 #include <signal.h>
+#include <sys/uio.h>
+#include <unistd.h>
 
 int __bb_brl_appstub_appstub();
 
@@ -19,3 +21,20 @@ int SDL_main( int argc,char *argv[] ){
 
 	return 0;
 }
+
+size_t bmx_process_vm_readv(size_t dataSize, void * pointer, void * buffer) {
+
+	struct iovec local;
+	struct iovec remote;
+	pid_t pid = getpid();
+	
+	local.iov_base = buffer;
+	local.iov_len = dataSize;
+	
+	remote.iov_base = pointer;
+	remote.iov_len = dataSize;
+	
+	size_t result = process_vm_readv(pid, &local, 1, &remote, 1, 0);
+	
+	return result;
+}

+ 25 - 37
appstub.mod/debugger_mt.stdio.bmx

@@ -4,6 +4,15 @@ Import "debugger.stdio.glue.c"
 
 NoDebug
 
+?win32
+Include "deref_win32.bmx"
+?linux
+Include "deref_linux.bmx"
+?macos
+Include "deref_macos.bmx"
+?
+
+
 Private
 
 ?Win32
@@ -425,13 +434,6 @@ Function DebugDerefPointer:String(decl:Int Ptr, pointer:Byte Ptr)
 	
 	Local result:String = ""
 	
-	
-	? Win32
-	Extern "Win32"
-		Function GetCurrentProcess:Byte Ptr() = "HANDLE GetCurrentProcess(void)!"
-		Function ReadProcessMemory:Int(hProcess:Byte Ptr, lpBaseAddress:Byte Ptr, lpBuffer:Byte Ptr, nSize:Size_T, lpNumberOfBytesRead:Size_T Ptr) = "BOOL ReadProcessMemory(HANDLE, LPCVOID, LPVOID, SIZE_T, SIZE_T*)!"
-	End Extern
-	
 	Local dataSize:Size_T
 	Select dataType
  		Case "Byte"      dataSize = SizeOf(Byte Null)
@@ -443,7 +445,7 @@ Function DebugDerefPointer:String(decl:Int Ptr, pointer:Byte Ptr)
 		Case "Size_T"    dataSize = SizeOf(Size_T Null)
 		Case "Float"     dataSize = SizeOf(Float Null)
 		Case "Double"    dataSize = SizeOf(Double Null)
-	? Win32 And Ptr64
+	? Ptr64
 		Case "Float64"   dataSize = SizeOf(Float64 Null)
 		Case "Float128"  dataSize = SizeOf(Float128 Null)
 		Case "Double128" dataSize = SizeOf(Double128 Null)
@@ -451,40 +453,26 @@ Function DebugDerefPointer:String(decl:Int Ptr, pointer:Byte Ptr)
 	? Win32	
 		Case "WParam"    dataSize = SizeOf(WParam Null)
 		Case "LParam"    dataSize = SizeOf(LParam Null)
+	?
 		Default          dataSize = 0 ' cannot dereference this
 	EndSelect
-	
-	Local processHandle:Byte Ptr = GetCurrentProcess()
+
 	Local buffer:Byte Ptr = MemAlloc(Max(dataSize, SizeOf(Byte Ptr Null)))
 	(Byte Ptr Ptr buffer)[0] = Null
 	
-	pointer = (Byte Ptr Ptr pointer)[0]
-	For Local i:Int = 1 To ptrDepth - 1
-		Local success:Int = ReadProcessMemory(processHandle, pointer, buffer, Size_T SizeOf(Byte Ptr Null), Null)
-		If Not success Then
-			MemFree buffer
-			result :+ derefSymbol + derefFailure
-			Return result
-		End If
-		pointer = (Byte Ptr Ptr buffer)[0]
-	? Win32 And Not Ptr64
-		result :+ derefSymbol + "$" + ToHex(Int pointer)
-	? Win32 And Ptr64
-		result :+ derefSymbol + "$" + ToHex(Long pointer)
-	? Win32
-	Next
-	
-	Local success:Int
-	If dataSize > 0 Then
-		success = ReadProcessMemory:Int(processHandle, pointer, buffer, dataSize, Null)
-	Else
-		success = False
-	End If
-	If Not success Then
-		MemFree buffer
-		result :+ derefSymbol + derefFailure
+	Local res:Int
+	?win32
+	result = DebugDerefPointerWin32(dataSize, ptrDepth, pointer, buffer, res)
+	?linux
+	result = DebugDerefPointerLinux(dataSize, ptrDepth, pointer, buffer, res)
+	?macos
+	result = DebugDerefPointerMacos(dataSize, ptrDepth, pointer, buffer, res)
+	?
+
+	If Not res Then
 		Return result
 	End If
+
 	Local value:String
 	Select dataType
  		Case "Byte"      value = String((Byte   Ptr buffer)[0])
@@ -496,7 +484,7 @@ Function DebugDerefPointer:String(decl:Int Ptr, pointer:Byte Ptr)
 		Case "Size_T"    value = String((Size_T Ptr buffer)[0])
 		Case "Float"     value = String((Float  Ptr buffer)[0])
 		Case "Double"    value = String((Double Ptr buffer)[0])
-	? Win32 And Ptr64
+	? Ptr64
 		Case "Float64"   value = String((Float  Ptr buffer)[0]) + "," + ..
 		                         String((Float  Ptr buffer)[1])
 		Case "Float128"  value = String((Float  Ptr buffer)[0]) + "," + ..
@@ -512,6 +500,7 @@ Function DebugDerefPointer:String(decl:Int Ptr, pointer:Byte Ptr)
 	? Win32	
 		Case "WParam"    value = String((WParam Ptr buffer)[0])
 		Case "LParam"    value = String((LParam Ptr buffer)[0])
+	?
 		Default
 			MemFree buffer
 			result :+ derefSymbol + derefFailure
@@ -521,7 +510,6 @@ Function DebugDerefPointer:String(decl:Int Ptr, pointer:Byte Ptr)
 	result :+ derefSymbol + "{" + value + "}"
 	?
 	
-	
 	Return result
 EndFunction
 

+ 47 - 0
appstub.mod/deref_linux.bmx

@@ -0,0 +1,47 @@
+
+Extern
+	Function bmx_process_vm_readv:Size_T(dataSize:Size_T, pointer:Byte Ptr, buffer:Byte Ptr)
+End Extern
+
+Function DebugDerefPointerLinux:String(dataSize:Size_T, ptrDepth:Int, pointer:Byte Ptr, buffer:Byte Ptr, res:Int Var)
+	Const derefFailure:String = "{?}"
+	Const derefSymbol:String = "->"
+
+	Local result:String
+
+	pointer = (Byte Ptr Ptr pointer)[0]
+	For Local i:Int = 1 To ptrDepth - 1
+
+		Local success:Size_T = bmx_process_vm_readv(Size_T(SizeOf(Byte Ptr Null)), pointer, buffer)
+
+		If success < 0 Then
+			MemFree buffer
+			result :+ derefSymbol + derefFailure
+			Return result
+		End If
+
+		pointer = (Byte Ptr Ptr buffer)[0]
+	? Not Ptr64
+		result :+ derefSymbol + "$" + ToHex(Int pointer)
+	? Ptr64
+		result :+ derefSymbol + "$" + ToHex(Long pointer)
+	Next
+
+	Local success:Size_T
+	If dataSize > 0 Then
+		success = bmx_process_vm_readv(dataSize, pointer, buffer)
+	Else
+		success = -1
+	End If
+	
+	If success < 0 Then
+		MemFree buffer
+		result :+ derefSymbol + derefFailure
+		Return result
+	Else
+		res = True
+	End If
+
+	Return result
+	
+End Function

+ 7 - 0
appstub.mod/deref_macos.bmx

@@ -0,0 +1,7 @@
+
+
+Function DebugDerefPointerMacos:String(dataSize:Size_T, ptrDepth:Int, pointer:Byte Ptr, buffer:Byte Ptr, res:Int Var)
+
+	Return ""
+	
+End Function

+ 42 - 0
appstub.mod/deref_win32.bmx

@@ -0,0 +1,42 @@
+
+Extern "Win32"
+	Function GetCurrentProcess:Byte Ptr() = "HANDLE GetCurrentProcess(void)!"
+	Function ReadProcessMemory:Int(hProcess:Byte Ptr, lpBaseAddress:Byte Ptr, lpBuffer:Byte Ptr, nSize:Size_T, lpNumberOfBytesRead:Size_T Ptr) = "BOOL ReadProcessMemory(HANDLE, LPCVOID, LPVOID, SIZE_T, SIZE_T*)!"
+End Extern
+
+Function DebugDerefPointerWin32:String(dataSize:Size_T, ptrDepth:Int, pointer:Byte Ptr, buffer:Byte Ptr, res:Int Var)
+
+	Local result:String
+
+	Local processHandle:Byte Ptr = GetCurrentProcess()
+	
+	pointer = (Byte Ptr Ptr pointer)[0]
+	For Local i:Int = 1 To ptrDepth - 1
+		Local success:Int = ReadProcessMemory(processHandle, pointer, buffer, Size_T SizeOf(Byte Ptr Null), Null)
+		If Not success Then
+			MemFree buffer
+			result :+ derefSymbol + derefFailure
+			Return result
+		End If
+		pointer = (Byte Ptr Ptr buffer)[0]
+	? Not Ptr64
+		result :+ derefSymbol + "$" + ToHex(Int pointer)
+	? Ptr64
+		result :+ derefSymbol + "$" + ToHex(Long pointer)
+	Next
+	
+	Local success:Int
+	If dataSize > 0 Then
+		success = ReadProcessMemory(processHandle, pointer, buffer, dataSize, Null)
+	Else
+		success = False
+	End If
+	res = success
+	If Not success Then
+		MemFree buffer
+		result :+ derefSymbol + derefFailure
+		Return result
+	End If
+
+	Return result
+End Function