<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ludovic Rousseau's blog (Posts about C)</title><link>https://blog.apdu.fr/</link><description></description><atom:link href="https://blog.apdu.fr/categories/c.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:ludovic.rousseau+blog@free.fr"&gt;Ludovic Rousseau&lt;/a&gt; - License &lt;a href="/posts/2010/08/my-blog-messages-license/"&gt;CC BY-NC-SA 4.0 Deed&lt;/a&gt; for the text &amp;amp; &lt;a href="/posts/2019/01/my-blog-source-code-license/"&gt;GNU GPLv3&lt;/a&gt; for the code</copyright><lastBuildDate>Fri, 02 Jan 2026 16:23:53 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Improved SCardGetStatusChange() for "\\?PnP?\Notification" special reader</title><link>https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;&lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt; works fine to detect a change in one of the
listed readers.
It is also possible to detect when a reader has been added or removed
using the special reader name &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;"\\?PnP?\Notification"&lt;/span&gt;&lt;/code&gt;. See
&lt;a class="reference external" href="https://blog.apdu.fr/posts/2018/02/how-to-use-scardgetstatuschange/"&gt;How to use SCardGetStatusChange()?&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One old problem is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;how to detect that a reader has been added &lt;strong&gt;between&lt;/strong&gt; two calls to
&lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Even if you call &lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt; just after the previous
&lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt; returned you may still suffer from a &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Race_condition"&gt;race
condition&lt;/a&gt; and miss a reader event.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In pcsc-lite &lt;a class="reference external" href="https://blog.apdu.fr/posts/2024/08/new-version-of-pcsc-lite-230/"&gt;version 2.3.0&lt;/a&gt; I
implemented a solution for that use case.&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt; will now use the high word (high 16-bits) of the
&lt;code class="docutils literal"&gt;.dwEventState&lt;/code&gt; field for the special reader &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;"\\?PnP?\Notification"&lt;/span&gt;&lt;/code&gt; to
store the number of reader events (since the start of the pcscd daemon).&lt;/p&gt;
&lt;section id="pseudo-code-algorithm"&gt;
&lt;h2&gt;Pseudo code algorithm&lt;/h2&gt;
&lt;p&gt;The suggested way to fix the problem is to use something like that:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;initial call to &lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;get the initial value from &lt;code class="docutils literal"&gt;.dwEventState&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;copy this value in &lt;code class="docutils literal"&gt;.dwCurrentState&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;second call to &lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If a reader has been added before the second &lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt;
call then &lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt; will return immediately.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="sample-code"&gt;
&lt;h2&gt;Sample code&lt;/h2&gt;
&lt;p&gt;File &lt;code class="docutils literal"&gt;sample.c&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code c"&gt;&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-1" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-1" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-1"&gt;&lt;/a&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-2" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-2" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-2"&gt;&lt;/a&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-3" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-3" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-3"&gt;&lt;/a&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-4" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-4" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-4"&gt;&lt;/a&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;stdbool.h&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-5" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-5" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-6" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-6" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-6"&gt;&lt;/a&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;winscard.h&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-7" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-7" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-8" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-8" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-8"&gt;&lt;/a&gt;&lt;span class="cp"&gt;#define CHECK(f, rv, panic) \&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-9" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-9" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-9"&gt;&lt;/a&gt;&lt;span class="cp"&gt; printf(f "(): 0x%08lX, %s\n", rv, pcsc_stringify_error(rv)); \&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-10" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-10" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-10"&gt;&lt;/a&gt;&lt;span class="cp"&gt; if ((SCARD_S_SUCCESS != rv) &amp;amp;&amp;amp; panic) \&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-11" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-11" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-11"&gt;&lt;/a&gt;&lt;span class="cp"&gt; { \&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-12" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-12" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-12"&gt;&lt;/a&gt;&lt;span class="cp"&gt;  return -1; \&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-13" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-13" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-13"&gt;&lt;/a&gt;&lt;span class="cp"&gt; }&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-14" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-14" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-14"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-15" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-15" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-15"&gt;&lt;/a&gt;&lt;span class="cp"&gt;#define PANIC true&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-16" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-16" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-16"&gt;&lt;/a&gt;&lt;span class="cp"&gt;#define DONT_PANIC false&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-17" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-17" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-17"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-18" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-18" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-18"&gt;&lt;/a&gt;&lt;span class="cp"&gt;#define MAX_READERS 16&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-19" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-19" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-19"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-20" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-20" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-20"&gt;&lt;/a&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-21" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-21" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-21"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-22" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-22" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-22"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;LONG&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-23" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-23" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-23"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;SCARDCONTEXT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hContext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-24" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-24" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-24"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;LPTSTR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mszReaders&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-25" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-25" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dwReaders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-26" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-26" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-26"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;readers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_READERS&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-27" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-27" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-27"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nb_readers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-28" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-28" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-28"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;SCARD_READERSTATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rgReaderStates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_READERS&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-29" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-29" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-29"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-30" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-30" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-30"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SCardEstablishContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SCARD_SCOPE_SYSTEM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;hContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-31" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-31" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-31"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SCardEstablishContext"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PANIC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-32" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-32" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-32"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-33" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-33" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-33"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SCardListReaders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;dwReaders&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-34" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-34" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-34"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SCardListReaders"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DONT_PANIC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-35" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-35" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-35"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-36" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-36" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-36"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;mszReaders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;calloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dwReaders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-37" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-37" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-37"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SCardListReaders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mszReaders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;dwReaders&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-38" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-38" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-38"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SCardListReaders"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DONT_PANIC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-39" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-39" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-39"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Found readers:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-40" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-40" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-40"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;nb_readers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-41" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-41" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-41"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mszReaders&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-42" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-42" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-42"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-43" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-43" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-43"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-44" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-44" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-44"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;readers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;nb_readers&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-45" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-45" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-45"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-46" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-46" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-46"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Found %d readers&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nb_readers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-47" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-47" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-47"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-48" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-48" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-48"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* add the special reader */&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-49" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-49" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-49"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;readers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;nb_readers&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\\\\&lt;/span&gt;&lt;span class="s"&gt;?PnP?&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;Notification"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-50" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-50" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-50"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-51" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-51" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-51"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* get the initial states */&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-52" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-52" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-52"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;nb_readers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-53" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-53" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-53"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-54" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-54" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-54"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;rgReaderStates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;szReader&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;readers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-55" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-55" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-55"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;rgReaderStates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;dwCurrentState&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SCARD_STATE_UNAWARE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-56" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-56" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-56"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-57" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-57" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-57"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SCardGetStatusChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rgReaderStates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nb_readers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-58" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-58" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-58"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SCardGetStatusChange"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DONT_PANIC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-59" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-59" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-59"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-60" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-60" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-60"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* set the current state */&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-61" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-61" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-61"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;nb_readers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-62" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-62" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-62"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-63" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-63" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-63"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;rgReaderStates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;dwCurrentState&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rgReaderStates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;dwEventState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-64" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-64" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-64"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"reader: %s, events #: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-65" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-65" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-65"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;readers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rgReaderStates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;dwEventState&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-66" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-66" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-66"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"reader: %s, events state 0x%04X&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-67" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-67" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-67"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;readers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rgReaderStates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;dwEventState&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xFFFF&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-68" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-68" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-68"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-69" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-69" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-69"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-70" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-70" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-70"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* wait for a change */&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-71" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-71" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-71"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SCardGetStatusChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;INFINITE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rgReaderStates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nb_readers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-72" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-72" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-72"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SCardGetStatusChange"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PANIC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-73" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-73" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-73"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-74" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-74" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-74"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* new state */&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-75" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-75" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-75"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;nb_readers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-76" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-76" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-76"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-77" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-77" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-77"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"reader: %s, events #: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-78" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-78" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-78"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;readers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rgReaderStates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;dwEventState&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-79" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-79" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-79"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"reader: %s, events state 0x%04X&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-80" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-80" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-80"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;readers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rgReaderStates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;dwEventState&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xFFFF&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-81" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-81" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-81"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-82" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-82" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-82"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-83" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-83" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-83"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mszReaders&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-84" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-84" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-84"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-85" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-85" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-85"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SCardReleaseContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-86" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-86" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-86"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SCardReleaseContext"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PANIC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-87" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-87" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-87"&gt;&lt;/a&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-88" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-88" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-88"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;a id="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-89" name="rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-89" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ad1c3ca3ce76425fa73fd0bc5561632f-89"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;File &lt;code class="docutils literal"&gt;Makefile&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code makefile"&gt;&lt;a id="rest_code_07bac30c16114089be35184f1e20d8d8-1" name="rest_code_07bac30c16114089be35184f1e20d8d8-1" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_07bac30c16114089be35184f1e20d8d8-1"&gt;&lt;/a&gt;&lt;span class="c"&gt;# Linux&lt;/span&gt;
&lt;a id="rest_code_07bac30c16114089be35184f1e20d8d8-2" name="rest_code_07bac30c16114089be35184f1e20d8d8-2" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_07bac30c16114089be35184f1e20d8d8-2"&gt;&lt;/a&gt;&lt;span class="nv"&gt;PCSC_CFLAGS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;shell&lt;span class="w"&gt; &lt;/span&gt;pkg-config&lt;span class="w"&gt; &lt;/span&gt;--cflags&lt;span class="w"&gt; &lt;/span&gt;libpcsclite&lt;span class="k"&gt;)&lt;/span&gt;
&lt;a id="rest_code_07bac30c16114089be35184f1e20d8d8-3" name="rest_code_07bac30c16114089be35184f1e20d8d8-3" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_07bac30c16114089be35184f1e20d8d8-3"&gt;&lt;/a&gt;&lt;span class="nv"&gt;LDLIBS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;shell&lt;span class="w"&gt; &lt;/span&gt;pkg-config&lt;span class="w"&gt; &lt;/span&gt;--libs&lt;span class="w"&gt; &lt;/span&gt;libpcsclite&lt;span class="k"&gt;)&lt;/span&gt;
&lt;a id="rest_code_07bac30c16114089be35184f1e20d8d8-4" name="rest_code_07bac30c16114089be35184f1e20d8d8-4" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_07bac30c16114089be35184f1e20d8d8-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_07bac30c16114089be35184f1e20d8d8-5" name="rest_code_07bac30c16114089be35184f1e20d8d8-5" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_07bac30c16114089be35184f1e20d8d8-5"&gt;&lt;/a&gt;&lt;span class="nv"&gt;CFLAGS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;PCSC_CFLAGS&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-g
&lt;a id="rest_code_07bac30c16114089be35184f1e20d8d8-6" name="rest_code_07bac30c16114089be35184f1e20d8d8-6" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_07bac30c16114089be35184f1e20d8d8-6"&gt;&lt;/a&gt;
&lt;a id="rest_code_07bac30c16114089be35184f1e20d8d8-7" name="rest_code_07bac30c16114089be35184f1e20d8d8-7" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_07bac30c16114089be35184f1e20d8d8-7"&gt;&lt;/a&gt;&lt;span class="nf"&gt;sample&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;.&lt;span class="n"&gt;c&lt;/span&gt;
&lt;a id="rest_code_07bac30c16114089be35184f1e20d8d8-8" name="rest_code_07bac30c16114089be35184f1e20d8d8-8" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_07bac30c16114089be35184f1e20d8d8-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_07bac30c16114089be35184f1e20d8d8-9" name="rest_code_07bac30c16114089be35184f1e20d8d8-9" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_07bac30c16114089be35184f1e20d8d8-9"&gt;&lt;/a&gt;&lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;a id="rest_code_07bac30c16114089be35184f1e20d8d8-10" name="rest_code_07bac30c16114089be35184f1e20d8d8-10" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_07bac30c16114089be35184f1e20d8d8-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;sample
&lt;/pre&gt;&lt;/div&gt;
&lt;section id="connect-a-reader"&gt;
&lt;h3&gt;Connect a reader&lt;/h3&gt;
&lt;p&gt;We start the sample code with no reader connected:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-1" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-1" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-1"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardEstablishContext(): 0x00000000, Command successful.&lt;/span&gt;
&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-2" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-2" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-2"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardListReaders(): 0x8010002E, Cannot find a smart card reader.&lt;/span&gt;
&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-3" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-3" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-3"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardListReaders(): 0x8010002E, Cannot find a smart card reader.&lt;/span&gt;
&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-4" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-4" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-4"&gt;&lt;/a&gt;&lt;span class="go"&gt; Found readers:&lt;/span&gt;
&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-5" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-5" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-5"&gt;&lt;/a&gt;&lt;span class="go"&gt; Found 0 readers&lt;/span&gt;
&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-6" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-6" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-6"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardGetStatusChange(): 0x8010000A, Command timeout.&lt;/span&gt;
&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-7" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-7" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-7"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: \\?PnP?\Notification, events #: 33&lt;/span&gt;
&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-8" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-8" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-8"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: \\?PnP?\Notification, events state 0x0000&lt;/span&gt;
&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-9" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-9" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-9"&gt;&lt;/a&gt;
&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-10" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-10" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-10"&gt;&lt;/a&gt;&lt;span class="hll"&gt;&lt;span class="go"&gt; &amp;gt;&amp;gt;&amp;gt; connection of a new reader here&lt;/span&gt;
&lt;/span&gt;&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-11" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-11" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-11"&gt;&lt;/a&gt;
&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-12" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-12" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-12"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardGetStatusChange(): 0x00000000, Command successful.&lt;/span&gt;
&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-13" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-13" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-13"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: \\?PnP?\Notification, events #: 34&lt;/span&gt;
&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-14" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-14" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-14"&gt;&lt;/a&gt;&lt;span class="hll"&gt;&lt;span class="go"&gt; reader: \\?PnP?\Notification, events state 0x0002&lt;/span&gt;
&lt;/span&gt;&lt;a id="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-15" name="rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-15" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_2c32ef2456ca4b4d9aa567962b4c28e1-15"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardReleaseContext(): 0x00000000, Command successful.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;State value 0x0002 is &lt;code class="docutils literal"&gt;SCARD_STATE_CHANGED&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The first &lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt; returns a reader events of 33.
After I connect a reader the number goes to 34.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="disconnect-a-reader"&gt;
&lt;h3&gt;Disconnect a reader&lt;/h3&gt;
&lt;p&gt;We restart the sample code with the reader connected:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-1" name="rest_code_ff77d2363d934a478f2409bfe0e44509-1" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-1"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardEstablishContext(): 0x00000000, Command successful.&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-2" name="rest_code_ff77d2363d934a478f2409bfe0e44509-2" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-2"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardListReaders(): 0x00000000, Command successful.&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-3" name="rest_code_ff77d2363d934a478f2409bfe0e44509-3" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-3"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardListReaders(): 0x00000000, Command successful.&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-4" name="rest_code_ff77d2363d934a478f2409bfe0e44509-4" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-4"&gt;&lt;/a&gt;&lt;span class="go"&gt; Found readers:&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-5" name="rest_code_ff77d2363d934a478f2409bfe0e44509-5" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-5"&gt;&lt;/a&gt;&lt;span class="go"&gt;  Gemalto PC Twin Reader 00 00&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-6" name="rest_code_ff77d2363d934a478f2409bfe0e44509-6" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-6"&gt;&lt;/a&gt;&lt;span class="go"&gt; Found 1 readers&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-7" name="rest_code_ff77d2363d934a478f2409bfe0e44509-7" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-7"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardGetStatusChange(): 0x00000000, Command successful.&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-8" name="rest_code_ff77d2363d934a478f2409bfe0e44509-8" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-8"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: Gemalto PC Twin Reader 00 00, events #: 0&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-9" name="rest_code_ff77d2363d934a478f2409bfe0e44509-9" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-9"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: Gemalto PC Twin Reader 00 00, events state 0x0012&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-10" name="rest_code_ff77d2363d934a478f2409bfe0e44509-10" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-10"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: \\?PnP?\Notification, events #: 34&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-11" name="rest_code_ff77d2363d934a478f2409bfe0e44509-11" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-11"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: \\?PnP?\Notification, events state 0x0000&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-12" name="rest_code_ff77d2363d934a478f2409bfe0e44509-12" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-12"&gt;&lt;/a&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-13" name="rest_code_ff77d2363d934a478f2409bfe0e44509-13" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-13"&gt;&lt;/a&gt;&lt;span class="hll"&gt;&lt;span class="go"&gt; &amp;gt;&amp;gt;&amp;gt; removal of the reader here&lt;/span&gt;
&lt;/span&gt;&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-14" name="rest_code_ff77d2363d934a478f2409bfe0e44509-14" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-14"&gt;&lt;/a&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-15" name="rest_code_ff77d2363d934a478f2409bfe0e44509-15" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-15"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardGetStatusChange(): 0x00000000, Command successful.&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-16" name="rest_code_ff77d2363d934a478f2409bfe0e44509-16" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-16"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: Gemalto PC Twin Reader 00 00, events #: 0&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-17" name="rest_code_ff77d2363d934a478f2409bfe0e44509-17" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-17"&gt;&lt;/a&gt;&lt;span class="hll"&gt;&lt;span class="go"&gt; reader: Gemalto PC Twin Reader 00 00, events state 0x000E&lt;/span&gt;
&lt;/span&gt;&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-18" name="rest_code_ff77d2363d934a478f2409bfe0e44509-18" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-18"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: \\?PnP?\Notification, events #: 35&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-19" name="rest_code_ff77d2363d934a478f2409bfe0e44509-19" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-19"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: \\?PnP?\Notification, events state 0x0002&lt;/span&gt;
&lt;a id="rest_code_ff77d2363d934a478f2409bfe0e44509-20" name="rest_code_ff77d2363d934a478f2409bfe0e44509-20" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_ff77d2363d934a478f2409bfe0e44509-20"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardReleaseContext(): 0x00000000, Command successful.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The reader "Gemalto PC Twin Reader 00 00" has been removed.
Its state value 0x000E contains the bits:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal"&gt;SCARD_STATE_UNKNOWN&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal"&gt;SCARD_STATE_UNAVAILABLE&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal"&gt;SCARD_STATE_CHANGED&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="connect-a-second-reader"&gt;
&lt;h3&gt;Connect a second reader&lt;/h3&gt;
&lt;p&gt;We restart the sample code with the reader connected:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-1" name="rest_code_c03ea406a24c403eae190c1363e57559-1" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-1"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardEstablishContext(): 0x00000000, Command successful.&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-2" name="rest_code_c03ea406a24c403eae190c1363e57559-2" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-2"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardListReaders(): 0x00000000, Command successful.&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-3" name="rest_code_c03ea406a24c403eae190c1363e57559-3" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-3"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardListReaders(): 0x00000000, Command successful.&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-4" name="rest_code_c03ea406a24c403eae190c1363e57559-4" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-4"&gt;&lt;/a&gt;&lt;span class="go"&gt; Found readers:&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-5" name="rest_code_c03ea406a24c403eae190c1363e57559-5" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-5"&gt;&lt;/a&gt;&lt;span class="go"&gt;  Gemalto PC Twin Reader 00 00&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-6" name="rest_code_c03ea406a24c403eae190c1363e57559-6" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-6"&gt;&lt;/a&gt;&lt;span class="go"&gt; Found 1 readers&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-7" name="rest_code_c03ea406a24c403eae190c1363e57559-7" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-7"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardGetStatusChange(): 0x00000000, Command successful.&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-8" name="rest_code_c03ea406a24c403eae190c1363e57559-8" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-8"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: Gemalto PC Twin Reader 00 00, events #: 0&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-9" name="rest_code_c03ea406a24c403eae190c1363e57559-9" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-9"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: Gemalto PC Twin Reader 00 00, events state 0x0012&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-10" name="rest_code_c03ea406a24c403eae190c1363e57559-10" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-10"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: \\?PnP?\Notification, events #: 36&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-11" name="rest_code_c03ea406a24c403eae190c1363e57559-11" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-11"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: \\?PnP?\Notification, events state 0x0000&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-12" name="rest_code_c03ea406a24c403eae190c1363e57559-12" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-12"&gt;&lt;/a&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-13" name="rest_code_c03ea406a24c403eae190c1363e57559-13" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-13"&gt;&lt;/a&gt;&lt;span class="hll"&gt;&lt;span class="go"&gt; &amp;gt;&amp;gt;&amp;gt; connection of a second reader&lt;/span&gt;
&lt;/span&gt;&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-14" name="rest_code_c03ea406a24c403eae190c1363e57559-14" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-14"&gt;&lt;/a&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-15" name="rest_code_c03ea406a24c403eae190c1363e57559-15" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-15"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardGetStatusChange(): 0x00000000, Command successful.&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-16" name="rest_code_c03ea406a24c403eae190c1363e57559-16" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-16"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: Gemalto PC Twin Reader 00 00, events #: 0&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-17" name="rest_code_c03ea406a24c403eae190c1363e57559-17" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-17"&gt;&lt;/a&gt;&lt;span class="hll"&gt;&lt;span class="go"&gt; reader: Gemalto PC Twin Reader 00 00, events state 0x0010&lt;/span&gt;
&lt;/span&gt;&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-18" name="rest_code_c03ea406a24c403eae190c1363e57559-18" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-18"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: \\?PnP?\Notification, events #: 37&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-19" name="rest_code_c03ea406a24c403eae190c1363e57559-19" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-19"&gt;&lt;/a&gt;&lt;span class="go"&gt; reader: \\?PnP?\Notification, events state 0x0002&lt;/span&gt;
&lt;a id="rest_code_c03ea406a24c403eae190c1363e57559-20" name="rest_code_c03ea406a24c403eae190c1363e57559-20" href="https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/#rest_code_c03ea406a24c403eae190c1363e57559-20"&gt;&lt;/a&gt;&lt;span class="go"&gt; SCardReleaseContext(): 0x00000000, Command successful.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The Gemalto reader event state is 0x0010 = &lt;code class="docutils literal"&gt;SCARD_STATE_EMPTY&lt;/code&gt; because
it does not contains a smart card. It does not have the bit
&lt;code class="docutils literal"&gt;SCARD_STATE_CHANGED&lt;/code&gt; set because it's state has not changed.&lt;/p&gt;
&lt;p&gt;The PnP reader state is 0x0002 = &lt;code class="docutils literal"&gt;SCARD_STATE_CHANGED&lt;/code&gt; because a new
reader was connected.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="remarks"&gt;
&lt;h2&gt;Remarks&lt;/h2&gt;
&lt;section id="timeout"&gt;
&lt;h3&gt;Timeout&lt;/h3&gt;
&lt;p&gt;It is important to use a timeout of 0 (parameter &lt;a class="reference external" href="https://pcsclite.apdu.fr/api/group__API.html#ga33247d5d1257d59e55647c3bb717db24"&gt;dwTimeout&lt;/a&gt;)
in the first call to &lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt; to make the function
returns immediately.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="unitary-test"&gt;
&lt;h3&gt;Unitary Test&lt;/h3&gt;
&lt;p&gt;If you want to know if your implementation of PC/SC includes the fix or
not (or test on Windows or macOS) you can use the program
&lt;a class="reference external" href="https://salsa.debian.org/rousseau/PCSC/-/blob/master/UnitaryTests/SCardGetStatusChange/SCardGetStatusChange_PnP_Events.py?ref_type=heads"&gt;CardGetStatusChange_PnP_Events.py&lt;/a&gt;
included in pcsc-lite &lt;a class="reference external" href="https://salsa.debian.org/rousseau/PCSC/-/tree/master/UnitaryTests/SCardGetStatusChange?ref_type=heads"&gt;UnitaryTests/SCardGetStatusChange/&lt;/a&gt;
directory.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="windows"&gt;
&lt;h3&gt;Windows&lt;/h3&gt;
&lt;p&gt;Microsoft implemented a similar mechanism. But instead of using the
number of reader events it uses the number of connected readers.&lt;/p&gt;
&lt;p&gt;So between the 2 calls to &lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt; if one reader is
added and one reader is removed you may not be notified.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="macos"&gt;
&lt;h3&gt;macOS&lt;/h3&gt;
&lt;p&gt;Apple does not support the special reader &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;"\\?PnP?\Notification"&lt;/span&gt;&lt;/code&gt;.
See &lt;a class="reference external" href="https://blog.apdu.fr/posts/2015/12/os-x-el-capitan-missing-feature/"&gt;OS X El Capitan missing feature: SCardGetStatusChange() and "\\?PnP?\Notification"&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So there is no way it supports the mechanism presented here.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="backward-compatibility"&gt;
&lt;h3&gt;Backward compatibility&lt;/h3&gt;
&lt;p&gt;To not break existing codes the new &lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt; beahavior
is enabled only if the number of reader events in &lt;code class="docutils literal"&gt;.dwCurrentState&lt;/code&gt; is
&lt;em&gt;not&lt;/em&gt; zero.&lt;/p&gt;
&lt;p&gt;That is also one reason why you should use a &lt;code class="docutils literal"&gt;dwTimeout&lt;/code&gt; value of 0
for the first call.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="dweventstate-for-normal-readers"&gt;
&lt;h3&gt;&lt;code class="docutils literal"&gt;.dwEventState&lt;/code&gt; for normal readers&lt;/h3&gt;
&lt;p&gt;The high 16-bits of &lt;code class="docutils literal"&gt;.dwEventState&lt;/code&gt; for the normal readers is also
used. It contains the number of &lt;cite&gt;card events&lt;/cite&gt; for this particular
reader.&lt;/p&gt;
&lt;p&gt;This is an old behavior that is documented in the &lt;a class="reference external" href="https://pcsclite.apdu.fr/api/group__API.html#ga33247d5d1257d59e55647c3bb717db24"&gt;API documentation&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code class="docutils literal"&gt;dwEventState&lt;/code&gt; also contains a number of events in the upper 16
bits (&lt;code class="docutils literal"&gt;dwEventState &amp;amp; 0xFFFF0000&lt;/code&gt;). This number of events is
incremented for each card insertion or removal in the specified reader.
This can be used to detect a card removal/insertion between two calls to
&lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I was aware of this race issue with &lt;code class="docutils literal"&gt;SCardGetStatusChange()&lt;/code&gt; since a
long time (at least 2018. Thanks Maksim). But I got a new motivation
boost after an issue was reported &lt;a class="reference external" href="https://github.com/LudovicRousseau/PCSC/issues/190"&gt;SCardGetStatusChange: Race
condition when attaching multiple readers at the same time&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is now the job of applications programmers to use this new feature in
their codes.&lt;/p&gt;
&lt;p&gt;If you find a regression in your application because of this change
please open an issue.&lt;/p&gt;
&lt;/section&gt;</description><category>C</category><category>pcsc-lite</category><guid>https://blog.apdu.fr/posts/2024/08/improved-scardgetstatuschange-for-pnpnotification-special-reader/</guid><pubDate>Sun, 04 Aug 2024 11:07:07 GMT</pubDate></item><item><title>PCSC sample in C for UEFI</title><link>https://blog.apdu.fr/posts/2015/05/pcsc-sample-in-c-for-uefi/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;To continue the list of PC/SC wrappers initiated more than four years ago with "&lt;a href="https://blog.apdu.fr/posts/2010/04/pcsc-sample-in-different-languages/"&gt;PC/SC sample in different languages&lt;/a&gt;" I now present a PC/SC sample written in C but for UEFI.&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;h2&gt;
UEFI&lt;/h2&gt;
UEFI stands for &lt;a href="http://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface"&gt;Unified Extensible Firmware Interface&lt;/a&gt;. UEFI is an evolution of EFI. EFI should replace BIOS on "modern" "Intel PC" computers.&lt;br&gt;
&lt;br&gt;
Any 64-bits Intel (or compatible) PC computer should have UEFI (and maybe also a BIOS for compatibility).&lt;br&gt;
&lt;br&gt;
See my previous article "&lt;a href="https://blog.apdu.fr/posts/2015/05/uefi-smart-card-reader-protocol/"&gt;UEFI Smart Card Reader Protocol&lt;/a&gt;" for some more details.&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;
Sample source code&lt;/h2&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style="color: navy;"&gt;#include&lt;/span&gt;&lt;/b&gt; &lt;span style="color: red;"&gt;&amp;lt;Uefi.h&amp;gt;&lt;/span&gt;
&lt;b&gt;&lt;span style="color: navy;"&gt;#include&lt;/span&gt;&lt;/b&gt; &lt;span style="color: red;"&gt;&amp;lt;Library/UefiLib.h&amp;gt;&lt;/span&gt;
&lt;b&gt;&lt;span style="color: navy;"&gt;#include&lt;/span&gt;&lt;/b&gt; &lt;span style="color: red;"&gt;&amp;lt;Library/ShellCEntryLib.h&amp;gt;&lt;/span&gt;
&lt;b&gt;&lt;span style="color: navy;"&gt;#include&lt;/span&gt;&lt;/b&gt; &lt;span style="color: red;"&gt;&amp;lt;Library/UefiBootServicesTableLib.h&amp;gt;&lt;/span&gt;
&lt;b&gt;&lt;span style="color: navy;"&gt;#include&lt;/span&gt;&lt;/b&gt; &lt;span style="color: red;"&gt;&amp;lt;Library/BaseMemoryLib.h&amp;gt;&lt;/span&gt;

