Login | Register   
RSS Feed
Download our iPhone app
Browse DevX
Sign up for e-mail newsletters from DevX

Tip of the Day
Language: VB4/32,VB5,VB6
Expertise: Advanced
Jun 12, 1999



Application Security Testing: An Integral Part of DevOps

Caveats of the CopyMemory API function

Here's the correct declaration of the CopyMemory API function, which is so useful whenever you want to move a block of bytes between two memory locations:

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, _
    source As Any, ByVal bytes As Long)
You should be aware of a few caveats of this statement:

  • When the source or the destination is a Visual Basic variable, it should be passed by reference, for example:
        ' copy an Integer into the low word of a Long variable
        CopyMemory lngValue, intValue, 2
  • When the source or the destination is a memory locationyou should pass a 32-bit address by value, for example:
        ' Copy the contents of a Long variable to the memory location
        ' pointed to by the "address" variable
        Dim address As Long
        CopyMemory ByVal address, lngValue, 4
  • When the source or the destination is an array of numbers (or of UDTs that contains only numeric and fixed-length strings), you must pass the first element of the array by reference:
        ' Copy the first 1000 elements of array a() to b()
        ' both arrays must be of the same type, and can't be objects 
        ' nor variable-length strings
        CopyMemory b(0), a(0), 1000 * Len(a(0))
  • Passing zero as the last arguments crashes the application, therefore when the number of bytes to be transferred is dynamically evalutated at runtime, you should always check that it isn't a null value, as in:
    If bytes > 0 Then
        CopyMemory source, dest, bytes
    End If
    Francesco Balena
    Comment and Contribute






    (Maximum characters: 1200). You have 1200 characters left.



    Thanks for your registration, follow us on our social networks to keep up-to-date