none
關於利用ReadProcessMemory 讀取記憶體內數值出值後轉值的問題 RRS feed

  • 問題

  • 小弟參考了 MSDN論壇不少關於ReadProcessMemory 讀取值出來的觀念和手法  

    也依樣畫葫蘆自己照做了一次  但我發現這個API取值出來後的後段處理  有點搞不太懂

    所以特來發文請教各位大大

    首先這個API 我用了兩種不同的宣告方法 :

    Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, ByVal pBuffer() As Byte, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer

    Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesRead As Integer) As Integer

     

    當然這兩種宣告方法實際測試後是可以使用的  也是我尋找網路上的資訊後彙整確認可以使用的

    但是使用這兩種不同的宣告 我試著要將他傳出來的值轉成浮點數 就發現了問題

    1.

    Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, ByVal pBuffer() As Byte, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer

                Dim b(3) As Byte

                ReadProcessMemory(hProcess, &HBD1A88, b, 4, bytesRead)

             Me.Label2.Text = "監看數據int32:" & BitConverter.ToInt32(b, 0)

               Me.Label1.Text = "監看數據浮點數:" & (BitConverter.ToSingle(b, 0))

     

          

    label2跑出來的數據是  1132390609      lebel1跑出來的數據是 254.9094   這個沒有問題是我要的數據

    但是用第二個API重新宣告再測試一次

    2.

    Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesRead As Integer) As Integer

    Dim b As integer

      ReadProcessMemory(hProcess, &HBD1A88, b, 4, bytesRead)

       Me.Label2.Text = "監看數據int32" & b

      Me.Label1.Text = "監看數據浮點數:" & CSng(b)

     

    label2跑出來的數據是  1132390609  跟上面一樣   lebel1跑出來的數據卻是1.132391E+09

    為什麼會這樣呢?   明明都是轉換成浮點數  為什麼下面這種一樣轉成浮點數 為什麼會變成這樣呢?

    我要lebel1的數據結果是跟上面那個浮點數的結果才是我要的  這裡是哪裡有問題呢?  該如何修改..

     

    2012年11月2日 下午 01:10

解答

  • Integer 1132390609 會跟 Single 254.9094 相等
    是轉成對應的2進位才會相等

    所以把Integer 1132390609直接用CSng 轉成Single 格式 當然只會是 1132390609.00 (科學記號表示法就是 1.132391E+09)

    你的第二個例子
    要先把Integer轉成Byte() 再轉回Single


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    • 已提議為解答 KKBruceMVP 2012年11月2日 下午 02:12
    • 已標示為解答 向恩 2012年11月2日 下午 03:25
    2012年11月2日 下午 02:03
  • CXXX是轉型別的用法

    我的意思是:

    Dim byteArray As Byte()
    byteArray = BitConverter.GetBytes(b)

    BitConverter.ToSingle(b, 0)


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    • 已標示為解答 向恩 2012年11月2日 下午 03:21
    2012年11月2日 下午 02:19
  • 計概有教,MSDN 線上手冊也有,只是 MSDN 那邊假設你看過 IEEE 754 ,沒有細說。

    請看 IEEE 754 關於浮點數的位元配置。不然用 IEEE 754 為關鍵字搜尋也可以。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 向恩 2012年11月3日 上午 05:50
    2012年11月2日 下午 05:47

所有回覆

  • Integer 1132390609 會跟 Single 254.9094 相等
    是轉成對應的2進位才會相等

    所以把Integer 1132390609直接用CSng 轉成Single 格式 當然只會是 1132390609.00 (科學記號表示法就是 1.132391E+09)

    你的第二個例子
    要先把Integer轉成Byte() 再轉回Single


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    • 已提議為解答 KKBruceMVP 2012年11月2日 下午 02:12
    • 已標示為解答 向恩 2012年11月2日 下午 03:25
    2012年11月2日 下午 02:03
  • TO  Alex

    請問你的意思是像這樣嗎?

       

    CSng(CByte(b))

    可是這樣寫會跑出錯誤信息  : 數學運算導致溢位 ...

    2012年11月2日 下午 02:14
  • CXXX是轉型別的用法

    我的意思是:

    Dim byteArray As Byte()
    byteArray = BitConverter.GetBytes(b)

    BitConverter.ToSingle(b, 0)


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    • 已標示為解答 向恩 2012年11月2日 下午 03:21
    2012年11月2日 下午 02:19
  • Alex 說你實際上用的是 CSng(1132390609) ,4 bytes 浮點數只有 6 ~ 7 為有效數字。

    這是計概的基礎。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年11月2日 下午 03:57
  • 有點了解了  只不過還有一個疑問

    integer  跟  single 都是占用 4byte的空間  

    能將 Integer轉成Byte() 再轉回Single

    這個底層到底是做了什麼樣的轉換阿?

    不是一樣是在4byte空間中的那些 0和1嗎?  為什麼轉出來的數值會不一樣?

    2012年11月2日 下午 05:23
  • 計概有教,MSDN 線上手冊也有,只是 MSDN 那邊假設你看過 IEEE 754 ,沒有細說。

    請看 IEEE 754 關於浮點數的位元配置。不然用 IEEE 754 為關鍵字搜尋也可以。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 向恩 2012年11月3日 上午 05:50
    2012年11月2日 下午 05:47