/////////////////////////////////////////////////////////////////////////////////////////////////// //设备接入时系统会调用此函数 NTSTATUS KadyUsbTestDevice::DefaultPnp(KIrp I) { //这里使用默认处理 I.ForceReuseOfCurrentStackLocationInCalldown(); NTSTATUS status = m_Lower.PnpCall(this, I); return status; }
/////////////////////////////////////////////////////////////////////////////////////////////////// //系统控制函数 NTSTATUS KadyUsbTestDevice::SystemControl(KIrp I) { NTSTATUS status = STATUS_SUCCESS; //采用默认处理 I.ForceReuseOfCurrentStackLocationInCalldown(); status = m_Lower.PnpCall(this, I); 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::OnStartDevice(KIrp I) { NTSTATUS status = STATUS_SUCCESS; I.Information() = 0; status = STATUS_UNSUCCESSFUL; AC_STATUS acStatus = AC_SUCCESS; acStatus = m_Lower.ActivateConfiguration(1); //使用配置1 switch (acStatus) { //配置成功 case AC_SUCCESS: status = STATUS_SUCCESS; TestBusInterface(); //USB直接客户访问,测试总线接口 break; case AC_COULD_NOT_LOCATE_INTERFACE: break; case AC_COULD_NOT_PRECONFIGURE_INTERFACE: break; case AC_CONFIGURATION_REQUEST_FAILED: break; case AC_FAILED_TO_INITIALIZE_INTERFACE_OBJECT: break; case AC_FAILED_TO_GET_DESCRIPTOR: break; case AC_FAILED_TO_OPEN_PIPE_OBJECT: status = STATUS_SUCCESS; break; default: break; } // TODO: Add USB device-specific code to start the hardware. T.Trace(TraceInfo, __FUNCTION__"--. IRP %p, STATUS %x\n", I, status); return status; }
NTSTATUS MouseFilterDevice::OnIrpComplete(KIrp I, PVOID Context) { PMOUSE_INPUT_DATA pMID; mNumOutstandingIrps--; mCurrentStackLocation = NULL; pMID = (PMOUSE_INPUT_DATA) I.IoctlBuffer(); pgpAssertAddrValid(pMID, MOUSE_INPUT_DATA); if (pMID->Buttons != 0) Interface->mSecondsInactive = 0; return KFilterDevice::OnIrpComplete(I, Context); }
NTSTATUS CPGPdiskInterface::Write(KIrp I) { I.Information() = 0; return I.Complete(STATUS_NOT_IMPLEMENTED); }
NTSTATUS CPGPdiskInterface::Create(KIrp I) { return I.Complete(STATUS_SUCCESS); }
NTSTATUS CPGPdiskInterface::Close(KIrp I) { mUserMemManager.CleanupCurrentProcess(); return I.Complete(STATUS_SUCCESS); }
/////////////////////////////////////////////////////////////////////////////////////////////////// //清除信息 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); }