title: Using SCardGetStatusChange to be notified of card insert/remove without polling
body: <p>I'm trying to detect when a card has been inserted into a reader.
  If I do a nasty polling loop like this:</p>
  
  <pre><code>      public struct SCARD_READERSTATE
          {
              [MarshalAs(UnmanagedType.LPWStr)]
              public string szReader;
              public byte[] pvUserData;
              public byte[] rgbAtr;
              public uint dwCurrentState;
              public uint dwEventState;
              public uint cbAtr;
          }
  
     byte[] atr = null;
     SCARD_READERSTATE[] rs = new SCARD_READERSTATE[1];
     rs[0].szReader = readersList[0];
     rs[0].dwCurrentState = SCARD_STATE_UNAWARE;
     rs[0].dwEventState = SCARD_STATE_PRESENT;
     int hctx = hContext.ToInt32();
     var cardResult = SCardGetStatusChange(hctx, 100, rs, 1);
     if (cardResult == 0 &amp;&amp; rs[0].cbAtr &gt; 0 &amp;&amp; rs[0].rgbAtr != null)
     {
         atr = new byte[rs[0].cbAtr];
         Array.Copy(rs[0].rgbAtr, atr, rs[0].cbAtr);
     }
  
    while ( (rs[0].dwCurrentState &amp; SCARD_STATE_PRESENT) == 0)
    {
         rs = new SCARD_READERSTATE[1];
         rs[0].szReader = readersList[0];
         //rs[0].dwCurrentState = SCARD_STATE_PRESENT;
         //rs[0].dwEventState = SCARD_STATE_PRESENT;
         SCardGetStatusChange(hctx, 100000000, rs, 1);
         System.Threading.Thread.Sleep(1000);
    }
  </code></pre>
  
  <p>it works, but it has a nasty thread sleep in it. Ideally I'd like to make a blocking call to SCardGetStatusChange on a background thread and then surface up the events.</p>
  
  <p>Apparently by setting the szReader to the value "\\?PnP?\Notification" it should block, as long as everything else in the struct is 0.</p>
  
  <p>I've changed the code to </p>
  
  <pre><code>   rs[0].szReader = "\\\\?PnP?\\Notification";
     rs[0].cbAtr = 0;
     rs[0].dwCurrentState = 0;
     rs[0].dwEventState = 0;
     rs[0].pvUserData = new byte[0];
     rs[0].rgbAtr = new byte0];
     SCardGetStatusChange(hctx, 100000000, rs, 1);
  </code></pre>
  
  <p>but it just returns a success result immediately. Can any pInvoke masters out there see what's wrong?</p>