找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4602|回复: 3

【C】windows驱动 扫描pci总线设备

[复制链接]
发表于 2017-4-22 16:01:55 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 Ayala 于 2017-4-22 17:27 编辑
  1. #include <ntdef.h>
  2. #include <ntddk.h>
  3. char*
  4. fmt1="PCI_COMMON_CONFIG \n\
  5.       USHORT VendorID   :%04X\n\
  6.       USHORT DeviceID   :%04X\n\
  7.       USHORT Command    :%04X\n\
  8.       USHORT Status     :%04X\n\
  9.       UCHAR  RevisionID :%02X\n\
  10.       UCHAR  ProgIf     :%02X\n\
  11.       UCHAR  SubClass   :%02X\n\
  12.       UCHAR  BaseClass  :%02X\n\
  13.       UCHAR  CacheLineSize :%02X\n\
  14.       UCHAR  LatencyTimer  :%02X\n\
  15.       UCHAR  HeaderType    :%02X\n\
  16.       UCHAR  BIST          :%02X\n";
  17. char*
  18. fmt2="\
  19.         ULONG BaseAddresses[6]:\n\
  20.           0   %08X\n\
  21.           1   %08X\n\
  22.           2   %08X\n\
  23.           3   %08X\n\
  24.           4   %08X\n\
  25.           5   %08X\n\
  26.         ULONG Reserved1[2]\n\
  27.         ULONG ROMBaseAddress:\n\
  28.               %08X\n\
  29.         ULONG Reserved2[2]\n\
  30.         UCHAR InterruptLine:\n\
  31.               %02X\n\
  32.         UCHAR InterruptPin\n\
  33.               %02X\n\
  34.         UCHAR MinimumGrant\n\
  35.               %02X\n\
  36.         UCHAR MaximumLatency\n\
  37.               %02X\n\
  38.         ";
  39. #define PCI_COMMON_CONFIG_s1(t) \
  40.         t.VendorID,\
  41.         t.DeviceID,\
  42.         t.Command,\
  43.         t.Status,\
  44.         t.RevisionID,\
  45.         t.ProgIf,\
  46.         t.SubClass,\
  47.         t.BaseClass,\
  48.         t.CacheLineSize,\
  49.         t.LatencyTimer,\
  50.         t.HeaderType,\
  51.         t.BIST
  52. #define PCI_COMMON_CONFIG_s2(t) \
  53.         t.u.type0.BaseAddresses[0],\
  54.         t.u.type0.BaseAddresses[1],\
  55.         t.u.type0.BaseAddresses[2],\
  56.         t.u.type0.BaseAddresses[3],\
  57.         t.u.type0.BaseAddresses[4],\
  58.         t.u.type0.BaseAddresses[5],\
  59.         t.u.type0.ROMBaseAddress,\
  60.         t.u.type0.InterruptLine,\
  61.         t.u.type0.InterruptPin,\
  62.         t.u.type0.MinimumGrant,\
  63.         t.u.type0.MaximumLatency
  64.        
  65. SacnPciConfiguration()
  66. /*
  67.         typedef struct _PCI_SLOT_NUMBER {
  68.            union {
  69.                    struct {
  70.                            ULONG   DeviceNumber:5;
  71.                            ULONG   FunctionNumber:3;
  72.                            ULONG   Reserved:24;
  73.                    } bits;
  74.                    ULONG   AsULONG;
  75.            } u;
  76.         } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;

  77.         typedef struct _PCI_COMMON_CONFIG {
  78.           USHORT VendorID;
  79.           USHORT DeviceID;
  80.           USHORT Command;
  81.           USHORT Status;
  82.           UCHAR  RevisionID;
  83.           UCHAR  ProgIf;
  84.           UCHAR  SubClass;
  85.           UCHAR  BaseClass;
  86.           UCHAR  CacheLineSize;
  87.           UCHAR  LatencyTimer;
  88.           UCHAR  HeaderType;
  89.           UCHAR  BIST;
  90.           union {
  91.                 struct {
  92.                   ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
  93.                   ULONG Reserved1[2];
  94.                   ULONG ROMBaseAddress;
  95.                   ULONG Reserved2[2];
  96.                   UCHAR InterruptLine;
  97.                   UCHAR InterruptPin;
  98.                   UCHAR MinimumGrant;
  99.                   UCHAR MaximumLatency;
  100.                 } type0;
  101.           } u;
  102.           UCHAR  DeviceSpecific[192];
  103.         } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
  104. */
  105. {
  106.     PCI_SLOT_NUMBER     slotData;
  107.     PCI_COMMON_CONFIG   pciData;
  108.     ULONG               pciBus;
  109.     ULONG               slotNumber;
  110.     ULONG               functionNumber;

  111.     ULONG               length;

  112.     slotData.u.AsULONG = 0;

  113.     //
  114.     // Search each PCI bus.
  115.     //

  116.     for (pciBus = 0;pciBus < 256; pciBus++) {

  117.         //
  118.         // Look at each device.
  119.         //

  120.         for (slotNumber = 0;slotNumber < 32;slotNumber++) {

  121.             slotData.u.bits.DeviceNumber = slotNumber;

  122.             //
  123.             // Look at each function.
  124.             //

  125.             for (functionNumber = 0;functionNumber < 8;functionNumber++) {

  126.                 slotData.u.bits.FunctionNumber = functionNumber;
  127.                                         /*
  128.                                 length = HalpPhase0GetPciDataByOffset(
  129.                             pciBus,
  130.                             slotData.u.AsULONG,
  131.                             &pciData.ProgIf,
  132.                             FIELD_OFFSET(PCI_COMMON_CONFIG,ProgIf),
  133.                             sizeof(UCHAR)+sizeof(UCHAR)+sizeof(UCHAR));
  134.                                         */
  135.                 length = HalGetBusDataByOffset (
  136.                             PCIConfiguration,
  137.                             pciBus,
  138.                             slotData.u.AsULONG,
  139.                             &pciData.ProgIf,
  140.                             FIELD_OFFSET(PCI_COMMON_CONFIG,ProgIf),
  141.                             sizeof(UCHAR)+sizeof(UCHAR)+sizeof(UCHAR));
  142.                                 #define DbgP(f,...) DbgPrintEx(DPFLTR_SETUP_ID,DPFLTR_INFO_LEVEL,f,__VA_ARGS__)

  143.                 if (length == 0) {
  144.                                         //DbgP("no more Slots");
  145.                     break;
  146.                 }

  147.                                 switch (pciData.BaseClass)
  148.                                 {
  149.                                         char* s;
  150.                                         case 1://STORAGE
  151.                                                
  152.                                                 switch (pciData.SubClass)
  153.                                                 {
  154.                                                         case 0://SCSI
  155.                                                                 s="SCSI";
  156.                                                                 break;
  157.                                                         case 1://IDE
  158.                                                                 s="IDE";
  159.                                                                 break;
  160.                                                         case 2://FLOPPY
  161.                                                                 s="FLOPPY";
  162.                                                                 break;
  163.                                                         case 3://IPI
  164.                                                                 s="IPI";
  165.                                                                 break;
  166.                                                         case 4://RAID
  167.                                                                 s="RAID";
  168.                                                                 break;
  169.                                                         case 5://???
  170.                                                                 s="???";
  171.                                                                 break;
  172.                                                         case 6://SATA
  173.                                                                 s="SATA";
  174.                                                                 if (pciData.ProgIf) s="SATA_AHCI";
  175.                                                                 break;
  176.                                                         case 7://SAS
  177.                                                                 s="SAS";
  178.                                                                 break;
  179.                                                         case 8://NVME
  180.                                                                 s="NVME";
  181.                                                                 break;
  182.                                                         case 80://OTHER
  183.                                                                 s="OTHER";
  184.                                                                 break;
  185.                                                         default:break;
  186.                                                                 s="????";
  187.                                                 }
  188.                                                 DbgP("\nSTORAGE:%s\n",s);
  189.                                                 length = HalGetBusDataByOffset (
  190.                                                                         PCIConfiguration,
  191.                                                                         pciBus,
  192.                                                                         slotData.u.AsULONG,
  193.                                                                         &pciData,
  194.                                                                         0,
  195.                                                                         sizeof(PCI_COMMON_CONFIG));
  196.                                                 if (length==sizeof(PCI_COMMON_CONFIG))
  197.                                                 {
  198.                                                        
  199.                                                         DbgP(fmt1,PCI_COMMON_CONFIG_s1(pciData));
  200.                                                         DbgP(fmt2,PCI_COMMON_CONFIG_s2(pciData));
  201.                                                 }
  202.                                                 break;
  203.                                         case 0: //PRE_20
  204.                                         case 2: //NETWORK
  205.                                         case 3: //DISPLAY
  206.                                         case 4: //MULTIMEDIA
  207.                                         case 5: //MEMORY
  208.                                         case 6: //BRIDGE
  209.                                         case 7: //COMMUNICATION
  210.                                         case 8: //SYSTEM
  211.                                         case 9: //INPUT
  212.                                         case 0xA : //DOCKING
  213.                                         case 0xB : //PROCESSOR
  214.                                         case 0xC : //SERIAL
  215.                                         case 0xD : //WIRELESS
  216.                                         case 0xE : //INTELLIGENT
  217.                                         case 0xF : //SATELLITE
  218.                                         case 0x10: //CRYPT
  219.                                         case 0x11: //SIGNAL_PROCESSING
  220.                                         case 0xFF: //OTHERS
  221.                                         default:
  222.                                                
  223.                                                 break;
  224.                                 }
  225.                                

  226.             }   // next PCI function


  227.         }   // next PCI slot


  228.     }   // next PCI bus

  229.     return 0;

  230. } // SacnPciConfiguration()



  231. NTSTATUS
  232. DriverEntry(a,b)
  233. {
  234.         SacnPciConfiguration();
  235.         return STATUS_DEVICE_CONFIGURATION_ERROR;
  236. }
复制代码

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2017-5-10 15:01:10 | 显示全部楼层
我看到了SacnPciConfiguration。。
Sacn,应该打错了,是Scan
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2017-5-10 16:04:21 | 显示全部楼层
用了这么久 我自己都没发现
回复 赞! 靠!

使用道具 举报

发表于 2017-12-28 16:17:16 | 显示全部楼层
很好. 正需要. 感谢开源
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 07:00 , Processed in 0.036586 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表