• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 27,  comments - 68,  trackbacks - 0
            今天移植以前用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ā)

            <2009年1月>
            28293031123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(13)

            隨筆分類(28)

            隨筆檔案(27)

            搜索

            •  

            積分與排名

            • 積分 - 58078
            • 排名 - 396

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            99热精品久久只有精品| 久久亚洲欧美日本精品| 久久亚洲中文字幕精品一区| 日韩久久久久中文字幕人妻| 999久久久无码国产精品| 亚洲精品99久久久久中文字幕| 久久国产亚洲精品麻豆| 亚洲va久久久噜噜噜久久| 久久久久久国产a免费观看不卡| 亚洲午夜无码AV毛片久久| 久久人人妻人人爽人人爽| 久久亚洲精品无码AV红樱桃| 久久亚洲国产成人影院网站| 波多野结衣AV无码久久一区| 久久亚洲国产精品123区| 国产产无码乱码精品久久鸭| 欧美丰满熟妇BBB久久久| 美女久久久久久| 丰满少妇人妻久久久久久4| 日日噜噜夜夜狠狠久久丁香五月| 日本久久久久久久久久| 亚洲狠狠综合久久| 久久久久久国产精品免费免费| 国产精品久久久久影视不卡| 亚洲精品乱码久久久久久 | 久久久国产精品福利免费| 久久夜色精品国产亚洲| 久久99精品久久久大学生| 久久久久亚洲av无码专区 | 狠狠狠色丁香婷婷综合久久俺| 久久天天躁狠狠躁夜夜avapp| 久久精品无码一区二区三区免费 | 国内精品久久久久影院网站| 一级做a爱片久久毛片| 国产精品一区二区久久| 久久亚洲欧美国产精品| 久久亚洲精品无码AV红樱桃| 国产精品久久久久久久久免费 | 亚洲级αV无码毛片久久精品 | 久久男人中文字幕资源站| 伊人久久大香线蕉AV一区二区|