日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

使用API Monitor监测到目标程序对系统API函数的调用(常用分析工具)

發布時間:2023/12/14 windows 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用API Monitor监测到目标程序对系统API函数的调用(常用分析工具) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1、問題背景

2、使用API Monitor工具監測目標軟件對SystemParametersInfo接口的調用

3、到MSDN上查看SystemParametersInfo API函數的說明,查看到關鍵參數的含義

4、最后


? ? ? ?我們多次在項目中使用API Monitor工具監測參考程序對系統API函數的調用,找到問題的解決辦法,API Monitor工具確實很好用,今天我們就來詳細介紹一下如何使用API Monitor工具。

1、問題背景

? ? ? ?我們以之前一個項目問題為例。在某些場景下,Windows系統因為鼠標沒操作出發自動關閉顯示器、自動屏保、自動待機等會打斷我們正在進行的事務。比如我們當前正在使用會議軟件開會,如果系統自動關閉了顯示器或者待機,就會打斷正在進行中的會議(看不到視頻等),用戶體驗也是非常差的,所以我們要在進入開會狀態后,阻止系統屏保,阻止子系統自動關閉屏幕,阻止系統自動待機。

? ? ? ?以阻止屏保為例,我們在網上搜索得知,可以調用系統API函數SystemParametersInfo主動關閉屏保,但調用該函數應該使用哪些具體的函數參數,以及使用該函數是否能實現既定的功能,一開始是不得而知的。所以我們想使用API Monitor工具去監控一下一款主流的會議軟件,看看該軟件是不是調用SystemParametersInfo接口去組織屏保的,以及調用該接口都使用了哪些參數。

2、使用API Monitor工具監測目標軟件對SystemParametersInfo接口的調用

? ? ? ?啟動API Monitor后,先在左邊的API函數列表中搜索到SystemParametersInfo函數,勾選上;然后在進程列表中找到目標進程,右鍵單擊目標進程,在彈出的右鍵菜單中點擊Start Monitoring,啟動監測,操作步驟如下圖所示:

? ? ? ?但在進程列表中該參考軟件有多個進程(通過進程名稱和圖標可以看出),不知道哪個是與會議相關的進程。這些進程都要監控,有兩個辦法。一個是按照上圖操作將多個進程一個一個添加到監控列表中,二是在通過API Monitor中點擊“Monitor New Process”按鈕去啟動參考軟件:

這樣API Monitor就可以監控該參考軟件啟動的所有進程了。

但好像有時即使通過“Monitor New Process”按鈕啟動軟件,也不會把啟動程序的所有進程加入到監控列表中,所以還是需要手動添加到監控進程列表中的。

? ? ? ?于是使用參考軟件創建一個會議,加入到會議中,然后在監測的進程列表中,切換點擊該參考軟件的多個進程,看看哪個進程調用SystemParametersInfo函數時傳入了SPI_SETSCREENSAVEACTIVE參數,可以按下Ctrl+F快捷鍵調出搜索窗口,在監測結果中以SPI_SETSCREENSAVEACTIVE為關鍵字進行搜索,果然監測到了,如下:

  • ?上圖中有監控進程列表,有多個進程時需要切換查看。
  • 點擊監測結果列表中的某行記錄,下方callstack子窗口中會顯示該行記錄對應的函數調用堆棧的(只顯示4幀)。

? ? ? ? 我們單獨對監測結果列表截圖,可以看的更清楚一點:

? ? ? ?在退出會議時,可以監測到又調用了SystemParametersInfo函數(第一個參數傳SPI_SETSCREENSAVEACTIVE,第二個參數傳TRUE(1),TRUE即表示開啟屏保),恢復系統的屏保,如下:

3、到MSDN上查看SystemParametersInfo API函數的說明,查看到關鍵參數的含義

? ? ? ? API Monitor工具開啟監測后不僅看到調用了什么API函數禁用屏保,還能看到調用該API函數時傳遞了什么參數。參考軟件的實際運行效果是,入會時禁用屏保僅僅是作用于當前登錄的會話,不會保存到系統全局配置里面去的,所以系統重啟后讀取系統全局配置,系統全局配置中是啟用屏保的。

? ? ? ?那我們回過頭來看這個API函數在MSDN上的說明,對比API Monitor中調用SystemParametersInfo函數設置的參數,看看是否有不寫入系統全局配置文件的參數。

對于Windows C++軟件開發人員來說,到微軟MSDN上查看API接口等的詳細說明,是必須要掌握的基礎技能!

? ? ? ?SystemParametersInfo的fWinIni參數,從參數名稱上看好像是和Windows系統配置文件有關,于是查看該參數的說明:

說明中指出,此字段決定是否寫入到系統user profile中。從API Monitor監測到參考軟件調用SystemParametersInfo時給fWinIni參數設置的值為0,綜合參考軟件的實際表現,所以確定fWinIni字段就是設置是否寫入到系統全局配置文件中的。

MSDN上對SystemParametersInfo函數的最后一個參數fWinIni的說明不夠清晰,比較隱晦,我們沒搞清楚其對應的真實含義,通過這次問題我們才結合實際現象才搞懂該參數的真實用途。

? ? ? ?參考軟件在加入會議時調用SystemParametersInfo禁用屏保,給fWinIni參數設置的值為0,那么此次禁止屏保,僅僅是作用于當前登錄的會話,不會保存到系統全局配置里面去的。如果入會后出現崩潰或者強殺進程,沒機會恢復屏保,但當前禁用屏保只作用于當前登錄的會話,系統重啟后系統會從系統配置文件中讀取到屏保啟用的配置項,系統還是能繼續屏保的。所以我們軟件也可以這樣處理的。

? ? ? ?入會時調用SystemParametersInfo函數,傳入SPI_GETSCREENSAVEACTIVE,獲取系統有沒有設置屏保,如果設置了屏保,就再調用SystemParametersInfo函數,傳入SPI_SETSCREENSAVEACTIVE和FALSE參數,臨時取消系統屏保,代碼如下:

// 先獲取是否啟用屏幕保護 SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &m_bScreenSaveActive, 0); if (m_bScreenSaveActive) {// 阻止屏保SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0); }

? ? ? ?退會時,如果之前取消了屏保,則再調用SystemParametersInfo函數,傳入SPI_SETSCREENSAVEACTIVE和TRUE參數,恢復系統屏保,代碼如下:

if (m_bScreenSaveActive) {// 取消阻止屏保SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0); }

4、最后

? ? ? ? 本文通過一個問題實例詳細地說明了API Monitor工具的使用,給大家提供一個借鑒或參考。我們已經使用API Monitor工具解決了項目開發過程中遇到的多個問題,沒用過的朋友可以嘗試著用一下。

? ? ? ?對于本文中講的問題實例,更詳細的內容可以參見我之前寫的一篇文章:

VC++實現會議中阻止屏保、阻止系統自動關閉屏幕、阻止系統待機(附源碼)https://blog.csdn.net/chenlycly/article/details/124526549

API Monitor等工具的下載鏈接如下:

鏈接:https://pan.baidu.com/s/1ID6_0RSYKbiy_tzfYDX3Ew?
提取碼:tn6i

總結

以上是生活随笔為你收集整理的使用API Monitor监测到目标程序对系统API函数的调用(常用分析工具)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。