- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
_Return_type_success_(return != false) bool CEnumerateSerial::UsingCreateFile(_Inout_ CPortsArray& ports)
{
//Reset the output parameter
ports.clear();
//Up to 255 COM ports are supported so we iterate through all of them seeing
//if we can open them or if we fail to open them, get an access denied or general error error.
//Both of these cases indicate that there is a COM port at that number.
for (UINT i=1; i<256; i++)
{
//Form the Raw device name
ATL::CAtlString sPort;
sPort.Format(_T("\\\\.\\COM%u"), i);
//Try to open the port
bool bSuccess = false;
ATL::CHandle port(CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr));
if (port == INVALID_HANDLE_VALUE)
{
const DWORD dwError = GetLastError();
//Check to see if the error was because some other app had the port open or a general failure
if ((dwError == ERROR_ACCESS_DENIED) || (dwError == ERROR_GEN_FAILURE) || (dwError == ERROR_SHARING_VIOLATION) || (dwError == ERROR_SEM_TIMEOUT))
bSuccess = true;
}
else
{
//The port was opened successfully
bSuccess = true;
}
//Add the port number to the array which will be returned
if (bSuccess)
#pragma warning(suppress: 26489)
ports.push_back(i);
}
//Return the success indicator
return true;
}
выглядит как говно
Извините
Вообще-то up to 256.
но... если копнуть глубже окажется, что искаропки поддерживается up to 1024 и расширяемо до 4096, а если забить на "com name arbiter" то ∞
а несчастный примат этот код 23 года вылизывал, а он оказался полной хуйней
Это какая-то станция для дайлап пула в крупном провайдере из 1999-го года?
Старый можно удалить, если сказать show hidden devices
Кто настолько старый, что помнит переменную
Ну там через какое-нибудь setupapi запросить по классу "последовательный порт" или что-то подобное...
Или "change port /QUERY" распарсить, там хотя бы кириллических букв нят.
ебать откуда ты это знаеш
c:\> change logon /disable
на знакомом сервере
https://docs.microsoft.com/en-us/windows-hardware/drivers/serports/external-naming-of-com-ports
собирать под 14-й vc. Под 17-й нужно явно отключать strictString (с ним wbem не собирается, ссаный BSTR виноват) и с unicode строками
Нужно сделать обработку ошибок, и завернуть наверное комы в ATL, но я пьяный
Оно и видно... кто по трезвости полезет ворошить WMI голыми руками...
Заебись, с USB COM девайсами это в принципе не работает, я думаю? У них не меньше 5 и дырки в нумерации, емнип.
сервис может быть отключен
или хуже, настроен неторопливо стартовать, когда ты туда полезешь
или даже еще хуже, не успеть обновить список чтобы туда включить девайс, который ты только что воткнул