コード例 #1
0
ファイル: KadyUsbTestDevice.cpp プロジェクト: zppzq/LCDTestor
///////////////////////////////////////////////////////////////////////////////////////////////////
//应用程序向设备写数据时的操作
NTSTATUS KadyUsbTestDevice::Write(KIrp I)
{
    NTSTATUS status = STATUS_INSUFFICIENT_RESOURCES;

	//声明变量,存放实际发送的字节数
    ULONG dwBytesSent = 0;
	
	//URB
	PURB pUrb = NULL;
	
	//获取应用程序内存对象
	KMemory Mem(I.Mdl());
	
	//检查缓冲区长度
	ULONG dwTotalSize = I.WriteSize(CURRENT);				//应用程序要写的数据长度
	ULONG dwMaxSize = EndPoint2Out.MaximumTransferSize();	//端点允许传输的最大数据长度
	if ( dwTotalSize > dwMaxSize )
	{
		//如果超过允许的最大数据长度,则传输最大允许数据长度个字节数
		ASSERT(dwMaxSize);
		dwTotalSize = dwMaxSize;
	}
	
	if(UsbdPipeTypeBulk == EndPoint2Out.Type())
	{
		pUrb = EndPoint2Out.BuildBulkTransfer(
			Mem,          //数据缓冲区
			dwTotalSize,  //需要传输的字节数
			FALSE,        //写数据
			NULL          //下一个URB(无)
							);
	}
	else if(UsbdPipeTypeInterrupt == EndPoint2Out.Type())
	{
		//创建URB
		pUrb = EndPoint2Out.BuildInterruptTransfer(
			Mem,		  //数据缓冲区
			dwTotalSize,  //需要传输的字节数
			TRUE,         //允许实际传输的字节数小于需要传输的字节数
			NULL,	      //下一个URB(无)
			NULL,		  //当前URB(无,创建新的)
			FALSE		  //写数据
													);
	}
	
    //判断URB创建是否成功
    if (pUrb != NULL) 
    {
		//提交URB
        status = EndPoint2Out.SubmitUrb(pUrb, NULL, NULL,1000);
		
		//获取实际写入的字节数
        if ( NT_SUCCESS(status) ) 
        {
            dwBytesSent = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;
        }
		
		delete pUrb;
    }
	
	//向应用程序返回实际写入的字节数
    I.Information() = dwBytesSent;

	//完成IRP
    return I.PnpComplete(this, status, IO_NO_INCREMENT);
}
コード例 #2
0
ファイル: KadyUsbTestDevice.cpp プロジェクト: zppzq/LCDTestor
///////////////////////////////////////////////////////////////////////////////////////////////////
//应用程序读设备数据时(应用程序调用ReadFile函数),系统会调用此函数
NTSTATUS KadyUsbTestDevice::Read(KIrp I)
{
    NTSTATUS status = STATUS_INSUFFICIENT_RESOURCES;

	//声明变量,接收实际读取的字节数	
    ULONG dwBytesRead = 0;
	
	//URB
	PURB pUrb = NULL;
	
	//获取应用程序内存对象
	KMemory Mem(I.Mdl());

	//检查缓冲区长度
    ULONG dwTotalSize = I.ReadSize(CURRENT);				//应用程序要读取的字节数
	ULONG dwMaxSize = EndPoint1In.MaximumTransferSize();	//端点能传输的最大字节数
	if ( dwTotalSize > dwMaxSize )
	{
		//如果要读取的字节数超过端点的最大长度,则设置为最大长度
		ASSERT(dwMaxSize);
		dwTotalSize = dwMaxSize;
	}
	
	if(UsbdPipeTypeBulk == EndPoint2Out.Type())
	{
		pUrb = EndPoint1In.BuildBulkTransfer(
			Mem,		  //数据缓冲区
			dwTotalSize,  //要读取的字节数
			TRUE,         //输入
			NULL	      //下一个URB(无)
							);

	}
	else if(UsbdPipeTypeInterrupt == EndPoint2Out.Type())
	{
		pUrb = EndPoint1In.BuildInterruptTransfer(
			Mem,		  //数据缓冲区
			dwTotalSize,  //要读取的字节数
			TRUE,         //允许接收的字节数小于需求字节数
			NULL,	      //下一个URB(无)
			NULL,		  //当前USB(无,则创建新的)
			TRUE		  //读数据
													);
	}

	
	//判断创建URB是否成功
	if ( pUrb != NULL)
	{
		//设置为直接读取方式,允许接收字节数小于要求的字节数
		pUrb->UrbBulkOrInterruptTransfer.TransferFlags =
			(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK);
		
		//提交URB
        status = EndPoint1In.SubmitUrb(pUrb, NULL, NULL,1000);
		
		//获取实际读取的字节数
        if ( NT_SUCCESS(status) ) 
        {
			dwBytesRead = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;
		}
		
		delete pUrb;
	}
	
	//向应用程序返回实际读取的字节数
    I.Information() = dwBytesRead;

	//结束IRP操作
    return I.PnpComplete(this, status, IO_NO_INCREMENT);
}