Question about PC/SC reader driver.

I am now developing a PC/SC compatible virtual smart card reader driver.

I am developing by Windows DDK 2003 and XP. I want it plug and play, so I use the Toaster Bus which was provided by the DDK sample as its underlying bus device. I made it by combining the Toaster(incomplete1) function driver and the PSCR smart card reader driver which are both from the DDK samples.

Now, I have a problem. I build and install the virtual smart card reader driver. After that the Device Manager can display a “Virtual Smart Card Reader” working. But it seems that the Smart Card Resource Manager can’t recognize it, because when I use SCardListReaders to list the readers, the virtual reader hasn’t come up.

Above is the debug information when the device was pluged in.

VSCR: ===DriverEntry() on Oct 9 2007 at 13:49:30
VSCR: +++AddDevice()
VSCR: SmartcardInitialize() called with status=STATUS_SUCCESS
VSCR: —AddDevice() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_LEGACY_BUS_INFORMATION
VSCR: —Pnp() STATUS_NOT_SUPPORTED
VSCR: +++Pnp() MinorFunction=IRP_MN_FILTER_RESOURCE_REQUIREMENTS
VSCR: —Pnp() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_INTERFACE
VSCR: —Pnp() STATUS_NOT_SUPPORTED
VSCR: +++Pnp() MinorFunction=IRP_MN_START_DEVICE
VSCR: +++StartDevice()
VSCR: —StartDevice() STATUS_SUCCESS
VSCR: —Pnp() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_CAPABILITIES
VSCR: —Pnp() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_PNP_DEVICE_STATE
VSCR: —Pnp() STATUS_NOT_SUPPORTED
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_DEVICE_RELATIONS
VSCR: —Pnp() STATUS_NOT_SUPPORTED

* All the driver has received were Pnp irps, why?

I have summarize all the requirments that a PC/SC smart card reader driver needs which I can think up:

In AddDevice():
(1) Define a SMARTCARD_EXTENSION member structure in the DEVICE_EXTENSION.
(2) Initialize Version, SmartcardRequest.BufferSize and SmartcardReply.BufferSize of SmartcardExtension and call SmartcardInitlize() to alloc buffer for SMLIB.
(3) Initlize VendorAttr and ReaderCapabilities member of SmartcardExtension. The VendorAttr.VendorName, VendorAttr.IfdType and VendorAttr.UnitNo must be set to proper values.
(4) Setup SMLIB callback functions, in which RDF_CARD_POWER, RDF_TRANSMIT, RDF_CARD_TRACKING and RDF_SET_PROTOCOL are mandatory.
(5) OsData->DeviceObject must be set to DeviceObject.
(6) Call IoRegisterDeviceInterface() to register a interface for the device with SmartCardReaderGuid.

In INF File:
(1) In [Version] section, “Class” must equal “SmartCardReader” and “ClassGuid” must be “{50DD5230-BA8A-11D1-BF5D-0000F805F530}”.
(2) Do I need to add an item into registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\Readers with a device key named “VenderName IfdType UnitNo” which corresponding with the values in SmartcardExtension.VendorAttr.

In SMLIB callback functions:
(1) In CBCardPower() when SmartcardExtension->MinorIoControlCode equals SCARD_COLD_RESET or SCARD_WARM_RESET, fill the SmartcardExtension->IoRequest.ReplyBuffer with ATR which was fetched from card. Then copy ATR to SmartcardExtension->CardCapabilities.ATR and call SmartcardUpdateCardCapablities() to inform the SMLIB.

* Is there anything I have ignored or misunderstood?

I am beginner with driver developing. Any reply will be appreciated.

You don’t need the toaster bus to simulate pnp. You can just install your driver as a root enumerated device (which, BTW, is what you did to install the toaster bus). To do this you can just run “Devcon install ” (Again, just like you did for toaster bus). Once you do this there is no need to run enum.exe to enumerate your device.

Did you also call IoSetDeviceInterfaceState? If not, this is the trigger that enables the interface, registering it is not enough

d

-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of xxxxx@msn.com
Sent: Tuesday, October 09, 2007 5:16 PM
To: Windows System Software Devs Interest List
Subject: [ntdev] Question about PC/SC reader driver.

I am now developing a PC/SC compatible virtual smart card reader driver.

I am developing by Windows DDK 2003 and XP. I want it plug and play, so I use the Toaster Bus which was provided by the DDK sample as its underlying bus device. I made it by combining the Toaster(incomplete1) function driver and the PSCR smart card reader driver which are both from the DDK samples.

Now, I have a problem. I build and install the virtual smart card reader driver. After that the Device Manager can display a “Virtual Smart Card Reader” working. But it seems that the Smart Card Resource Manager can’t recognize it, because when I use SCardListReaders to list the readers, the virtual reader hasn’t come up.

Above is the debug information when the device was pluged in.

