′---以下為Assembly部分--
′作用:將函數(shù)的參數(shù)壓入堆棧
Dim lngIndex As Long, lngCodeStart As Long
′程序起始位址必須是16的倍數(shù)
′VarPtr函數(shù)是用來取得變量的地址
lngCodeStart = (VarPtr(m_OpCode(0)) Or &HF) + 1
m_opIndex = lngCodeStart - VarPtr(m_OpCode(0)) ′程序開始的元素的位置
′前面部分以中斷點添滿
For lngIndex = 0 To m_opIndex - 1
m_OpCode(lngIndex) = &HCC ′int 3
Next lngIndex
′--------以下開始放入所需的程序----------
′將參數(shù)push到堆棧
′由于是STDCall CALL 參數(shù)由最后一個開始放到堆棧
For lngIndex = UBound(arrParams) To 0 Step -1
AddByteToCode &H68 ′push的機器碼為H68
AddLongToCode CLng(arrParams(lngIndex)) ′參數(shù)地址
Next lngIndex
′call hProc
AddByteToCode &HE8 ′call的機器碼為HE8
AddLongToCode lngProc - VarPtr(m_OpCode(m_opIndex)) - 4 ′函數(shù)地址 用call的定址
′-----------結(jié)束所需的程序--------------
′返回呼叫函數(shù)
AddByteToCode &HC2 ′ret 10h
AddByteToCode &H10
AddByteToCode &H0
GetCodeStart = lngCodeStart
End Function
Private Sub AddLongToCode(lData As Long)
′將Long類型的參數(shù)寫到m_OpCode中
CopyMemory m_OpCode(m_opIndex), lData, 4
m_opIndex = m_opIndex + 4
End Sub
Private Sub AddIntToCode(iData As Byte)
′將Integer類型的參數(shù)寫道m(xù)_OpCode中
CopyMemory m_OpCode(m_opIndex), iData, 2
m_opIndex = m_opIndex + 2
End Sub
Private Sub AddByteToCode(bData As Byte)
′將Byte類型的參數(shù)寫道m(xù)_OpCode中
m_OpCode(m_opIndex) = bData
m_opIndex = m_opIndex + 1
End Sub
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |