title: Error: [Expression expected] using ByVal modifier
body: <p>I was hoping to get help from you, because I am encountering errors for a project using VB.net. I am having errors in using the ByVal modifier. And the 7 errors all says "Expression Expected".</p>
  
  <p>I get Errors on lines 97, 103, 103, 112, 112, 146, and 146. A total of 7 Errors.</p>
  
  <p>Here they are:</p>
  
  <p>97:</p>
  
  <pre><code>ret = VirtualQueryEx(hProcess, ByVal lpMem, mbi, lLenMBI)
  </code></pre>
  
  <p>103:</p>
  
  <pre><code>ReadProcessMemory(hProcess, ByVal mbi.BaseAddress, ByVal sBuffer, mbi.RegionSize, lWritten)
  </code></pre>
  
  <p>112:</p>
  
  <pre><code>Call WriteProcessMemory(hProcess, ByVal CalcAddress - 1, ByVal sReplaceString, Len(sReplaceString), lWritten)
  </code></pre>
  
  <p>146:</p>
  
  <pre><code>test_hwnd = FindWindow(ByVal 0&amp;, ByVal 0&amp;)
  </code></pre>
  
  <p>Here is the complete code:</p>
  
  <pre><code>Option Explicit On
  Imports System.Text
  Imports System
  Imports Microsoft.VisualBasic
  
  Public Class Form1
  
  Public Structure OSVERSIONINFO
      Dim dwOSVersionInfoSize As Long
      Dim dwMajorVersion As Long
      Dim dwMinorVersion As Long
      Dim dwBuildNumber As Long
      Dim dwPlatformId As Long
      Dim szCSDVersion As String ' 128
  End Structure
  
  Public Structure MEMORY_BASIC_INFORMATION ' 28 bytes
      Dim BaseAddress As Long
      Dim AllocationBase As Long
      Dim AllocationProtect As Long
      Dim RegionSize As Long
      Dim State As Long
      Dim Protect As Long
      Dim lType As Long
  End Structure
  
  Public Structure SYSTEM_INFO ' 36 Bytes
      Dim dwOemID As Long
      Dim dwPageSize As Long
      Dim lpMinimumApplicationAddress As Long
      Dim lpMaximumApplicationAddress As Long
      Dim dwActiveProcessorMask As Long
      Dim dwNumberOrfProcessors As Long
      Dim dwProcessorType As Long
      Dim dwAllocationGranularity As Long
      Dim wProcessorLevel As Integer
      Dim wProcessorRevision As Integer
  End Structure
  
  Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByVal LpVersionInformation As OSVERSIONINFO) As Long
  Private Declare Function VirtualQueryEx&amp; Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Short, &lt;System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.AsAny)&gt; ByVal o As Object, ByVal lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As Long)
  Private Declare Sub GetSystemInfo Lib "kernel32" (ByVal lpSystemInfo As SYSTEM_INFO)
  Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long
  Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Short, &lt;System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.AsAny)&gt; ByVal o As Object, ByVal lpBuffer As Short, &lt;System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.AsAny)&gt; ByVal o As Object, ByVal nSize As Long, ByVal lpNumberOfBytesWritten As Long) As Long
  Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Short, &lt;System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.AsAny)&gt; ByVal o As Object, ByVal lpBuffer As Short, &lt;System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.AsAny)&gt; ByVal o As Object, ByVal nSize As Long, ByVal lpNumberOfBytesWritten As Long) As Long
  
  Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, ByVal lpdwProcessId As Long) As Long
  Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
  Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
  Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
  Const GW_HWNDNEXT = 2
  
  Private Declare Function InvalidateRect Lib "user32" (ByVal hWnd As Long, ByVal lpRect As Long, ByVal bErase As Long) As Long
  Const PROCESS_VM_READ = (&amp;H10)
  Const PROCESS_VM_WRITE = (&amp;H20)
  Const PROCESS_VM_OPERATION = (&amp;H8)
  Const PROCESS_QUERY_INFORMATION = (&amp;H400)
  Const PROCESS_READ_WRITE_QUERY = PROCESS_VM_READ + PROCESS_VM_WRITE + PROCESS_VM_OPERATION + PROCESS_QUERY_INFORMATION
  
  Const MEM_PRIVATE&amp; = &amp;H20000
  Const MEM_COMMIT&amp; = &amp;H1000
  
  '================================================================================================================================================================='
  '===============================================================Start of FUNCTION CODES==========================================================================='
  '================================================================================================================================================================='
  
  'Add 3 labels, 3 textboxes and 1 commandbutton on form
  Private Sub Command1_Click()
  
      Dim srcEncoding As Encoding
      Dim dstEncoding As Encoding
      Dim bytes As Byte()
      Dim returnValue As Byte()
  
      Dim pid As Long, hProcess As Long, hWin As Long
      Dim lpMem As Long, ret As Long, lLenMBI As Long
      Dim lWritten As Long, CalcAddress As Long, lPos As Long
      Dim sBuffer As String
      Dim sSearchString As String, sReplaceString As String
      Dim si As SYSTEM_INFO
      Dim mbi As MEMORY_BASIC_INFORMATION
  
      sSearchString = Text2.Text
      sReplaceString = Text3.Text &amp; Chr(0)
      pid = Shell(Text1.Text) 'launch application (calc.exe in this sample)
      hWin = InstanceToWnd(pid) 'get handle of launched window - only to repaint it after changes
      'Open process with required access
      hProcess = OpenProcess(PROCESS_READ_WRITE_QUERY, False, pid)
      lLenMBI = Len(mbi)
      'Determine applications memory addresses range
      Call GetSystemInfo(si)
      lpMem = si.lpMinimumApplicationAddress
      'Scan memory
      Do While lpMem &lt; si.lpMaximumApplicationAddress
          mbi.RegionSize = 0
      ret = VirtualQueryEx(hProcess, ByVal lpMem, mbi, lLenMBI)
          If ret = lLenMBI Then
              If ((mbi.lType = MEM_PRIVATE) And (mbi.State = MEM_COMMIT)) Then ' this block is In use by this process
                  If mbi.RegionSize &gt; 0 Then
                      sBuffer = String.Equals(mbi.RegionSize, 0)
                      'Read region into string
                 ReadProcessMemory(hProcess, ByVal mbi.BaseAddress, ByVal sBuffer, mbi.RegionSize, lWritten)
                      'Check if region contain search string
                      lPos = InStr(1, sBuffer, sSearchString, vbTextCompare)
                      If lPos Then
                          CalcAddress = mbi.BaseAddress + lPos
                          Me.Show()
                          ret = MsgBox("Search string was found at address " &amp; CalcAddress &amp; "." &amp; vbCrLf &amp; "Do you want to replace it?", vbInformation + vbYesNo, "VB-O-Matic")
                          If ret = vbYes Then
                              'Replace string in virtual memory
                       Call WriteProcessMemory(hProcess, ByVal CalcAddress - 1, ByVal sReplaceString, Len(sReplaceString), lWritten)
                              'Redraw window
                              InvalidateRect(hWin, 0, 1)
                          End If
                          Exit Do
                      End If
                  End If
              End If
              'Increase base address for next searching cicle. Last address may overhead max Long value (Windows use 2GB memory, which is near max long value), so add Error checking
              On Error GoTo Finished
              lpMem = mbi.BaseAddress + mbi.RegionSize
              On Error GoTo 0
          Else
              Exit Do
          End If
      Loop
  Finished:
      CloseHandle(hProcess)
  End Sub
  Private Sub Form_Load()
      'Caption = "VB-O-Matic"
      Label1.Text = "Start application:"
      Label2.Text = "String to find:"
      Label3.Text = "Replace with:"
      Text1.Text = "Calc.exe"
      Text2.Text = "Backspace"
      Text3.Text = "VB-O-Matic"
      Command1.Text = "&amp;Launch It!"
  End Sub
  
  Private Function InstanceToWnd(ByVal target_pid As Long) As Long
      Dim test_hwnd As Long
      Dim test_pid As Long
      Dim test_thread_id As Long
      test_hwnd = FindWindow(ByVal 0&amp;, ByVal 0&amp;)
      Do While test_hwnd &lt;&gt; 0
          If GetParent(test_hwnd) = 0 Then
              test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
              If test_pid = target_pid Then
                  InstanceToWnd = test_hwnd
                  Exit Do
              End If
          End If
          test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
      Loop
  End Function
  End Class
  </code></pre>