예제 #1
0
///////////////////////////////////////////////////////////////////////////////////////////////////
//设备接入时系统会调用此函数
NTSTATUS KadyUsbTestDevice::DefaultPnp(KIrp I)
{
	//这里使用默认处理
	I.ForceReuseOfCurrentStackLocationInCalldown();
	NTSTATUS status = m_Lower.PnpCall(this, I);

	return status;
}
예제 #2
0
///////////////////////////////////////////////////////////////////////////////////////////////////
//系统控制函数
NTSTATUS KadyUsbTestDevice::SystemControl(KIrp I)
{
	NTSTATUS status = STATUS_SUCCESS;

	//采用默认处理
	I.ForceReuseOfCurrentStackLocationInCalldown();
	status = m_Lower.PnpCall(this, I);
	return status;
}
예제 #3
0
///////////////////////////////////////////////////////////////////////////////////////////////////
//设备操作控制,对应应用程序的操作函数
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;
}
예제 #4
0
///////////////////////////////////////////////////////////////////////////////////////////////////
//设备接入时会系统会调用此函数
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);
}
예제 #9
0
///////////////////////////////////////////////////////////////////////////////////////////////////
//清除信息
NTSTATUS KadyUsbTestDevice::CleanUp(KIrp I)
{
	NTSTATUS status = STATUS_SUCCESS;
	I.PnpComplete(this, status);
	return status;
}
예제 #10
0
///////////////////////////////////////////////////////////////////////////////////////////////////
//应用程序向设备写数据时的操作
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);
}
예제 #11
0
///////////////////////////////////////////////////////////////////////////////////////////////////
//应用程序读设备数据时(应用程序调用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);
}