VSCR: ===DriverEntry() on Oct 9 2007 at 13:49:30
VSCR: +++AddDevice()
VSCR: SmartcardInitialize() called with status=STATUS_SUCCESS
VSCR: —AddDevice() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_LEGACY_BUS_INFORMATION
VSCR: —Pnp() STATUS_NOT_SUPPORTED
VSCR: +++Pnp() MinorFunction=IRP_MN_FILTER_RESOURCE_REQUIREMENTS
VSCR: —Pnp() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_INTERFACE
VSCR: —Pnp() STATUS_NOT_SUPPORTED
VSCR: +++Pnp() MinorFunction=IRP_MN_START_DEVICE
VSCR: +++StartDevice()
VSCR: —StartDevice() STATUS_SUCCESS
VSCR: —Pnp() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_CAPABILITIES
VSCR: —Pnp() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_PNP_DEVICE_STATE
VSCR: —Pnp() STATUS_NOT_SUPPORTED
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_DEVICE_RELATIONS
VSCR: —Pnp() STATUS_NOT_SUPPORTED

* All the driver has received were Pnp irps, why?

I have summarize all the requirments that a PC/SC smart card reader driver needs which I can think up:

In AddDevice():
(1) Define a SMARTCARD_EXTENSION member structure in the DEVICE_EXTENSION.
(2) Initialize Version, SmartcardRequest.BufferSize and SmartcardReply.BufferSize of SmartcardExtension and call SmartcardInitlize() to alloc buffer for SMLIB.
(3) Initlize VendorAttr and ReaderCapabilities member of SmartcardExtension. The VendorAttr.VendorName, VendorAttr.IfdType and VendorAttr.UnitNo must be set to proper values.
(4) Setup SMLIB callback functions, in which RDF_CARD_POWER, RDF_TRANSMIT, RDF_CARD_TRACKING and RDF_SET_PROTOCOL are mandatory.
(5) OsData->DeviceObject must be set to DeviceObject.
(6) Call IoRegisterDeviceInterface() to register a interface for the device with SmartCardReaderGuid.

In INF File:
(1) In [Version] section, “Class” must equal “SmartCardReader” and “ClassGuid” must be “{50DD5230-BA8A-11D1-BF5D-0000F805F530}”.
(2) Do I need to add an item into registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\Readers with a device key named “VenderName IfdType UnitNo” which corresponding with the values in SmartcardExtension.VendorAttr.

In SMLIB callback functions:
(1) In CBCardPower() when SmartcardExtension->MinorIoControlCode equals SCARD_COLD_RESET or SCARD_WARM_RESET, fill the SmartcardExtension->IoRequest.ReplyBuffer with ATR which was fetched from card. Then copy ATR to SmartcardExtension->CardCapabilities.ATR and call SmartcardUpdateCardCapablities() to inform the SMLIB.

* Is there anything I have ignored or misunderstood?

I am beginner with driver developing. Any reply will be appreciated.


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer

Doron, thank you for help!

I have enable the interface in the Pnp dispatcher routine. Here is the code:

NTSTATUS
VscrStartDevice (
IN PDEVICE_EXTENSION pDevExt,
IN PIRP Irp
)
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION stack;

VscrDebugPrint(TRACE, “+++StartDevice()\n”);

stack = IoGetCurrentIrpStackLocation (Irp);

status = IoSetDeviceInterfaceState(&pDevExt->InterfaceName, TRUE);

if (!NT_SUCCESS (status))
{
goto CLEAN_UP;
}

SET_NEW_PNP_STATE(pDevExt, Started);

VscrDebugPrint(TRACE, “—StartDevice() %s\n”, OsrNTStatusToString(status));
return status;

CLEAN_UP:

VscrDebugPrint(ERROR, “!!!StartDevice() %s\n”, OsrNTStatusToString(status));
return status;
}