&lt;b&gt;&lt;span style="color: navy;"&gt;#include&lt;/span&gt;&lt;/b&gt; &lt;span style="color: red;"&gt;&amp;lt;Protocol/SmartCardReader.h&amp;gt;&lt;/span&gt;

&lt;span style="color: #009900;"&gt;int&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;HelloWorld&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: teal;"&gt;EFI_SMART_CARD_READER_PROTOCOL&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;SmartCardReader&lt;span style="color: #990000;"&gt;)&lt;/span&gt;
&lt;span style="color: red;"&gt;{&lt;/span&gt;
    &lt;span style="color: teal;"&gt;EFI_STATUS&lt;/span&gt;  Status&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: teal;"&gt;UINT32&lt;/span&gt; ActiveProtocol&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;int&lt;/span&gt; i&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: teal;"&gt;UINT8&lt;/span&gt; CAPDU_select&lt;span style="color: #990000;"&gt;[]&lt;/span&gt; &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0xA4&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x04&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x0A&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0xA0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x62&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x03&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x01&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x0C&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x06&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x01&lt;/span&gt;&lt;span style="color: red;"&gt;}&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: teal;"&gt;UINT8&lt;/span&gt; CAPDU_command&lt;span style="color: #990000;"&gt;[]&lt;/span&gt; &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: red;"&gt;}&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: teal;"&gt;UINTN&lt;/span&gt; CAPDULength&lt;span style="color: #990000;"&gt;,&lt;/span&gt; RAPDULength&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: teal;"&gt;UINT8&lt;/span&gt; RAPDU&lt;span style="color: #990000;"&gt;[&lt;/span&gt;&lt;span style="color: #993399;"&gt;256&lt;/span&gt;&lt;span style="color: #990000;"&gt;+&lt;/span&gt;&lt;span style="color: #993399;"&gt;2&lt;/span&gt;&lt;span style="color: #990000;"&gt;];&lt;/span&gt;

    &lt;i&gt;&lt;span style="color: #9a1900;"&gt;/*&lt;/span&gt;&lt;/i&gt;
&lt;i&gt;&lt;span style="color: #9a1900;"&gt;     * SCardConnect&lt;/span&gt;&lt;/i&gt;
&lt;i&gt;&lt;span style="color: #9a1900;"&gt;     */&lt;/span&gt;&lt;/i&gt;
    Status &lt;span style="color: #990000;"&gt;=&lt;/span&gt; SmartCardReader&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;SCardConnect&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;SmartCardReader&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        SCARD_AM_CARD&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        SCARD_CA_COLDRESET&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        SCARD_PROTOCOL_T0 &lt;span style="color: #990000;"&gt;|&lt;/span&gt; SCARD_PROTOCOL_T1&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;ActiveProtocol&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
    &lt;b&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;EFI_ERROR&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;Status&lt;span style="color: #990000;"&gt;))&lt;/span&gt;
    &lt;span style="color: red;"&gt;{&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"ERROR: SCardConnect: %d&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; Status&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: red;"&gt;}&lt;/span&gt;

    &lt;i&gt;&lt;span style="color: #9a1900;"&gt;/*&lt;/span&gt;&lt;/i&gt;
&lt;i&gt;&lt;span style="color: #9a1900;"&gt;     * SCardTransmit Select&lt;/span&gt;&lt;/i&gt;
&lt;i&gt;&lt;span style="color: #9a1900;"&gt;     */&lt;/span&gt;&lt;/i&gt;
    CAPDULength &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;sizeof&lt;/span&gt;&lt;/b&gt; CAPDU_select&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    RAPDULength &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;sizeof&lt;/span&gt;&lt;/b&gt; RAPDU&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    Status &lt;span style="color: #990000;"&gt;=&lt;/span&gt; SmartCardReader&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;SCardTransmit&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;SmartCardReader&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        CAPDU_select&lt;span style="color: #990000;"&gt;,&lt;/span&gt; CAPDULength&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        RAPDU&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;RAPDULength&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
    &lt;b&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;EFI_ERROR&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;Status&lt;span style="color: #990000;"&gt;))&lt;/span&gt;
    &lt;span style="color: red;"&gt;{&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"ERROR: SCardTransmit: %d&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; Status&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: red;"&gt;}&lt;/span&gt;
    &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"RAPDU: "&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
    &lt;b&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;i&lt;span style="color: #990000;"&gt;=&lt;/span&gt;&lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt; i&lt;span style="color: #990000;"&gt;&amp;lt;&lt;/span&gt;RAPDULength&lt;span style="color: #990000;"&gt;;&lt;/span&gt; i&lt;span style="color: #990000;"&gt;++)&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"%02X "&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; RAPDU&lt;span style="color: #990000;"&gt;[&lt;/span&gt;i&lt;span style="color: #990000;"&gt;]);&lt;/span&gt;
    &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;

    &lt;i&gt;&lt;span style="color: #9a1900;"&gt;/*&lt;/span&gt;&lt;/i&gt;
&lt;i&gt;&lt;span style="color: #9a1900;"&gt;     * SCardTransmit Command&lt;/span&gt;&lt;/i&gt;
&lt;i&gt;&lt;span style="color: #9a1900;"&gt;     */&lt;/span&gt;&lt;/i&gt;
    CAPDULength &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;sizeof&lt;/span&gt;&lt;/b&gt; CAPDU_command&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    RAPDULength &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;sizeof&lt;/span&gt;&lt;/b&gt; RAPDU&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    Status &lt;span style="color: #990000;"&gt;=&lt;/span&gt; SmartCardReader&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;SCardTransmit&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;SmartCardReader&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        CAPDU_command&lt;span style="color: #990000;"&gt;,&lt;/span&gt; CAPDULength&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        RAPDU&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;RAPDULength&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
    &lt;b&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;EFI_ERROR&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;Status&lt;span style="color: #990000;"&gt;))&lt;/span&gt;
    &lt;span style="color: red;"&gt;{&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"ERROR: SCardTransmit: %d&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; Status&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: red;"&gt;}&lt;/span&gt;
    &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"RAPDU: "&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
    &lt;b&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;i&lt;span style="color: #990000;"&gt;=&lt;/span&gt;&lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt; i&lt;span style="color: #990000;"&gt;&amp;lt;&lt;/span&gt;RAPDULength&lt;span style="color: #990000;"&gt;;&lt;/span&gt; i&lt;span style="color: #990000;"&gt;++)&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"%02X "&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; RAPDU&lt;span style="color: #990000;"&gt;[&lt;/span&gt;i&lt;span style="color: #990000;"&gt;]);&lt;/span&gt;
    &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
    &lt;b&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;i&lt;span style="color: #990000;"&gt;=&lt;/span&gt;&lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt; i&lt;span style="color: #990000;"&gt;&amp;lt;&lt;/span&gt;RAPDULength&lt;span style="color: #990000;"&gt;;&lt;/span&gt; i&lt;span style="color: #990000;"&gt;++)&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"%c"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; RAPDU&lt;span style="color: #990000;"&gt;[&lt;/span&gt;i&lt;span style="color: #990000;"&gt;]);&lt;/span&gt;
    &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;

    &lt;i&gt;&lt;span style="color: #9a1900;"&gt;/*&lt;/span&gt;&lt;/i&gt;
&lt;i&gt;&lt;span style="color: #9a1900;"&gt;     * SCardDisconnect&lt;/span&gt;&lt;/i&gt;
&lt;i&gt;&lt;span style="color: #9a1900;"&gt;     */&lt;/span&gt;&lt;/i&gt;
    Status &lt;span style="color: #990000;"&gt;=&lt;/span&gt; SmartCardReader&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;SCardDisconnect&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;SmartCardReader&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        SCARD_CA_NORESET&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
    &lt;b&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;EFI_ERROR&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;Status&lt;span style="color: #990000;"&gt;))&lt;/span&gt;
    &lt;span style="color: red;"&gt;{&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"ERROR: SCardDisconnect: %d&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; Status&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: red;"&gt;}&lt;/span&gt;

    &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
