IoAttachDevice

操作者通過編程可以生成一個虛擬的設備對象,並“綁定”(Attach)在一個真實的設備上。一旦綁定,則本來作業系統傳送給真實設備的請求,就會首先傳送到這個虛擬設備。同時,在WDK中,有多個核心API能實現綁定功能。

基本介紹

  • 外文名:IoAttachDevice
  • 性質:調用者生成的用來過濾的虛擬設備
  • 特點:有多個核心API能實現綁定功能
  • 函式的原型:NTSTATUS
函式原型,參數,

函式原型

下面是其中一個函式的原型:
NTSTATUS
IoAttachDevice(
IN PDEVICE_OBJECT SourceDevice,
IN PUNICODE_STRING TargetDevice,
OUT PDEVICE_OBJECT *AttachedDevice
);

參數

SourceDevice是調用者生成的用來過濾的虛擬設備;
TargetDevice是要被綁定的目標設備。請注意這裡的TargetDevice並不是一個PDEVICE_OBJECT(DEVICE_OBJECT
是設備對象的數據結構,以P開頭的是其指針),而是一個字元串(在驅動開發中字元串用UNICODE_STRING來表示)。實際上,
這個字元串是要被綁定的設備的名字。Windows中許多設備對象是有名字的,但是並不是所有的設備對象都有名字。必須是有名字
的設備,才能用這個核心API進行綁定。在Windows中,串口設備是有固定名字的。
這裡有一個疑問:假設這個函式綁定一個名字所對應的設備,那么如果這個設備已經被其他的設備綁定了,會怎么樣呢?
如果一個設備被其他設備綁定,它們在一起的一組設備,被稱為設備棧(之所以稱為棧,是由於和請求的傳遞方式有關)。實際上,
IoAttachDevice總是會綁定設備棧上最頂層的那個設備。
AttachedDevice是一個用來返回的指針的指針。綁定成功後,被綁定的設備指針被返回到這個地址。
前面已經提到了並不是所有的設備都有設備名字,所以依靠IoAttachDevice無法綁定沒有名字的設備。另外還有兩個API:一個是
IoAttachDeviceToDeviceStack,另一個是IoAttachDeviceToDeviceStackSafe。這兩個函式功能一樣,都是根據設備對象的
指針(而不是名字)進行綁定;區別是IoAttachDeviceToDeviceStackSafe更加安全,而且只有在Windows 2000SP4和Windows XP
以上的系統中才有。一般都使用IoAttachDeviceToDeviceStackSafe,但當試圖兼容較低版本的Windows 2000時,
應該使用IoAttachDeviceToDeviceStack。
NTSTATUS
IoAttachDeviceToDeviceStackSafe(
IN PDEVICE_OBJECT SourceDevice, // 過濾設備
IN PDEVICE_OBJECT TargetDevice, // 要被綁定的設備棧中的設備
IN OUT PDEVICE_OBJECT *AttachedToDeviceObject// 返回最終被綁定的設備
);
在Window 2000下應該使用另外一個函式IoAttachDeviceToDeviceStack,這個函式除了缺少最後一個參數之外(實際上放到返回值里了),
其他的和IoAttachDeviceToDeviceStackSafe函式相同。
PDEVICE_OBJECT
IoAttachDeviceToDeviceStack(
IN PDEVICE_OBJECT SourceDevice,
IN PDEVICE_OBJECT TargetDevice
);
這個函式返回了最終被綁定的設備指針,這也就導致了它不能返回一個明確的錯誤碼。但是如果為NULL,則表示綁定失敗了。

相關詞條

熱門詞條

聯絡我們