diff --git a/src/cardreader.cpp b/src/cardreader.cpp index 30e92f5..85e2ca7 100644 --- a/src/cardreader.cpp +++ b/src/cardreader.cpp @@ -340,23 +340,24 @@ void CardReader::HandleReaderStatusChange(uv_async_t *handle, int status) { if (reader->m_state == 1) { // Swallow events : Listening thread was cancelled by user. } else if ((ar->result == SCARD_S_SUCCESS) || - (ar->result == (LONG)SCARD_E_NO_READERS_AVAILABLE)) { // Card reader was unplugged, it's not an error - if (ar->result == SCARD_S_SUCCESS) { - const unsigned argc = 3; + (ar->result == (LONG)SCARD_E_NO_READERS_AVAILABLE) || + (ar->result == (LONG)SCARD_E_UNKNOWN_READER)) { // Card reader was unplugged, it's not an error + if (ar->status != 0) { + const unsigned int argc = 3; Local argv[argc] = { Nan::Undefined(), // argument Nan::New(ar->status), Nan::CopyBuffer(reinterpret_cast(ar->atr), ar->atrlen).ToLocalChecked() }; - Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv); - } else { - Local err = Nan::Error(error_msg("SCardGetStatusChange", ar->result).c_str()); - // Prepare the parameters for the callback function. - const unsigned argc = 1; - Local argv[argc] = { err }; Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv); } + } else { + Local err = Nan::Error(error_msg("SCardGetStatusChange", ar->result).c_str()); + // Prepare the parameters for the callback function. + const unsigned int argc = 1; + Local argv[argc] = { err }; + Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv); } if (ar->do_exit) { @@ -403,7 +404,11 @@ void CardReader::HandlerFunction(void* arg) { async_baton->async_result->do_exit = (reader->m_state != 0); async_baton->async_result->result = result; - async_baton->async_result->status = card_reader_state.dwEventState; + if (card_reader_state.dwEventState == card_reader_state.dwCurrentState) { + async_baton->async_result->status = 0; + } else { + async_baton->async_result->status = card_reader_state.dwEventState; + } memcpy(async_baton->async_result->atr, card_reader_state.rgbAtr, card_reader_state.cbAtr); async_baton->async_result->atrlen = card_reader_state.cbAtr;