&lt;span style="color: red;"&gt;}&lt;/span&gt;

INTN
EFIAPI
&lt;b&gt;&lt;span style="color: black;"&gt;ShellAppMain&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;
  IN &lt;span style="color: teal;"&gt;UINTN&lt;/span&gt; Argc&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
  &lt;span style="color: teal;"&gt;IN&lt;/span&gt; CHAR16 &lt;span style="color: #990000;"&gt;**&lt;/span&gt;Argv
  &lt;span style="color: #990000;"&gt;)&lt;/span&gt;
&lt;span style="color: red;"&gt;{&lt;/span&gt;
    &lt;span style="color: teal;"&gt;EFI_STATUS&lt;/span&gt;  Status&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: teal;"&gt;UINTN&lt;/span&gt;       HandleIndex&lt;span style="color: #990000;"&gt;,&lt;/span&gt; HandleCount&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: teal;"&gt;EFI_HANDLE&lt;/span&gt;  &lt;span style="color: #990000;"&gt;*&lt;/span&gt;DevicePathHandleBuffer &lt;span style="color: #990000;"&gt;=&lt;/span&gt; NULL&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: teal;"&gt;EFI_SMART_CARD_READER_PROTOCOL&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;SmartCardReader&lt;span style="color: #990000;"&gt;;&lt;/span&gt;

    &lt;i&gt;&lt;span style="color: #9a1900;"&gt;/* EFI_SMART_CARD_READER_PROTOCOL */&lt;/span&gt;&lt;/i&gt;
    Status &lt;span style="color: #990000;"&gt;=&lt;/span&gt; gBS&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;LocateHandleBuffer&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;
            ByProtocol&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
            &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;gEfiSmartCardReaderProtocolGuid&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
            NULL&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
            &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;HandleCount&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
            &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;DevicePathHandleBuffer&lt;span style="color: #990000;"&gt;);&lt;/span&gt;

    &lt;b&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;EFI_ERROR&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;Status&lt;span style="color: #990000;"&gt;))&lt;/span&gt;
    &lt;span style="color: red;"&gt;{&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"ERROR: Get EFI_SMART_CARD_READER_PROTOCOL count fail.&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
    &lt;span style="color: red;"&gt;}&lt;/span&gt;

    &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"Found %d reader(s)&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; HandleCount&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
    &lt;b&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;HandleIndex &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt; HandleIndex &lt;span style="color: #990000;"&gt;&amp;lt;&lt;/span&gt; HandleCount&lt;span style="color: #990000;"&gt;;&lt;/span&gt; HandleIndex&lt;span style="color: #990000;"&gt;++)&lt;/span&gt;
    &lt;span style="color: red;"&gt;{&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: black;"&gt;ZeroMem&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&amp;amp;&lt;/span&gt;SmartCardReader&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;sizeof&lt;/span&gt;&lt;/b&gt; SmartCardReader&lt;span style="color: #990000;"&gt;);&lt;/span&gt;

        Status &lt;span style="color: #990000;"&gt;=&lt;/span&gt; gBS&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;HandleProtocol&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;
                DevicePathHandleBuffer&lt;span style="color: #990000;"&gt;[&lt;/span&gt;HandleIndex&lt;span style="color: #990000;"&gt;],&lt;/span&gt;
                &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;gEfiSmartCardReaderProtocolGuid&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
                &lt;span style="color: #990000;"&gt;(&lt;/span&gt;VOID&lt;span style="color: #990000;"&gt;**)&amp;amp;&lt;/span&gt;SmartCardReader&lt;span style="color: #990000;"&gt;);&lt;/span&gt;

        &lt;b&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;EFI_ERROR&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;Status&lt;span style="color: #990000;"&gt;))&lt;/span&gt;
        &lt;span style="color: red;"&gt;{&lt;/span&gt;
            &lt;b&gt;&lt;span style="color: black;"&gt;Print&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;L&lt;span style="color: red;"&gt;"ERROR: Open Protocol fail.&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
            gBS&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;FreePool&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;DevicePathHandleBuffer&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
            &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
        &lt;span style="color: red;"&gt;}&lt;/span&gt;

        &lt;b&gt;&lt;span style="color: black;"&gt;HelloWorld&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;SmartCardReader&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
    &lt;span style="color: red;"&gt;}&lt;/span&gt;
    gBS&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;FreePool&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;DevicePathHandleBuffer&lt;span style="color: #990000;"&gt;);&lt;/span&gt;

    &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
