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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Windows资源监视器软件的原理

發布時間:2024/8/26 综合教程 35 生活家
生活随笔 收集整理的這篇文章主要介紹了 Windows资源监视器软件的原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

微軟給我們提供了一些很好的程序,比如資源監視器,可以從這個軟件里獲取分析windows的自身的一些性能數據,比如CPU、內存、磁盤數據、文件讀寫、進程線程等,他具體怎么實現呢,今天這天文章就帶你去獲取其真實的原理。

1.分析

打開windows任務欄管理器,在其性能選項里,可以看到性能監控的一些機器性能圖表

這個只是一些概要數據,如果要看詳細的內容,可以點擊左下角的“打開資源監視器”,會自己開啟一個進程perfmon.exe的進程,這個進程界面會顯示詳細的資源信息

我們可以看到每個進程打開了什么文件、讀寫了什么磁盤數據、以及訪問了什么網絡的IP都有詳細的信息,這個進程既沒有文件過濾驅動也沒有網絡驅動他是如何實現去獲取這些詳細的信息呢,下面我們來具體分析下。

打開這個軟件所在的目錄,可以看到一些對應的perfmon.exe 、perfnet.dll、perfDisk.dll、perfos.dll、perfpro.dll進程和模塊

用IDA打開perfmon.exe看看其進程一些函數

也只是一些UI相關的函數,說明核心功能并不在這里exe里 ,在繼續換一個,用IDA打開perdisk.dll這個模塊

模塊里有一些比較明顯的函數CollectDiskObjectData、CollectPDiskObjectData、CollectLDiskObjectData等函數,選擇一個函數用windbg調試器去下斷點

當第一放過運行時,調試器立馬就停了下來,看堆棧區域

大概是這樣的

