shengws
驱动大牛
驱动大牛
  • 注册日期2002-03-08
  • 最后登录2010-06-21
  • 粉丝0
  • 关注0
  • 积分384分
  • 威望102点
  • 贡献值0点
  • 好评度37点
  • 原创分0分
  • 专家分0分
阅读:973回复:1

能否帮我分析一下?

楼主#
更多 发布于:2002-06-07 15:40
感谢arthurt 、zydcat 、pjf 三位
通过今天早上的理解,我现在有点乱,为什么呢?
对自己的程序产生一点怀疑,我是这样实现的:
在首先获取资源列表,
然后又映射内存资源地址,
在进行地质读写,
然后机器死机。
这个问题困扰了我2天,我实在不知道问题出在什么地方,这是我的
一段测试代码(根据书上的例子修改得来),请帮我分析一下
NTSTATUS WdmPciDeviceControl( IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
PWDMPCI_DEVICE_EXTENSION dx = (PWDMPCI_DEVICE_EXTENSION)fdo->DeviceExtension;
if( !dx->GotPortOrMemory)
return CompleteIrp( Irp, STATUS_INSUFFICIENT_RESOURCES);
if( dx->IODisabled)
return CompleteIrp( Irp, STATUS_DEVICE_NOT_CONNECTED);
if (!LockDevice(dx))
return CompleteIrp( Irp, STATUS_DELETE_PENDING);

PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);

ULONG ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
ULONG InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
ULONG OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
//ws add
PUCHAR Buffer = (PUCHAR)Irp->AssociatedIrp.SystemBuffer;
USHORT FailCode = PHDIO_OK;

USHORT ByteNo=0;
USHORT OutByteNo=0;
//
DebugPrint(\"DeviceIoControl: Control code %x InputLength %d OutputLength %d\",
ControlCode, InputLength, OutputLength);
//ws add
// return STATUS_SUCCESS;
//ws add
NTSTATUS status;
//ws add
UCHAR reg,bvalue;
UCHAR Cmd=*Buffer++;
PVOID WW=ExAllocatePool(NonPagedPool,4);

switch( ControlCode)
{
case IOCTL_WDMPCI_RUN_CMDS:
//ws add
// UCHAR Cmd = *Buffer++;
// {
//得到下一条命令
// UCHAR Cmd = *Buffer++;           ByteNo++;
switch(Cmd)
{
case PHDIO_WRITE:
{
   reg=*Buffer++;
   ByteNo++;    bvalue=*Buffer++;
   ByteNo++;
DebugPrint(\"dx->PortBase:%L\",int(dx->PortBase+reg));
WRITE_REGISTER_UCHAR(dx->PortBase+reg, bvalue);
DebugPrint( \"王Write %2x\", bvalue);


DebugPrint(\"dx->PortBase:%L\",int(dx->PortBase+reg));
READ_REGISTER_BUFFER_UCHAR(dx->PortBase+reg,(PUCHAR)WW,4);
DebugPrint( \"王READ %8x\",WW);
break;
}
}
break;

这段代码运行便死机
如果是读端口机器还能正常工作
喂,小孩,你的小JJ露出来了!
highw
驱动牛犊
驱动牛犊
  • 注册日期2002-01-10
  • 最后登录2011-04-05
  • 粉丝0
  • 关注0
  • 积分372分
  • 威望38点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-15 14:57
以下两个你跟一下
WRITE_REGISTER_UCHAR(dx->PortBase+reg, bvalue);READ_REGISTER_BUFFER_UCHAR(dx->PortBase+reg,(PUCHAR)WW,4);
msn : armlinux2000@hotmail.com
游客

返回顶部