&lt;span style="color: red;"&gt;}&lt;/span&gt;
&lt;/tt&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;h3&gt;
Output&lt;/h3&gt;
&lt;pre&gt;Found 1 reader(s)
RAPDU: 90 00 
RAPDU: 48 65 6C 6C 6F 20 77 6F 72 6C 64 21 90 00 
Hello world!&lt;/pre&gt;
&lt;br&gt;
&lt;h3&gt;
Test platform&lt;/h3&gt;
I used a Dell laptop model E6420 (shipped in August 2013) with an integrated Broadcom smart card reader. This reader was already in the "should work" list of my &lt;a href="https://ccid.apdu.fr/"&gt;CCID driver&lt;/a&gt;. Of course the SmartCardReader API was not included in the UEFI. I had to write the driver myself.&lt;br&gt;
&lt;br&gt;
I made tests with older Dell laptops and had problems with the USB UEFI layer. It looks like UEFI is still a work in progress and bugs/limitations are common.&lt;br&gt;
&lt;br&gt;
I started by using a software simulator qemu + UEFI but I could not use a USB device with the simulator. So I rapidly had to use a real hardware. Developing a UEFI driver involves a &lt;b&gt;lot&lt;/b&gt; of reboot to try a new version of the driver.&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;
Remarks&lt;/h2&gt;
I added error checks and logging feature in the source code.&lt;br&gt;
&lt;br&gt;
The API is not high level but mostly the direct equivalent of WinSCard (the classic C API for smart cards).&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;
Conclusion&lt;/h2&gt;
It was fun to work on UEFI and learn a new technology.&lt;br&gt;
&lt;br&gt;
UEFI is very powerful. Time will tell if the SmartCardReader API will be deployed and used.</description><category>C</category><category>ccid</category><category>code</category><guid>https://blog.apdu.fr/posts/2015/05/pcsc-sample-in-c-for-uefi/</guid><pubDate>Wed, 27 May 2015 15:39:00 GMT</pubDate></item><item><title>PCSC sample in C</title><link>https://blog.apdu.fr/posts/2010/04/pcsc-sample-in-c/</link><dc:creator>Ludovic Rousseau</dc:creator><description>&lt;p&gt;Here is the PCSC sample in C language I promised in &lt;a href="https://blog.apdu.fr/posts/2010/04/pcsc-sample-in-different-languages/"&gt;PC/SC sample in different languages&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;&lt;h2&gt;
 C Source code&lt;/h2&gt;
