|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
环境:DS3.2,winxp,xpddk,基本上就是在DS3.2的架构上面加了点东西,而且也基本上是在网上那个9054实现IO的例程上面搬下来的(只是不知道我下的那个版本是不是真的正确的……)
NTSTATUS FirstDevice:eviceControl(KIrp I)
{
NTSTATUS status=STATUS_SUCCESS;
switch(I.IoctlCode())
{
case IOCTL_800:
status=IOCTL_800Queue.QueueIrp(I);
break;
default:
status=STATUS_INVALID_DEVICE_REQUEST;
break;
}
return status;
}
void FirstDevice::Serial_IOCTL_800_Handler(KIrp I)
{
NTSTATUS status= STATUS_SUCCESS;
KMemory Mem(I.Mdl());
USHORT count;
USHORT Offset;
ULONG input Size=I.IoctlInputBufferSize();
ULONG outputSize=I.IoctlOutputBufferSize();
PVOID inputBuffer=I.IoctlBuffer();
PVOID outputBuffer=NULL;
outputBuffer=Mem.MapToSystemSpace();
Offset=*((PUSHORT)inputBuffer);
count=*((PUSHORT)inputBuffer+1);
PciMemory0.inw(Offset,(PUSHORT)outputBuffer,count);
if(FALSE)
{
status=STATUS_INVALID_PARAMETER;
I.Information()=0;
}
else
{
}
I.Information()=count*sizeof(USHORT);
I.Status()=status;
IOCTL_800Queue.PnpNextIrp(I);
}
//app
char* sLinkName=//这里是文件的路径和文件名,选的是直接生成sys的目录
先调用如下函数:
m_hDevice=CreateFile(sLinkName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
得到了一个有效的句柄,然后定义两个全局缓冲区
#define IOCTL_INBUF_SIZE 800
#define IOCTL_OUTBUF_SIZE 800
USHORT bufOutput[IOCTL_OUTBUF_SIZE];
USHORT bufInput[IOCTL_INBUF_SIZE+2];
再在一个按键的函数里面调用DeviceIoControl:
void CFirstTestDlg::OnButtonRead()
{
ULONG nOutput;
USHORT offset=0;
bufInput[0]=offset;
bufInput[1]=IOCTL_OUTBUF_SIZE;
if(!DeviceIoControl(m_hDevice,IOCTL_800,bufInput,2*sizeof(USHORT),bufOutput,IOCTL_OUTBUF_SIZE*sizeof(USHORT),&nOutput,NULL))
{
……
}
else
……
}
编译通过,在初始化的时候也读到了合法的文件句柄,但是在按下Read按钮的时候,执行的是if当中的语句,显然DeviceIoControl函数并没有从驱动读到数据,请问这里出了什么和通讯失败相关的错误?
小弟初学PCI驱动,对windows的编程也是一知半解(对C++还算了解一些,C是最熟悉的,一直在用)所以,还希望能够尽可能详细地指教,谢谢。 |
|