首页
社区
课程
招聘
[分享]驱动模拟键鼠,支持64位,附代码。
发表于: 2015-2-1 15:55 68786

[分享]驱动模拟键鼠,支持64位,附代码。

2015-2-1 15:55
68786
收藏
免费 10
支持
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  kanxue   +2.00 2019/02/02 感谢分享~
最新回复 (126)
雪    币: 25
活跃值: (506)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
76
很流弊的东西!
2016-9-14 18:03
0
雪    币: 103
活跃值: (128)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
77
Mark
2016-9-19 15:12
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
78
大牛能对应新系统更新下吗
2016-10-6 17:28
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
79
请问一下,我在虚拟机里面加载楼主的64位驱动,显示PS和USB借口的鼠标同时存在,但是为什么我仿照写了之后就一个都检测不到呢?代码如下

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
NTSTATUS status = STATUS_SUCCESS;
UNICODE_STRING ustrLinkName;
UNICODE_STRING ustrDevName;
PDEVICE_OBJECT pDevObj;
//设置分发函数和卸载例程
pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
pDriverObj->DriverUnload = DriverUnload;
//创建一个设备
RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);
status = IoCreateDevice(pDriverObj, 0, &ustrDevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevObj);
if(!NT_SUCCESS(status)) return status;

status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);
if(!NT_SUCCESS(status))
{
IoDeleteDevice(pDevObj);
return status;
}
DbgPrint("DriverEntry\n");
pDevObj->Flags |= DO_DIRECT_IO;
pDevObj->AlignmentRequirement = FILE_WORD_ALIGNMENT;
status = SearchMouServiceCallBack(pDriverObj);
if (!NT_SUCCESS(status))
{
KdPrint(("MOUSE_DEVICE ERROR, error = 0x%08lx\n", status));
return status;
}
//返回加载驱动的状态(如果返回失败,驱动讲被清除出内核空间)
pDevObj->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
}



NTSTATUS SearchMouServiceCallBack(PDRIVER_OBJECT DriverObject)
{
//定义用到的一组全局变量,这些变量大多数是顾名思义的
NTSTATUS status = STATUS_SUCCESS;
UNICODE_STRING uniNtNameString;
PDEVICE_OBJECT pTargetDeviceObject = NULL;
PDRIVER_OBJECT KbdDriverObject = NULL;
PDRIVER_OBJECT KbdhidDriverObject = NULL;
PDRIVER_OBJECT Kbd8042DriverObject = NULL;
PDRIVER_OBJECT UsingDriverObject = NULL;
PDEVICE_OBJECT UsingDeviceObject = NULL;

PVOID UsingDeviceExt = NULL;

//这里的代码用来打开USB键盘端口驱动的驱动对象
RtlInitUnicodeString(&uniNtNameString, L"\\Driver\\mouhid");
status = ObReferenceObjectByName(&uniNtNameString,
OBJ_CASE_INSENSITIVE, NULL, 0,
*IoDeviceObjectType,
KernelMode,
NULL,
(PVOID *)&KbdhidDriverObject);
if (!NT_SUCCESS(status))
{
DbgPrint(("Couldn't get the USB Mouse Object\n"));
}
else
{
ObDereferenceObject(KbdhidDriverObject);
DbgPrint(("get the USB Mouse Object\n"));
}
//打开PS/2键盘的驱动对象
RtlInitUnicodeString(&uniNtNameString, L"\\Driver\\i8042prt");
status = ObReferenceObjectByName(&uniNtNameString,
OBJ_CASE_INSENSITIVE,
NULL, 0,
*IoDeviceObjectType,
KernelMode,
NULL,
(PVOID *)&Kbd8042DriverObject);
if (!NT_SUCCESS(status))
{
DbgPrint(("Couldn't get the PS/2 Mouse Object \n"));
}
else
{
ObDereferenceObject(Kbd8042DriverObject);
DbgPrint(("get the PS/2 Mouse Object\n"));
}
//如果两个设备都没有找到
if (!Kbd8042DriverObject && !KbdhidDriverObject)
{
return STATUS_SUCCESS;
}
//如果USB键盘和PS/2键盘同时存在,使用USB鼠标
if (KbdhidDriverObject)
{
UsingDriverObject = KbdhidDriverObject;
}
else
{
UsingDriverObject = Kbd8042DriverObject;
}
RtlInitUnicodeString(&uniNtNameString, L"\\Driver\\mouclass");
status = ObReferenceObjectByName(&uniNtNameString,
OBJ_CASE_INSENSITIVE, NULL,
0,
*IoDeviceObjectType,
KernelMode,
NULL,
(PVOID *)&KbdDriverObject);
if (!NT_SUCCESS(status))
{
//如果没有成功,直接返回即可
DbgPrint(("MyAttach: Coundn't get the Mouse driver Object\n"));
return STATUS_UNSUCCESSFUL;
}
else
{
ObDereferenceObject(KbdDriverObject);
}
//遍历KbdDriverObject下的设备对象
UsingDeviceObject = UsingDriverObject->DeviceObject;
while (UsingDeviceObject)
{
status = SearchServiceFromMouExt(KbdDriverObject, UsingDeviceObject);
if (status == STATUS_SUCCESS)
{
break;
}
UsingDeviceObject = UsingDeviceObject->NextDevice;
}
if (g_KoMCallBack.MouDeviceObject && g_KoMCallBack.MouseClassServiceCallback)
{
DbgPrint(("Find MouseClassServiceCallback\n"));
}
return status;
}
2016-10-12 15:26
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
80
好吧,终于找到地方了,不知道以前从哪个地方抄的代码:
extern POBJECT_TYPE *IoDeviceObjectType;

