回头吧,回到 EHSpawnEventHandler 177行,接着往下看。
184 /* 185 * Find an empty reader slot and insert the new reader 186 */ 187 for (i = 0; i < PCSCLITE_MAX_READERS_CONTEXTS; i++) 188 { 189 if ((readerStates[i])->readerID == 0) 190 break; 191 } 192 193 if (i == PCSCLITE_MAX_READERS_CONTEXTS) 194 return SCARD_F_INTERNAL_ERROR; 195 196 /* 197 * Set all the attributes to this reader 198 */ 199 rContext->readerState = readerStates[i]; 200 (void)strlcpy(rContext->readerState->readerName, rContext->lpcReader, 201 sizeof(rContext->readerState->readerName)); 202 memcpy(rContext->readerState->cardAtr, ucAtr, dwAtrLen); 203 rContext->readerState->readerID = i + 100; 204 rContext->readerState->readerState = dwStatus; 205 rContext->readerState->readerSharing = rContext->dwContexts; 206 rContext->readerState->cardAtrLength = dwAtrLen; 207 rContext->readerState->cardProtocol = SCARD_PROTOCOL_UNDEFINED; 208 209 rContext->pthCardEvent = card_event; 210 rv = SYS_ThreadCreate(&rContext->pthThread, 0, 211 (PCSCLITE_THREAD_FUNCTION( ))EHStatusHandlerThread, (LPVOID) rContext); 212 if (rv) 213 { 214 Log2(PCSC_LOG_ERROR, "SYS_ThreadCreate failed: %s", strerror(rv)); 215 return SCARD_E_NO_MEMORY; 216 } 217 else 218 return SCARD_S_SUCCESS; 219 } |
199行说明了一个事实,一个重要的事实。reader读卡器上下文数组元素的readerState 字段就是对应的共享内存readerStates数组的元素。
187~191行,寻找还没有用到的readerStates元素。
199~208行,分配readerStates元素给对应的reader上下文数组元素的readerState字段。
并进一步初始化readerState字段。
还记得上面提到的fct回调函数地址,从参数 card_event传入,再由 rContext->pthCardEvent进入 SYS_ThreadCreate.
EHStatusHandlerThread做了什么?
定义在eventhandler.c
实现如下:
231 static void EHStatusHandlerThread(PREADER_CONTEXT rContext) 232 { 233 LONG rv; 234 LPCSTR lpcReader; 235 DWORD dwStatus, dwReaderSharing; 236 DWORD dwCurrentState; 237 DWORD dwAtrLen; 238 239 /* 240 * Zero out everything 241 */ 242 dwStatus = 0; 243 dwReaderSharing = 0; 244 dwCurrentState = 0; 245 246 lpcReader = rContext->lpcReader; 247 248 dwAtrLen = rContext->readerState->cardAtrLength; 249 rv = IFDStatusICC(rContext, &dwStatus, rContext->readerState->cardAtr, 250 &dwAtrLen); 251 rContext->readerState->cardAtrLength = dwAtrLen; 252 253 if (dwStatus & SCARD_PRESENT) 254 { 255 dwAtrLen = MAX_ATR_SIZE; 256 rv = IFDPowerICC(rContext, IFD_POWER_UP, 257 rContext->readerState->cardAtr, 258 &dwAtrLen); 259 rContext->readerState->cardAtrLength = dwAtrLen; 260 261 /* the protocol is unset after a power on */ 262 rContext->readerState->cardProtocol = SCARD_PROTOCOL_UNDEFINED; 263 264 if (rv == IFD_SUCCESS) 265 { 266 dwStatus |= SCARD_PRESENT; 267 dwStatus &= ~SCARD_ABSENT; 268 dwStatus |= SCARD_POWERED; 269 dwStatus |= SCARD_NEGOTIABLE; 270 dwStatus &= ~SCARD_SPECIFIC; 271 dwStatus &= ~SCARD_SWALLOWED; 272 dwStatus &= ~SCARD_UNKNOWN; 273 274 if (rContext->readerState->cardAtrLength > 0) 275 { 276 LogXxd(PCSC_LOG_INFO, "Card ATR: ", 277 rContext->readerState->cardAtr, 278 rContext->readerState->cardAtrLength); 279 } 280 else 281 Log1(PCSC_LOG_INFO, "Card ATR: (NULL)"); 282 } |
248~251行,再次查询读卡器和卡状态。
252~260行,如果读卡器中有卡存在,则给卡上电并复位卡。
266~272行,设置卡上电复位成功情况下的默认状态。
274~279行,如果atr长度大于0,则打印出atr和长度。
283 else 284 { 285 dwStatus |= SCARD_PRESENT; 286 dwStatus &= ~SCARD_ABSENT; 287 dwStatus |= SCARD_SWALLOWED; 288 dwStatus &= ~SCARD_POWERED; 289 dwStatus &= ~SCARD_NEGOTIABLE; 290 dwStatus &= ~SCARD_SPECIFIC; 291 dwStatus &= ~SCARD_UNKNOWN; 292 Log3(PCSC_LOG_ERROR, "Error powering up card: %d 0x%04X", rv, rv); 293 } 294 295 dwCurrentState = SCARD_PRESENT; 296 } |
283~293行,设置卡上电复位失败情况下的状态。
297 else 298 { 299 dwStatus |= SCARD_ABSENT; 300 dwStatus &= ~SCARD_PRESENT; 301 dwStatus &= ~SCARD_POWERED; 302 dwStatus &= ~SCARD_NEGOTIABLE; 303 dwStatus &= ~SCARD_SPECIFIC; 304 dwStatus &= ~SCARD_SWALLOWED; 305 dwStatus &= ~SCARD_UNKNOWN; 306 rContext->readerState->cardAtrLength = 0; 307 rContext->readerState->cardProtocol = SCARD_PROTOCOL_UNDEFINED; 308 309 dwCurrentState = SCARD_ABSENT; 310 } |
297~310行,设置卡不存在情况下的状态。
311 312 /* 313 * Set all the public attributes to this reader 314 */ 315 rContext->readerState->readerState = dwStatus; 316 rContext->readerState->readerSharing = dwReaderSharing = 317 rContext->dwContexts; 318 319 (void)StatSynchronize(rContext->readerState); 320 |
315~317行做什么,还是进入 StatSynchronize看看,要进入吗?前面说过了。