Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июля!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.

Получение списка COM-портов в системе

Следующий код позволит вам получить список COM-портов в системе:
 
 #include <windows.h>
 
 #include <TCHAR.H >
 
 #include <conio.h>
 
 #include <stdio.h>
 
 //------------------------------------------------------------------------------
 
 void EnumerateSerialPorts()
 
   {
 
     // В какой системе работаем?
 
     OSVERSIONINFO osvi;
 
     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 
     BOOL bGetVer = GetVersionEx(&osvi);
 
     // В NT используем API QueryDosDevice
 
     if(bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))
 
       {
 
         // Используем QueryDosDevice для просмотра всех устройств похожих на COMx.
 
        // Это наилучшее решение, так как порты не требуется открывать
 
         TCHAR szDevices[65535];
 
         DWORD dwChars = QueryDosDevice(NULL, szDevices, 65535);
 
         if(dwChars)
 
           {
 
             int i=0;
 
               for (;;)
 
                 {
 
                   // Получаем текущее имя устройства
 
                   TCHAR* pszCurrentDevice = &szDevices[i];
 
                   // Если похоже на "COMX" выводим на экран
 
                   int nLen = _tcslen(pszCurrentDevice);
 
                     if(nLen > 3 && _tcsnicmp(pszCurrentDevice, _T("COM"), 3) == 0)
 
                       {
 
                         printf(pszCurrentDevice);
 
                         printf("\n");
 
                      }
 
                   // Переходим к следующему символу терминатору
 
                   while(szDevices[i] != _T('\0'))
 
                     i++;
 
                   // Перескакиваем на следующую строку
 
                     i++;
 
                   // Список завершается двойным симмволом терминатором, так что если символ
 
                   // NULL, мы дошли до конца
 
                   if(szDevices[i] == _T('\0'))
 
                     break;
 
                 } // for (;;)
 
             } // if(dwChars)
 
       } // if(bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))
 
     else
 
       {
 
         // В 95/98 открываем каждый порт для определения его существования
 
         // Поддерживается до 255 COM портов, так что мы проходим пл всему списку
 
         // Если мы не можем открыть порт, или происходит ошибка при открытии,
 
         // получаем access denied или общую ошибку все эти случаи указывают на
 
         // то, что под таким номером есть порт.
 
         for (UINT i=1; i<256; i++)
 
           {
 
             // Формируем сырое имя устройства
 
             char sPort[10];
 
             sprintf(sPort,"\\\\.\\COM%d", i);
 
             // Пытаемся открыть каждый порт
 
             BOOL bSuccess = FALSE;
 
             HANDLE hPort = ::CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
 
             if(hPort == INVALID_HANDLE_VALUE)
 
               {
 
                 DWORD dwError = GetLastError();
 
                 // Смотрим что получилось при открытии
 
                 if(dwError == ERROR_ACCESS_DENIED || dwError == ERROR_GEN_FAILURE)
 
 bSuccess = TRUE;
 
               }
 
             else
 
               {
 
                 // Порт открыт успешно
 
                 bSuccess = TRUE;
 
                 // Не забываем закрывать каждый открытый порт,
 
                 // так как мы не собираемся с ним работать...
 
                 CloseHandle(hPort);
 
               } // if(hPort == INVALID_HANDLE_VALUE)
 
 
 
             // Выводим на экран название порта
 
             if(bSuccess)
 
               {
 
                 printf(sPort);
 
                 printf("\n");
 
               }
 
           } // for (UINT i=1; i<256; i++)
 
       } // if(bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))
 
   }
 
 //------------------------------------------------------------------------------
 
 int main()
 
   {
 
     EnumerateSerialPorts();
 
     getch();
 
     return 0;
 
   }
 
 //------------------------------------------------------------------------------
 
 
 
 

<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS