/* * Sets up callbacks for device hotplug events. */ ULONG HPRegisterForHotplugEvents(void) { SYS_ThreadCreate(&sHotplugWatcherThread, THREAD_ATTR_DEFAULT, (PCSCLITE_THREAD_FUNCTION( )) HPDeviceNotificationThread, NULL); return 0; }
LONG EHSpawnEventHandler(PREADER_CONTEXT rContext) { LONG rv; DWORD dwStatus = 0; int i; UCHAR ucAtr[MAX_ATR_SIZE]; DWORD dwAtrLen = 0; secdebug("pcscd", "EHSpawnEventHandler: rContext: 0x%p", rContext); rv = IFDStatusICC(rContext, &dwStatus, ucAtr, &dwAtrLen); if (rv != SCARD_S_SUCCESS) { Log2(PCSC_LOG_ERROR, "Initial Check Failed on %s", rContext->lpcReader); return SCARD_F_UNKNOWN_ERROR; } /* * Find an empty reader slot and insert the new reader */ for (i = 0; i < PCSCLITE_MAX_READERS_CONTEXTS; i++) { PCSCD::SharedReaderState *rstmp = PCSCD::SharedReaderState::overlay(readerStates[i]); if (rstmp->xreaderID() == 0) break; } if (i == PCSCLITE_MAX_READERS_CONTEXTS) return SCARD_F_INTERNAL_ERROR; /* * Set all the attributes to this reader */ PCSCD::SharedReaderState *rs = PCSCD::SharedReaderState::overlay(readerStates[i]); rContext->readerState = readerStates[i]; rs->xreaderName(rContext->lpcReader); rs->xcardAtr(ucAtr, dwAtrLen); // also sets cardAtrLength rs->xreaderID(i + 100); rs->xreaderState(dwStatus); rs->sharing(rContext->dwContexts); rs->xcardProtocol(SCARD_PROTOCOL_UNSET); rv = SYS_ThreadCreate(&rContext->pthThread, THREAD_ATTR_DETACHED, (PCSCLITE_THREAD_FUNCTION( ))EHStatusHandlerThread, (LPVOID) rContext); secdebug("pcscd", "EHSpawnEventHandler after thread create: %d [%04X]", rv, rv); if (rv == 1) return SCARD_S_SUCCESS; else return SCARD_E_NO_MEMORY; }
LONG HPSearchHotPluggables(void) { int i; for (i=0; i<PCSCLITE_MAX_READERS_CONTEXTS; i++) { readerTracker[i].status = READER_ABSENT; readerTracker[i].bus_device[0] = '\0'; readerTracker[i].fullName = NULL; } if (HPReadBundleValues()) SYS_ThreadCreate(&usbNotifyThread, THREAD_ATTR_DETACHED, (PCSCLITE_THREAD_FUNCTION( )) HPEstablishUSBNotifications, NULL); return 0; }
LONG HPSearchHotPluggables(void) { int i, j; for (i = 0; i < PCSCLITE_MAX_READERS_CONTEXTS; i++) { bundleTracker[i].productID = 0; bundleTracker[i].manuID = 0; for (j=0; j < PCSCLITE_MAX_READERS_CONTEXTS; j++) bundleTracker[i].deviceNumber[j].id = 0; } HPReadBundleValues(); SYS_ThreadCreate(&usbNotifyThread, THREAD_ATTR_DETACHED, (PCSCLITE_THREAD_FUNCTION( )) HPEstablishUSBNotifications, 0); return 0; }