阅读:3082回复:12
得到并口地址
在我做并口驱动时,得到并口地址的方法如下.我曾经搜索过网站里所有的关于并口的贴子,知道通过IoBuildDeviceIoControlRequest得到并口的地址,同时有文章介绍说pInf中的OriginalController的低四位就是并口的基地址.可是我用softice跟踪发现OriginalController是一个LARGE_INTERGE结构,它的LowPart是0x0000000它的HighPart是
0xc50000037(记不太清了,反正不是与378相关的数.我的并口地址是3378).我不知道我在那里有错误. 另外,我用NTDDK中SCR目录下的Parclass的方法发送内部IO控制中的占用端口也没有效果.IOCTL_INTERNAL_PARALLEL_ALLOCATED和IOCTL_INTERNAL_PARALLEL_FREE.,并不能够独占端口,我打印文件依然不出错. 下面是我的得到并口地址的方法: if(bdo!=NULL) { irp=IoBuildDeviceIoControlRequest( IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO, bdo, NULL, 0, pInf, sizeof(PPARALLEL_PORT_INFORMATION), TRUE, &event, pStatus ); } if(! irp) { return; } else { port.Initialize( (pInf->OriginalController).QuadPart, 3, TRUE); } |
|
最新喜欢:![]() |
沙发#
发布于:2002-07-05 11:37
你能把你的方法全部贴出来吗?我用这种方法取得并口地址屡试屡爽!也只有这种方法是最科学的,动态取得地址。直接就给出并口地址(hard code),在编程时不推荐!
你贴的代码不能取得并口地址! 用IoBuildDeviceIoControlRequest()得到了irp后,还要将此irp下传给ms的并口driver(用IoCallDriver()),这样才能取得并口地址! 关于独占问题,如果你用IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE,如果调用后超时,你就可以认为被占;当然也可调用PARALLEL_PORT_INFORMATION的PPARALLEL_TRY_ALLOCATE_ROUTINE例程来完成此事,如果返回FALSe,者表示被占。 |
|
板凳#
发布于:2002-07-05 18:32
我把我程序中的主要部分都贴出来吧.或许对像我一样的初学者有一些用.
我现在还有一个最大的问题就是,如果我不给我的调用2000串口驱动相关的irp设置完成路径的话,它会出现irp多次完成错误,如果设了.我发现我的得到并口地址的地方没有最后完成,他提前就返回了. 下面是我得到并口设备的方法: PUNICODE_STRING objn; NTSTATUS status = STATUS_SUCCESS; PFILE_OBJECT FileObject; objn=(PUNICODE_STRING)ExAllocatePool(NonPagedPool, sizeof(UNICODE_STRING)); RtlInitUnicodeString(objn,L\"\\\\Device\\\\ParallelPort0\"); status=IoGetDeviceObjectPointer( objn, FILE_ALL_ACCESS, &FileObject, &bdo); if( ! NT_SUCCESS(status)) { if(!bdo) { IoDeleteDevice(bdo); } } ObDereferenceObject(FileObject); ExFreePool(objn); return status; 下面是我改进后得到并口地址的方法: PARALLEL_PORT_INFORMATION pInf; NTSTATUS status; IO_STATUS_BLOCK pStatus; KIoRange port; PIRP irp; KEVENT event; KeInitializeEvent( &event, NotificationEvent, FALSE ); if(bdo!=NULL) { irp=IoBuildDeviceIoControlRequest( IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO, bdo, NULL, 0, &pInf, sizeof(PARALLEL_PORT_INFORMATION), TRUE, &event, &pStatus ); } if(! irp) { return STATUS_INSUFFICIENT_RESOURCES; } IoSetCompletionRoutine( irp, (PIO_COMPLETION_ROUTINE)CompleteRoutine, &event, TRUE, TRUE, TRUE ); status=IoCallDriver(bdo,irp); if (!NT_SUCCESS(status)) { return status; } status = KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); if (!NT_SUCCESS(status)) { return status; } status = pStatus.Status; if (!NT_SUCCESS(status)) { return status; } port.Initialize( (pInf.OriginalController).QuadPart, 3, TRUE); IoFreeIrp(irp); 下面是我发送内部占有和释放命令的方法: NTSTATUS status; PIRP irp; LARGE_INTEGER timeout; KEVENT event; PIO_STACK_LOCATION irpSp; BOOLEAN needToCopyOutputBuffer = FALSE; irp = IoAllocateIrp( (CCHAR)(bdo->StackSize + 1), FALSE ); if( !irp ) { return STATUS_INSUFFICIENT_RESOURCES; } irpSp = IoGetNextIrpStackLocation( irp ); irpSp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; irpSp->Parameters.DeviceIoControl.OutputBufferLength = 0; irpSp->Parameters.DeviceIoControl.InputBufferLength = 0; irpSp->Parameters.DeviceIoControl.IoControlCode = IoControlCode;//IoControlCode是传进函数里的参数 KeInitializeEvent( &event, NotificationEvent, FALSE ); IoSetCompletionRoutine( irp, (PIO_COMPLETION_ROUTINE)CompleteRoutine, &event, TRUE, TRUE, TRUE ); status=IoCallDriver(bdo,irp); if( !NT_SUCCESS(status) ) { IoFreeIrp( irp ); return status; } timeout.QuadPart = -((LONGLONG) 10*1000*500); status = KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, &timeout); if( status == STATUS_TIMEOUT ) { IoCancelIrp( irp ); KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); } status = irp->IoStatus.Status; IoFreeIrp( irp ); return status; |
|
地板#
发布于:2002-07-08 10:47
IoBuildDeviceIoControlRequest()的irp没有必要设置完成路径!会出现多次irp完成错误,什么意思?
|
|
地下室#
发布于:2002-07-08 14:07
我现在又遇到无穷无尽的问题.我的程序里我是把并口设备作为我的驱动的设备对象的一个成员变量的.在我装好驱动后,重新启动,softice总在载入这个驱动时跳出,由于我的显卡问题,softice在全屏下是花屏的,不过,据我估计,大概是在我载入驱动得到并口设备对象时,出现分页错误.我不知道是什么原因.
IRP_MORE_COMPLETE_ROUTE错误,后来我把最后一句IoFreeIRP()去了,就没事了. 第三个问题是在我前面贴的程序的第三部分,也就是占用端口那部分,在我IoCallDevice()时会出现页面错误.我现在正试着看能不能通过直接用IoBuildDeviceIoControRequest()得到的irp来实现. dazzy大侠,可不可以让我看看你的程序.如果您愿意,可以发到 marongfu@sina.com 或者i11usi0n@163.com.谢谢了 |
|
5楼#
发布于:2002-07-08 15:47
代码已发
请查收 |
|
6楼#
发布于:2002-07-08 18:07
已经收到了,谢谢.我回头再试试
|
|
7楼#
发布于:2002-07-18 10:06
|
|
|
8楼#
发布于:2002-07-24 14:55
能不能也发给我一份,先谢了
yunfangf88@sina.com |
|
|
9楼#
发布于:2002-07-24 15:12
能不能也发给我一份,小弟先谢了
stower@etang.com |
|
10楼#
发布于:2002-07-27 21:27
能否也给小弟一份?谢谢.
alexander_liu@163.com |
|
11楼#
发布于:2007-11-08 10:28
急需要这个方法,请 dazzy 大侠发一份给我,谢谢了 邮箱zhaohuzi2003@163.com
|
|
|
12楼#
发布于:2007-11-09 14:31
兄弟,给我一份,十分感谢, fanzier@gmail.com
|
|
|