【WM】应用程序实现网络去附着(unregister)的简便方法

在Windows Mobile下,应用程序如果需要网络去附着一般需要调用RIL函数RIL_UnregisterFromNetwork(调用扩展TAPI函数lineUnregister的很少见)。但是,由于该函数是异步的,如果想通过result callback获知网络去附着是否成功的话就比较麻烦了。

 

因此,笔者在此介绍一个未归档的函数UnregisterFromNetwork,该函数亦可实现网络去附着功能,其函数原型如下:

 

//  *************************************************************************
//  UnregisterFromNetwork
//
//  Purpose:
//      Unregisters the radio module from the network if it is
//      possible to do so, and waits for that operation to complete.
//
//  Returns:
//      HRESULT
//
//  *************************************************************************
HRESULT WINAPI UnregisterFromNetwork();

 

开发者如果要链接该函数需要使用导入库ccoreutl.lib

 

以下是根据笔者反汇编所得,改用C/C++描述的UnregisterFromNetwork函数实现:

 

该函数实现较为简单,依次调用了RIL_Initialize、RIL_UnregisterFromNetwork和RIL_Deinitialize。由于RIL_UnregisterFromNetwork是异步的,为了等待去附着过程完成就用到了一个Event内核对象,不过这里的WaitForSingleObject函数调用传入的第二个参数是INFINITE,很可能造成主调线程挂起。这个Event内核对象则是通过回调函数RIL_RESULT_Callback在去附着操作完成时设置成signaled状态。

 

PS: 如果微软在实现该函数时给出一个timeout参数就完美了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的驱动程序示例,它可以拦截系统按下截屏键的事件,并阻止其传递给操作系统和其他应用程序。 ```c #include <linux/module.h> #include <linux/init.h> #include <linux/input.h> #include <linux/keyboard.h> static struct input_dev *key_dev; static struct timer_list key_timer; static void key_timer_function(unsigned long data) { /* 模拟按下和释放截屏键 */ input_event(key_dev, EV_KEY, KEY_SCREENSHOT, 1); input_sync(key_dev); input_event(key_dev, EV_KEY, KEY_SCREENSHOT, 0); input_sync(key_dev); /* 重新启动定时器 */ mod_timer(&key_timer, jiffies + HZ / 10); } static int key_event(struct notifier_block *nblock, unsigned long code, void *_param) { struct keyboard_notifier_param *param = _param; /* 检查是否按下了截屏键 */ if (code == KBD_KEYCODE && param->value == KEY_SCREENSHOT) { /* 取消按键事件 */ return NOTIFY_STOP; } /* 其他按键事件不拦截 */ return NOTIFY_OK; } static struct notifier_block key_notifier = { .notifier_call = key_event, }; static int __init key_init(void) { int error; /* 创建一个输入设备 */ key_dev = input_allocate_device(); if (!key_dev) { printk(KERN_ERR "key: Failed to allocate input device\n"); return -ENOMEM; } /* 设置输入设备的名称和属性 */ key_dev->name = "key"; key_dev->phys = "key/input0"; key_dev->id.bustype = BUS_USB; key_dev->id.vendor = 0x0001; key_dev->id.product = 0x0001; key_dev->id.version = 0x0100; /* 注册输入设备 */ error = input_register_device(key_dev); if (error) { printk(KERN_ERR "key: Failed to register input device\n"); input_free_device(key_dev); return error; } /* 注册键盘事件通知 */ error = register_keyboard_notifier(&key_notifier); if (error) { printk(KERN_ERR "key: Failed to register keyboard notifier\n"); input_unregister_device(key_dev); return error; } /* 初始化定时器 */ setup_timer(&key_timer, key_timer_function, 0); mod_timer(&key_timer, jiffies + HZ / 10); return 0; } static void __exit key_exit(void) { /* 取消键盘事件通知 */ unregister_keyboard_notifier(&key_notifier); /* 取消定时器 */ del_timer(&key_timer); /* 注销输入设备 */ input_unregister_device(key_dev); input_free_device(key_dev); } module_init(key_init); module_exit(key_exit); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("Disable screenshot key"); MODULE_LICENSE("GPL"); ``` 这个驱动程序首先创建了一个输入设备,并将其注册到内核中。然后,它注册了一个键盘事件通知程序,用于拦截按下截屏键的事件。如果检测到按下截屏键,驱动程序将取消该事件,从而阻止其传递到操作系统和其他应用程序。最后,驱动程序使用定时器周期性地模拟按下和释放截屏键,以便防止任何尝试截屏的行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值