今天移植以前用DriverWorks編寫的一個驅動到x64平臺上,編譯時沒有什么問題,但鏈接的時候發現無法找到KPciConfiguration::Enumerate,經過一段時間的探索,找到了一種臨時解決方案。
由于
KPciConfiguration
的構造函數中也使用了這個函數,而且程序中大量使用了KPciConfiguration類,這意味著要大量修改代碼,真是頭痛
檢查DriverWorks的源程序
Kpcicfg.cpp
后發現,在
AMD64
模式下,KPciConfiguration::Enumerate函數是不被編譯的:
#if?!?_WDM_
#if?!(defined(_IA64_)?||?defined(_AMD64_))

BOOLEAN?KPciConfiguration::Enumerate(
????KPciSlot&?slot,
????PUSHORT?VendorId,
????PUSHORT?DeviceId)


{
????ULONG?status;
????UCHAR?headtype;


????struct?
{
????????USHORT?VendorID;
????????USHORT?DeviceID;
????}?slotdata;


????if?(?(slot.Slot()?!=?0xffffffff)?||?(slot.Bus()?!=?0)?)

????
{
????????//?determine?if?the?current?slot?is?single?function?device
????????status?=?HalGetBusDataByOffset(
????????????PCIConfiguration,
????????????slot.Bus(),
????????????slot.Slot(),
????????????&headtype,
????????????HeaderOffset(HeaderType),
????????????1);

????????if?(?(slot.Function()?==?0)?&&
?????????????(status?!=?0)?&&
?????????????(status?!=?2)?&&
?????????????((headtype?&?0x80)==0)?)?//?bit?7?of?header?type?is?1?for?multi

????????
{
????????????slot.IncrementDevice();
????????}
????????else

????????
{
????????????slot.Increment();
????????}
????}
????else

????
{
????????slot.Increment();
????}

????while?(TRUE)

????
{
????????status?=?HalGetBusData(PCIConfiguration,?slot.Bus(),?slot.Slot(),?&slotdata,?4);
????????
????????if?(status?==?0)

????????
{
????????????if?(?slot.Bus()?==?255?)

????????????
{
????????????????return?FALSE;
????????????}
????????????else

????????????
{
????????????????slot.IncrementBus();
????????????}
????????????continue;
????????}
????????else?if?(status?==?2)

????????
{
????????????slot.Increment();
????????????continue;
????????}
????????else

????????
{
????????????*VendorId?=?slotdata.VendorID;
????????????*DeviceId?=?slotdata.DeviceID;
????????????return?TRUE;
????????}
????}
}

#endif

如果去掉#if語句強行編譯,發現原來是因為HalGetBusData函數不被x64支持,所以不能編譯成功。在MSDN的文檔中的確提到這個函數是過時的,建議使用即插即用 (PnP) 管理器的 IRP_MN_START_DEVICE 請求來獲取這些資源,在中文知識庫中還可以找到一個例子:http://support.microsoft.com/?scid=kb;zh-cn;253232。在網上還找到另一個英文的例子http://www.hollistech.com/Resources/Misc%20articles/getbusdata.doc。
不過要全部改寫代碼,擔心時間不夠,所以想到另外一個臨時解決方案,在x64下HalGetBusDataByOffset仍然是支持的,所以利用HalGetBusDataByOffset代替HalGetBusData,暫時修改函數如下:
#if?!?_WDM_
//#if?!(defined(_IA64_)?||?defined(_AMD64_))

BOOLEAN?KPciConfiguration::Enumerate(
????KPciSlot&?slot,
????PUSHORT?VendorId,
????PUSHORT?DeviceId)


{
????ULONG?status;
????UCHAR?headtype;


????struct?
{
????????USHORT?VendorID;
????????USHORT?DeviceID;
????}?slotdata;


????if?(?(slot.Slot()?!=?0xffffffff)?||?(slot.Bus()?!=?0)?)

????
{
????????//?determine?if?the?current?slot?is?single?function?device
????????status?=?HalGetBusDataByOffset(
????????????PCIConfiguration,
????????????slot.Bus(),
????????????slot.Slot(),
????????????&headtype,
????????????HeaderOffset(HeaderType),
????????????1);

????????if?(?(slot.Function()?==?0)?&&
?????????????(status?!=?0)?&&
?????????????(status?!=?2)?&&
?????????????((headtype?&?0x80)==0)?)?//?bit?7?of?header?type?is?1?for?multi

????????
{
????????????slot.IncrementDevice();
????????}
????????else

????????
{
????????????slot.Increment();
????????}
????}
????else

????
{
????????slot.Increment();
????}

????while?(TRUE)

????
{
//????????status?=?HalGetBusData(PCIConfiguration,?slot.Bus(),?slot.Slot(),?&slotdata,?4);
????????status?=?HalGetBusDataByOffset(PCIConfiguration,?slot.Bus(),?slot.Slot(),?&slotdata,?0,?4);
????????
????????if?(status?==?0)

????????
{
????????????if?(?slot.Bus()?==?255?)

????????????
{
????????????????return?FALSE;
????????????}
????????????else

????????????
{
????????????????slot.IncrementBus();
????????????}
????????????continue;
????????}
????????else?if?(status?==?2)

????????
{
????????????slot.Increment();
????????????continue;
????????}
????????else

????????
{
????????????*VendorId?=?slotdata.VendorID;
????????????*DeviceId?=?slotdata.DeviceID;
????????????return?TRUE;
????????}
????}
}

//#endif
?
目前從測試的結果來看,這樣做是可以運行的。但是
HalGetBusDataByOffset
也是過時的,不推薦使用的函數,將來有時間還是按照微軟的建議將程序徹底改寫。
posted on 2006-07-09 16:32
zealsoft 閱讀(848)
評論(0) 編輯 收藏 引用 所屬分類:
驅動開發