eDosStation/OkReadBadge/OkReadBadge.cpp

135 lines
4.4 KiB
C++
Raw Normal View History

2019-02-07 16:54:34 +01:00
#include "stdafx.h"
#include "OkReadBadge.h"
#pragma comment (lib, "setupapi.lib")
#pragma comment (lib, "hid.lib")
void OkReadBadge::BadgeUnmanaged::GetDeviceUSB(std::wstring vid, std::wstring pid, std::wstring pid2)
{
SP_DEVINFO_DATA deviceInfoData;
DWORD deviceIndex = 0;
deviceInfoData.cbSize = sizeof(deviceInfoData);
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
GUID hid;
HidD_GetHidGuid(&hid);
//buried somewhere deep in the ddk
/*static GUID GUID_DEVINTERFACE_USB_HUB = { 0xf18a0e88, 0xc30c, 0x11d0, {0x88, 0x15, 0x00, 0xa0, 0xc9, 0x06, 0xbe, 0xd8} };
static GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
static GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER = { 0x3abf6f2d, 0x71c4, 0x462a, {0x8a, 0x92, 0x1e, 0x68, 0x61, 0xe6, 0xaf, 0x27} };*/
//get usb device interfaces
HDEVINFO deviceInterfaceSet = SetupDiGetClassDevs(&hid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
DWORD DeviceInstanceIdSize = 500;
DWORD RequiredSize = 0;
WCHAR * DeviceInstanceId = new WCHAR(DeviceInstanceIdSize);
DeviceType = 0;
while (DeviceType == 0 && SetupDiEnumDeviceInfo(deviceInterfaceSet, deviceIndex, &deviceInfoData))
{
deviceInfoData.cbSize = sizeof(deviceInfoData);
ULONG IDSize = 0;
bool rv = CM_Get_Device_ID_Size(&IDSize, deviceInfoData.DevInst, 0);
TCHAR* deviceID = new TCHAR[IDSize];
CM_Get_Device_ID(deviceInfoData.DevInst, deviceID, IDSize, 0);
std::wstring sDeviceID(deviceID);
auto x = sDeviceID.find(vid);
auto y = sDeviceID.find(pid);
auto z = sDeviceID.find(pid2);
if (x < 100 && (y < 100 || z < 100))
{
DWORD deviceInterfaceIndex = 0;
deviceInterfaceData.cbSize = sizeof(deviceInterfaceData);
if (SetupDiEnumDeviceInterfaces(deviceInterfaceSet, &deviceInfoData, &hid, deviceInterfaceIndex, &deviceInterfaceData))
{
deviceInterfaceData.cbSize = sizeof(deviceInterfaceData);
DWORD requiredBufferSize = 0, requiredBufferSize2 = 0;
SetupDiGetDeviceInterfaceDetail(deviceInterfaceSet, &deviceInterfaceData, NULL, 0, &requiredBufferSize, &deviceInfoData);
PSP_INTERFACE_DEVICE_DETAIL_DATA ifdetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(requiredBufferSize);
memset(ifdetail, 0, requiredBufferSize);
ifdetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
int rv = SetupDiGetDeviceInterfaceDetail(deviceInterfaceSet, &deviceInterfaceData, ifdetail, requiredBufferSize, &requiredBufferSize2, &deviceInfoData);
DevicePath = _wcsdup(ifdetail->DevicePath);
if (z < 100) DeviceType = 2; else DeviceType = 1;
free(ifdetail);
deviceInterfaceIndex++;
}
}
deviceIndex++;
}
}
int OkReadBadge::BadgeUnmanaged::read()
{
//const string x ="USB\\VID_076B&PID_5128&MI_00\\6&13A62366&0&0000";
//const wchar_t *devicePath0 = L"\\\\?\\hid#vid_076b&pid_5128&mi_00#7&1ddf3054&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}";
int rv = 0;
//const wchar_t *devicePath1 = L"\\\\?\\hid#vid_076b&pid_5428&mi_00#7&95573f7&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}";
HANDLE HIDfile = CreateFile(DevicePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED, nullptr); //FILE_FLAG_OVERLAPPED|
DWORD err = GetLastError();
if (err != 0) {
//_tprintf(TEXT("unable to obtain read permissions for the HID device, error:\n "));
}
else {
buffer[0] = 0x00; // Feature report 0x0F
bread = 0;
rv = 1;
err = 0;
while (err==0)
{
rv = ReadFile(HIDfile, buffer, 100, &bread, Overlapped);
if (rv == 0)
{
err = GetLastError();
if (err == ERROR_IO_PENDING)
{
do {
rv = GetOverlappedResultEx(HIDfile, Overlapped, &bread, 5000, false);
if (rv == 0) err = GetLastError(); else err = 0;
} while (err == WAIT_TIMEOUT);
if (err == 0) {
// Ok
Message(0,(LPARAM)this);
}
else {
//Probleem
Message(err, (LPARAM)this);
}
}
else {
//1784 = bad buffer
Message(err, (LPARAM)this);
}
}
else {
//Ok
Message(0, (LPARAM)this);
}
}
}
CloseHandle(HIDfile);
return 0;
}
OkReadBadge::BadgeUnmanaged::BadgeUnmanaged(BadgeMessageHandler^ clr)
{
m_clr = clr;
Overlapped = new OVERLAPPED();
memset(Overlapped, 0, sizeof(OVERLAPPED));
Overlapped->Offset = 0;
Overlapped->hEvent = CreateEvent(nullptr, true, false, nullptr);
buffer[100];
memset(buffer, 0, sizeof(buffer));
buffer[0] = 0x00; // Feature report 0x0F
bread = 0;
GetDeviceUSB(L"VID_076B", L"PID_5428", L"PID_5128");
}