Search code examples
vb6readprocessmemory

How to get string from the output of ReadProcessMemory


This is a snippet of my code.

Declare Function ReadProcessMemory Lib "kernel32" _
                              (ByVal hProcess As Long, _
                              ByVal lpBaseAddress As Long, _
                              lpBuffer As Any, _
                              ByVal nSize As Long, _
                              lpNumberOfBytesRead As Long) As Long

Dim bytearray As String * 65526
Dim GetWindowsFormsID

ReadProcessMemory(processHandle, bufferMem, ByVal bytearray, size, lp)
GetWindowsFormsID = ByteArrayToString(bytearray, retLength)

Function ByteArrayToString(bytes As String, length As Long) As String
    Dim retValStr As String
    Dim l As Long
    retValStr = String$(length + 1, Chr(0))
    l = WideCharToMultiByte(CP_ACP, 0, bytes, -1, retValStr, length + 1, Null, Null)
    ByteArrayToString = retValStr
End Function

I got '94 null' error while calling WideCharToMultiByte. But I'm sure bytes is not empty.

alt text

Is this the exact procedure to convert this output into String?


Solution

  • OK, this is solved (and also this question). The issue is actually convert WideChar string into ANSI string. I use CopyMemory instead of WideCharToMultiByte.

    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    
    Function ByteArrayToString(bytes As String, Length As Long) As String
        Dim retValStr As String
        retValStr = String(Length - 1, Chr$(0))
        CopyMemory ByVal StrPtr(retValStr), ByVal bytes, Length * 2
        ByteArrayToString = retValStr
    End Function