今天移植以前用DriverWorks編寫的一個(gè)驅(qū)動(dòng)到x64平臺(tái)上,編譯時(shí)沒有什么問題,但鏈接的時(shí)候發(fā)現(xiàn)無法找到KPciConfiguration::Enumerate,經(jīng)過一段時(shí)間的探索,找到了一種臨時(shí)解決方案。
由于
KPciConfiguration
的構(gòu)造函數(shù)中也使用了這個(gè)函數(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的文檔中的確提到這個(gè)函數(shù)是過時(shí)的,建議使用即插即用 (PnP) 管理器的 IRP_MN_START_DEVICE 請(qǐng)求來獲取這些資源,在中文知識(shí)庫中還可以找到一個(gè)例子:http://support.microsoft.com/?scid=kb;zh-cn;253232。在網(wǎng)上還找到另一個(gè)英文的例子http://www.hollistech.com/Resources/Misc%20articles/getbusdata.doc。
不過要全部改寫代碼,擔(dān)心時(shí)間不夠,所以想到另外一個(gè)臨時(shí)解決方案,在x64下HalGetBusDataByOffset仍然是支持的,所以利用HalGetBusDataByOffset代替HalGetBusData,暫時(shí)修改函數(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í)的,不推薦使用的函數(shù),將來有時(shí)間還是按照微軟的建議將程序徹底改寫。
posted on 2006-07-09 16:32
zealsoft 閱讀(856)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
驅(qū)動(dòng)開發(fā)