今天移植以前用DriverWorks編寫的一個驅(qū)動到x64平臺上,編譯時沒有什么問題,但鏈接的時候發(fā)現(xiàn)無法找到KPciConfiguration::Enumerate,經(jīng)過一段時間的探索,找到了一種臨時解決方案。
由于
KPciConfiguration
的構(gòu)造函數(shù)中也使用了這個函數(shù),而且程序中大量使用了KPciConfiguration類,這意味著要大量修改代碼,真是頭痛
檢查DriverWorks的源程序
Kpcicfg.cpp
后發(fā)現(xiàn),在
AMD64
模式下,KPciConfiguration::Enumerate函數(shù)是不被編譯的:
#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語句強(qiáng)行編譯,發(fā)現(xiàn)原來是因?yàn)?/span>HalGetBusData函數(shù)不被x64支持,所以不能編譯成功。在MSDN的文檔中的確提到這個函數(shù)是過時的,建議使用即插即用 (PnP) 管理器的 IRP_MN_START_DEVICE 請求來獲取這些資源,在中文知識庫中還可以找到一個例子:http://support.microsoft.com/?scid=kb;zh-cn;253232。在網(wǎng)上還找到另一個英文的例子http://www.hollistech.com/Resources/Misc%20articles/getbusdata.doc。
不過要全部改寫代碼,擔(dān)心時間不夠,所以想到另外一個臨時解決方案,在x64下HalGetBusDataByOffset仍然是支持的,所以利用HalGetBusDataByOffset代替HalGetBusData,暫時修改函數(shù)如下:
#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
?
目前從測試的結(jié)果來看,這樣做是可以運(yùn)行的。但是
HalGetBusDataByOffset
也是過時的,不推薦使用的函數(shù),將來有時間還是按照微軟的建議將程序徹底改寫。
posted on 2006-07-09 16:32
zealsoft 閱讀(855)
評論(0) 編輯 收藏 引用 所屬分類:
驅(qū)動開發(fā)