foolboy101
驱动牛犊
驱动牛犊
  • 注册日期2003-06-30
  • 最后登录2003-08-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1680回复:6

为什么我用WriteFile(...)写往卡数据就停止不动,好象进了一个死循环一样?

楼主#
更多 发布于:2003-08-07 17:18
为什么我用WriteFile(...)写往卡数据就停止不动,好象进了一个死循环一样?
响应IRP_MJ_WRITE的函数如下:
          
          // Start the I/O
IoMarkIrpPending( pIrp );
IoStartPacket( pDevObj, pIrp, 0, DispatchCancel);
return STATUS_PENDING;
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-08 11:09
startIo里如何处理的?
或者用softice跟踪一下

[编辑 -  8/8/03 by  dazzy]
foolboy101
驱动牛犊
驱动牛犊
  • 注册日期2003-06-30
  • 最后登录2003-08-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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;
}
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-08 12:50
硬件不支持中断!
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;
}


你的处理有问题
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);
好像你这些都没做,由于代码不全只能推测,这好像是测试代码
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-08 12:51
这跟硬件是否支持中断无关
foolboy885
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2003-08-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于: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;
}
ji_pengyw
驱动牛犊
驱动牛犊
  • 注册日期2002-11-10
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-09-12 21:02
你把下面这条语句去掉再试试
// Don\'t transfer more than the user\'s request
xferSize = (xferSize < pDevExt->deviceBufferSize) ?
xferSize : pDevExt->deviceBufferSize;
游客

返回顶部