Подскажите, где найти адреса

Тема в разделе "WASM.HARDWARE", создана пользователем c1cl0n, 22 сен 2008.

  1. c1cl0n

    c1cl0n New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2008
    Сообщения:
    2
    Здравствуйте!
    Подскажите пож-то, где в системе Windows хранятся адреса PnP девайсов назначенных системой.
    Пробовал отследить обращения к реестру программы MSInfo32.exe , но безуспешно. А ведь программа
    где-то их берет.
     
  2. Ra_Sh

    Ra_Sh New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2008
    Сообщения:
    46
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum
    стр34, 42... Несвижский 2-е изд
    вот пример оттуда (1_14.cpp)
    Код (Text):
    1. // Определение основных параметров устройств в Windows NT/2000/XP/SR3/Vista
    2.  
    3. #include "stdafx.h"
    4.  
    5. // путь к разделу в реестре, описывающему установленное оборудование
    6. #define HKLM_ENUM_NT  "SYSTEM\\CurrentControlSet\\Enum"
    7. #define MAX_DEVICES 200 // возможное количество устройств в системе
    8.  
    9. // дополнительные флаги
    10. #define PORT_MEMORY 0x0000 // адрес порта в памяти
    11. #define PORT_IO 0x0001 // адрес порта ввода-вывода
    12. #define MEMORY_READ_WRITE 0x0000 // память для записи и чтения
    13. #define MEMORY_READ_ONLY 0x0001 // память только для чтения
    14. #define MEMORY_WRITE_ONLY 0x0002 // память только для записи
    15.  
    16. // тип канала DMA
    17. #define DMA_8 0x0000
    18. #define DMA_16 0x0001
    19. #define DMA_32 0x0002
    20.  
    21. // типы данных
    22. enum DataTypesNT
    23. {
    24.    Port_Type = 1, // адрес порта ввода-вывода
    25.    IRQ_Type = 2, // номер прерывания
    26.    Memory_Type = 3, // адрес в памяти
    27.    DMA_Type = 4, // номер канала DMA
    28.    BusNumber_Type = 6 // номер шины
    29. };
    30.  
    31. // определяем тип значения для хранения адресов
    32. typedef LARGE_INTEGER PHYSICAL_ADDRESS;
    33.  
    34. // определяем структуры для описания данных
    35.  
    36. #pragma pack ( 4 )
    37.  
    38. typedef struct _IDDATA
    39. {
    40.    unsigned char Type; // тип возвращаемых данных
    41.    unsigned char Share; // общий доступ к данным
    42.    unsigned short Flags; // дополнительный флаг описания
    43.    // общая область памяти
    44.    union
    45.    {
    46.       struct // обработка портов ввода-вывода
    47.       {
    48.         PHYSICAL_ADDRESS Start; // базовый адрес
    49.         unsigned long Length; // ширина порта
    50.       } Port;
    51.       struct // обработка номера прерывания
    52.       {
    53.         unsigned long Level; // уровень доступа
    54.         unsigned long Number; // номер выделенного прерывания
    55.         unsigned long Reserved; // резерв
    56.       } IRQ;
    57.       struct // обработка адресов в памяти
    58.       {
    59.         PHYSICAL_ADDRESS Start; // базовый адрес
    60.         unsigned long Length; // ширина адресного пространства
    61.       } Memory;
    62.       struct
    63.       {
    64.         unsigned long Channel; // номер выделенного канала DMA
    65.         unsigned long Port; // номер порта
    66.         unsigned long Reserved; // резерв
    67.       } DMA;
    68.       struct // обработка номера шины
    69.       {
    70.         unsigned long Start; // базовый адрес шины
    71.         unsigned long Length; // ширина адресного пространства
    72.         unsigned long Reserved; // резерв
    73.       } BusNumber;
    74.    } u;
    75. } IDDATA, *PIDDATA;
    76.  
    77. #pragma pack ( )
    78.  
    79. typedef struct _DATA_LIST
    80. {
    81.    unsigned short Version; // номер версии
    82.    unsigned short Revision; // дополнительный номер версии
    83.    unsigned long Count; // полное количество данных об устройстве
    84.    IDDATA Id[16]; // массив структур для получения данных
    85. } DATA_LIST, *PDATA_LIST;
    86.  
    87. typedef struct _DATA_LIST_ALL
    88. {
    89.    DWORD Reserved; // резерв
    90.    unsigned long Reserved2; // резерв
    91.    DATA_LIST DataList; // структура DATA_LIST
    92. } DATA_LIST_ALL, *PDATA_LIST_ALL;
    93.  
    94. typedef struct _DATA
    95. {
    96.    unsigned long Count; // количество найденных описателей устройства
    97.    DATA_LIST_ALL All_List[2]; // массив структур DATA_LIST_ALL
    98. } DATA, *PDATA;
    99.  
    100. // основная структура описателя устройства
    101. typedef struct _DeviceParamNT
    102. {
    103.    char DeviceDesc[100]; // текстовое описание устройства
    104.    char FriendlyName[80]; // дополнительное описание устройства
    105.    char Class[50]; // имя класса устройства
    106.    PHYSICAL_ADDRESS  Base_Memory[16]; // базовые адреса в памяти
    107.    PHYSICAL_ADDRESS  End_Memory[16]; // завершающие адреса в памяти
    108.    unsigned short TypeBaseMemory[16]; // тип адреса в памяти
    109.    PHYSICAL_ADDRESS  Base_Port[16]; // базовый порт ввода-вывода
    110.    PHYSICAL_ADDRESS  End_Port[16]; // завершающий порт ввода-вывода
    111.    unsigned short TypeBasePort[16]; // тип порта ввода-вывода
    112.    BYTE DMA_Channel[8]; // номер выделенного канала DMA
    113.    unsigned short TypeDMA[8]; // тип канала DMA
    114.    BYTE IRQ_Number[16]; // номер выделенного прерывания
    115.    unsigned int BusNumber[8]; // номер шины для некоторых типов устройств
    116. } DEVICEPARAMSNT, *PDEVICEPARAMSNT;
    117.  
    118. // определяем функцию поиска устройств в реестре
    119. void GetDevicesConfig_NT ( );
    120.  
    121. // массив структур DEVICEPARAMSNT для описания устройств
    122. DEVICEPARAMSNT devices_NT[MAX_DEVICES];
    123.  
    124. // реализация функции
    125. void GetDevicesConfig_NT ( )
    126. {
    127.    // объявляем переменные
    128.    HKEY phKey = NULL, phKey2 = NULL, phKey3 = NULL, phKey4 = NULL,
    129.                       phKey5 = NULL; // дескрипторы разделов реестра
    130.    // счетчики разделов и размеры значений параметров в реестре
    131.    DWORD dwKey = 0, dwKey2 = 0, dwKey3 = 0, dwSize = 0, cbName = 256;
    132.    // счетчики данных
    133.    unsigned int uPort_index = 0, uIRQ_index = 0, uMemory_index = 0,
    134.                  uDMA_index = 0, uBus_index = 0;
    135.    // счетчик найденных устройств
    136.    unsigned int uIndex = 0;
    137.    // различные пути в реестре
    138.    char section_name[513];
    139.    char new_path[MAX_PATH];
    140.    char new_path2[MAX_PATH];
    141.    char new_path3[MAX_PATH];
    142.    char new_path4[MAX_PATH];
    143.    char new_path5[MAX_PATH];
    144.    // буфер для данных
    145.    char hard_key[150];
    146.  
    147.    // структура для получения данных об устройстве
    148.    DATA cfg;
    149.  
    150.    // обнуляем структуру перед использованием
    151.    for ( i = 0; i < 200; i++ )
    152.        ZeroMemory ( &devicesNT[i], sizeof ( DEVICEPARAMSNT ) );
    153.  
    154.    // открываем раздел реестра для перечисления подразделов
    155.    if ( !RegOpenKeyEx ( HKEY_LOCAL_MACHINE, HKLM_ENUM_NT, 0, KEY_READ,
    156.                         &phKey ) == ERROR_SUCCESS )
    157.          return;
    158.    while ( 1 )
    159.    {
    160.     // определяем размер значения
    161.     cbName = 256;
    162.     // перечисляем подразделы в открытом разделе
    163.     if ( RegEnumKeyEx ( phKey, dwKey, section_name, &cbName, NULL, NULL,
    164.                         NULL, NULL ) == ERROR_NO_MORE_ITEMS )
    165.        break; // выходим из цикла, если все подразделы получены
    166.      // собираем путь для доступа к вложенному разделу
    167.      strcpy ( new_path, "" );
    168.      strcpy ( new_path, HKLM_ENUM_NT );
    169.      strcat ( new_path, "\\" );
    170.      strcat ( new_path, section_name );
    171.      // открываем вложенный раздел
    172.      if ( RegOpenKeyEx ( HKEY_LOCAL_MACHINE, new_path, 0, KEY_READ,
    173.                          &phKey2 ) == ERROR_SUCCESS )
    174.      {
    175.        // сбрасываем счетчик
    176.        dwKey2 = 0;
    177.        while ( 1 )
    178.        {
    179.          // определяем размер значения
    180.          cbName = 256;
    181.          // перечисляем подразделы в открытом разделе
    182.          if ( RegEnumKeyEx ( phKey2, dwKey2, new_path2, &cbName, NULL,
    183.                              NULL, NULL, NULL ) == ERROR_NO_MORE_ITEMS )
    184.               break; // выходим из цикла, если все подразделы получены
    185.          // собираем путь для доступа к вложенному разделу
    186.          strcpy ( new_path3, "" );
    187.          strcpy ( new_path3, new_path );
    188.          strcat ( new_path3, "\\" );
    189.          strcat ( new_path3, new_path2 );
    190.          // открываем вложенный раздел
    191.          if ( RegOpenKeyEx ( HKEY_LOCAL_MACHINE, new_path3, 0, KEY_READ,
    192.                              &phKey3 ) == ERROR_SUCCESS )
    193.          {
    194.            // сбрасываем счетчик
    195.            dwKey3 = 0;
    196.            while ( 1 )
    197.            {
    198.              // определяем размер значения
    199.              cbName = 256;
    200.              if ( RegEnumKeyEx ( phKey3, dwKey3, new_path4, &cbName,
    201.                         NULL, NULL, NULL, NULL ) == ERROR_NO_MORE_ITEMS )
    202.                   break; // выходим из цикла
    203.              // собираем путь для доступа к вложенному разделу
    204.              strcpy ( new_path5, "" );
    205.              strcpy ( new_path5, new_path3 );
    206.              strcat ( new_path5, "\\" );
    207.              strcat ( new_path5, new_path4 );
    208.              // открываем вложенный раздел
    209.              if(RegOpenKeyEx ( HKEY_LOCAL_MACHINE, new_path5, 0,
    210.                                KEY_READ, &phKey4 ) == ERROR_SUCCESS )
    211.              {
    212.                dwSize = 150; // размер данных
    213.                // получаем описание устройства
    214.                RegQueryValueEx ( phKey4, "DeviceDesc", NULL, NULL,
    215.                                ( LPBYTE ) hard_key, &dwSize );
    216.                // сохраняем в основную структуру
    217.                strcpy ( devicesNT[uIndex].DeviceDesc, hard_key );
    218.                strcpy ( hard_key, "" );
    219.                // получаем имя класса устройства
    220.                dwSize = 50;
    221.                RegQueryValueEx ( phKey4, "Class", NULL, NULL,
    222.                                ( LPBYTE ) hard_key, &dwSize );
    223.                strcpy ( devicesNT[uIndex].Class, hard_key );
    224.                strcpy ( hard_key, "" );
    225.                // получаем дополнительное описание устройства
    226.                dwSize = 80;
    227.                RegQueryValueEx ( phKey4, "FriendlyName", NULL, NULL,
    228.                                ( LPBYTE ) hard_key, &dwSize );
    229.                strcpy ( devicesNT[uIndex].FriendlyName , hard_key );
    230.                strcpy ( hard_key, "" );
    231.                // собираем путь для доступа
    232.                // основным параметрам устройства
    233.                strcat ( new_path5, "\\Control" ); // Windows 2000/XP/SR3
    234.                // strcat ( new_path5, "\\LogConf" ); // Windows NT
    235.                // открываем раздел реестра
    236.                if ( RegOpenKeyEx ( HKEY_LOCAL_MACHINE, new_path5, 0,
    237.                                    KEY_READ, &phKey5 ) == ERROR_SUCCESS )
    238.                {
    239.                  dwSize = sizeof ( DATA ); // определяем размер данных
    240.                  // обнуляем структуру данных
    241.                  ZeroMemory ( &cfg, sizeof ( DATA ) );
    242.                  // получаем данные из реестра
    243.                  RegQueryValueEx ( phKey5, "AllocConfig", NULL, NULL,
    244.                                  ( LPBYTE ) &cfg, &dwSize );
    245.                  // определяем количество описателей устройства
    246.                  for ( int i = 0; i < cfg.Count; i++ )
    247.                  {
    248.                    for ( int j = 0; j < cfg.All_List[i].DataList.Count;
    249.                          j++ )
    250.                    {
    251.                      // определяем тип данных
    252.                      switch ( cfg.All_List[i].DataList.Id[j].Type )
    253.                      {
    254.                      case Port_Type: // порт ввода-вывода
    255.                       // получаем базовый порт
    256.                       devicesNT[uIndex].Base_Port[uPort_index] =
    257.                          cfg.All_List[i].DataList.Id[j].u.Port.Start;
    258.                       // получаем завершающий порт
    259.                       devicesNT[uIndex].End_Port[uPort_index].LowPart =
    260.                      cfg.All_List[i].DataList.Id[j].u.Port.Start.LowPart
    261.                      + cfg.All_List[i].DataList.Id[j].u.Port.Length - 1;
    262.                      // получаем тип порта ввода-вывода
    263.                      if ( cfg.All_List[i].DataList.Id[j].Flags &
    264.                           PORT_MEMORY )
    265.                        devicesNT[uIndex].TypeBasePort[uPort_index] =
    266.                           PORT_MEMORY;
    267.                      else if ( cfg.All_List[i].DataList.Id[j].Flags &
    268.                           PORT_IO )
    269.                        devicesNT[uIndex].TypeBasePort[uPort_index] =
    270.                           PORT_IO;
    271.                      // увеличиваем счетчик
    272.                      uPort_index++;
    273.                       break;
    274.                      case IRQ_Type: // номер прерывания
    275.                        devicesNT[uIndex].IRQ_Number[uIRQ_index] =
    276.                            cfg.All_List[i].DataList.Id[j].u.IRQ.Number;
    277.                        uIRQ_index++;
    278.                         break;
    279.                      case Memory_Type: // адреса в памяти
    280.                        // получаем базовый адрес
    281.                        devicesNT[uIndex].Base_Memory[uMemory_index] =
    282.                           cfg.All_List[i].DataList.Id[j].u.Memory.Start;
    283.                        // получаем завершающий адрес
    284.                       devicesNT[uIndex].End_Memory[uMemory_index].LowPart
    285.                   = cfg.All_List[i].DataList.Id[j].u.Memory.Start.LowPart
    286.                   + cfg.All_List[i].DataList.Id[j].u.Memory.Length - 1;
    287.                        // определяем тип памяти
    288.                        if ( cfg.All_List[i].DataList.Id[j].Flags &
    289.                             MEMORY_READ_WRITE )
    290.                          devicesNT[uIndex].TypeBaseMemory[uPort_index] =
    291.                             MEMORY_READ_WRITE;
    292.                        else if ( cfg.All_List[i].DataList.Id[j].Flags &
    293.                             MEMORY_READ_ONLY )
    294.                          devicesNT[uIndex].TypeBaseMemory[uPort_index] =
    295.                             MEMORY_READ_ONLY;
    296.                          devicesNT[uIndex].TypeBaseMemory[uPort_index] =
    297.                             MEMORY_READ_ONLY;
    298.                          devicesNT[uIndex].TypeBaseMemory[uPort_index] =
    299.                             MEMORY_WRITE_ONLY;
    300.                         uMemory_index++;
    301.                         break;
    302.                        case DMA_Type: // номер канала DMA
    303.                         // получаем номер канала
    304.                         devicesNT[uIndex].DMA_Channel[uDMA_index] =
    305.                             cfg.All_List[i].DataList.Id[j].u.DMA.Channel;
    306.                         // определяем тип канала
    307.                         if ( cfg.All_List[i].DataList.Id[j].Flags &
    308.                              DMA_8 )
    309.                          devicesNT[uIndex].TypeDMA[uPort_index] =  DMA_8;
    310.                         else if ( cfg.All_List[i].DataList.Id[j].Flags &
    311.                              DMA_16 )
    312.                         devicesNT[uIndex].TypeDMA[uPort_index] =  DMA_16;
    313.                         else if ( cfg.All_List[i].DataList.Id[j].Flags &
    314.                              DMA_32 )
    315.                         devicesNT[uIndex].TypeDMA[uPort_index] =  DMA_32;
    316.                         uDMA_index++;
    317.                         break;
    318.                        case BusNumber_Type: // тип шины
    319.                         devicesNT[uIndex].BusNumber[uBus_index] =
    320.                         cfg.All_List[i].DataList.Id[j].u.BusNumber.Start;
    321.                         break;
    322.                      }
    323.                    }
    324.                  }
    325.                  // закрываем раздел и обнуляем счетчики
    326.                  if ( phKey5 ) RegCloseKey ( phKey5 );
    327.                  uPort_index = 0;
    328.                  uIRQ_index = 0;
    329.                  uMemory_index = 0;
    330.                  uDMA_index = 0;
    331.                  uBus_index = 0;
    332.                }
    333.                // закрываем вложенный раздел
    334.                if ( phKey4 ) RegCloseKey ( phKey4 );
    335.                // увеличиваем счетчик найденных устройств
    336.                uIndex++;
    337.              }
    338.              // увеличиваем счетчик для поиска следующего подраздела
    339.              dwKey3++;
    340.            }
    341.            // закрываем вложенный раздел
    342.            if ( phKey3 ) RegCloseKey ( phKey3 );
    343.          }
    344.          // увеличиваем счетчик для поиска следующего подраздела
    345.          dwKey2++;
    346.        }
    347.        // закрываем вложенный раздел
    348.        if ( phKey2 ) RegCloseKey ( phKey2 );
    349.      }
    350.     // увеличиваем счетчик для получения следующего подраздела
    351.     dwKey++;
    352.    }
    353.    // закрываем корневой раздел и выходим из функции
    354.    if ( phKey ) RegCloseKey ( phKey );
    355. }
     
  3. c1cl0n

    c1cl0n New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2008
    Сообщения:
    2
    Спасибо. щас посмотрю ...