/////////////////////////////////////////////////////////////////////////////////////////////////// //应用程序释放设备对象时(应用程序调用CloseHandle函数),系统会调用此函数 NTSTATUS KadyUsbTestDevice::Close(KIrp I) { //这里使用默认操作 NTSTATUS status = STATUS_SUCCESS; I.Information() = 0; I.PnpComplete(this, status); return status; }
/////////////////////////////////////////////////////////////////////////////////////////////////// //设备操作控制,对应应用程序的操作函数 NTSTATUS KadyUsbTestDevice::DeviceControl(KIrp I) { NTSTATUS status = STATUS_SUCCESS; switch (I.IoctlCode()) { case 0: default: status = STATUS_INVALID_DEVICE_REQUEST; break; } //完成操作 if (status != STATUS_PENDING) { I.PnpComplete(this, status); } return status; }
/////////////////////////////////////////////////////////////////////////////////////////////////// //清除信息 NTSTATUS KadyUsbTestDevice::CleanUp(KIrp I) { NTSTATUS status = STATUS_SUCCESS; I.PnpComplete(this, status); return status; }
/////////////////////////////////////////////////////////////////////////////////////////////////// //应用程序向设备写数据时的操作 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); }
/////////////////////////////////////////////////////////////////////////////////////////////////// //应用程序读设备数据时(应用程序调用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); }