&lt;br&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style="color: navy;"&gt;#ifdef&lt;/span&gt;&lt;/b&gt; WIN32
&lt;b&gt;&lt;span style="color: navy;"&gt;#undef&lt;/span&gt;&lt;/b&gt; UNICODE
&lt;b&gt;&lt;span style="color: navy;"&gt;#endif&lt;/span&gt;&lt;/b&gt;

&lt;b&gt;&lt;span style="color: navy;"&gt;#include&lt;/span&gt;&lt;/b&gt; &lt;span style="color: red;"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;
&lt;b&gt;&lt;span style="color: navy;"&gt;#include&lt;/span&gt;&lt;/b&gt; &lt;span style="color: red;"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;

&lt;b&gt;&lt;span style="color: navy;"&gt;#ifdef&lt;/span&gt;&lt;/b&gt; __APPLE__
&lt;b&gt;&lt;span style="color: navy;"&gt;#include&lt;/span&gt;&lt;/b&gt; &lt;/tt&gt;&lt;tt&gt;&lt;span style="color: red;"&gt;&amp;lt;PCSC/winscard.h&amp;gt;&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;
&lt;b&gt;&lt;span style="color: navy;"&gt;#include&lt;/span&gt;&lt;/b&gt; &lt;span style="color: red;"&gt;&amp;lt;PCSC/wintypes.h&amp;gt;&lt;/span&gt;
&lt;b&gt;&lt;span style="color: navy;"&gt;#else&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style="color: navy;"&gt;#include&lt;/span&gt;&lt;/b&gt; &lt;span style="color: red;"&gt;&amp;lt;winscard.h&amp;gt;&lt;/span&gt;
&lt;b&gt;&lt;span style="color: navy;"&gt;#endif&lt;/span&gt;&lt;/b&gt;

