i11usi0n
驱动牛犊
驱动牛犊
  • 注册日期2002-04-18
  • 最后登录2006-05-22
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望10点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:3082回复:12

得到并口地址

楼主#
更多 发布于:2002-07-05 08:59
在我做并口驱动时,得到并口地址的方法如下.我曾经搜索过网站里所有的关于并口的贴子,知道通过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);
}

最新喜欢:

juventusjuvent...
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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,者表示被占。
i11usi0n
驱动牛犊
驱动牛犊
  • 注册日期2002-04-18
  • 最后登录2006-05-22
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望10点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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;
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-07-08 10:47
IoBuildDeviceIoControlRequest()的irp没有必要设置完成路径!会出现多次irp完成错误,什么意思?
i11usi0n
驱动牛犊
驱动牛犊
  • 注册日期2002-04-18
  • 最后登录2006-05-22
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望10点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-08 14:07
我现在又遇到无穷无尽的问题.我的程序里我是把并口设备作为我的驱动的设备对象的一个成员变量的.在我装好驱动后,重新启动,softice总在载入这个驱动时跳出,由于我的显卡问题,softice在全屏下是花屏的,不过,据我估计,大概是在我载入驱动得到并口设备对象时,出现分页错误.我不知道是什么原因.

IRP_MORE_COMPLETE_ROUTE错误,后来我把最后一句IoFreeIRP()去了,就没事了.

第三个问题是在我前面贴的程序的第三部分,也就是占用端口那部分,在我IoCallDevice()时会出现页面错误.我现在正试着看能不能通过直接用IoBuildDeviceIoControRequest()得到的irp来实现.

dazzy大侠,可不可以让我看看你的程序.如果您愿意,可以发到
marongfu@sina.com
或者i11usi0n@163.com.谢谢了
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-07-08 15:47
代码已发
请查收
i11usi0n
驱动牛犊
驱动牛犊
  • 注册日期2002-04-18
  • 最后登录2006-05-22
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望10点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-07-08 18:07
已经收到了,谢谢.我回头再试试
yuri69
驱动小牛
驱动小牛
  • 注册日期2002-07-12
  • 最后登录2005-12-31
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-18 10:06
我现在也正在编写并口驱动的wdm程序,大哥是否可以给我一份你的程序?借小弟一看?先谢过了!97031118@163.com  

[编辑 -  7/20/02 by  yuri69]
我不会停止对你的思念,就像呼吸一样,我不去特意的想,但是,只能屏息,而不可能停止
gxjt
驱动老牛
驱动老牛
  • 注册日期2002-03-26
  • 最后登录2006-06-07
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-07-24 14:55
能不能也发给我一份,先谢了
yunfangf88@sina.com
[color=red] “阿弥陀佛,无上医王,舍此不求,是谓痴狂。” “一句弥陀,阿伽陀药,舍此不服,是谓大错。” 南无阿弥陀佛......[/color]
stower
驱动牛犊
驱动牛犊
  • 注册日期2001-06-08
  • 最后登录2010-05-19
  • 粉丝0
  • 关注0
  • 积分102分
  • 威望32点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-24 15:12
能不能也发给我一份,小弟先谢了
stower@etang.com
Alexander
驱动大牛
驱动大牛
  • 注册日期2002-02-04
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分-5分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-07-27 21:27
能否也给小弟一份?谢谢.
alexander_liu@163.com
zhzhb
驱动牛犊
驱动牛犊
  • 注册日期2007-11-08
  • 最后登录2007-12-19
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-11-08 10:28
急需要这个方法,请 dazzy 大侠发一份给我,谢谢了 邮箱zhaohuzi2003@163.com
认真,拼搏,务实
fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-11-09 14:31
兄弟,给我一份,十分感谢, fanzier@gmail.com
张帆的内核学习论坛 http://bbs.kerneldev.com
游客

返回顶部