NTSTATUS
VscrPnp (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
PDEVICE_EXTENSION pDevExt;
PIO_STACK_LOCATION stack;
NTSTATUS status = STATUS_SUCCESS;
ULONG requestCount;
PPNP_DEVICE_STATE deviceState;
BOOLEAN deviceRemoved = FALSE;

pDevExt = DeviceObject->DeviceExtension;

stack = IoGetCurrentIrpStackLocation (Irp);

VscrDebugPrint(TRACE, “+++Pnp() MinorFunction=%s \n”, PnpMN2String(stack->MinorFunction));

status = SmartcardAcquireRemoveLock(&pDevExt->SmartcardExtension);

if (!NT_SUCCESS(status))
{
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}

switch (stack->MinorFunction)
{
case IRP_MN_START_DEVICE:

status = VscrSendIrpSynchronously(pDevExt->AttachedDO, Irp);

if (!NT_SUCCESS (status))
{
VscrDebugPrint(WARNING, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}

status = VscrStartDevice (pDevExt, Irp);

Irp->IoStatus.Status = status;

IoCompleteRequest (Irp, IO_NO_INCREMENT);

break;

case IRP_MN_QUERY_STOP_DEVICE:

SET_NEW_PNP_STATE(pDevExt, StopPending);

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;

case IRP_MN_CANCEL_STOP_DEVICE:

status = VscrSendIrpSynchronously(pDevExt->AttachedDO,Irp);

if(!NT_SUCCESS(status))
{
VscrDebugPrint(WARNING, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}

RESTORE_PREVIOUS_PNP_STATE(pDevExt);

Irp->IoStatus.Status = status;

IoCompleteRequest (Irp, IO_NO_INCREMENT);

break;

case IRP_MN_STOP_DEVICE:

SET_NEW_PNP_STATE(pDevExt, Stopped);

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;

case IRP_MN_QUERY_REMOVE_DEVICE:

SET_NEW_PNP_STATE(pDevExt, RemovePending);

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;

case IRP_MN_CANCEL_REMOVE_DEVICE:

status = VscrSendIrpSynchronously(pDevExt->AttachedDO,Irp);

if(!NT_SUCCESS(status))
{
VscrDebugPrint(WARNING, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}

RESTORE_PREVIOUS_PNP_STATE(pDevExt);

Irp->IoStatus.Status = status;

IoCompleteRequest (Irp, IO_NO_INCREMENT);

break;

case IRP_MN_SURPRISE_REMOVAL:

SET_NEW_PNP_STATE(pDevExt, SurpriseRemovePending);

status = IoSetDeviceInterfaceState(&pDevExt->InterfaceName, FALSE);

if (!NT_SUCCESS (status))
{
VscrDebugPrint(ERROR, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;

case IRP_MN_REMOVE_DEVICE:

SET_NEW_PNP_STATE(pDevExt, Deleted);

if(SurpriseRemovePending != pDevExt->PreviousPnPState)
{
status = IoSetDeviceInterfaceState(&pDevExt->InterfaceName, FALSE);

if (!NT_SUCCESS (status))
{
VscrDebugPrint(ERROR, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}
}

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

//DeleteDevice
VscrDeleteDevice(DeviceObject);

deviceRemoved = TRUE;

break;

default:
IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;
}

if (deviceRemoved == FALSE)
{
SmartcardReleaseRemoveLock(&pDevExt->SmartcardExtension);
}

VscrDebugPrint(TRACE, “—Pnp() %s\n”, OsrNTStatusToString(status));

return status;
}

Today, when I checked the system’s event log, it says “Smart Card Resource Manager failed to add the reader: \?{B85B7C50-6A01-11d2-B841-00C04FAD5171}#MsToaster#1&1aafb3d5&2&01#{50dd5230-ba8a-11d1-bf5d-0000f805f530}”

Did you add support for IRP_MJ_CREATE?

-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of xxxxx@msn.com
Sent: Wednesday, October 10, 2007 9:42 AM
To: Windows System Software Devs Interest List
Subject: RE:[ntdev] Question about PC/SC reader driver.

Doron, thank you for help!

I have enable the interface in the Pnp dispatcher routine. Here is the code:

NTSTATUS
VscrStartDevice (
IN PDEVICE_EXTENSION pDevExt,
IN PIRP Irp
)
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION stack;

VscrDebugPrint(TRACE, “+++StartDevice()\n”);

stack = IoGetCurrentIrpStackLocation (Irp);

status = IoSetDeviceInterfaceState(&pDevExt->InterfaceName, TRUE);

if (!NT_SUCCESS (status))
{
goto CLEAN_UP;
}

SET_NEW_PNP_STATE(pDevExt, Started);

VscrDebugPrint(TRACE, “—StartDevice() %s\n”, OsrNTStatusToString(status));
return status;

CLEAN_UP:

VscrDebugPrint(ERROR, “!!!StartDevice() %s\n”, OsrNTStatusToString(status));
return status;
}

NTSTATUS
VscrPnp (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
PDEVICE_EXTENSION pDevExt;
PIO_STACK_LOCATION stack;
NTSTATUS status = STATUS_SUCCESS;
ULONG requestCount;
PPNP_DEVICE_STATE deviceState;
BOOLEAN deviceRemoved = FALSE;

pDevExt = DeviceObject->DeviceExtension;

stack = IoGetCurrentIrpStackLocation (Irp);

VscrDebugPrint(TRACE, “+++Pnp() MinorFunction=%s \n”, PnpMN2String(stack->MinorFunction));

status = SmartcardAcquireRemoveLock(&pDevExt->SmartcardExtension);

if (!NT_SUCCESS(status))
{
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}

switch (stack->MinorFunction)
{
case IRP_MN_START_DEVICE:

status = VscrSendIrpSynchronously(pDevExt->AttachedDO, Irp);

if (!NT_SUCCESS (status))
{
VscrDebugPrint(WARNING, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}

status = VscrStartDevice (pDevExt, Irp);

Irp->IoStatus.Status = status;

IoCompleteRequest (Irp, IO_NO_INCREMENT);

break;

case IRP_MN_QUERY_STOP_DEVICE:

SET_NEW_PNP_STATE(pDevExt, StopPending);

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;

case IRP_MN_CANCEL_STOP_DEVICE:

status = VscrSendIrpSynchronously(pDevExt->AttachedDO,Irp);

if(!NT_SUCCESS(status))
{
VscrDebugPrint(WARNING, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}

RESTORE_PREVIOUS_PNP_STATE(pDevExt);

Irp->IoStatus.Status = status;

IoCompleteRequest (Irp, IO_NO_INCREMENT);

break;

case IRP_MN_STOP_DEVICE:

SET_NEW_PNP_STATE(pDevExt, Stopped);

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;

case IRP_MN_QUERY_REMOVE_DEVICE:

SET_NEW_PNP_STATE(pDevExt, RemovePending);

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;

case IRP_MN_CANCEL_REMOVE_DEVICE:

status = VscrSendIrpSynchronously(pDevExt->AttachedDO,Irp);

if(!NT_SUCCESS(status))
{
VscrDebugPrint(WARNING, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}

RESTORE_PREVIOUS_PNP_STATE(pDevExt);

Irp->IoStatus.Status = status;

IoCompleteRequest (Irp, IO_NO_INCREMENT);

break;

case IRP_MN_SURPRISE_REMOVAL:

SET_NEW_PNP_STATE(pDevExt, SurpriseRemovePending);

status = IoSetDeviceInterfaceState(&pDevExt->InterfaceName, FALSE);

if (!NT_SUCCESS (status))
{
VscrDebugPrint(ERROR, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;

case IRP_MN_REMOVE_DEVICE:

SET_NEW_PNP_STATE(pDevExt, Deleted);

if(SurpriseRemovePending != pDevExt->PreviousPnPState)
{
status = IoSetDeviceInterfaceState(&pDevExt->InterfaceName, FALSE);

if (!NT_SUCCESS (status))
{
VscrDebugPrint(ERROR, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}
}

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

//DeleteDevice
VscrDeleteDevice(DeviceObject);

deviceRemoved = TRUE;

break;

default:
IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;
}

if (deviceRemoved == FALSE)
{
SmartcardReleaseRemoveLock(&pDevExt->SmartcardExtension);
}

VscrDebugPrint(TRACE, “—Pnp() %s\n”, OsrNTStatusToString(status));

return status;
}

Today, when I checked the system’s event log, it says “Smart Card Resource Manager failed to add the reader: \?{B85B7C50-6A01-11d2-B841-00C04FAD5171}#MsToaster#1&1aafb3d5&2&01#{50dd5230-ba8a-11d1-bf5d-0000f805f530}”


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer

Yes, here is the code of handler for IRP_MJ_CREATE. Is there anything wrong?
NTSTATUSVscrCreate ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ){ PDEVICE_EXTENSION pDevExt;
PAGED_CODE();
pDevExt = DeviceObject->DeviceExtension;
VscrDebugPrint(TRACE, “===Create()\n”);
if (Deleted == pDevExt->DevicePnPState) { Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return STATUS_NO_SUCH_DEVICE; }
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;}

From: xxxxx@microsoft.com> To: xxxxx@lists.osr.com> Date: Wed, 10 Oct 2007 09:53:15 -0700> Subject: RE: RE:[ntdev] Question about PC/SC reader driver.> > Did you add support for IRP_MJ_CREATE?> > -----Original Message-----> From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of xxxxx@msn.com> Sent: Wednesday, October 10, 2007 9:42 AM> To: Windows System Software Devs Interest List> Subject: RE:[ntdev] Question about PC/SC reader driver.> > Doron, thank you for help!> > I have enable the interface in the Pnp dispatcher routine. Here is the code:> > NTSTATUS> VscrStartDevice (> IN PDEVICE_EXTENSION pDevExt,> IN PIRP Irp> )> {> NTSTATUS status = STATUS_SUCCESS;> PIO_STACK_LOCATION stack;> > VscrDebugPrint(TRACE, “+++StartDevice()\n”);> > stack = IoGetCurrentIrpStackLocation (Irp);> > status = IoSetDeviceInterfaceState(&pDevExt->InterfaceName, TRUE);> > if (!NT_SUCCESS (status))> {> goto CLEAN_UP;> }> > SET_NEW_PNP_STATE(pDevExt, Started);> > VscrDebugPrint(TRACE, “—StartDevice() %s\n”, OsrNTStatusToString(status));> return status;> > CLEAN_UP:> > VscrDebugPrint(ERROR, “!!!StartDevice() %s\n”, OsrNTStatusToString(status));> return status;> }> > NTSTATUS> VscrPnp (> IN PDEVICE_OBJECT DeviceObject,> IN PIRP Irp> )> {> PDEVICE_EXTENSION pDevExt;> PIO_STACK_LOCATION stack;> NTSTATUS status = STATUS_SUCCESS;> ULONG requestCount;> PPNP_DEVICE_STATE deviceState;> BOOLEAN deviceRemoved = FALSE;> > pDevExt = DeviceObject->DeviceExtension;> > stack = IoGetCurrentIrpStackLocation (Irp);> > VscrDebugPrint(TRACE, “+++Pnp() MinorFunction=%s \n”, PnpMN2String(stack->MinorFunction));> > status = SmartcardAcquireRemoveLock(&pDevExt->SmartcardExtension);> > if (!NT_SUCCESS(status))> {> Irp->IoStatus.Information = 0;> Irp->IoStatus.Status = status;> IoCompleteRequest(Irp, IO_NO_INCREMENT);> return status;> }> > switch (stack->MinorFunction)> {> case IRP_MN_START_DEVICE:> > status = VscrSendIrpSynchronously(pDevExt->AttachedDO, Irp);> > if (!NT_SUCCESS (status))> {> VscrDebugPrint(WARNING, “!!!Pnp() %s\n”, OsrNTStatusToString(status));> }> > status = VscrStartDevice (pDevExt, Irp);> > Irp->IoStatus.Status = status;> > IoCompleteRequest (Irp, IO_NO_INCREMENT);> > break;> > case IRP_MN_QUERY_STOP_DEVICE:> > SET_NEW_PNP_STATE(pDevExt, StopPending);> > Irp->IoStatus.Status = STATUS_SUCCESS;> > IoSkipCurrentIrpStackLocation (Irp);> > status = IoCallDriver (pDevExt->AttachedDO, Irp);> > break;> > case IRP_MN_CANCEL_STOP_DEVICE:> > status = VscrSendIrpSynchronously(pDevExt->AttachedDO,Irp);> > if(!NT_SUCCESS(status))> {> VscrDebugPrint(WARNING, “!!!Pnp() %s\n”, OsrNTStatusToString(status));> }> > RESTORE_PREVIOUS_PNP_STATE(pDevExt);> > Irp->IoStatus.Status = status;> > IoCompleteRequest (Irp, IO_NO_INCREMENT);> > break;> > case IRP_MN_STOP_DEVICE:> > SET_NEW_PNP_STATE(pDevExt, Stopped);> > Irp->IoStatus.Status = STATUS_SUCCESS;> > IoSkipCurrentIrpStackLocation (Irp);> > status = IoCallDriver (pDevExt->AttachedDO, Irp);> > break;> > case IRP_MN_QUERY_REMOVE_DEVICE:> > SET_NEW_PNP_STATE(pDevExt, RemovePending);> > Irp->IoStatus.Status = STATUS_SUCCESS;> > IoSkipCurrentIrpStackLocation (Irp);> > status = IoCallDriver (pDevExt->AttachedDO, Irp);> > break;> > case IRP_MN_CANCEL_REMOVE_DEVICE:> > status = VscrSendIrpSynchronously(pDevExt->AttachedDO,Irp);> > if(!NT_SUCCESS(status))> {> VscrDebugPrint(WARNING, “!!!Pnp() %s\n”, OsrNTStatusToString(status));> }> > RESTORE_PREVIOUS_PNP_STATE(pDevExt);> > Irp->IoStatus.Status = status;> > IoCompleteRequest (Irp, IO_NO_INCREMENT);> > break;> > case IRP_MN_SURPRISE_REMOVAL:> > SET_NEW_PNP_STATE(pDevExt, SurpriseRemovePending);> > status = IoSetDeviceInterfaceState(&pDevExt->InterfaceName, FALSE);> > if (!NT_SUCCESS (status))> {> VscrDebugPrint(ERROR, “!!!Pnp() %s\n”, OsrNTStatusToString(status));> }> > Irp->IoStatus.Status = STATUS_SUCCESS;> > IoSkipCurrentIrpStackLocation (Irp);> > status = IoCallDriver (pDevExt->AttachedDO, Irp);> > break;> > case IRP_MN_REMOVE_DEVICE:> > SET_NEW_PNP_STATE(pDevExt, Deleted);> > if(SurpriseRemovePending != pDevExt->PreviousPnPState)> {> status = IoSetDeviceInterfaceState(&pDevExt->InterfaceName, FALSE);> > if (!NT_SUCCESS (status))> {> VscrDebugPrint(ERROR, “!!!Pnp() %s\n”, OsrNTStatusToString(status));> }> }> > Irp->IoStatus.Status = STATUS_SUCCESS;> > IoSkipCurrentIrpStackLocation (Irp);> > status = IoCallDriver (pDevExt->AttachedDO, Irp);> > //DeleteDevice> VscrDeleteDevice(DeviceObject);> > deviceRemoved = TRUE;> > break;> > default:> IoSkipCurrentIrpStackLocation (Irp);> > status = IoCallDriver (pDevExt->AttachedDO, Irp);> > break;> }> > if (deviceRemoved == FALSE)> {> SmartcardReleaseRemoveLock(&pDevExt->SmartcardExtension);> }> > VscrDebugPrint(TRACE, “—Pnp() %s\n”, OsrNTStatusToString(status));> > return status;> }> > Today, when I checked the system’s event log, it says “Smart Card Resource Manager failed to add the reader: \?{B85B7C50-6A01-11d2-B841-00C04FAD5171}#MsToaster#1&1aafb3d5&2&01#{50dd5230-ba8a-11d1-bf5d-0000f805f530}”> > —> NTDEV is sponsored by OSR> > For our schedule of WDF, WDM, debugging and other seminars visit:> http://www.osr.com/seminars\> > To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer\> > —> NTDEV is sponsored by OSR> > For our schedule of WDF, WDM, debugging and other seminars visit: > http://www.osr.com/seminars\> > To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer


ÊÖ»úÒ²ÄÜÉÏ MSN ÁÄÌìÁË£¬¿ìÀ´ÊÔÊÔ°É£¡
http://mobile.msn.com.cn/

Is VscrCreate being called?

From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of ???
Sent: Wednesday, October 10, 2007 10:05 AM
To: Windows System Software Devs Interest List
Subject: RE: [ntdev] Question about PC/SC reader driver.

Yes, here is the code of handler for IRP_MJ_CREATE. Is there anything wrong?

NTSTATUS
VscrCreate (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
PDEVICE_EXTENSION pDevExt;
PAGED_CODE();
pDevExt = DeviceObject->DeviceExtension;
VscrDebugPrint(TRACE, “===Create()\n”);
if (Deleted == pDevExt->DevicePnPState)
{
Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return STATUS_NO_SUCH_DEVICE;
}
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}

From: xxxxx@microsoft.com
To: xxxxx@lists.osr.com
Date: Wed, 10 Oct 2007 09:53:15 -0700
Subject: RE: RE:[ntdev] Question about PC/SC reader driver.

Did you add support for IRP_MJ_CREATE?

-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of xxxxx@msn.com
Sent: Wednesday, October 10, 2007 9:42 AM
To: Windows System Software Devs Interest List
Subject: RE:[ntdev] Question about PC/SC reader driver.

Doron, thank you for help!

I have enable the interface in the Pnp dispatcher routine. Here is the code:

NTSTATUS
VscrStartDevice (
IN PDEVICE_EXTENSION pDevExt,
IN PIRP Irp
)
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION stack;

VscrDebugPrint(TRACE, “+++StartDevice()\n”);

stack = IoGetCurrentIrpStackLocation (Irp);

status = IoSetDeviceInterfaceState(&pDevExt->InterfaceName, TRUE);

if (!NT_SUCCESS (status))
{
goto CLEAN_UP;
}

SET_NEW_PNP_STATE(pDevExt, Started);

VscrDebugPrint(TRACE, “—StartDevice() %s\n”, OsrNTStatusToString(status));
return status;

CLEAN_UP:

VscrDebugPrint(ERROR, “!!!StartDevice() %s\n”, OsrNTStatusToString(status));
return status;
}

NTSTATUS
VscrPnp (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
PDEVICE_EXTENSION pDevExt;
PIO_STACK_LOCATION stack;
NTSTATUS status = STATUS_SUCCESS;
ULONG requestCount;
PPNP_DEVICE_STATE deviceState;
BOOLEAN deviceRemoved = FALSE;

pDevExt = DeviceObject->DeviceExtension;

stack = IoGetCurrentIrpStackLocation (Irp);

VscrDebugPrint(TRACE, “+++Pnp() MinorFunction=%s \n”, PnpMN2String(stack->MinorFunction));

status = SmartcardAcquireRemoveLock(&pDevExt->SmartcardExtension);

if (!NT_SUCCESS(status))
{
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}

switch (stack->MinorFunction)
{
case IRP_MN_START_DEVICE:

status = VscrSendIrpSynchronously(pDevExt->AttachedDO, Irp);

if (!NT_SUCCESS (status))
{
VscrDebugPrint(WARNING, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}

status = VscrStartDevice (pDevExt, Irp);

Irp->IoStatus.Status = status;

IoCompleteRequest (Irp, IO_NO_INCREMENT);

break;

case IRP_MN_QUERY_STOP_DEVICE:

SET_NEW_PNP_STATE(pDevExt, StopPending);

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;

case IRP_MN_CANCEL_STOP_DEVICE:

status = VscrSendIrpSynchronously(pDevExt->AttachedDO,Irp);

if(!NT_SUCCESS(status))
{
VscrDebugPrint(WARNING, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}

RESTORE_PREVIOUS_PNP_STATE(pDevExt);

Irp->IoStatus.Status = status;

IoCompleteRequest (Irp, IO_NO_INCREMENT);

break;

case IRP_MN_STOP_DEVICE:

SET_NEW_PNP_STATE(pDevExt, Stopped);

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;

case IRP_MN_QUERY_REMOVE_DEVICE:

SET_NEW_PNP_STATE(pDevExt, RemovePending);

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;

case IRP_MN_CANCEL_REMOVE_DEVICE:

status = VscrSendIrpSynchronously(pDevExt->AttachedDO,Irp);

if(!NT_SUCCESS(status))
{
VscrDebugPrint(WARNING, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}

RESTORE_PREVIOUS_PNP_STATE(pDevExt);

Irp->IoStatus.Status = status;

IoCompleteRequest (Irp, IO_NO_INCREMENT);

break;

case IRP_MN_SURPRISE_REMOVAL:

SET_NEW_PNP_STATE(pDevExt, SurpriseRemovePending);

status = IoSetDeviceInterfaceState(&pDevExt->InterfaceName, FALSE);

if (!NT_SUCCESS (status))
{
VscrDebugPrint(ERROR, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;

case IRP_MN_REMOVE_DEVICE:

SET_NEW_PNP_STATE(pDevExt, Deleted);

if(SurpriseRemovePending != pDevExt->PreviousPnPState)
{
status = IoSetDeviceInterfaceState(&pDevExt->InterfaceName, FALSE);

if (!NT_SUCCESS (status))
{
VscrDebugPrint(ERROR, “!!!Pnp() %s\n”, OsrNTStatusToString(status));
}
}

Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

//DeleteDevice
VscrDeleteDevice(DeviceObject);

deviceRemoved = TRUE;

break;

default:
IoSkipCurrentIrpStackLocation (Irp);

status = IoCallDriver (pDevExt->AttachedDO, Irp);

break;
}

if (deviceRemoved == FALSE)
{
SmartcardReleaseRemoveLock(&pDevExt->SmartcardExtension);
}

VscrDebugPrint(TRACE, “—Pnp() %s\n”, OsrNTStatusToString(status));

return status;
}

Today, when I checked the system’s event log, it says “Smart Card Resource Manager failed to add the reader: \?{B85B7C50-6A01-11d2-B841-00C04FAD5171}#MsToaster#1&1aafb3d5&2&01#{50dd5230-ba8a-11d1-bf5d-0000f805f530}”


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer


Windows Live Writer ???磬???д??־?? ???ʹ?ã?http:</http:>

NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer

All the debug info is here, so I think the VscrCreate() haven’t been called.
Do you mean when the SCRM want to manage the reader, it will call CreateFile() to open it?
Then why SCRM failed to do that?

VSCR: ===DriverEntry() on Oct 9 2007 at 13:49:30
VSCR: +++AddDevice()
VSCR: SmartcardInitialize() called with status=STATUS_SUCCESS
VSCR: —AddDevice() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_LEGACY_BUS_INFORMATION
VSCR: —Pnp() STATUS_NOT_SUPPORTED
VSCR: +++Pnp() MinorFunction=IRP_MN_FILTER_RESOURCE_REQUIREMENTS
VSCR: —Pnp() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_INTERFACE
VSCR: —Pnp() STATUS_NOT_SUPPORTED
VSCR: +++Pnp() MinorFunction=IRP_MN_START_DEVICE
VSCR: +++StartDevice()
VSCR: —StartDevice() STATUS_SUCCESS
VSCR: —Pnp() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_CAPABILITIES
VSCR: —Pnp() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_PNP_DEVICE_STATE
VSCR: —Pnp() STATUS_NOT_SUPPORTED
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_DEVICE_RELATIONS
VSCR: —Pnp() STATUS_NOT_SUPPORTED

Did you clear DO_DEVICE_INITIALIZING from your DeviceObject->Flags? Is there a filter driver above your driver in the device stack (!devstack will show you the stack)?

d

-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of xxxxx@msn.com
Sent: Wednesday, October 10, 2007 5:02 PM
To: Windows System Software Devs Interest List
Subject: RE:[ntdev] Question about PC/SC reader driver.

All the debug info is here, so I think the VscrCreate() haven’t been called.
Do you mean when the SCRM want to manage the reader, it will call CreateFile() to open it?
Then why SCRM failed to do that?

VSCR: ===DriverEntry() on Oct 9 2007 at 13:49:30
VSCR: +++AddDevice()
VSCR: SmartcardInitialize() called with status=STATUS_SUCCESS
VSCR: —AddDevice() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_LEGACY_BUS_INFORMATION
VSCR: —Pnp() STATUS_NOT_SUPPORTED
VSCR: +++Pnp() MinorFunction=IRP_MN_FILTER_RESOURCE_REQUIREMENTS
VSCR: —Pnp() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_INTERFACE
VSCR: —Pnp() STATUS_NOT_SUPPORTED
VSCR: +++Pnp() MinorFunction=IRP_MN_START_DEVICE
VSCR: +++StartDevice()
VSCR: —StartDevice() STATUS_SUCCESS
VSCR: —Pnp() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_CAPABILITIES
VSCR: —Pnp() STATUS_SUCCESS
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_PNP_DEVICE_STATE
VSCR: —Pnp() STATUS_NOT_SUPPORTED
VSCR: +++Pnp() MinorFunction=IRP_MN_QUERY_DEVICE_RELATIONS
VSCR: —Pnp() STATUS_NOT_SUPPORTED


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer

Thank you again, Doron!

Today, I follow your first advice and it works. I abandoned using the toaster bus as reader’s underlying bus device. Instead of that, I found and used the devcon.exe in the tools directory of DDK to install the reader driver as a root device. Before the installation, I made a chage to the inf file. The old inf have a Device ID of “{b85b7c50-6a01-11d2-b841-00c04fad5171}\vscr”, I replace it with “root\vscr”. The inf file is like this:

;================================================ inf begin

[Manufacturer]
%MANUFACTURER_NAME% = VirtualDevices

[VirtualDevices]
; DisplayName Section DeviceId
; ----------- ------- --------
;%VSCR_DEVICE_DESCRIPTOR% = Vscr_Device, {b85b7c50-6a01-11d2-b841-00c04fad5171}\vscr
%VSCR_DEVICE_DESCRIPTOR% = Vscr_Device, root\vscr

;================================================ inf end

After the installation, the reader had been found by the SCRM. Now, my system have two virtaul readers with the IDs of “{B85B7C50-6A01-11d2-B841-00C04FAD5171}\MsToaster\1&431A56F&0&01” and “ROOT\SMARTCARDREADER\0000”, while only one of them can be recognized by the SCRM. I wonder if the reason of SCRM failed to open the first one was because its ID wereinvalid for the SCRM?

Here is the debug infomation when the device was installed:

VSCR: ===DriverEntry() on Oct 11 2007 at 17:09:34
VSCR: +++AddDevice()
VSCR: —AddDevice() status=STATUS_SUCCESS
VSCR: +++Pnp()
VSCR: >>>Pnp() minorFunction=unknown_pnp_irp
VSCR: —Pnp() status=STATUS_NOT_SUPPORTED
VSCR: +++Pnp()
VSCR: >>>Pnp() minorFunction=IRP_MN_FILTER_RESOURCE_REQUIREMENTS
VSCR: —Pnp() status=STATUS_NOT_SUPPORTED
VSCR: +++Pnp()
VSCR: >>>Pnp() minorFunction=IRP_MN_START_DEVICE
VSCR: +++StartDevice()
VSCR: —StartDevice() status=STATUS_SUCCESS
VSCR: —Pnp() status=STATUS_SUCCESS
VSCR: +++Pnp()
VSCR: >>>Pnp() minorFunction=IRP_MN_QUERY_CAPABILITIES
VSCR: —Pnp() status=STATUS_SUCCESS
VSCR: +++Pnp()
VSCR: >>>Pnp() minorFunction=IRP_MN_QUERY_PNP_DEVICE_STATE
VSCR: —Pnp() status=STATUS_NOT_SUPPORTED
VSCR: +++Pnp()
VSCR: >>>Pnp() minorFunction=IRP_MN_QUERY_DEVICE_RELATIONS
VSCR: —Pnp() status=STATUS_NOT_SUPPORTED
VSCR: ===Create() <====Create() was called by the SCRM
VSCR: +++DeviceControl()
VSCR: —DeviceControl() status=STATUS_SUCCESS
VSCR: +++DeviceControl()
VSCR: —DeviceControl() status=STATUS_SUCCESS
VSCR: +++DeviceControl()
VSCR: —DeviceControl() status=STATUS_SUCCESS
VSCR: +++DeviceControl()
VSCR: —DeviceControl() status=STATUS_SUCCESS
VSCR: +++Pnp()
VSCR: >>>Pnp() minorFunction=IRP_MN_QUERY_DEVICE_RELATIONS
VSCR: —Pnp() status=STATUS_SUCCESS
VSCR: +++DeviceControl()
VSCR: —DeviceControl() status=STATUS_SUCCESS
VSCR: +++DeviceControl()
VSCR: —DeviceControl() status=STATUS_SUCCESS
VSCR: +++DeviceControl()
VSCR: +++CardPower()
VSCR: >>>CardPower() controlCode=SCARD_COLD_RESET
VSCR: —CardPower() status=STATUS_SUCCESS
VSCR: —DeviceControl() status=STATUS_SUCCESS
VSCR: +++DeviceControl()
VSCR: —DeviceControl() status=STATUS_NOT_SUPPORTED
VSCR: +++DeviceControl()
VSCR: —DeviceControl() status=STATUS_SUCCESS
VSCR: +++DeviceControl()
VSCR: —DeviceControl() status=STATUS_SUCCESS
VSCR: +++DeviceControl()
VSCR: ===CardTracking()
VSCR: —DeviceControl() status=STATUS_PENDING
VSCR: +++DeviceControl()
VSCR: +++CardPower()
VSCR: >>>CardPower() controlCode=SCARD_POWER_DOWN
VSCR: —CardPower() status=STATUS_SUCCESS
VSCR: —DeviceControl() status=STATUS_SUCCESS