&lt;b&gt;&lt;span style="color: navy;"&gt;#ifdef&lt;/span&gt;&lt;/b&gt; WIN32
&lt;b&gt;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #009900;"&gt;char&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;pcsc_stringify_error&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;LONG rv&lt;span style="color: #990000;"&gt;)&lt;/span&gt;
&lt;span style="color: red;"&gt;{&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #009900;"&gt;char&lt;/span&gt; out&lt;span style="color: #990000;"&gt;[&lt;/span&gt;&lt;span style="color: #993399;"&gt;20&lt;/span&gt;&lt;span style="color: #990000;"&gt;];&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;sprintf_s&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;out&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;sizeof&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;out&lt;span style="color: #990000;"&gt;),&lt;/span&gt; &lt;span style="color: red;"&gt;"0x%08X"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; rv&lt;span style="color: #990000;"&gt;);&lt;/span&gt;

 &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; out&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
&lt;span style="color: red;"&gt;}&lt;/span&gt;
&lt;b&gt;&lt;span style="color: navy;"&gt;#endif&lt;/span&gt;&lt;/b&gt;

&lt;b&gt;&lt;span style="color: navy;"&gt;#define&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;CHECK&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;f&lt;span style="color: #990000;"&gt;,&lt;/span&gt; rv&lt;span style="color: #990000;"&gt;)&lt;/span&gt; &lt;span style="color: #990000;"&gt;\&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;SCARD_S_SUCCESS &lt;span style="color: #990000;"&gt;!=&lt;/span&gt; rv&lt;span style="color: #990000;"&gt;)&lt;/span&gt; &lt;span style="color: #990000;"&gt;\&lt;/span&gt;
 &lt;span style="color: red;"&gt;{&lt;/span&gt; &lt;span style="color: #990000;"&gt;\&lt;/span&gt;
  &lt;b&gt;&lt;span style="color: black;"&gt;printf&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;f &lt;span style="color: red;"&gt;": %s&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;pcsc_stringify_error&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;rv&lt;span style="color: #990000;"&gt;));&lt;/span&gt; &lt;span style="color: #990000;"&gt;\&lt;/span&gt;
  &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;-&lt;/span&gt;&lt;span style="color: #993399;"&gt;1&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt; &lt;span style="color: #990000;"&gt;\&lt;/span&gt;
 &lt;span style="color: red;"&gt;}&lt;/span&gt;

