| 2679 |
int WINAPI DetectComPorts(LPWORD ComPortTable, int ComPortMax, char **ComPortDesc) |
int WINAPI DetectComPorts(LPWORD ComPortTable, int ComPortMax, char **ComPortDesc) |
| 2680 |
{ |
{ |
| 2681 |
HMODULE h; |
HMODULE h; |
| 2682 |
TCHAR devicesBuff[65535]; |
char *devicesBuff; |
| 2683 |
TCHAR *p; |
char *p; |
| 2684 |
int comports = 0; |
int comports = 0; |
| 2685 |
int i, j, min; |
int i, j, min; |
| 2686 |
WORD s; |
WORD s; |
| 2687 |
|
size_t buf_size = 65535; |
| 2688 |
|
|
| 2689 |
|
devicesBuff = malloc(buf_size); |
| 2690 |
|
if (devicesBuff == NULL) { |
| 2691 |
|
return 0; |
| 2692 |
|
} |
| 2693 |
|
|
| 2694 |
if (((h = GetModuleHandle("kernel32.dll")) != NULL) && |
if (((h = GetModuleHandle("kernel32.dll")) != NULL) && |
| 2695 |
(GetProcAddress(h, "QueryDosDeviceA") != NULL) && |
(GetProcAddress(h, "QueryDosDeviceA") != NULL) && |
| 2696 |
(QueryDosDevice(NULL, devicesBuff, 65535) != 0)) { |
(QueryDosDevice(NULL, devicesBuff, buf_size) != 0)) { |
| 2697 |
p = devicesBuff; |
p = devicesBuff; |
| 2698 |
while (*p != '\0') { |
while (*p != '\0') { |
| 2699 |
if (strncmp(p, "COM", 3) == 0 && p[3] != '\0') { |
if (strncmp(p, "COM", 3) == 0 && p[3] != '\0') { |
| 2734 |
#endif |
#endif |
| 2735 |
} |
} |
| 2736 |
|
|
| 2737 |
|
free(devicesBuff); |
| 2738 |
|
|
| 2739 |
ListupSerialPort(ComPortTable, comports, ComPortDesc, ComPortMax); |
ListupSerialPort(ComPortTable, comports, ComPortDesc, ComPortMax); |
| 2740 |
|
|
| 2741 |
return comports; |
return comports; |
| 2744 |
int WINAPI CheckComPort(WORD ComPort) |
int WINAPI CheckComPort(WORD ComPort) |
| 2745 |
{ |
{ |
| 2746 |
HMODULE h; |
HMODULE h; |
| 2747 |
TCHAR devicesBuff[65535]; |
char *devicesBuff; |
| 2748 |
char com_str[64]; |
char com_str[64]; |
| 2749 |
BOOL bRet; |
BOOL bRet; |
| 2750 |
GUID ClassGuid[1]; |
GUID ClassGuid[1]; |
| 2752 |
HDEVINFO DeviceInfoSet = NULL; |
HDEVINFO DeviceInfoSet = NULL; |
| 2753 |
SP_DEVINFO_DATA DeviceInfoData; |
SP_DEVINFO_DATA DeviceInfoData; |
| 2754 |
int found = 0; |
int found = 0; |
| 2755 |
|
size_t buf_size = 65535; |
| 2756 |
|
|
| 2757 |
_snprintf_s(com_str, sizeof(com_str), _TRUNCATE, "COM%d", ComPort); |
_snprintf_s(com_str, sizeof(com_str), _TRUNCATE, "COM%d", ComPort); |
| 2758 |
|
|
| 2761 |
return -1; |
return -1; |
| 2762 |
} |
} |
| 2763 |
|
|
| 2764 |
if (QueryDosDevice(com_str, devicesBuff, 65535) == 0) { |
devicesBuff = malloc(buf_size); |
| 2765 |
|
if (devicesBuff == NULL) { |
| 2766 |
|
return -1; |
| 2767 |
|
} |
| 2768 |
|
|
| 2769 |
|
if (QueryDosDevice(com_str, devicesBuff, buf_size) == 0) { |
| 2770 |
DWORD err = GetLastError(); |
DWORD err = GetLastError(); |
| 2771 |
|
free(devicesBuff); |
| 2772 |
if (err == ERROR_FILE_NOT_FOUND) { |
if (err == ERROR_FILE_NOT_FOUND) { |
| 2773 |
/* NOT FOUND */ |
/* NOT FOUND */ |
| 2774 |
return 0; |
return 0; |
| 2780 |
/* QueryDosDeviceで切断を検知できない環境があるでさらにチェック */ |
/* QueryDosDeviceで切断を検知できない環境があるでさらにチェック */ |
| 2781 |
bRet = SetupDiClassGuidsFromName(_T("PORTS"), (LPGUID) & ClassGuid, 1, &dwRequiredSize); |
bRet = SetupDiClassGuidsFromName(_T("PORTS"), (LPGUID) & ClassGuid, 1, &dwRequiredSize); |
| 2782 |
if (bRet == FALSE) { |
if (bRet == FALSE) { |
| 2783 |
|
free(devicesBuff); |
| 2784 |
return -1; |
return -1; |
| 2785 |
} |
} |
| 2786 |
|
|
| 2787 |
DeviceInfoSet = SetupDiGetClassDevs(&ClassGuid[0], NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE); |
DeviceInfoSet = SetupDiGetClassDevs(&ClassGuid[0], NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE); |
| 2788 |
if (DeviceInfoSet == NULL) { |
if (DeviceInfoSet == NULL) { |
| 2789 |
|
free(devicesBuff); |
| 2790 |
return -1; |
return -1; |
| 2791 |
} |
} |
| 2792 |
|
|
| 2816 |
|
|
| 2817 |
SetupDiDestroyDeviceInfoList(DeviceInfoSet); |
SetupDiDestroyDeviceInfoList(DeviceInfoSet); |
| 2818 |
|
|
| 2819 |
|
free(devicesBuff); |
| 2820 |
return found; |
return found; |
| 2821 |
} |
} |
| 2822 |
|
|