PCSC那事儿(三十六--PCSCD)

 

回头吧,回到 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看看,要进入吗?前面说过了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值