首页
社区
课程
招聘
[求助]RegisterForDeviceNotifications
发表于: 2008-11-21 05:50 8063

[求助]RegisterForDeviceNotifications

2008-11-21 05:50
8063
typedef struct _ACPI_INTERFACE_STANDARD {
    //
    // Generic interface header
    //
    USHORT                  Size;
    USHORT                  Version;
    PVOID                   Context;
    PINTERFACE_REFERENCE    InterfaceReference;
    PINTERFACE_DEREFERENCE  InterfaceDereference;
    //
    // ACPI interfaces
    //
    PGPE_CONNECT_VECTOR                     GpeConnectVector;
    PGPE_DISCONNECT_VECTOR                  GpeDisconnectVector;
    PGPE_ENABLE_EVENT                       GpeEnableEvent;
    PGPE_DISABLE_EVENT                      GpeDisableEvent;
    PGPE_CLEAR_STATUS                       GpeClearStatus;
    PREGISTER_FOR_DEVICE_NOTIFICATIONS      RegisterForDeviceNotifications;
    PUNREGISTER_FOR_DEVICE_NOTIFICATIONS    UnregisterForDeviceNotifications;

} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
    在WDM里面找到这个有趣的struct,看起来是可以透过它来向ACPI driver Register for notification(当然在此之前必须发irp_mj_query_interface给ACPI driver,iocalldriver执行ok),不过对于下述routine的第三个参数意义不甚明了,不知道有没有高手愿意指教(自己反复try了很多次,结果都是blue screen)

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
楼主问的问题好高深啊,看不懂啊 帮你顶
typedef NTSTATUS (*PREGISTER_FOR_DEVICE_NOTIFICATIONS2) (
    PVOID   Context,
    PDEVICE_NOTIFY_CALLBACK2    NotificationHandler,
    PVOID   NotificationContext
    );

typedef VOID (*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2) (
    PVOID   Context
    );

typedef VOID (*PDEVICE_NOTIFY_CALLBACK2) (
    PVOID   NotificationContext,
    ULONG   NotifyCode
    );
2008-11-21 13:29
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
实际上就是个context.一般查询完的结果都放在DevExt保存,所以这个参数用PDEVICE_EXTENSION.
2008-11-21 14:51
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
4
这个Context
可以查看linux里的相关部分(和windows下的有点类似),里面会有处理这个Notifications的回调函数,还有其他一些的莫名其妙的东西。
有点像个任务描述的块
2008-11-22 11:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼上的大哥可以把linux里面相关的reference code贴出来供小弟参考下吗
还有2楼的大哥,为什么wdm里面的define与你贴出来的不一样呢
typedef NTSTATUS (* PREGISTER_FOR_DEVICE_NOTIFICATIONS) (
                            PDEVICE_OBJECT,
                            PDEVICE_NOTIFY_CALLBACK,
                            PVOID);
虽然说起来PDEVICE_OBJECT也是PVOID型的...
我对这个函数的理解是第一个参数是Pdo,也就是要向ACPI driver register的Pdo,而第三个参数是它的fdo,不过这样的结果是blue screen...
2008-11-22 14:44
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
6
evxface.c

acpi_status
acpi_install_notify_handler(acpi_handle device,
                            u32 handler_type,
                            acpi_notify_handler handler, void *context)

安装notify handler的一个例子
        status = acpi_install_notify_handler(device->handle,ACPI_ALL_NOTIFY, acpi_ac_notify,ac);

acpi_ac_notify是一个处理函数,后面的ac也就是context,是保存这个函数处理事件所需要的信息的结构体。类型为struct acpi_ac。

因此,这个VOID* Context没有一个固定的形式。
acpi_install_notify_handler仅仅是给acpi namespace里的对象添加一个handler,以及handler需要的信息。

不知道你要的是不是这个。
2008-11-22 15:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼上提供的示例很类似windows DDK里面的示例,所以acpi handle device应该是向acpi register handle的我自己的driver device
如您所言,这个函数的意义就是给acpi namespace里的对象添加一个handler,不过貌似我每次向acpi register的结果都是blue screen...
不知道楼上的大侠能否提供mail address或者是QQ什么的,我们交流一下吧
2008-11-22 16:59
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
http://www.microsoft.com/whdc/system/pnppwr/powermgmt/ACPIDriver_Vista.mspx   我是在微软那儿找到的一篇,你去看一下
2008-11-23 08:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我其实就是以楼上提到的资料作为reference的,不过貌似这份资料并不完全,所以才会有困扰
2008-11-23 18:49
0
游客
登录 | 注册 方可回帖
返回
//