#RetAddr:ArgstoChild:CallSite
0000007ffc`2d132060:ffffffff`feced30000000000`0000001000000000`0000001400000000`00000000:perfdisk!CollectDiskObjectData
0100007ffc`2d1316b5:00000000`00007f8800000000`0000000000000000`0000000000000000`00000000:ADVAPI32!QueryExtensibleData+0x540
0200007ffc`29a92a99:0000021e`67749c6600000000`000602ff000000fc`368ff72800007ffc`ffffffff:ADVAPI32!PerfRegQueryValue+0x325
0300007ffc`29a9204d:ffffffff`80000004000000fc`368ff7a40000021e`6b4904f0000000fc`368ff820:KERNELBASE!MapPredefinedHandleInternal+0x8e9
0400007ffc`25f063ec:ffffffff`800000040000021e`6b4904900000021e`00008000000000fc`368ff7a4:KERNELBASE!RegQueryValueExW+0xed
0500007ffc`25f056ad:0000021e`6b4904900000021e`6ad74c1000000000`0000800000000000`00000000:pdh!GetSystemPerfData+0x9c
0600007ffc`25f054c9:01d2e6b6`135f9140000000fc`368ff8b800000000`0000000001d2e673`053c5140:pdh!GetQueryPerfData+0xcd
0700007ffc`01548566:00000000`0000000000000000`0000000300000000`0000000000000000`000002b0:pdh!PdhCollectQueryData+0x59
0800007ffc`2ad58364:0000021e`6adc1b0000000000`0000000000000000`0000000000000000`00000000:wdc!WdcTraceControl::QueryThread+0x1a6
0900007ffc`2d2370d1:00000000`0000000000000000`0000000000000000`0000000000000000`00000000:KERNEL32!BaseThreadInitThunk+0x14
0a00000000`00000000:00000000`0000000000000000`0000000000000000`0000000000000000`00000000:ntdll!RtlUserThreadStart+0x21

堆棧看該函數被調用是從wdc!WdcTraceControl::QueryThread這個函數過來的,看樣子是一個單獨的數據線程,是wdc.dll這個模塊里的函數,繼續用IDA打開wdc這個模塊。

查看WdcTraceControl::QueryThread這個函數實現,確實調用了一些監控實例的Query方法,這里我們可以確認wc.dll這個模塊是核心功能所在的模塊,現在可以分析下是怎么開啟這個線程的,開啟前做了哪些工作。

發現只有一處調用,就是WdcTraceControl::Start函數調用了這個函數開啟線程

繼續往上翻閱WdcTraceControl::Start函數實現

有一個WdcTraceControl::TraceStart函數,進入該函數

發現該函數調用OpenTrace、StartTrace、EnableTraceEx、processTrace這些函數,從EnableTraceEx的參數ThreadPoolGuid、PsProvGuid、DiskProvGuid、FileProvGuid、NetProvGuid可以判斷這些函數就是核心功能,查看微軟的CSDN終于發現了秘密,原來這些函數是微軟事件診斷函數(ETW),其中OpenTrace的里的有一個參數是事件的回掉接收函數,我們看到的WdcTraceControl::CallbackEvent這個函數就是,下個斷點,確實斷了下來

就是WdcTraceControl::TraceThread線程中的ProcessTrace函數處理獲取了內核日志數據然后調用了設置的回調函數WdcTraceControl::CallbackEvent去處理,為了進一步驗證,翻閱該回調函數的實現

可以知道里面處理了各種過來的數據包括網絡、磁盤、cpu、內存、線程、進程日志信息,去寫個demo實例驗證我們的結果。

2.代碼demo

#include"stdafx.h"
#defineINITGUID//Includethis#definetouseSystemTraceControlGuidinEvntrace.h.
#include<Windows.h>
#include<wmistr.h>
#include<evntrace.h>
#include<evntcons.h>
#include<strsafe.h>
#pragmacomment(lib,"Advapi32.lib")
#defineLOGFILE_PATHL"kernellogfile.etl"
#defineETL_FILEL"G:\OpenSource\GitHub\WindowsSDK7-Samples\winbase\Eventing\EtwConsumer\Output\16.pdf.etl"
#define__REAL_TIME_MODE
/*不同類型的GUID,從MSDN手冊中找,固定的*/
DEFINE_GUID(/*3d6fa8d0-fe05-11d0-9dda-00c04fd7ba7c*/
ProcessGuid,
0x3d6fa8d0,
0xfe05,
0x11d0,
0x9d,0xda,0x00,0xc0,0x4f,0xd7,0xba,0x7c
);
ULONGWINAPIBufferCallback(__inPEVENT_TRACE_LOGFILELogFile)
{
printf("BufferCallback!
");
returnTRUE;
}
/*可以調用SetTraceCallback設置單獨事件GUID的回調函數,即使如此,EventCallback仍然會收到所有的事件*/
VOIDWINAPIEventRecordCallback(__inPEVENT_RECORDEvent)
{
if(IsEqualGUID(Event->EventHeader.ProviderId,ProcessGuid))
{
/*需要解析數據格式*/
printf("EventRecordCallbackProcessGuid!
");
}
printf("EventRecordCallback!
");
}
VOIDWINAPIEventCallback(PEVENT_TRACEpEvent)
{
printf("EventCallback!
");
}
VOIDEventConsumer()
{
TRACEHANDLEhTrace=NULL;
EVENT_TRACE_LOGFILEtraceFile;
#ifdef__REAL_TIME_MODE
traceFile.LogFileName=NULL;
traceFile.LoggerName=KERNEL_LOGGER_NAME;
traceFile.ProcessTraceMode=PROCESS_TRACE_MODE_REAL_TIME|PROCESS_TRACE_MODE_EVENT_RECORD;
#else
traceFile.LogFileName=ETL_FILE;
traceFile.LoggerName=NULL;
traceFile.ProcessTraceMode=PROCESS_TRACE_MODE_EVENT_RECORD;
#endif
traceFile.BufferCallback=BufferCallback;
traceFile.EventCallback=EventCallback;
if(traceFile.ProcessTraceMode&PROCESS_TRACE_MODE_EVENT_RECORD)
traceFile.EventRecordCallback=EventRecordCallback;
traceFile.Context=NULL;
hTrace=OpenTrace(&traceFile);
if(hTrace==(TRACEHANDLE)INVALID_HANDLE_VALUE||hTrace==0x0)
return;
ULONGstatus=ProcessTrace(&hTrace,1,NULL,NULL);
}
voidEventController(void)
{
ULONGstatus=ERROR_SUCCESS;
TRACEHANDLESessionHandle=0;
EVENT_TRACE_PROPERTIES*pSessionProperties=NULL;
ULONGBufferSize=0;
BufferSize=sizeof(EVENT_TRACE_PROPERTIES)+sizeof(KERNEL_LOGGER_NAME)+sizeof(LOGFILE_PATH);
pSessionProperties=(EVENT_TRACE_PROPERTIES*)malloc(BufferSize);
if(NULL==pSessionProperties)
{
wprintf(L"Unabletoallocate%dbytesforpropertiesstructure.
",BufferSize);
gotocleanup;
}
ZeroMemory(pSessionProperties,BufferSize);
pSessionProperties->Wnode.BufferSize=BufferSize;
pSessionProperties->Wnode.Flags=WNODE_FLAG_TRACED_GUID;
pSessionProperties->Wnode.ClientContext=1;//QPCclockresolution
pSessionProperties->Wnode.Guid=SystemTraceControlGuid;
pSessionProperties->EnableFlags=EVENT_TRACE_FLAG_PROCESS;//關注事件
#ifdef__REAL_TIME_MODE
pSessionProperties->LogFileMode=EVENT_TRACE_REAL_TIME_MODE;//EVENT_TRACE_USE_PAGED_MEMORY該標識在win7上會導致失敗
#else
pSessionProperties->LogFileMode=EVENT_TRACE_FILE_MODE_CIRCULAR;
#endif
pSessionProperties->MaximumFileSize=5;//5MB
pSessionProperties->LoggerNameOffset=sizeof(EVENT_TRACE_PROPERTIES);
pSessionProperties->LogFileNameOffset=sizeof(EVENT_TRACE_PROPERTIES)+sizeof(KERNEL_LOGGER_NAME);
#ifndef__REAL_TIME_MODE//也可在RealTime模式下開啟,但是沒必要RealTime都記錄到文件
StringCbCopy((LPWSTR)((char*)pSessionProperties+pSessionProperties->LogFileNameOffset),sizeof(LOGFILE_PATH),LOGFILE_PATH);
#endif
status=StartTrace((PTRACEHANDLE)&SessionHandle,KERNEL_LOGGER_NAME,pSessionProperties);
if(ERROR_SUCCESS!=status)
{
if(ERROR_ALREADY_EXISTS==status)
wprintf(L"TheNTKernelLoggersessionisalreadyinuse.
");
else
wprintf(L"EnableTrace()failedwith%lu
",status);
gotocleanup;
}
EventConsumer();
wprintf(L"Pressanykeytoendtracesession");
getchar();
cleanup:
if(SessionHandle)
{
status=ControlTrace(SessionHandle,KERNEL_LOGGER_NAME,pSessionProperties,EVENT_TRACE_CONTROL_STOP);
if(ERROR_SUCCESS!=status)
wprintf(L"ControlTrace(stop)failedwith%lu
",status);
}
else
{
/*開啟會話后,若不關閉,即使進程退出,依然會保持開啟狀態,單獨關閉可使用如下方式*/
status=ControlTrace(NULL,KERNEL_LOGGER_NAME,pSessionProperties,EVENT_TRACE_CONTROL_STOP);
if(ERROR_SUCCESS!=status)
wprintf(L"ControlTrace(stop)failedwith%lu
",status);
}
if(pSessionProperties)
free(pSessionProperties);
}
int_tmain(intargc,_TCHAR*argv[])
{
EventController();
//EventConsumer();
while(true)
{
Sleep(300000);
}
return0;
}

運行后,當有數據來時就會進入我們設置的回調函數

此處我們大概知道了該軟件的實現原理,剩下具體的對數據的內容的解析不再繼續贅述,讀者可以自行去研究,從這篇文章里我們知道了微軟提供了一套內核事件診斷的函數方便我們去分析系統一些的性能,我們不光可以用這些函數去分析診斷系統,我們可以充分利用這些函數去實現一些我們想要的功能,大家可以自行去發揮。

轉自:https://bbs.pediy.com/thread-218627.htm

總結

以上是生活随笔為你收集整理的Windows资源监视器软件的原理的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 视频一区 国产 | 极品新婚夜少妇真紧 | 欧美一级爱爱 | 末路1997全集免费观看完整版 | 日韩乱论 | 久久久久网 | 黄色a在线 | 男人插女人下面视频 | 懂色av蜜臀av粉嫩av分享吧 | 老师的肉丝玉足夹茎 | 韩国性经典xxxxhd | 无遮挡的裸体按摩的视频 | 秋霞福利 | 日本色悠悠 | 久久av一区二区三区漫画 | 天堂在线中文8 | 蜜臀人妻四季av一区二区不卡 | 国产妇女馒头高清泬20p多 | 欧美大胆a视频 | 制服丝袜av在线 | 四虎av影院 | 亚洲av无码一区二区三区在线播放 | 国产片在线 | 成人av动漫| 欧美区二区三区 | 久久久久99精品成人片毛片 | 琪琪五月天 | 成人污污视频在线观看 | 加勒比av在线播放 | 女人下面喷水视频 | 永久在线 | 亚洲一区二区黄片 | 免费观看国产精品 | 欧美特级一级片 | 亚洲一区中文字幕在线观看 | 国产午夜视频 | 九色91在线| 美女久久 | 色中色综合网 | 风流僵尸艳片a级 | 欧美一级三级 | 天天躁狠狠躁狠狠躁夜夜躁68 | 枫可怜av | 成人免费不卡视频 | 国产欧美久久一区二区三区 | 影音先锋在线观看视频 | 大奶在线播放 | 非洲黄色片 | 亚洲第9页 | 久久老熟女一区二区三区 | 婷婷色在线观看 | 精品无码av在线 | av最新版天堂资源在线 | 国产ts人妖系列高潮 | 国产精品综合久久久久久 | 黑丝久久 | 在线欧美a | 喷水少妇 | wwwxx在线 | 色狠狠av | 亚洲免费一级片 | 精品久久久无码中文字幕 | 亚洲国产一区二区a毛片 | 99热这里是精品 | 欧美888| 精久久久久 | 无码人妻aⅴ一区二区三区69岛 | 亚洲热av| 男人操女人下面视频 | 日韩午夜网站 | 99riav国产 | 国产综合色视频 | 成人免费毛片日本片视频 | 中文字幕制服诱惑 | www.嫩草.com| www在线观看国产 | 337p日本大胆噜噜噜鲁 | 农村激情伦hxvideos | 97国产在线视频 | 亚洲风情av | 一区视频在线免费观看 | 欧美三级在线视频 | 天天亚洲 | 女人被狂躁c到高潮 | 亚洲在线综合 | 日日操夜夜草 | av在线资源网 | 福利91 | 亚洲视频在线网 | 嫩草嫩草嫩草嫩草嫩草 | 色射综合 | 五月天亚洲色图 | av一区三区 | 欧美国产在线一区 | 麻豆91在线播放 | 美女日日日 | 黄色国产一级 | jizz毛片 | va婷婷在线免费观看 |