Windows System Software -- Consulting, Training, Development -- Unique Expertise, Guaranteed Results

Before Posting... Please check out the Community Guidelines in the
Announcements and Administration Category, below.

SCardListReader, SCardConnect

OSR_Community_UserOSR_Community_User Posts: 110,218
Hi experts,

I try to develop a kmdf smart card driver.

Actually my driver is seen as a smart card driver from the device manager.

Now, from an application, I'd like to correctly enumerate this driver with the SCardListReaders function and to connect to it with ScardConnect.

But I don't know the requirements (name format, registry, ...).

By using SCardIntroduceReader and NULL as context in SCardListReader, ok it works. But I'm not sure that I have to use the SCardIntroduceReader function. The documentation says that it's used just to rename a reader... Anyway, the SCardConnect fails after.

In the sample provided by Microsoft (PCMCIA Smart Card driver), this function is not used.

I think the SCardListReader checks this registry key : HKLM\SOFTWARE\Microsoft\Cryptography\Calais\Reader\

Documentation (link below) says that there are two names to define but how and where ? with SmartcardCreateLink function ?

https://docs.microsoft.com/en-us/windows-hardware/drivers/smartcard/wdm-device-names-for-smart-card-readers

Thanks in advance for your time.

Comments

  • Tim_RobertsTim_Roberts Posts: 12,567
    xxxxx@hotmail.com wrote:
    > ...
    > Now, from an application, I'd like to correctly enumerate this driver with the SCardListReaders function and to connect to it with ScardConnect.
    >
    > But I don't know the requirements (name format, registry, ...).
    >
    > By using SCardIntroduceReader and NULL as context in SCardListReader, ok it works. But I'm not sure that I have to use the SCardIntroduceReader function. The documentation says that it's used just to rename a reader... Anyway, the SCardConnect fails after.
    >
    > In the sample provided by Microsoft (PCMCIA Smart Card driver), this function is not used.
    > I think the SCardListReader checks this registry key : HKLM\SOFTWARE\Microsoft\Cryptography\Calais\Reader\
    > Documentation (link below) says that there are two names to define but how and where ? with SmartcardCreateLink function ?

    The documentation seems pretty clear.  You must have a device name that
    ends with a number.  Are you calling WdfDeviceInitAssignName?  Then, you
    must pass that name to SmartcardCreateLink so it can create the symbolic
    that SCardListReader can access.  Are you calling SmartcardCreateLink?

    --
    Tim Roberts, xxxxx@probo.com
    Providenza & Boekelheide, Inc.

    Tim Roberts, [email protected]
    Providenza & Boekelheide, Inc.

  • OSR_Community_UserOSR_Community_User Posts: 110,218
    Thanks for your reply.

    I didn't know WdfDeviceInitAssignName.

    I try this on the AddDevice routine but SCardListReaders return nothing even with NULL as context:

    UNICODE_STRING deviceName;
    wchar_t* name = L"\\DosDevices\\SCReader0";

    status = RtlUnicodeStringInit(&deviceName, name);

    if (!NT_SUCCESS(status)) {

    status = WdfDeviceInitAssignName(DeviceInit, &deviceName);

    if (!NT_SUCCESS(status)) {
    PUNICODE_STRING LinkName = NULL;
    status = SmartcardCreateLink(LinkName, &deviceName);
    }
    }

    Should I use a AddReg in the .inf file to write something in the registry ?
  • OSR_Community_UserOSR_Community_User Posts: 110,218
    sorry, without the "!"

    UNICODE_STRING deviceName;
    wchar_t* name = L"\\DosDevices\\SCReader0";

    status = RtlUnicodeStringInit(&deviceName, name);

    if (NT_SUCCESS(status)) {

    status = WdfDeviceInitAssignName(DeviceInit, &deviceName);

    if (NT_SUCCESS(status)) {
    PUNICODE_STRING LinkName = NULL;
    status = SmartcardCreateLink(LinkName, &deviceName);
    }
    }

    But it doesn't work.
  • Doron_HolanDoron_Holan Posts: 10,353
    You probably want

    wchar_t* name = L"\\Devicr\\SCReader0"

    DosDevices is usually used for the symbolic link name

    d

    Bent from my phone

    ________________________________
    From: 30141712100n behalf of
    Sent: Saturday, June 16, 2018 4:44 PM
    To: Windows System Software Devs Interest List
    Subject: RE:[ntdev] SCardListReader, SCardConnect

    sorry, without the "!"

    UNICODE_STRING deviceName;
    wchar_t* name = L"\\DosDevices\\SCReader0";

    status = RtlUnicodeStringInit(&deviceName, name);

    if (NT_SUCCESS(status)) {

    status = WdfDeviceInitAssignName(DeviceInit, &deviceName);

    if (NT_SUCCESS(status)) {
    PUNICODE_STRING LinkName = NULL;
    status = SmartcardCreateLink(LinkName, &deviceName);
    }
    }

    But it doesn't work.

    ---
    NTDEV is sponsored by OSR

    Visit the list online at:

    MONTHLY seminars on crash dump analysis, WDF, Windows internals and software drivers!
    Details at

    To unsubscribe, visit the List Server section of OSR Online at
  • Tim_RobertsTim_Roberts Posts: 12,567
    On Jun 16, 2018, at 1:43 PM, xxxxx@hotmail.com <xxxxx@lists.osr.com> wrote:
    >
    > UNICODE_STRING deviceName;
    > wchar_t* name = L"\\DosDevices\\SCReader0";

    Device, not DosDevices. The SmartcardCreateLink documentation talks about that.


    > status = RtlUnicodeStringInit(&deviceName, name);
    >
    > if (NT_SUCCESS(status)) {
    >
    > status = WdfDeviceInitAssignName(DeviceInit, &deviceName);
    >
    > if (NT_SUCCESS(status)) {
    > PUNICODE_STRING LinkName = NULL;
    > status = SmartcardCreateLink(LinkName, &deviceName);
    > }
    > }

    That sequence won't work. All of the WdfDeviceInit calls have to be made before you call WdfDeviceCreate, but SmartcardCreateLink has to be called after the device is created.

    Tim Roberts, xxxxx@probo.com
    Providenza & Boekelheide, Inc.

    Tim Roberts, [email protected]
    Providenza & Boekelheide, Inc.

  • OSR_Community_UserOSR_Community_User Posts: 110,218
    Thanks for your reply.

    I try this without success. Driver is installed but I can't enumerate it with SCardListReaders:

    UNICODE_STRING deviceName;
    wchar_t* name = L"\\Device\\SCReader0";

    status = RtlUnicodeStringInit(&deviceName, name);

    if (NT_SUCCESS(status)) {
    status = WdfDeviceInitAssignName(DeviceInit, &deviceName);

    if (NT_SUCCESS(status)) {
    status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device);

    if (NT_SUCCESS(status)) {
    UNICODE_STRING linkName;
    status = SmartcardCreateLink(&linkName, &deviceName);

    ....
    }
    }
    }

    It doens't create an entry in HKLM\SOFTWARE\Microsoft\Cryptography\Calais\Reader\.

    deviceName shouldn't be the same as VENDOR_NAME + IFD_TYPE + UNIT_NO ?
    These fields belong to _SMARTCARD_EXTENSION structure.
  • OSR_Community_UserOSR_Community_User Posts: 110,218
    I specify that it's a virtual smart card reader. I'll use a wearable like a smart card over bluetooth low energy.

    So I don't use any bus, like USB, PCMCIA, ...
  • Tim_RobertsTim_Roberts Posts: 12,567
    On Jun 17, 2018, at 8:43 AM, xxxxx@hotmail.com <xxxxx@lists.osr.com> wrote:
    >
    > I specify that it's a virtual smart card reader. I'll use a wearable like a smart card over bluetooth low energy.
    >
    > So I don't use any bus, like USB, PCMCIA, ...

    Sure there is -- your bus is Bluetooth. Right?

    Tim Roberts, xxxxx@probo.com
    Providenza & Boekelheide, Inc.

    Tim Roberts, [email protected]
    Providenza & Boekelheide, Inc.

  • OSR_Community_UserOSR_Community_User Posts: 110,218
    Yes Bluetooth Low Energy provided by Bluegiga USB dongle. I have a Windows service to manage the communication between dongle and wearable.
Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!