阅读:1681回复:6
为什么我用WriteFile(...)写往卡数据就停止不动,好象进了一个死循环一样?
为什么我用WriteFile(...)写往卡数据就停止不动,好象进了一个死循环一样?
响应IRP_MJ_WRITE的函数如下: // Start the I/O IoMarkIrpPending( pIrp ); IoStartPacket( pDevObj, pIrp, 0, DispatchCancel); return STATUS_PENDING; |
|
沙发#
发布于:2003-09-12 21:02
你把下面这条语句去掉再试试
// Don\'t transfer more than the user\'s request xferSize = (xferSize < pDevExt->deviceBufferSize) ? xferSize : pDevExt->deviceBufferSize; |
|
板凳#
发布于:2003-08-15 08:31
邪门了!请看看我的代码,为什么读写都出错? Write: static NTSTATUS AddriverWrite(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp) { IoMarkIrpPending( pIrp ); IoStartPacket( pDevObj, pIrp, 0, DispatchCancel); return STATUS_PENDING; } Read: static NTSTATUS AddriverRead ( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp ) { NTSTATUS status = STATUS_SUCCESS; PVOID userBuffer; ULONG xferSize; // The stack location contains the user buffer info PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation( pIrp ); // Dig out the Device Extension from the Device object PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION) pDevObj->DeviceExtension; // Determine the length of the request xferSize = pIrpStack->Parameters.Read.Length; // Obtain user buffer pointer userBuffer = pIrp->AssociatedIrp.SystemBuffer; // Don\'t transfer more than the user\'s request xferSize = (xferSize < pDevExt->deviceBufferSize) ? xferSize : pDevExt->deviceBufferSize; // Now copy the pool buffer into user space RtlCopyMemory( userBuffer, pDevExt->deviceBuffer, xferSize ); // Free the temporary pool buffer ExFreePool( pDevExt->deviceBuffer ); pDevExt->deviceBuffer = NULL; pDevExt->deviceBufferSize = 0; // Now complete the IRP pIrp->IoStatus.Status = status; pIrp->IoStatus.Information = xferSize; // bytes xfered IoCompleteRequest( pIrp, IO_NO_INCREMENT ); return status; } |
|
地板#
发布于:2003-08-08 12:51
这跟硬件是否支持中断无关
|
|
地下室#
发布于:2003-08-08 12:50
硬件不支持中断! 你的处理有问题 1. 处理IRP CANCEL? 2. If buffer allocate succesfull, how process?(need IoCompleteRequest). 3. 代码不全,内存分配成功后要进行写操作,写操作结束后要如下调用: Irp->IoStatus.Status = ntStatus; IoStartNextPacket(DeviceObject, TRUE); IoCompleteRequest (Irp, IO_NO_INCREMENT); 好像你这些都没做,由于代码不全只能推测,这好像是测试代码 |
|
5楼#
发布于:2003-08-08 12:26
硬件不支持中断!
startIo里: PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation( pIrp ); PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION) pDO->DeviceExtension; PUCHAR userBuffer; ULONG xferSize; switch( pIrpStack->MajorFunction ) { case IRP_MJ_WRITE: pDevExt->maxXferCount = pIrpStack->Parameters.Write.Length; pDevExt->xferCount = 0; // free up any old buffer if (pDevExt->deviceBuffer != NULL) { ExFreePool(pDevExt->deviceBuffer); pDevExt->deviceBuffer = NULL; pDevExt->deviceBufferSize = 0; } // Determine the length of the request xferSize = pIrpStack->Parameters.Write.Length; // Obtain user buffer pointer userBuffer = (PUCHAR) pIrp->AssociatedIrp.SystemBuffer; // Allocate the new buffer pDevExt->deviceBuffer = (PUCHAR) ExAllocatePool( PagedPool, xferSize ); if (pDevExt->deviceBuffer == NULL) { // buffer didn\'t allocate??? // fail the IRP pIrp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; pIrp->IoStatus.Information = 0; IoCompleteRequest( pIrp, IO_NO_INCREMENT ); IoStartNextPacket( pDO, FALSE ); } pDevExt->deviceBufferSize = xferSize; break; default: pIrp->IoStatus.Status = STATUS_NOT_SUPPORTED; pIrp->IoStatus.Information = 0; IoCompleteRequest( pIrp, IO_NO_INCREMENT ); IoStartNextPacket( pDO, FALSE ); break; } |
|
6楼#
发布于:2003-08-08 11:09
startIo里如何处理的?
或者用softice跟踪一下 [编辑 - 8/8/03 by dazzy] |
|