&lt;span style="color: #009900;"&gt;int&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;main&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;void&lt;/span&gt;&lt;span style="color: #990000;"&gt;)&lt;/span&gt;
&lt;span style="color: red;"&gt;{&lt;/span&gt;
 LONG rv&lt;span style="color: #990000;"&gt;;&lt;/span&gt;

 SCARDCONTEXT hContext&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
 LPTSTR mszReaders&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
 SCARDHANDLE hCard&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
 DWORD dwReaders&lt;span style="color: #990000;"&gt;,&lt;/span&gt; dwActiveProtocol&lt;span style="color: #990000;"&gt;,&lt;/span&gt; dwRecvLength&lt;span style="color: #990000;"&gt;;&lt;/span&gt;

 SCARD_IO_REQUEST pioSendPci&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
 BYTE pbRecvBuffer&lt;span style="color: #990000;"&gt;[&lt;/span&gt;&lt;span style="color: #993399;"&gt;258&lt;/span&gt;&lt;span style="color: #990000;"&gt;];&lt;/span&gt;
 BYTE cmd1&lt;span style="color: #990000;"&gt;[]&lt;/span&gt; &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: red;"&gt;{&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0xA4&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x04&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x0A&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0xA0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
  &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x62&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x03&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x01&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x0C&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x06&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x01&lt;/span&gt; &lt;span style="color: red;"&gt;}&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
 BYTE cmd2&lt;span style="color: #990000;"&gt;[]&lt;/span&gt; &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: red;"&gt;{&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0x00&lt;/span&gt; &lt;span style="color: red;"&gt;}&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;

 &lt;span style="color: #009900;"&gt;unsigned&lt;/span&gt; &lt;span style="color: #009900;"&gt;int&lt;/span&gt; i&lt;span style="color: #990000;"&gt;;&lt;/span&gt;

 rv &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;SCardEstablishContext&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;SCARD_SCOPE_SYSTEM&lt;span style="color: #990000;"&gt;,&lt;/span&gt; NULL&lt;span style="color: #990000;"&gt;,&lt;/span&gt; NULL&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;hContext&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;CHECK&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"SCardEstablishContext"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; rv&lt;span style="color: #990000;"&gt;)&lt;/span&gt;

&lt;b&gt;&lt;span style="color: navy;"&gt;#ifdef&lt;/span&gt;&lt;/b&gt; SCARD_AUTOALLOCATE
 dwReaders &lt;span style="color: #990000;"&gt;=&lt;/span&gt; SCARD_AUTOALLOCATE&lt;span style="color: #990000;"&gt;;&lt;/span&gt;

 rv &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;SCardListReaders&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;hContext&lt;span style="color: #990000;"&gt;,&lt;/span&gt; NULL&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;LPTSTR&lt;span style="color: #990000;"&gt;)&amp;amp;&lt;/span&gt;mszReaders&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;dwReaders&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;CHECK&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"SCardListReaders"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; rv&lt;span style="color: #990000;"&gt;)&lt;/span&gt;
&lt;b&gt;&lt;span style="color: navy;"&gt;#else&lt;/span&gt;&lt;/b&gt;
 rv &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;SCardListReaders&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;hContext&lt;span style="color: #990000;"&gt;,&lt;/span&gt; NULL&lt;span style="color: #990000;"&gt;,&lt;/span&gt; NULL&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;dwReaders&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;CHECK&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"SCardListReaders"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; rv&lt;span style="color: #990000;"&gt;)&lt;/span&gt;

 mszReaders &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;calloc&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;dwReaders&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;sizeof&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;char&lt;/span&gt;&lt;span style="color: #990000;"&gt;));&lt;/span&gt;
 rv &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;SCardListReaders&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;hContext&lt;span style="color: #990000;"&gt;,&lt;/span&gt; NULL&lt;span style="color: #990000;"&gt;,&lt;/span&gt; mszReaders&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;dwReaders&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;CHECK&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"SCardListReaders"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; rv&lt;span style="color: #990000;"&gt;)&lt;/span&gt;
&lt;b&gt;&lt;span style="color: navy;"&gt;#endif&lt;/span&gt;&lt;/b&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;printf&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"reader name: %s&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; mszReaders&lt;span style="color: #990000;"&gt;);&lt;/span&gt;

 rv &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;SCardConnect&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;hContext&lt;span style="color: #990000;"&gt;,&lt;/span&gt; mszReaders&lt;span style="color: #990000;"&gt;,&lt;/span&gt; SCARD_SHARE_SHARED&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
  SCARD_PROTOCOL_T0 &lt;span style="color: #990000;"&gt;|&lt;/span&gt; SCARD_PROTOCOL_T1&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;hCard&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;dwActiveProtocol&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;CHECK&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"SCardConnect"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; rv&lt;span style="color: #990000;"&gt;)&lt;/span&gt;

 &lt;b&gt;&lt;span style="color: blue;"&gt;switch&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;dwActiveProtocol&lt;span style="color: #990000;"&gt;)&lt;/span&gt;
 &lt;span style="color: red;"&gt;{&lt;/span&gt;
  &lt;b&gt;&lt;span style="color: blue;"&gt;case&lt;/span&gt;&lt;/b&gt; SCARD_PROTOCOL_T0&lt;span style="color: #990000;"&gt;:&lt;/span&gt;
   pioSendPci &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;SCARD_PCI_T0&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
   &lt;b&gt;&lt;span style="color: blue;"&gt;break&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;

  &lt;b&gt;&lt;span style="color: blue;"&gt;case&lt;/span&gt;&lt;/b&gt; SCARD_PROTOCOL_T1&lt;span style="color: #990000;"&gt;:&lt;/span&gt;
   pioSendPci &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;SCARD_PCI_T1&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
   &lt;b&gt;&lt;span style="color: blue;"&gt;break&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
 &lt;span style="color: red;"&gt;}&lt;/span&gt;
 dwRecvLength &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;sizeof&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;pbRecvBuffer&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
 rv &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;SCardTransmit&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;hCard&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;pioSendPci&lt;span style="color: #990000;"&gt;,&lt;/span&gt; cmd1&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;sizeof&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;cmd1&lt;span style="color: #990000;"&gt;),&lt;/span&gt;
  NULL&lt;span style="color: #990000;"&gt;,&lt;/span&gt; pbRecvBuffer&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;dwRecvLength&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;CHECK&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"SCardTransmit"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; rv&lt;span style="color: #990000;"&gt;)&lt;/span&gt;

 &lt;b&gt;&lt;span style="color: black;"&gt;printf&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"response: "&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;i&lt;span style="color: #990000;"&gt;=&lt;/span&gt;&lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt; i&lt;span style="color: #990000;"&gt;&amp;lt;&lt;/span&gt;dwRecvLength&lt;span style="color: #990000;"&gt;;&lt;/span&gt; i&lt;span style="color: #990000;"&gt;++)&lt;/span&gt;
  &lt;b&gt;&lt;span style="color: black;"&gt;printf&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"%02X "&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; pbRecvBuffer&lt;span style="color: #990000;"&gt;[&lt;/span&gt;i&lt;span style="color: #990000;"&gt;]);&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;printf&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;

 dwRecvLength &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;sizeof&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;pbRecvBuffer&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
 rv &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;SCardTransmit&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;hCard&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;pioSendPci&lt;span style="color: #990000;"&gt;,&lt;/span&gt; cmd2&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;sizeof&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;cmd2&lt;span style="color: #990000;"&gt;),&lt;/span&gt;
  NULL&lt;span style="color: #990000;"&gt;,&lt;/span&gt; pbRecvBuffer&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #990000;"&gt;&amp;amp;&lt;/span&gt;dwRecvLength&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;CHECK&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"SCardTransmit"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; rv&lt;span style="color: #990000;"&gt;)&lt;/span&gt;

 &lt;b&gt;&lt;span style="color: black;"&gt;printf&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"response: "&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;i&lt;span style="color: #990000;"&gt;=&lt;/span&gt;&lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt; i&lt;span style="color: #990000;"&gt;&amp;lt;&lt;/span&gt;dwRecvLength&lt;span style="color: #990000;"&gt;;&lt;/span&gt; i&lt;span style="color: #990000;"&gt;++)&lt;/span&gt;
  &lt;b&gt;&lt;span style="color: black;"&gt;printf&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"%02X "&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; pbRecvBuffer&lt;span style="color: #990000;"&gt;[&lt;/span&gt;i&lt;span style="color: #990000;"&gt;]);&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;printf&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\n&lt;/span&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;

 rv &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;SCardDisconnect&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;hCard&lt;span style="color: #990000;"&gt;,&lt;/span&gt; SCARD_LEAVE_CARD&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;CHECK&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"SCardDisconnect"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; rv&lt;span style="color: #990000;"&gt;)&lt;/span&gt;

&lt;b&gt;&lt;span style="color: navy;"&gt;#ifdef&lt;/span&gt;&lt;/b&gt; SCARD_AUTOALLOCATE
 rv &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;SCardFreeMemory&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;hContext&lt;span style="color: #990000;"&gt;,&lt;/span&gt; mszReaders&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;CHECK&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"SCardFreeMemory"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; rv&lt;span style="color: #990000;"&gt;)&lt;/span&gt;

