日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > 綜合技術 > Pnp管理器(1)

Pnp管理器(1)

來源:程序員人生   發(fā)布時間:2016-07-13 10:42:36 閱讀次數(shù):3738次

    之前寫過1篇Pnp管理器的文章,感覺寫的有點浮淺,因此打算另起1篇寫Pnp管理器。Pnp管理器是個大的組件:從內(nèi)核到用戶態(tài)都有觸及,因此需要分若干篇章分析。本篇立足于Pnp管理器中連接各個模塊之間消息流。

    系統(tǒng)引導進程中會初始化IO管理器,由IO管理器調(diào)用PnpInit對Pnp管理器進行初始化。跟Pnp消息相干的有兩處:

NTSTATUS INIT_FUNCTION IopInitPlugPlayEvents(VOID) { InitializeListHead(&IopPnpEventQueueHead); KeInitializeEvent(&IopPnpNotifyEvent, SynchronizationEvent, FALSE); return STATUS_SUCCESS; }
初始化Pnp消息隊列和用于同步Pnp管理器間各個模塊的事件。從這段代碼可以大致看出Pnp管理器屬于生產(chǎn)者-消費者模型:內(nèi)核把裝備相干的動態(tài)信息加入到IopPnpEventQueueHead隊列中,然后通知其他模塊取走消息并處理。

    內(nèi)核中用樹結構來管理裝備,在PnpInit中IopRootDriverObject驅動創(chuàng)建1個Pdo作為全部裝備樹的根對象,當有新裝備加入時,就加到連在根裝備對象各個總線下,同時產(chǎn)生通知消息。根裝備也是裝備,所以在PnpInit中,IopRootDriverObject驅動創(chuàng)建Pdo的同時也向才創(chuàng)建不久的IopPnpEventQueueHead隊列插入1條消息(第1條消息),通知內(nèi)核有新裝備加入,固然,現(xiàn)在還沒組件處理這些消息。

IopQueueTargetDeviceEvent(&GUID_DEVICE_ARRIVAL, &IopRootDeviceNode->InstancePath);
    隨著初始化進程的推動,IO管理器終究會創(chuàng)建1個內(nèi)核線程,循環(huán)往復的處理IopPnpEventQueueHead中排隊的消息:

hThread = CreateThread(NULL, 0, PnpEventThread, NULL, 0, &dwThreadId);

static DWORD WINAPI PnpEventThread(LPVOID lpParameter) { for (;;) { /* Wait for the next pnp event */ //這是個等待操作,等待PnpEvent有信號 Status = NtGetPlugPlayEvent(0, 0, PnpEvent, PnpEventSize); if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_ARRIVAL, &RpcStatus)) { InterlockedPushEntrySList(&DeviceInstallListHead, &Params->ListEntry); #else InsertTailList(&DeviceInstallListHead, &Params->ListEntry); #endif SetEvent(hDeviceInstallListNotEmpty); }
}

    NtGetPlugPlayEvent函數(shù)是個無窮等待函數(shù),直到IopPnpNotifyEvent有事件,才從IopPnpEventQueueHead隊列中取出1個元素。Pnp管理器的目的是為裝備對象加載驅動,因此當線程從阻塞中返回到PnpEventThread中,PnpEventThread就取得裝備信息,然后通知Pnp管理器其他組件部份準備安裝驅動

    誰會觸發(fā)IopPnpNotifyEvent事件?搜索對IopPnpNotifyEvent的調(diào)用會發(fā)現(xiàn)IopActionInterrogateDeviceStack函數(shù)會間接觸發(fā)IopPnpNotifyEvent事件。

NTSTATUS IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, PVOID Context) { /* Report the device to the user-mode pnp manager */ IopQueueTargetDeviceEvent(&GUID_DEVICE_ARRIVAL, &DeviceNode->InstancePath); }
    每當總線裝備枚舉到到有新裝備加入系統(tǒng)就會IoSynchronousInvalidateDeviceRelations,通知Pnp管理器原來的裝備樹產(chǎn)生變動,期間調(diào)用IopActionInterrogateDeviceStack使得總線上已有的裝備重新取得裝備信息(DeviceID,Resource等,這像是1個社區(qū)人員產(chǎn)生了變動,要通知社區(qū)中所有社員1樣),變更裝備信息后調(diào)用IopQueueTargetDeviceEvent準備為裝備加載驅動~


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲精品成人 | 正在播放av| 日韩国产中文字幕 | 国产精品国产三级国产专播品爱网 | 成人性生交大片免费看中文 | 国产精品久久久久国产a级 中文字幕影院 | 国产午夜一区二区三区 | 国产婷婷综合网 | 国产在线小视频 | 天堂а在线中文在线无限看推荐 | 精品久久久中文字幕 | 免费av看 | 亚洲精品久久久久久久久久久久久 | 国产精品成人免费 | 成人精品一区二区三区中文字幕 | 黄色免费av| 日产精品久久久 | 激情自拍网| 日本不卡免费新一二三区 | 久久久精品亚洲 | 日日噜噜夜夜狠狠 | 欧美在线免费视频 | 五月综合久久 | 伊人99 | 91色在线视频| 国产成人精品一区 | 最色网站| 欧美日韩综合久久久 | 中文字幕综合在线 | 91精品久久久久久久久99绯色 | 国产午夜久久 | 日韩av电影在线免费观看 | 国产视频一区在线播放 | 欧美日韩国产一区二区三区 | 中文字幕av亚洲精品一部二部 | 91精品国产99久久久久久红楼 | 国产精品视频一区二区三区, | 91精品网| 高清不卡一区二区三区 | 男女超级黄aaa大片免费 | 国产精品久久久久久模特 |