阅读:973回复:1
能否帮我分析一下?
感谢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; 这段代码运行便死机 如果是读端口机器还能正常工作 |
|
|
沙发#
发布于:2002-06-15 14:57
以下两个你跟一下
WRITE_REGISTER_UCHAR(dx->PortBase+reg, bvalue);READ_REGISTER_BUFFER_UCHAR(dx->PortBase+reg,(PUCHAR)WW,4); |
|
|