键盘过滤驱动(键盘过滤驱动 )
一、电脑键盘快捷键大全
电脑键盘快捷键的使用能很好的提高工作效率,所谓的快捷键就是使用键盘上某一个或某几个键的组合完成一条功能命令,从而达到提高操作速度的目的。善于使用快捷键能更快捷的使用电脑,那么电脑键盘快捷键有哪些呢?下面就来简单介绍一下电脑键盘快捷键大全。
电脑键盘快捷键大全:
Ctrl+1,2,3...功能:切换到从左边数起第1,2,3...个标签
Ctrl+A功能:全部选中当前页面内容
Ctrl+C功能:复制当前选中内容
Ctrl+D功能:打开“添加收藏”面版(把当前页面添加到收藏夹中)
Ctrl+E功能:打开或关闭“搜索”侧边栏(各种搜索引擎可选)
Ctrl+F功能:打开“查找”面版
Ctrl+G功能:打开或关闭“简易收集”面板
Ctrl+H功能:打开“历史”侧边栏
Ctrl+I功能:打开“收藏夹”侧边栏/另:将所有垂直平铺或水平平铺或层叠的窗口恢复
Ctrl+K功能:关闭除当前和锁定标签外的所有标签
Ctrl+L功能:打开“打开”面版(可以在当前页面打开Iternet地址或其他文件...)
Ctrl+N功能:新建一个空白窗口(可更改,Maxthon选项→标签→新建)
Ctrl+O功能:打开“打开”面版(可以在当前页面打开Iternet地址或其他文件...)
Ctrl+P功能:打开“打印”面板(可以打印网页,图片什么的...)
Ctrl+Q功能:打开“添加到过滤列表”面板(将当前页面地址发送到过滤列表)
Ctrl+R功能:刷新当前页面
Ctrl+S功能:打开“保存网页”面板(可以将当前页面所有内容保存下来)
Ctrl+T功能:垂直平铺所有窗口
Ctrl+V功能:粘贴当前剪贴板内的内容
Ctrl+W功能:关闭当前标签(窗口)
Ctrl+X功能:剪切当前选中内容(一般只用于文本操作)
Ctrl+Y功能:重做刚才动作(一般只用于文本操作)
Ctrl+Z功能:撤消刚才动作(一般只用于文本操作)
Ctrl+F4功能:关闭当前标签(窗口)
Ctrl+F5功能:刷新当前页面
Ctrl+F6功能:按页面打开的先后时间顺序向前切换标签(窗口)
Ctrl+F11功能:隐藏或显示菜单栏
Ctrl+Tab功能:以小菜单方式向下切换标签(窗口)
Ctrl+拖曳功能:保存该链接的地址或已选中的文本或指定的图片到一个文件夹中(保存目录可更改,Maxthon选项→保存)
Ctrl+小键盘'+'功能:当前页面放大20%
Ctrl+小键盘'-'功能:当前页面缩小20%
Ctrl+小键盘'*'功能:恢复当前页面的缩放为原始大小
Ctrl+Alt+S功能:自动保存当前页面所有内容到指定文件夹(保存路径可更改,Maxthon选项→保存)
Ctrl+Shift+小键盘'+'功能:所有页面放大20%
Ctrl+Shift+小键盘'-'功能:所有页面缩小20%
Ctrl+Shift+F功能:输入焦点移到搜索栏
Ctrl+Shift+G功能:关闭“简易收集”面板
Ctrl+Shift+H功能:打开并激活到你设置的主页
Ctrl+Shift+N功能:在新窗口中打开剪贴板中的地址,如果剪贴板中为文字,则调用搜索引擎搜索该文字(搜索引擎可选择,Maxthon选项→搜索)
Ctrl+Shift+S功能:打开“保存网页”面板(可以将当前页面所有内容保存下来,等同于Ctrl+S)
Ctrl+Shift+W功能:关闭除锁定标签外的全部标签(窗口)
Ctrl+Shift+F6功能:按页面打开的先后时间顺序向后切换标签(窗口)
Ctrl+Shift+Tab功能:以小菜单方式向上切换标签(窗口)
Alt+1功能:保存当前表单
Alt+2功能:保存为通用表单
Alt+A功能:展开收藏夹列表
资源管理器
END显示当前窗口的底端
HOME显示当前窗口的顶端
NUMLOCK+数字键盘的减号(-)折叠所选的文件夹
NUMLOCK+数字键盘的加号(+)显示所选文件夹的内容
NUMLOCK+数字键盘的星号(*)显示所选文件夹的所有子文件夹
向左键当前所选项处于展开状态时折叠该项,或选定其父文件夹
向右键当前所选项处于折叠状态时展开该项,或选定第一个子文件夹
自然键盘
【窗口】显示或隐藏“开始”菜单
【窗口】+F1帮助
【窗口】+D显示桌面
【窗口】+R打开“运行”
【窗口】+E打开“我的电脑”
【窗口】+F搜索文件或文件夹
【窗口】+U打开“工具管理器”
【窗口】+BREAK显示“系统属性”
【窗口】+TAB在打开的项目之间切换
辅助功能
按右边的SHIFT键八秒钟切换筛选键的开和关
按SHIFT五次切换粘滞键的开和关
按NUMLOCK五秒钟切换切换键的开和关
左边的ALT+左边的SHIFT+NUMLOCK切换鼠标键的开和关
左边的ALT+左边的SHIFT+PRINTSCREEN切换高对比度的开和关
QQ快捷键,玩QQ更方便
Alt+S快速回复
Alt+C关闭当前窗口
Alt+H打开聊天记录
Alt+T更改消息模式
Ait+J打开聊天纪录
Ctrl+A全选当前对话框里的内容
Ctrl+F QQ里直接显示字体设置工具条
Ctrl+J输入框里回车(跟回车一个效果)
Ctrl+M输入框里回车(跟回车一个效果)
Ctrl+L对输入框里当前行的文字左对齐
Ctrl+R对输入框里当前行的文字右对齐
Ctrl+E对输入框里当前行的文字居中
Ctrl+V在qq对话框里实行粘贴
Ctrl+Z清空/恢复输入框里的文字
Ctrl+回车快速回复这个可能是聊QQ时最常用到的了
Ctrl+Alt+Z快速提取消息
Ctrl+Alt+A捕捉屏幕
IE浏览器快捷键
一般快捷键
F11打开/关闭全屏模式
TAB循环的选择地址栏,刷新键和当前标签页
CTRL+F在当前标签页查询字或短语
CTRL+N为当前标签页打开一个新窗口
CTRL+P打印当前标签页
CTRL+A选择当前页的所有内容
CTRL+Plus放大(由于前面是加号为避免误解所以用Plus代表“+”)
CTRL+-缩小
CTRL+0恢复原始大小
导航快捷键
ALT+HOME返回主页
ALT+LEFT返回后一页
ALT+RIGHT返回前一页
F5刷新
CTRL+F5刷新页面同时刷新缓存
ESC停止下载页面
收藏夹中心快捷键
CTRL+I打开收藏夹
CTRL+SHIFT+I以固定模式打开收藏夹
CTRL+B整理收藏夹
CTRL+D将当前页添加到收藏夹
CTRL+J打开 Feeds
CTRL+SHIFT+J以固定模式打开 Feeds
CTRL+H打开历史
CTRL+SHIFT+H以固定模式打开历史
标签快捷键
CTRL+鼠标左键 or鼠标中键用新标签打开链接并切换至新标签
CTRL+SHIFT+鼠标左键 or CTRL+SHIFT+鼠标中键用新标签打开链接但不切换至新标签
CTRL+W or CTRL+F4关闭当前标签页(如果只有一个标签将关闭IE)
CTRL+Q打开快速标签视图
CTRL+T打开一个新标签
CTRL+SHIFT+Q查看打开标签的列表
CTRL+TAB切换到下一个标签
CTRL+SHIFT+TAB切换到前一个标签
地址栏快捷键
ALT+D选择地址栏
CTRL+ENTER在地址栏中的文本初出添加"."和末尾添加".com"
CTRL+SHIFT+ENTER在地址栏中的文本初出添加"."和末尾添加你自定义的后缀
ALT+ENTER用新标签打开地址栏的网址
F4查看以前出入的地址
搜索栏快捷键
CTRL+E选择搜索栏
CTRL+DOWN查看搜索引擎列表
ALT+ENTER用新标签打开搜索结果
以上就是电脑键盘快捷键大全的简单介绍,了解一些快捷键的使用,确实能给我们提高工作效率,快捷键很多,比较常用的一些还是需要了解的。
二、如何构造一个简单的USB过滤驱动程序
本文分三部分来介绍如何构造一个简单的USB过滤驱动程序,包括“基本原理”、“程序的实现”、“使用INF安装”。此文的目的在于希望读者了解基本原理后,可以使用除DDK以外最流行也最方便的驱动开发工具DriverStudio来实现一个自己的过滤驱动,并正确地安装。
一、基本原理
我们知道,WDM(和KDM)是分层的,在构造设备栈时,IO管理器可以使一个设备对象附加到另外一个初始驱动程序创建的设备对象上。与初始设备对象相关的驱动程序决定的IRP,也将被发送到附加的设备对象相关的驱动程序上。这个被附加的驱动程序便是过滤驱动程序。如右图,过滤驱动可以在设备栈的任何层次中插入。IO管理器发出的IRP将会沿着右图的顺序从上往下传递并返回。因此,我们可以使用过滤驱动程序来检查、修改、完成它接收到的IRP,或者构造自己的IRP。
上面这种文字是很枯燥的,好在“前人”已经写过一些范例以供我们更好地理解这些概念。读过Waltz Oney的《Programming Windows Driver Mode》一书的读者大概都知道Waltz Oney提供的范例中有一个关于USB过滤器(第九章)的例子,而在此基础上,《USB Design By Example》()的作者John Hyde实现了一个USB键盘过滤驱动程序,即给此程序增加了一个“拦截(Intercept)”功能来处理USB键盘的Report以实现特定的功能:当驱动程序在IRP_MJ_INTERNAL_DEVICE_CONTROL设置的完成例程从USB设备拦截到一个Get_Report_Descriptor时,拦截程序将此Descriptor中的USAGE值从“Keyboard”改为“UserDefined”,再返回给系统。
我们可以从这个例子中获得一些灵感,比如,在Win2k下,键盘是由OS独占访问的,我们可以通过这种方式使之可以让用户自由访问;我们也可以拦截其他Report_Descriptor,将部分键重新定义,以满足特殊的要求;如果你愿意再做一个用户态的程序,你还可以将你拦截到的键值传递给你的用户态程序,以实现象联想、实达等国内电脑大厂出品的那些键盘上的各种实用的功能。
二、程序的实现
Waltz Oney和John Hyde的例子已经写得很详细了,读者可以不用修改一个字节便顺利地编译生成一个过滤驱动程序。本文的目的在于使用DriverStudio组件Driverworks来实现同样的功能。
相信读者读到这篇文章时,已经对DriverStudio有了很多的了解。DriverStudio作为一个以C++为基础的“快速”驱动开发工具,它封装了基本上所有的DDK的函数,其集成在VC++中的DriverWizard,可以很方便地引导你完成设备驱动程序开发的全过程,能根据你的硬件种类自动生成设备驱动程序源代码,并提供了很多范例程序。当然,这些例子中便包含一个USB Filter驱动程序的框架。在不侵犯版权的前提下,充分利用现有共享的、免费的、授权的代码是我们的一贯作法。我们下面便以此范例为基础来作修改。
我们的目的是做一个HID小驱动程序hidusb.sys的Lower Filter,它附加在“人机接口设备”,通过拦截USB的Get_Report_Descriptor来修改其返回值,当它发现该Descriptor的Usage为“Keyboard”时,将其改为“UserDefined”,如此我们便可以完全控制这只键盘。具体做法是,拦截IRP_MJ_INTERNAL_DEVICE_CONTROL,并检查其IOCTL代码及URB,如果满足IOCTRL功能代码为IOCTL_INTERNAL_USB_SUBMIT_URB以及URB功能代码为URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE的条件,即上层驱动发来Get_Report_Descriptor请求时,设置一个完成例程,在这个完成例程中,我们将判断Usage的值,将Usage由“6(Keyboard)”时,将其改为“0(UserDefined)”。
打开C:\Program Files\NuMega\DriverStudio\DriverWorks\Examples\wdm\usbfilt目录(具体目录依你的DriverStudio所安装的目录不同而不同),再打开工程文件usbfilt.dsw,我们先看一下代码。
程序由两个类组成,一个是Driver类,一个是Device类。Driver类包括:
入口函数DriverEntry:
DECLARE_DRIVER_CLASS(UsbFilterDriver, NULL)
/////////////////////////////////////////////////////////////////////
// Driver Entry
//
NTSTATUS UsbFilterDriver::DriverEntry(PUNICODE_STRING RegistryPath)
{
T<<"UsbFilterDriver::DriverEntry\n";
m_Unit= 0;
return STATUS_SUCCESS;
// The following macro simply allows compilation at Warning Level 4
// If you reference this parameter in the function simply remove the macro.
UNREFERENCED_PARAMETER(RegistryPath);
}
AddDevice函数
NTSTATUS UsbFilterDriver::AddDevice(PDEVICE_OBJECT Pdo)
{
T<<"UsbFilterDriver::AddDevice\n";
UsbFilterDevice* pFilterDevice= new(
static_cast<PCWSTR>(NULL),
FILE_DEVICE_UNKNOWN,
static_cast<PCWSTR>(NULL),
0,
DO_DIRECT_IO
)
UsbFilterDevice(Pdo, m_Unit);
if(pFilterDevice)
{
NTSTATUS status= pFilterDevice->ConstructorStatus();
if(!NT_SUCCESS(status))
{
T<<"Failed to construct UsbFilterDevice"
<<(ULONG) m_Unit
<<" status="
<< status
<<"\n";
delete pFilterDevice;
}
else
{
m_Unit++;
}
return status;
}
else
{
T<<"Failed to allocate UsbFilterDevice"
<<(ULONG) m_Unit
<<"\n";
return STATUS_INSUFFICIENT_RESOURCES;
}
}
这两段代码基本上和自动生成的代码差不多。AddDevice的作用是构造一个过滤器的实例。
关键的代码在Device类。在这个类里,我们把过滤器插入设备栈,并拦截IRP,用自己的完成例程来实现特定的功能。
Device构造函数
UsbFilterDevice::UsbFilterDevice(PDEVICE_OBJECT Pdo, ULONG Unit):
KWdmFilterDevice(Pdo, NULL)
{
T<<"UsbFilterDevice::UsbFilterDevice\n";
// Check constructor status
if(! NT_SUCCESS(m_ConstructorStatus))
{
return;
}
// Remember our unit number
m_Unit= Unit;
// initialize the USB lower device
m_Usb.Initialize(this, Pdo);
NTSTATUS status= AttachFilter(&m_Usb);//Attach the filter
if(!NT_SUCCESS(status))
{
m_ConstructorStatus= status;
return;
}
SetFilterPowerPolicy();
SetFilterPnpPolicy();
}
在DDK中,我们用IoAttachDevice将设备对象插入设备栈中。DriverStudio封装了这个函数。在DriverStudio中,其他驱动程序需要用Initialize来初始化设备对象和接口,对于过滤驱动,我们关键是需要Attachfilter将其附加在堆栈中。
对于大部分如IRP_MJ_SYSTEM_CONTROL等IRP,我们所做的只需用PassThrough(Irp)将其直接往设备栈下层传递,不需要做任何工作。这些代码我们就不一一列举了。下面的部分才是本文的关键。
我们知道,HIDUSB.SYS是使用内部IOCTRL发出URB给USB类驱动程序(USBD)读取数据的,那么,HIDUSB首先必须构造一个IRP_MJ_INTERNAL_DEVICE_CONTROL,它的IOCTL功能码为IOCTL_INTERNAL_USB_SUBMIT_URB(发出URB的内部IOCTL)。另外,因为我们要检查并修改的是USB键盘某个接口的报告描述,那么这个URB应该是URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE,如下:
NTSTATUS UsbFilterDevice::InternalDeviceControl(KIrp I)
{
T<<"UsbFilterDevice::InternalDeviceControl\n";
// Pass through IOCTLs that are not submitting an URB
//不是我们感兴趣的IOCTL不要理它
if(I.IoctlCode()!= IOCTL_INTERNAL_USB_SUBMIT_URB)
return DefaultPnp(I);
PURB p= I.Urb(CURRENT);// get URB pointer from IRP
//不是我们感兴趣的URB,也不要理它,
if(p->UrbHeader.Function!=
URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE)
return DefaultPnp(I);
//符合要求的IRP才被设置完成例程
return PassThrough(I, LinkTo(DeviceControlComplete), this);
}
在设置好条件以后,再来实现完成例程。所有的检查、修改等动作都是在完成例程里面完成的。
NTSTATUS UsbFilterDevice::DeviceControlComplete(KIrp I)
{
PURB p= I.Urb(CURRENT);
if(p)
{
//拦截到设备返回的描述表,
char* DescriptorBuffer=(char*)p->UrbControlDescriptorRequest.TransferBuffer;
//指向第三个字节,表示设备Usage属性的值
DescriptorBuffer+= 3;
//如果值为6则改成0,6表示hid键盘,0表示未知设备
//在设备管理器里面,原来的hid兼容键盘就不复存在了,取而代之的则是hid兼容设备
if((*DescriptorBuffer&0xff)== 6)
*DescriptorBuffer= 0;
}
return I.Status();
}
读者可以对照DriverWorks中的例子,直接替换掉(或者修改)上面这两个函数,再编译一下,便可以得到一个完整的键盘过滤器驱动程序。
其实,只要弄清楚了我们需要做些什么动作,在DriverStudio里面只需要写少量的关键代码,便可实现我们的要求,其余的大部分工作,或有范例可供参考,或有Driver Wizard自动生成。
从上面可以看出,我们只需要修改这两个函数,拦截合适的IRP,便可以在完成例程里面实现我们特定的要求。正如开头所说,我们也可以拦截其他的IRP,拦截其他的URB,或者拦截特定键盘的按键键值,将之传递到用户态,以方便实现联想、实达等随机配备的多功能键盘的功能。
三、使用INF安装驱动
在完成了驱动以后,还必须把它安装到系统里面,驱动程序才会起作用。一般来说,我们都必须为我们的驱动程序提供一个inf文件,以便于用户安装或者维护。对于新手来说,过滤驱动程序的inf或许有些棘手。所以,针对本文所描述的驱动,我们提供一个Win98下的安装范例usbkey.inf,范例中“;”后的文字是注解,以方便读者理解。
; usbkey.INF
;
; Installs Lower Level Filter for a HID keyboard device
;
;(c) Copyright 2001 SINO Co., Ltd.
;
[Version]
;”CHICAGO”表示Win9x平台
Signature="$CHICAGO$"
;键盘所属类名
Class=HID
ClassGUID={745a17a0-74d3-11d0-b6fe-00a0c90f57da}
;驱动程序提供者,此信息会显示在设备属性的“常规”页
Provider=%USBDBE%
LayoutFile=layout.inf
;显示在驱动程序文件详细资料窗口
DriverVer=11/12/2001,4.10.2222.12
;[ControlFlags]
;ExcludeFromSelect=*
;驱动程序安装目录,inf会将我们的驱动程序安装到如下目录
;记得Destinationdir后面一定要带一个“s”
[DestinationDirs]
DefaultDestDir= 10,system32\drivers
;要增加的注册表项
[ClassInstall]
Addreg=HIDClassReg
[HIDClassReg]
HKR,,,,%HID.ClassName%
HKR,,Icon,,-20
;制造商
[Manufacturer]
%USBDBE%=USBDBE
[USBDBE]
;我们所要附加过滤驱动程序的设备ID。这个ID可以从IC的规范上得来,也可以
;用hidview.exe读出,或者从注册表HKLM\Enum\hid和usb项找出
%HID.DeviceDesc%= Keypad_Inst, USB\VID_05AF&PID_0805&MI_00
;要安装的文件和需要修改的注册表项
;Install usbkey driver
[Keypad_Inst]
CopyFiles=Keypad_Inst.CopyFiles
AddReg=Keypad_Inst.AddReg
[Keypad_Inst.CopyFiles]
hidusb.sys
hidparse.sys
hidclass.sys
usbfilt.sys
[Keypad_Inst.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,"hidusb.sys"
[Keypad_Inst.HW]
AddReg=Keypad_Inst.AddReg.HW
;Lowerfilters表示是低层过滤驱动,如果是上层过滤驱动,则必须改为upperfilters
[Keypad_Inst.AddReg.HW]
HKR,,"LowerFilters",0x00010000,"usbfilt.sys"
;HID设备所需要安装的文件和注册表中需要修改的地方
;Install USBHIDDevice
[USBHIDDevice]
CopyFiles=USBHIDDevice.Copy
AddReg=USBHIDDevice.AddReg
[USBHIDDevice.Copy]
hidclass.sys
hidusb.sys
hidparse.sys
[USBHIDDevice.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,"hidusb.sys"
;以下定义需要在上面某些地方使用时替换的字符串
[strings]
USBDBE="SINO Co., Ltd."
HID.DeviceDesc="SINO USB MultiKeyboard"
HID.HIDDeviceDesc="Human Interface Devices"
HID.DefaultDevice="HID Default Device"
HID.ClassName="Human Input Devices(HID)"
HID.SvcDesc="Microsoft HID Class Driver"
其实最简单的写inf的方式,是找一些类似设备的inf文件或范例来修改。在不侵权的前提下,充分利用现有资源是我们的一贯原则。
三、键盘过滤驱动卸载时,系统蓝屏,该如何处理
蓝屏的原因往往集中在不兼容的硬件和驱动程序、有问题的软件、病毒等。解决办法:
A、病毒的原因。使用腾讯电脑管家——病毒查杀。
B、内存的原因。用橡皮擦把内存条的金手指擦拭一下,把氧化层擦掉,确保内存条安装、运行正常。
C、机箱不清洁.CPU风扇积灰太多不能正常运行,造成CPU温度过高,用毛刷、电吹风将机箱内壁、CPU风扇、显卡风扇、主板上的积灰都清理一遍。
D、也有一种可能就是系统的不稳定,这时需要把电脑重启按F8进入启动菜单项,选择"启动到最后一次正确配置"。