找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3237|回复: 0

【其它源码】【转载】VB.NET的指针操作模块

[复制链接]

1112

主题

1653

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24269 个
贡献
46222 次
宅之契约
0 份
在线时间
2299 小时
注册时间
2014-1-26
发表于 2014-5-25 01:36:19 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
转载来源:http://www.vbasm.com/thread-8008-1-1.html
作者:Tesla.Angela
转载请注明出处!
摘自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
复制代码
回复

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-5-8 12:46 , Processed in 0.041011 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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