应该是
extern POBJECT_TYPE *IoDriverObjectType;

多谢楼主的代码和开源精神,赞一个
2016-10-14 11:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
81
WIN7 64可以用不?
2016-12-14 11:56
0
雪    币: 14
活跃值: (62)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
82
我用这个驱动已成功向WinKawaks游戏模拟器发送模拟按键,但遇到这样一个问题:比如当按住了键盘A键时,这时我发送一个连招的模拟按键,但模拟器会一直响应我按住的A键,导致我的连招没效果,但当没有操作键盘的时候,这里发送模拟按键能100%成功。我也试过先模拟发送A键的抬起,但是抬起后还是继续响应按住的A键。请问有什么方法可以实现先交出键盘的控制权,等我的模拟按键结束后再响应回实际的键盘按键?最好可以给出代码哈,本人较菜。
2017-1-16 16:12
0
雪    币: 2
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
83
绝对的用得到,留个位置以后好来下
2017-1-16 21:59
0
雪    币: 251
活跃值: (301)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
84
一键连招的辅助我也做过。其实没什么复杂的,你按下按键,然后弹起,中间加一个比较短的延时
然后再按下另外一个键再弹起。这样就有效果了。至于延时多少具体自己试。
2017-1-30 18:23
0
雪    币: 48
活跃值: (1104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
85
长知识了
2017-3-7 00:17
0
雪    币: 569
活跃值: (261)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
86
好多人跟我一样啊,一看到键鼠模拟就想到用于游戏啊。。。 可以改成网络版,这样可以远程控制电脑里的键鼠了,比如用手机远程控制电脑
2017-3-7 09:38
0
雪    币: 36
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
87
感谢楼主分享
2017-3-14 21:54
0
雪    币: 878
活跃值: (737)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
88
赞,辛苦哦了
2017-3-14 23:48
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
89
mark
2017-6-4 16:30
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
90

尝试用C#调用

[DllImport(“kernel32.dll”)]
public  static  extern  IntPtr  LoadLibrary(string  dllToLoad);

IntPtr  pDll  =  NativeMethods.LoadLibrary(@”PathToYourDll.DLL”);
返回值为IntPtr.Zero

原来是64位build的问题,改成32位build就好了


2017-7-8 16:49
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
91

发现一个问题

win7 64位 

C# 调用dll

MouseMoveRELATIVE 只能移动X轴

2017-7-9 02:27
0
雪    币: 251
活跃值: (301)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
92
楼上的小哥,请使用MouseMoveABSOLUTE,这个是绝对坐标移动,你用的那个是相对坐标移动。
2017-7-10 16:13
0
雪    币: 251
活跃值: (301)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
93
有没有哪位兄台能越过64位系统驱动签名的?分享一下吧。
2017-8-11 18:36
0
雪    币: 251
活跃值: (301)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
94
今天试着把该程序放到VS2015+WDK10下编译,发现只有32位的可以编译成功,X64的出现一堆的错误。有没有人会修改?
2017-8-15 13:23
0
雪    币: 251
活跃值: (301)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
95
win10下64位编译的问题解决了,但是还是要在开机选禁用驱动签名。头疼。。
2017-8-15 18:00
0
雪    币: 4
活跃值: (189)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
96
楼主,你有没有遇到模拟鼠标驱动导致蓝屏的啊
2017-9-8 23:35
0
雪    币: 251
活跃值: (301)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
97
Mco令海 楼主,你有没有遇到模拟鼠标驱动导致蓝屏的啊[em_2]
有的,要么是64位和32位的驱动没选对,要么就是win7和win10的驱动没选对,我就碰到这两种。
2017-9-9 11:22
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
98
mark,留个记号,谢谢
2017-9-11 23:25
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
99
测试了下,可用
2017-9-21 22:01
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
100
楼主大大,有个死狗拿着驱动卖钱
2017-11-24 16:57
0
游客
登录 | 注册 方可回帖
返回
//