&lt;b&gt;&lt;span style="color: navy;"&gt;#else&lt;/span&gt;&lt;/b&gt;
 &lt;b&gt;&lt;span style="color: black;"&gt;free&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;mszReaders&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
&lt;b&gt;&lt;span style="color: navy;"&gt;#endif&lt;/span&gt;&lt;/b&gt;

 rv &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;SCardReleaseContext&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;hContext&lt;span style="color: #990000;"&gt;);&lt;/span&gt;

 &lt;b&gt;&lt;span style="color: black;"&gt;CHECK&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"SCardReleaseContext"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; rv&lt;span style="color: #990000;"&gt;)&lt;/span&gt;

 &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
&lt;span style="color: red;"&gt;}&lt;/span&gt;
&lt;/tt&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;h3&gt;
 Makefile&lt;/h3&gt;
&lt;pre&gt;# Linux
PCSC_CFLAGS := $(shell pkg-config --cflags libpcsclite)
LDFLAGS := $(shell pkg-config --libs libpcsclite)

# Mac OS X
#PCSC_CFLAGS := -framework PCSC

CFLAGS += $(PCSC_CFLAGS)

sample: sample.c

clean:
 rm -f sample&lt;/pre&gt;
&lt;br&gt;
&lt;h2&gt;
 Outputs&lt;/h2&gt;
The output is "&lt;tt&gt;Hello   world!&lt;/tt&gt;" which is in hex:&lt;br&gt;
&lt;br&gt;
&lt;pre&gt;&lt;span class="code_par"&gt;$ echo -n 'Hello world!' | xxd -g 1
0000000: 48 65 6c 6c 6f 20 77 6f 72 6c 64 21   Hello world!&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;h3&gt;
 GNU/Linux and Mac OS X&lt;/h3&gt;
&lt;pre&gt;reader name: Gemplus GemPC Twin 00 00
response: 90 00 
response: 48 65 6C 6C 6F 20 77 6F 72 6C 64 21 90 00&lt;/pre&gt;
&lt;br&gt;
&lt;h3&gt;
 Windows&lt;/h3&gt;
&lt;pre&gt;D:\Documents and Settings\lroussea\My Documents\Visual Studio 2008\Projects\
sample\Debug&amp;gt; sample.exe
reader name: Gemplus USB Smart Card Reader 0
response: 90 00
response: 48 65 6C 6C 6F 20 77 6F 72 6C 64 21 90 00&lt;/pre&gt;
&lt;br&gt;
&lt;h2&gt;
 Lessons learned&lt;/h2&gt;
&lt;h3&gt;
 Reader name&lt;/h3&gt;
The reader names are different on different plate forms. GNU/Linux and Mac OS X use the same PC/SC driver and the same (mostly) pcsc-lite so the name of an identical reader is the same. But Windows uses a different driver with a different PC/SC reader name.&lt;br&gt;
&lt;br&gt;
Do not use the PC/SC reader name to identify a specific reader if you want to be portable.&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;
 SCardTransmit&lt;/h3&gt;
&lt;tt&gt;pioRecvPci&lt;/tt&gt; argument may be NULL (as in the sample) but shall not be left uninitialised on Windows. Otherwise SCardTransmit returns an error &lt;tt&gt;0xE&lt;/tt&gt;. This error code does not look like a WinSCard error code and is not documented in the &lt;tt&gt;SCardTransmit()&lt;/tt&gt; API AFAIK.&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;
 UNICODE&lt;/h3&gt;
If UNICODE is defined under Windows then the reader name is in UTF-16 and not easy to manipulate in a &lt;i&gt;portable&lt;/i&gt; way. But I am not a Windows expert.&lt;br&gt;
&lt;br&gt;
Unix uses UTF-8 so the name is the same in ASCII and UTF-8.&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;
 SCARD_AUTOALLOCATE&lt;/h3&gt;
Mac OS X does not (yet) support memory (auto) allocation in the PC/SC layer. So you have to use a double call mechanism. One first call to get the size to allocate and one second call with a buffer allocated at the correct size.&lt;br&gt;
&lt;br&gt;
In the example the memory auto allocation is used to get the list of connected readers. We see here that the C language is very low level regarding memory allocation.&lt;br&gt;
&lt;br&gt;
Memory allocated by PC/SC has to be free-ed by PC/SC using &lt;tt&gt;SCardFreeMemory()&lt;/tt&gt;&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;
 PCSC framework&lt;/h3&gt;
Mac OS X uses Frameworks instead of classical Unix libraries. The difference (for our example) is the header files are not stored in &lt;tt&gt;/usr/include/&lt;/tt&gt; but in &lt;tt&gt;/System/Library/Frameworks/PCSC.framework/Headers/&lt;/tt&gt;. You do not specify the header path to the compiler using &lt;tt&gt;-Ipath&lt;/tt&gt; but use &lt;tt&gt;-framework PCSC&lt;/tt&gt; instead. The compiler (gcc) takes care to find and use the correct framework.&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;
 &lt;tt&gt;pcsc_stringify_error()&lt;/tt&gt;&lt;/h3&gt;
&lt;tt&gt;pcsc_stringify_error()&lt;/tt&gt; is a function specific to pcsc-lite. So we have to either not use it at all in a portable source code or re-implement a version on Windows. I decided to rewrite a limited version on Windows.&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;
 &lt;tt&gt;wintypes.h&lt;/tt&gt;&lt;/h3&gt;
Mac OS X does not use the exact same API definition than Windows or GNU/Linux for the WinSCard functions. Only standards types are used instead of Windows ones. For example:&lt;br&gt;
&lt;br&gt;
&lt;pre&gt;&lt;tt&gt;int32_t &lt;b&gt;&lt;span style="color: black;"&gt;SCardConnect&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;SCARDCONTEXT hContext&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        &lt;b&gt;&lt;span style="color: blue;"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #009900;"&gt;char&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;szReader&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        uint32_t dwShareMode&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        uint32_t dwPreferredProtocols&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        LPSCARDHANDLE phCard&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
        uint32_t &lt;span style="color: #990000;"&gt;*&lt;/span&gt;pdwActiveProtocol&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
&lt;/tt&gt;&lt;/pre&gt;
&lt;br&gt;
instead of&lt;br&gt;
&lt;br&gt;
&lt;pre&gt;&lt;tt&gt;LONG &lt;b&gt;&lt;span style="color: black;"&gt;SCardConnect&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;SCARDCONTEXT hContext&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
 LPCSTR szReader&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
 DWORD dwShareMode&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
 DWORD dwPreferredProtocols&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
 LPSCARDHANDLE phCard&lt;span style="color: #990000;"&gt;,&lt;/span&gt;
 LPDWORD pdwActiveProtocol&lt;span style="color: #990000;"&gt;);&lt;/span&gt;
&lt;/tt&gt;&lt;/pre&gt;
&lt;br&gt;
The advantage is that the types used on Mac OS X are clearly defined by &lt;a href="http://en.wikipedia.org/wiki/Inttypes.h"&gt;&lt;tt&gt;inttypes.h&lt;/tt&gt;&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
For example ULONG is defined as &lt;br&gt;
&lt;br&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;typedef&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #009900;"&gt;unsigned&lt;/span&gt; &lt;span style="color: #009900;"&gt;long&lt;/span&gt; ULONG&lt;span style="color: #990000;"&gt;;&lt;/span&gt;
&lt;/tt&gt;&lt;/pre&gt;
&lt;br&gt;
but the long type from the C-language is different on Windows and GNU/Linux.&lt;br&gt;
&lt;br&gt;
GNU/Linux (and Mac OS X) are LLP64 systems but Windows is a LP64 system. See &lt;a href="http://en.wikipedia.org/wiki/64-bit#Specific_data_models"&gt;64-bit&lt;/a&gt;. So on GNU/Linux a long is 64-bits on a 64-bits CPU and on Windows a long is 32-bits on a 64-bits CPU.&lt;br&gt;
&lt;br&gt;
To avoid problems Apple decided to explicitly fix the size using &lt;tt&gt;uint32_t&lt;/tt&gt;.&lt;br&gt;
&lt;br&gt;</description><category>C</category><category>pcsc-lite</category><guid>https://blog.apdu.fr/posts/2010/04/pcsc-sample-in-c/</guid><pubDate>Thu, 15 Apr 2010 16:16:00 GMT</pubDate></item></channel></rss>