找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 8163|回复: 1

[其它源码] [原创]VB.NET的指针操作模块

[复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2014-5-24 20:05:20 | 显示全部楼层 |阅读模式
摘自WIN64AST源码。
  1. Module PtrOpr

  2.     Private Declare Function VirtualAlloc Lib "kernel32.dll" Alias "VirtualAlloc" (ByVal lpAddress As UIntPtr,
  3.                                                                                     ByVal dwSize As UInt32,
  4.                                                                                     ByVal flAllocationType As UInt32,
  5.                                                                                     ByVal flProtect As UInt32) As UIntPtr

  6.     Private Declare Function VirtualFree Lib "kernel32.dll" Alias "VirtualFree" (ByVal lpAddress As UIntPtr,
  7.                                                                                 ByVal dwSize As UInt32,
  8.                                                                                 ByVal dwFreeType As UInt32) As Int32

  9.     Public Declare Sub memset Lib "kernel32.dll" Alias "RtlFillMemory" (ByVal lpAddress As UIntPtr,
  10.                                                                         ByVal dwSize As UInt32,
  11.                                                                         ByVal bFill As Byte)

  12.     Public Declare Sub memcpy Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination As UIntPtr,
  13.                                                                         ByVal Source As UIntPtr,
  14.                                                                         ByVal Length As UInt32)

  15.     Public Declare Sub memcpy1pv Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination As UIntPtr,
  16.                                                                             ByRef Source As Byte,
  17.                                                                             Optional ByVal Length As UInt32 = 1)

  18.     Public Declare Sub memcpy2pv Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination As UIntPtr,
  19.                                                                             ByRef Source As UInt16,
  20.                                                                             Optional ByVal Length As UInt32 = 2)

  21.     Public Declare Sub memcpy4pv Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination As UIntPtr,
  22.                                                                             ByRef Source As UInt32,
  23.                                                                             Optional ByVal Length As UInt32 = 4)

  24.     Public Declare Sub memcpy8pv Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination As UIntPtr,
  25.                                                                             ByRef Source As UInt64,
  26.                                                                             Optional ByVal Length As UInt32 = 8)

  27.     Public Declare Sub memcpy1vp Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Byte,
  28.                                                                         ByVal Source As UIntPtr,
  29.                                                                         Optional ByVal Length As UInt32 = 1)

  30.     Public Declare Sub memcpy2vp Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As UInt16,
  31.                                                                             ByVal Source As UIntPtr,
  32.                                                                             Optional ByVal Length As UInt32 = 2)

  33.     Public Declare Sub memcpy4vp Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As UInt32,
  34.                                                                             ByVal Source As UIntPtr,
  35.                                                                             Optional ByVal Length As UInt32 = 4)

  36.     Public Declare Sub memcpy8vp Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As UInt64,
  37.                                                                             ByVal Source As UIntPtr,
  38.                                                                             Optional ByVal Length As UInt32 = 8)

  39.     Public Function malloc(ByVal length As Long) As ULong
  40.         Dim p As ULong
  41.         p = VirtualAlloc(0, length, &H1000, &H40)
  42.         memset(p, length, 0)
  43.         Return p
  44.     End Function

  45.     Public Sub free(ByVal buffer As ULong)
  46.         VirtualFree(buffer, 0, &H4000)
  47.     End Sub

  48.     Public Function GetPtrVal1(ByVal ptr As UIntPtr) As Byte
  49.         Dim v As Byte = 0
  50.         memcpy1vp(v, ptr)
  51.         Return v
  52.     End Function

  53.     Public Function GetPtrVal2(ByVal ptr As UIntPtr) As UInt16
  54.         Dim v As UInt16 = 0
  55.         memcpy2vp(v, ptr)
  56.         Return v
  57.     End Function

  58.     Public Function GetPtrVal4(ByVal ptr As UIntPtr) As UInt32
  59.         Dim v As UInt32 = 0
  60.         memcpy4vp(v, ptr)
  61.         Return v
  62.     End Function

  63.     Public Function GetPtrVal8(ByVal ptr As UIntPtr) As UInt64
  64.         Dim v As UInt64 = 0
  65.         memcpy8vp(v, ptr)
  66.         Return v
  67.     End Function

  68.     Public Sub SetPtrVal1(ByVal ptr As UIntPtr, ByVal v As Byte)
  69.         memcpy1pv(ptr, v)
  70.     End Sub

  71.     Public Sub SetPtrVal2(ByVal ptr As UIntPtr, ByVal v As UInt16)
  72.         memcpy2pv(ptr, v)
  73.     End Sub

  74.     Public Sub SetPtrVal4(ByVal ptr As UIntPtr, ByVal v As UInt32)
  75.         memcpy4pv(ptr, v)
  76.     End Sub

  77.     Public Sub SetPtrVal8(ByVal ptr As UIntPtr, ByVal v As UInt64)
  78.         memcpy8pv(ptr, v)
  79.     End Sub

  80.     Public Function AllocAndSetPtr1(ByVal v As Byte) As UIntPtr
  81.         Dim p As UIntPtr = malloc(Len(v))
  82.         SetPtrVal1(p, v)
  83.         Return p
  84.     End Function

  85.     Public Function AllocAndSetPtr2(ByVal v As UInt16) As UIntPtr
  86.         Dim p As UIntPtr = malloc(Len(v))
  87.         SetPtrVal2(p, v)
  88.         Return p
  89.     End Function

  90.     Public Function AllocAndSetPtr4(ByVal v As UInt32) As UIntPtr
  91.         Dim p As UIntPtr = malloc(Len(v))
  92.         SetPtrVal4(p, v)
  93.         Return p
  94.     End Function

  95.     Public Function AllocAndSetPtr8(ByVal v As UInt64) As UIntPtr
  96.         Dim p As UIntPtr = malloc(Len(v))
  97.         SetPtrVal8(p, v)
  98.         Return p
  99.     End Function

  100. End Module
复制代码

使用范例:
  1.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         Dim p As UIntPtr = malloc(1024 * 1024 * 10)
  3.         If p.Size = 4 Then
  4.             MsgBox("申请了10MB内存请注意内存变化", , Hex(p.ToUInt32))
  5.         Else
  6.             MsgBox("申请了10MB内存请注意内存变化", , Hex(p.ToUInt64))
  7.         End If
  8.         free(p) : MsgBox("内存已经释放请注意内存变化")
  9.     End Sub

  10.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  11.         Dim p As UIntPtr = AllocAndSetPtr8(&H7FFFF80012345699)
  12.         Dim v As ULong = GetPtrVal8(p) : MsgBox(Hex(v))
  13.         free(p)
  14.     End Sub
复制代码

30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-4-13 09:22:38 | 显示全部楼层
大侠亲为 必须支持
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表