Advertisement
Week045

Lab2

Oct 9th, 2023 (edited)
1,073
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.08 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "pci_codes.h"
  3. #include "hexioctrl.h"
  4. #include <conio.h>
  5. #include <iomanip>
  6. #include <stdlib.h>
  7. #include <io.h>
  8.  
  9. class Id {
  10. protected:
  11.     unsigned long id;
  12.  
  13. public:
  14.     Id() {
  15.         this->id = -1;
  16.     }
  17.  
  18.     Id(unsigned long id) {
  19.         this->setId(id);
  20.     }
  21.  
  22.     unsigned long getId() {
  23.         return this->id;
  24.     }
  25.  
  26.     void setId(unsigned long id) {
  27.         this->id = id;
  28.     }
  29.  
  30. };
  31.  
  32. class ConfigSpace {
  33. private:
  34.     unsigned long configAddress;
  35.     unsigned long configData;
  36. public:
  37.  
  38.     ConfigSpace() {
  39.         this->configAddress = -1;
  40.         this->configData = -1;
  41.     }
  42.  
  43.     unsigned long getConfigData() {
  44.         return this->configData;
  45.     }
  46.  
  47.     unsigned long getConfigAddress() {
  48.         return this->configAddress;
  49.     }
  50.  
  51.     void calculateConfigAddress(int bus, int device, int function, int reg) {
  52.         unsigned long address = 1;
  53.         address = (address << 15) + bus;         // Номер шины, 8 бит
  54.         address = (address << 5) + device;       // Номер устройства, 5 бит
  55.         address = (address << 3) + function;     // Номер функции, 3 бита
  56.         address = (address << 8) + reg;          // Номер регистра, 8 бит
  57.         this->configAddress = address;
  58.     }
  59.  
  60.     bool calculateConfigData() {
  61.         _outpd(0xCF8, this->configAddress);
  62.         if (configAddress == -1) {
  63.             return false;
  64.         }
  65.         this->configData = _inpd(0xCFC);
  66.         if(this->configData == -1) {
  67.             return false;
  68.         }
  69.         return true;
  70.     }
  71.  
  72. };
  73.  
  74.  
  75. class DeviceId : public Id {
  76. public:
  77.     DeviceId() : Id() {
  78.  
  79.     }
  80.  
  81.     DeviceId(unsigned long id) : Id(id){
  82.    
  83.     }
  84.                
  85.     unsigned long calculateDeviceId(ConfigSpace configSpace) {
  86.         return configSpace.getConfigData() >> 16;
  87.     }
  88. };
  89.  
  90. class VendorId : public Id {
  91. public:
  92.     VendorId() : Id() {
  93.  
  94.     }
  95.    
  96.     VendorId(unsigned long id) : Id(id){
  97.    
  98.     }
  99.  
  100.     unsigned long calculateVendorId(ConfigSpace configSpace, DeviceId deviceID) {
  101.         return configSpace.getConfigData() - (deviceID.getId() << 16);
  102.     }
  103. };
  104.  
  105.  
  106. const int lenght = 150;
  107. class Device {
  108. private:
  109.     DeviceId deviceId;
  110.     VendorId vendorId;
  111.     char chipName[lenght];
  112.     char chipDescName[lenght];
  113.     char producerName[lenght];
  114. public:
  115.     Device() {
  116.         this->chipName[0] = '\0';
  117.         this->chipDescName[0] = '\0';
  118.         this->producerName[0] = '\0';
  119.     }
  120.  
  121.     DeviceId getDeviceId() {
  122.         return this->deviceId;
  123.     }
  124.  
  125.     void setDeviceId(DeviceId deviceId) {
  126.         this->deviceId = deviceId;
  127.     }
  128.  
  129.     VendorId getVendorId() {
  130.         return this->vendorId;
  131.     }
  132.  
  133.     void setVendorId(VendorId vendorId){
  134.         this->vendorId = vendorId;
  135.     }
  136.  
  137.     char* GetChipName() {
  138.         return this->chipName;
  139.     }
  140.  
  141.     char* GetChipDescName() {
  142.         return this->chipDescName;
  143.     }
  144.  
  145.     char* GetProducerName() {
  146.         return this->producerName;
  147.     }
  148.  
  149.     void decodeChipsName() {
  150.         for (int i = 0; i < PCI_DEVTABLE_LEN; i++)
  151.             if (PciDevTable[i].VenId == this->vendorId.getId() && PciDevTable[i].DevId == this->deviceId.getId())
  152.             {
  153.                 strcpy(this->chipName, PciDevTable[i].Chip);
  154.                 this->chipName[strlen(PciDevTable[i].Chip)] = '\0';
  155.                 strcpy(this->chipDescName, PciDevTable[i].ChipDesc);
  156.                 this->chipDescName[strlen(PciDevTable[i].ChipDesc)] = '\0';
  157.                 break;
  158.             }
  159.     }
  160.  
  161.     void decodeProducerName() {
  162.         for (int i = 0; i < PCI_VENTABLE_LEN; i++)
  163.             if (PciVenTable[i].VenId == this->vendorId.getId()) {
  164.                 strcpy(this->producerName, PciVenTable[i].VenFull);
  165.                 break;
  166.             }
  167.     }
  168.  
  169. };
  170.  
  171. void printBar()
  172. {
  173.     printf("-----------------------------------------------------------------------------------------------------------------------\n");
  174.     printf("|  N | VendorID | DeviceID |                          Additional information about the device                          \n");
  175.     printf("-----------------------------------------------------------------------------------------------------------------------\n");
  176. }
  177.  
  178. void printInfo(Device device){
  179.     static int device_count = 0;
  180.     printf("| %2d |   %4x   |   %4x   |", ++device_count, device.getDeviceId().getId(), device.getVendorId().getId());
  181.     if(strcmp(device.GetChipName(), ""))
  182.         printf(" %s, %s", device.GetChipName(), device.GetChipDescName());
  183.     printf("\n|    |          |          |");
  184.     if(strcmp(device.GetProducerName(), ""))
  185.         printf(" Producer: %s", device.GetProducerName());
  186.     printf("\n-----------------------------------------------------------------------------------------------------------------------\n");
  187. }
  188.  
  189.  
  190.  
  191. int main() {
  192.  
  193.     ALLOW_IO_OPERATIONS;
  194.  
  195.     printBar();
  196.  
  197.     for (int bus = 0; bus < 256; bus++)                                 // 8 бит, 2^8 = 256
  198.         for (int dev = 0; dev < 32; dev++)                              // 5 бит, 2^5 = 32
  199.             for (int function = 0; function < 8; function++) {          // 3 бита, 2^3 = 8
  200.                 Device device;
  201.                 ConfigSpace configSpace;
  202.  
  203.                 configSpace.calculateConfigAddress(bus, dev, function, 0x00);
  204.                 if (!configSpace.calculateConfigData()) {
  205.                     break;
  206.                 }
  207.                
  208.                 device.setDeviceId(DeviceId(device.getDeviceId().calculateDeviceId(configSpace)));
  209.                 device.setVendorId(VendorId(device.getVendorId().calculateVendorId(configSpace, device.getDeviceId())));
  210.  
  211.                 device.decodeChipsName();
  212.                 device.decodeProducerName();
  213.  
  214.                 printInfo(device);
  215.             }  
  216.  
  217.     printf("\n\n");
  218.     system("pause");
  219.     return 0;
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement