久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

DO_DEVICE_INITIALIZING 到底有什么用?

 iceberg_horn 2009-10-30

DO_DEVICE_INITIALIZING 到底有什么用?

當設(shè)備驅(qū)動程序通過調(diào)用 IoCreateDevice 創(chuàng)建設(shè)備對象時,,I/O 管理器在 DEVICE_OBJECT 結(jié)構(gòu)的 Flags 字段中設(shè)置 DO_DEVICE_INITIALIZING。DO_DEVICE_INITIALIZING 的目的是防止其它組件在驅(qū)動程序完成初始化設(shè)備對象之前向設(shè)備發(fā)送 I/O,。

每次打開設(shè)備的一個句柄時,,以及任何時候驅(qū)動程序試圖附加到一個設(shè)備堆棧時(檢查堆棧頂部設(shè)備對象的這個標志),I/O 管理器都檢查 DO_DEVICE_INITIALIZING,。如果設(shè)置 DO_DEVICE_INITIALIZING,,那么 I/O 管理器將不允許另一個組件使用諸如 CreateFileOpenFileIoGetDeviceObjectPointer 之類的函數(shù)通過名稱打開設(shè)備,。DO_DEVICE_INITIALIZING 不會阻止驅(qū)動程序接收即插即用請求或來自堆棧中高層驅(qū)動程序的請求,,它僅僅防止組件打開設(shè)備。

對于驅(qū)動程序在其 DriverEntry 例程中創(chuàng)建的任何設(shè)備對象,,由 I/O 管理器負責清除 DO_DEVICE_INITIALIZING,。對于除 DriverEntry 之外的任何例程中創(chuàng)建的任何設(shè)備對象,,由驅(qū)動程序負責清除 DO_DEVICE_INITIALIZING。

傳統(tǒng)驅(qū)動程序(例如為 Windows NT 4 編寫的非即插即用驅(qū)動程序)在 DriverEntry 中創(chuàng)建它們的設(shè)備對象,。即插即用驅(qū)動程序通常在 AddDevice 中創(chuàng)建它們的設(shè)備對象,,但是即插即用驅(qū)動程序可能在 DriverEntry 中創(chuàng)建控制設(shè)備對象(例如,公開自己的設(shè)備接口或者支持某個應(yīng)用程序可以打開的獨占堆棧中的設(shè)備),。(驅(qū)動程序不把控制設(shè)備對象報告給即插即用或者將它們附加到設(shè)備堆棧,。)

驅(qū)動程序負責從例程(驅(qū)動程序在其中創(chuàng)建設(shè)備對象)返回之前準備接收 I/O 請求。對于不同類型的驅(qū)動程序,,涉及的步驟有所不同;對于即插即用驅(qū)動程序,,步驟通常包括將設(shè)備的 PDO 指針存儲到設(shè)備擴展中,、定義標志來跟蹤設(shè)備的即插即用狀態(tài)、設(shè)置電源管理標志以及創(chuàng)建或初始化軟件資源(例如驅(qū)動程序用來管理其設(shè)備的事件和自旋鎖),。驅(qū)動程序還可以注冊設(shè)備接口或創(chuàng)建一個或多個到其設(shè)備的符號鏈接,。

對于在 DriverEntry 中創(chuàng)建的設(shè)備對象,I/O 管理器允許 DriverEntry 一返回就打開設(shè)備,。對于即插即用驅(qū)動程序,,驅(qū)動程序堆棧必須在 I/O 管理器允許打開設(shè)備之前成功完成一個啟動請求 (IRP_MN_START_DEVICE)。雖然即插即用驅(qū)動程序可能需要在 AddDevice 和啟動請求之間處理一些來自堆棧中其它驅(qū)動程序的請求(例如,,存儲端口驅(qū)動程序必須在此時間間隔內(nèi)處理 SRB_FUNCTION_CLAIM_DEVICE),,但是驅(qū)動程序在設(shè)備被啟動之前不接收任何創(chuàng)建請求或基于文件對象的 I/O 請求。從驅(qū)動程序清除此標志到即插即用管理器啟動設(shè)備的時間,,驅(qū)動程序不需要針對 IRP_MJ_CREATE 或基于文件句柄傳入的 I/O 請求進行同步,。

下列代碼是一個簡化的 AddDevice 例程的例子(基于 Windows DDK 中的 Toaster 示例)。(已經(jīng)從這個例子中刪除錯誤檢查和初始化設(shè)備擴展的代碼,。完整的代碼請參見 %winddk%\src\general\toaster\func\featured1\ 上的 Toaster 功能驅(qū)動程序示例),。

NTSTATUS ToasterAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject ) { NTSTATUS                status = STATUS_SUCCESS; PDEVICE_OBJECT          deviceObject = NULL; PFDO_DATA               fdoData; POWER_STATE             powerState;
PAGED_CODE();
// Create a function device object. status = IoCreateDevice (DriverObject, sizeof (FDO_DATA), NULL,  // No Name FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &deviceObject);
// Code to initialize the device extension.
// Attach driver to the device stack. fdoData->NextLowerDriver = IoAttachDeviceToDeviceStack (deviceObject, PhysicalDeviceObject);
// Clear the DO_DEVICE_INITIALIZING flag.// Note:Do not clear this flag until the driver has set the // device power state and the power DO flags. //
deviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
return status; }

您應(yīng)該做什么?

清除驅(qū)動程序在除 DriverEntry 之外的例程(例如即插即用驅(qū)動程序的 AddDevice 例程)中創(chuàng)建的任何設(shè)備對象的 DO_DEVICE_INITIALIZING 標志,。

在初始化設(shè)備對象之后到從例程返回之前清除 DO_DEVICE_INITIALIZING,。

更多信息:

Windows DDK
設(shè)備對象和設(shè)備堆棧
編寫 DriverEntry 例程
編寫 AddDevice 例程


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多