日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

2 《Undocumented Windows 2000 Secrets》翻譯 --- 第三章( 四 )


譯注:
在 Windows NT 中,大多數(shù)的 I/O 請求都是用 I/O 請求包( IRP )來表示的 。在多數(shù)情況下,I/O 請求包可以從一個(gè) I/O 系統(tǒng)組件轉(zhuǎn)移到另一組件 。這種設(shè)計(jì)允許單個(gè)應(yīng)用程序線程并行的管理多個(gè) I/O 請求 。IRP 是一種數(shù)據(jù)結(jié)構(gòu),包含描述一個(gè) I/O 請求的完整信息 。
具體的細(xì)節(jié),請參考《 Inside Windows 2000 》的第 9 章 I/O System
typedef struct _UNICODE_STRING
{
WORD Length;
WORD MaximumLength;
PWORD Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
列表 3-5. 一個(gè)普遍存在的 Windows 2000 結(jié)構(gòu): UNICODE_STRING
元素
Windows NT 4.0
Windows 2000
0x00
IRP_MJ_CREATE
IRP_MJ_CREATE
0x01
IRP_MJ_CREATE_NAMED_PIPE
IRP_MJ_CREATE_NAMED_PIPE
0x02
IRP_MJ_CLOSE
IRP_MJ_CLOSE
0x03
IRP_MJ_READ
IRP_MJ_READ
0x04
IRP_MJ_WRITE
IRP_MJ_WRITE
0x05
IRP_MJ_QUERY_INFORMATION
IRP_MJ_QUERY_INFORMATION
0x06
IRP_MJ_SET_INFORMATION
IRP_MJ_SET_INFORMATION
0x07
IRP_MJ_QUERY_EA
IRP_MJ_QUERY_EA
0x08
IRP_MJ_SET_EA
IRP_MJ_SET_EA
0x09
IRP_MJ_FLUSH_BUFFERS
IRP_MJ_FLUSH_BUFFERS
0x0A
IRP_MJ_QUERY_VOLUME_INFORMATION
IRP_MJ_QUERY_VOLUME_INFORAMTION
0x0B
IRP_MJ_SET_VOLUME_INFORMATION
IRP_MJ_SET_VOLUME_INFORMATION
0x0C
IRP_MJ_DirectorY_CONTROL
IRP_MJ_DIRECTORY_CONTROL
0x0D
IRP_MJ_FILE_SYSTEM_CONTROL
IRP_MJ_FILE_SYSTEM_CONTROL
0x0E
IRP_MJ_DEVICE_CONTROL
IRP_MJ_DEVICE_CONTROL
0x0F
IRP_MJ_INTERNAL_DEVICE_CONTROL
IRP_MJ_INTERNAL_DEVICE_CONTROL
0x10
IRP_MJ_SHUTDOWN
IRP_MJ_SHUTDOWN
0x11
IRP_MJ_LOCK_CONTROL
IRP_MJ_LOCK_CONTROL
0x12
IRP_MJ_CLEANUP
IRP_MJ_CLEANUP
0x13
IRP_MJ_CREATE_MAILSLOT
IRP_MJ_CREATE_MAILSLOT
0x14
IRP_MJ_QUERY_SECURITY
IRP_MJ_QUERY_SECURITY
0x15
IRP_MJ_SET_SECURITY
IRP_MJ_SET_SECURITY
0x16
IRP_MJ_QUERY_POWER
IRP_MJ_POWER
0x17
IRP_MJ_SET_POWER
IRP_MJ_SYSTEM_CONTROL
0x18
IRP_MJ_DEVICE_CHANGE
IRP_MJ_DEVICE_CHANGE
0x19
IRP_MJ_QUERY_QUOTA
IRP_MJ_QUERY_QUOTA
0x1A
IRP_MJ_SET_QUOTA
IRP_MJ_SET_QUOTA
0x1B
IRP_MJ_PNP_POWER
IRP_MJ_PNP
表 3-2. 數(shù)組中的每個(gè) I/O 請求包的比較
在 IRP 數(shù)組建立好之后,DriverEntry() 將自己的 CallBack 函數(shù) ----DriverUnload() 寫入驅(qū)動(dòng)程序?qū)ο蠼Y(jié)構(gòu)中,這將允許在運(yùn)行時(shí)卸載該驅(qū)動(dòng)程序 。DriverUnload() 函數(shù)只是簡單的銷毀由 DriverInitialize() 創(chuàng)建的所有對象(即設(shè)備對象和其符號鏈接) 。在此之后,就可安全的將驅(qū)動(dòng)程序從系統(tǒng)中移除 。
每當(dāng)一個(gè)模塊要求驅(qū)動(dòng)程序做出相應(yīng)時(shí),就會(huì)調(diào)用 DriverDispatcher() 函數(shù) 。因?yàn)?,?qū)動(dòng)程序能夠處理多個(gè)設(shè)備,Dispatcher 首先檢查那個(gè)設(shè)備應(yīng)該響應(yīng)該請求 。本書提供的驅(qū)動(dòng)程序骨架僅維護(hù)了一個(gè)設(shè)備,因此,僅需要在初始化時(shí)檢查從 IoCreateDevice() 接受到的設(shè)備對象指針是否一致 。如果一致,DriverDispatcher() 將接收到的 IRP 向前傳遞,給之前的 DriverDispatcher() 函數(shù),隨之傳遞的還有 DriverInitialize() 準(zhǔn)備好的 Device Context。當(dāng)你擴(kuò)展該驅(qū)動(dòng)骨架以管理多個(gè)設(shè)備驅(qū)動(dòng)程序時(shí),你可能需要為每個(gè)設(shè)備編寫?yīng)毩⒌?IRP dispatcher。列表 3-3 中的 DeviceDispatcher() 函數(shù)只是一個(gè)示意性的實(shí)現(xiàn),它僅能識別三種常見的請求: IRP_MJ_CREATE 、 IRP_MJ_CLEANUP 和 IRP_MJ_CLOSE,并通過返回 STATUS_SUCCESS 來表示以處理該請求 。這是使設(shè)備能夠正常打開、關(guān)閉的最小實(shí)現(xiàn)方式,對于其他的請求都將返回一個(gè) STATUS_NOT_IMPLEMENTED。
你可能想知道在 列表 3-3 的 DISCARDABLE FUNCTIONS 一節(jié)中出現(xiàn)的 #pragma alloc_text 的目的 。#pragma 指示符是將命令送往編譯器和鏈接器的有力手段 。alloc_text 命令表示將指定函數(shù)的代碼寫入可執(zhí)行文件的非默認(rèn) section 中 。默認(rèn)情況下,所有程序代碼都位于 .text section。然而,指示符 #pragma alloc_text(INIT,DriverEntry) 將使 DriverEntry() 的代碼保存在一個(gè)新的 section----INIT 中 。驅(qū)動(dòng)加載器可以識別這種指定的 section,并在初始化之后丟掉該 section。DriverEntry() 和它的幫助函數(shù) DriverInitialize() 僅在驅(qū)動(dòng)程序啟動(dòng)時(shí)會(huì)被調(diào)用一次;因此,當(dāng)它們完成自己的工作后,就可安全的將它們從內(nèi)存中移除 。

推薦閱讀