static unsigned mapCoordsToScreen(DISPLAYFBINFO *pInfos, unsigned cInfos, int *px, int *py, int *pw, int *ph) { DISPLAYFBINFO *pInfo = pInfos; unsigned uScreenId; Log9(("mapCoordsToScreen: %d,%d %dx%d\n", *px, *py, *pw, *ph)); for (uScreenId = 0; uScreenId < cInfos; uScreenId++, pInfo++) { Log9((" [%d] %d,%d %dx%d\n", uScreenId, pInfo->xOrigin, pInfo->yOrigin, pInfo->w, pInfo->h)); if ( (pInfo->xOrigin <= *px && *px < pInfo->xOrigin + (int)pInfo->w) && (pInfo->yOrigin <= *py && *py < pInfo->yOrigin + (int)pInfo->h)) { /* The rectangle belongs to the screen. Correct coordinates. */ *px -= pInfo->xOrigin; *py -= pInfo->yOrigin; Log9((" -> %d,%d", *px, *py)); break; } } if (uScreenId == cInfos) { /* Map to primary screen. */ uScreenId = 0; } Log9((" scr %d\n", uScreenId)); return uScreenId; }
RESPONSECODE IFDHSetCapabilities (DWORD Lun, DWORD Tag, DWORD Length, PUCHAR Value) { Log9(PCSC_LOG_DEBUG, "IFDHSetCapabilities not supported (Lun=%u Tag=%u Length=%u Value=%p)%s%s%s%s", (unsigned int) Lun, (unsigned int) Tag, (unsigned int) Length, (unsigned char *) Value, "", "", "", ""); return IFD_NOT_SUPPORTED; }
RESPONSECODE IFDHSetProtocolParameters (DWORD Lun, DWORD Protocol, UCHAR Flags, UCHAR PTS1, UCHAR PTS2, UCHAR PTS3) { Log9(PCSC_LOG_DEBUG, "Ignoring IFDHSetProtocolParameters (Lun=%u Protocol=%u Flags=%u PTS1=%u PTS2=%u PTS3=%u)%s%s", (unsigned int) Lun, (unsigned int) Protocol, (unsigned char) Flags, (unsigned char) PTS1, (unsigned char) PTS2, (unsigned char) PTS3, "", ""); return IFD_SUCCESS; }
RESPONSECODE IFDHControl (DWORD Lun, DWORD dwControlCode, PUCHAR TxBuffer, DWORD TxLength, PUCHAR RxBuffer, DWORD RxLength, LPDWORD pdwBytesReturned) { Log9(PCSC_LOG_DEBUG, "IFDHControl not supported (Lun=%u ControlCode=%u TxBuffer=%p TxLength=%u RxBuffer=%p RxLength=%u pBytesReturned=%p)%s", (unsigned int) Lun, (unsigned int) dwControlCode, (unsigned char *) TxBuffer, (unsigned int) TxLength, (unsigned char *) RxBuffer, (unsigned int) RxLength, (unsigned int *) pdwBytesReturned, ""); return IFD_ERROR_NOT_SUPPORTED; }
RESPONSECODE IFDHControl(DWORD Lun, PUCHAR TxBuffer, DWORD TxLength, PUCHAR RxBuffer, PDWORD RxLength) { Log9(PCSC_LOG_DEBUG, "IFDHControl not supported (Lun=%u%s TxBuffer=%p TxLength=%u RxBuffer=%p RxLength=%u%s)%s", (unsigned int) Lun, "", (unsigned char *) TxBuffer, (unsigned int) TxLength, (unsigned char *) RxBuffer, (unsigned int) RxLength, "", ""); return IFD_ERROR_NOT_SUPPORTED; }
static void vbvaRgnDirtyRect(VBVADIRTYREGION *prgn, unsigned uScreenId, VBVACMDHDR *phdr) { Log9(("x = %d, y = %d, w = %d, h = %d\n", phdr->x, phdr->y, phdr->w, phdr->h)); /* * Here update rectangles are accumulated to form an update area. */ /** @todo * Now the simplest method is used which builds one rectangle that * includes all update areas. A bit more advanced method can be * employed here. The method should be fast however. */ if (phdr->w == 0 || phdr->h == 0) { /* Empty rectangle. */ return; } int32_t xRight = phdr->x + phdr->w; int32_t yBottom = phdr->y + phdr->h; RTRECT *pDirtyRect = &prgn->aDirtyRects[uScreenId]; DISPLAYFBINFO *pFBInfo = &prgn->paFramebuffers[uScreenId]; if (pDirtyRect->xRight == 0) { /* This is the first rectangle to be added. */ pDirtyRect->xLeft = phdr->x; pDirtyRect->yTop = phdr->y; pDirtyRect->xRight = xRight; pDirtyRect->yBottom = yBottom; } else { /* Adjust region coordinates. */ if (pDirtyRect->xLeft > phdr->x) { pDirtyRect->xLeft = phdr->x; } if (pDirtyRect->yTop > phdr->y) { pDirtyRect->yTop = phdr->y; } if (pDirtyRect->xRight < xRight) { pDirtyRect->xRight = xRight; } if (pDirtyRect->yBottom < yBottom) { pDirtyRect->yBottom = yBottom; } } if (pFBInfo->fDefaultFormat) { //@todo pfnUpdateDisplayRect must take the vram offset parameter for the framebuffer prgn->pPort->pfnUpdateDisplayRect(prgn->pPort, phdr->x, phdr->y, phdr->w, phdr->h); prgn->pDisplay->i_handleDisplayUpdate(uScreenId, phdr->x, phdr->y, phdr->w, phdr->h); } return; }
RESPONSECODE IFDHGetCapabilities (DWORD Lun, DWORD Tag, PDWORD Length, PUCHAR Value) { unsigned char *atr = NULL; ssize_t size; size_t slot = Lun & 0xffff; RESPONSECODE r = IFD_COMMUNICATION_ERROR; if (slot >= vicc_max_slots) goto err; if (!Length || !Value) goto err; switch (Tag) { case TAG_IFD_ATR: size = vicc_getatr(ctx[slot], &atr); if (size < 0) { Log1(PCSC_LOG_ERROR, "could not get ATR"); goto err; } if (size == 0) { Log1(PCSC_LOG_ERROR, "Virtual ICC removed"); goto err; } Log2(PCSC_LOG_DEBUG, "Got ATR (%d bytes)", size); #ifndef __APPLE__ if (*Length < size) { #else /* Apple's new SmartCardServices on OS X 10.10 doesn't set the * length correctly so we only check for the maximum */ if (MAX_ATR_SIZE < size) { #endif free(atr); Log1(PCSC_LOG_ERROR, "Not enough memory for ATR"); goto err; } memcpy(Value, atr, size); *Length = size; free(atr); break; case TAG_IFD_SLOTS_NUMBER: if (*Length < 1) { Log1(PCSC_LOG_ERROR, "Invalid input data"); goto err; } *Value = vicc_max_slots; *Length = 1; break; case TAG_IFD_THREAD_SAFE: if (*Length < 1) { Log1(PCSC_LOG_ERROR, "Invalid input data"); goto err; } /* We are not thread safe due to * the global hostname and ctx */ *Value = 0; *Length = 1; break; case TAG_IFD_SLOT_THREAD_SAFE: if (*Length < 1) { Log1(PCSC_LOG_ERROR, "Invalid input data"); goto err; } /* driver supports access to multiple slots of the same reader at * the same time */ *Value = 1; *Length = 1; break; default: Log2(PCSC_LOG_DEBUG, "unknown tag %d", (int)Tag); r = IFD_ERROR_TAG; goto err; } r = IFD_SUCCESS; err: if (r != IFD_SUCCESS && Length) *Length = 0; return r; } RESPONSECODE IFDHSetCapabilities (DWORD Lun, DWORD Tag, DWORD Length, PUCHAR Value) { Log9(PCSC_LOG_DEBUG, "IFDHSetCapabilities not supported (Lun=%u Tag=%u Length=%u Value=%p)%s%s%s%s", (unsigned int) Lun, (unsigned int) Tag, (unsigned int) Length, (unsigned char *) Value, "", "", "", ""); return IFD_NOT_SUPPORTED; }
/** * @brief parse an ATR * * @param[out] psExtension * @param[in] pucAtr ATR * @param[in] dwLength ATR length * @return */ short ATRDecodeAtr(PSMARTCARD_EXTENSION psExtension, const unsigned char *pucAtr, DWORD dwLength) { USHORT p; UCHAR K, TCK; /* MSN of T0/Check Sum */ UCHAR Y1i, T; /* MSN/LSN of TDi */ int i = 1; /* value of the index in TAi, TBi, etc. */ /* * Zero out everything */ p = K = TCK = Y1i = T = 0; #ifdef ATR_DEBUG if (dwLength > 0) LogXxd(PCSC_LOG_DEBUG, "ATR: ", pucAtr, dwLength); #endif if (dwLength < 2) return 0; /** @retval 0 Atr must have TS and T0 */ /* * Zero out the bitmasks */ psExtension->CardCapabilities.AvailableProtocols = SCARD_PROTOCOL_UNDEFINED; psExtension->CardCapabilities.CurrentProtocol = SCARD_PROTOCOL_UNDEFINED; /* * Decode the TS byte */ if (pucAtr[0] == 0x3F) { /* Inverse convention used */ psExtension->CardCapabilities.Convention = SCARD_CONVENTION_INVERSE; } else if (pucAtr[0] == 0x3B) { /* Direct convention used */ psExtension->CardCapabilities.Convention = SCARD_CONVENTION_DIRECT; } else { memset(psExtension, 0x00, sizeof(SMARTCARD_EXTENSION)); return 0; /** @retval 0 Unable to decode TS byte */ } /* * Here comes the platform dependant stuff */ /* * Decode the T0 byte */ Y1i = pucAtr[1] >> 4; /* Get the MSN in Y1 */ K = pucAtr[1] & 0x0F; /* Get the LSN in K */ p = 2; #ifdef ATR_DEBUG Log4(PCSC_LOG_DEBUG, "Conv: %02X, Y1: %02X, K: %02X", psExtension->CardCapabilities.Convention, Y1i, K); #endif /* * Examine Y1 */ do { short TAi, TBi, TCi, TDi; /* Interface characters */ TAi = (Y1i & 0x01) ? pucAtr[p++] : -1; TBi = (Y1i & 0x02) ? pucAtr[p++] : -1; TCi = (Y1i & 0x04) ? pucAtr[p++] : -1; TDi = (Y1i & 0x08) ? pucAtr[p++] : -1; #ifdef ATR_DEBUG Log9(PCSC_LOG_DEBUG, "TA%d: %02X, TB%d: %02X, TC%d: %02X, TD%d: %02X", i, TAi, i, TBi, i, TCi, i, TDi); #endif /* * Examine TDi to determine protocol and more */ if (TDi >= 0) { Y1i = TDi >> 4; /* Get the MSN in Y1 */ T = TDi & 0x0F; /* Get the LSN in K */ /* * Set the current protocol TD1 (first TD only) */ if (psExtension->CardCapabilities.CurrentProtocol == SCARD_PROTOCOL_UNDEFINED) { switch (T) { case 0: psExtension->CardCapabilities.CurrentProtocol = SCARD_PROTOCOL_T0; break; case 1: psExtension->CardCapabilities.CurrentProtocol = SCARD_PROTOCOL_T1; break; default: return 0; /** @retval 0 Unable to decode LNS */ } } #ifdef ATR_DEBUG Log2(PCSC_LOG_DEBUG, "T=%d Protocol Found", T); #endif if (0 == T) { psExtension->CardCapabilities.AvailableProtocols |= SCARD_PROTOCOL_T0; } else if (1 == T) { psExtension->CardCapabilities.AvailableProtocols |= SCARD_PROTOCOL_T1; } else if (15 == T) { psExtension->CardCapabilities.AvailableProtocols |= SCARD_PROTOCOL_T15; } else { /* * Do nothing for now since other protocols are not * supported at this time */ } } else Y1i = 0; /* test presence of TA2 */ if ((2 == i) && (TAi >= 0)) { T = TAi & 0x0F; #ifdef ATR_DEBUG Log2(PCSC_LOG_DEBUG, "Specific mode: T=%d", T); #endif switch (T) { case 0: psExtension->CardCapabilities.CurrentProtocol = psExtension->CardCapabilities.AvailableProtocols = SCARD_PROTOCOL_T0; break; case 1: psExtension->CardCapabilities.CurrentProtocol = psExtension->CardCapabilities.AvailableProtocols = SCARD_PROTOCOL_T1; break; default: return 0; /** @retval 0 Unable do decode T protocol */ } } if (p > MAX_ATR_SIZE) { memset(psExtension, 0x00, sizeof(SMARTCARD_EXTENSION)); return 0; /** @retval 0 Maximum attribute size */ } /* next interface characters index */ i++; }