谁能帮助一下 我写了个挂接键盘的驱动 但是只要一运行到IoAttachDevice 函数 就蓝屏了
没想通是怎么回事 都折磨一个多星期了 望高人指点.... 我把代码贴出来
key.cpp
==================================================
#include "key.h"
#include "HookKbd.h"
NTSTATUS DispatchPassDown(PDEVICE_OBJECT pDeviceObject,PIRP pIrp);
VOID keyunload(IN PDRIVER_OBJECT pDriverObject);
NTSTATUS HookKeyboard(IN PDRIVER_OBJECT pDriverObject);
//驱动入口点
#pragma INITCODE
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath)
{
KdPrint(("进入驱动入口点\n"));
NTSTATUS status;
for (int i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++)
{
pDriverObject->MajorFunction[i]=DispatchPassDown;
}
status=HookKeyboard(pDriverObject);
if (!NT_SUCCESS(status))
{
KdPrint(("创建和附加设备失败\n"));
}
pDriverObject->DriverUnload=keyunload;
KdPrint(("退出驱动入口点\n"));
return STATUS_SUCCESS;
}
//卸载例程
#pragma PAGEDCODE
VOID keyunload(IN PDRIVER_OBJECT pDriverObject)
{
KdPrint(("进入驱动卸载keyunload函数\n"));
PDEVICE_OBJECT pNextObj;
PDEVICE_EXTENSION pDevExt;
UNICODE_STRING pLinkName;
pNextObj = pDriverObject->DeviceObject;
while (pNextObj != NULL)
{
pDevExt = (PDEVICE_EXTENSION)pNextObj->DeviceExtension;
if (pDevExt->pkeyboardDevice!=NULL)
{
//脱离键盘挂接
IoDetachDevice(pDevExt->pkeyboardDevice);
}
//删除符号链接
//pLinkName = pDevExt->ustrSymLinkName;
//IoDeleteSymbolicLink(&pLinkName);
pNextObj = pNextObj->NextDevice;
//删除设备
IoDeleteDevice( pDevExt->pDevice );
}
KdPrint(("退出驱动卸载keyunload函数\n"));
return;
}
//派遣函数 向下一层设备转发
#pragma LOCKEDCODE
NTSTATUS DispatchPassDown(PDEVICE_OBJECT pDeviceObject,PIRP pIrp)
{
PDEVICE_EXTENSION pDevExt;
pDevExt=(PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;
IoSkipCurrentIrpStackLocation(pIrp);
return IoCallDriver(pDevExt->pDevice,pIrp);
}
=====================================================
hookkdb.h
====================================================
#pragma once
#include "key.h"
//创建设备并附加到键盘上
#pragma LOCKEDCODE
NTSTATUS HookKeyboard(IN PDRIVER_OBJECT pDriverObject)
{
NTSTATUS status={0};
UNICODE_STRING devName,symLinkName,keyName;//设备名 符号名 键盘名
PDEVICE_OBJECT pkeyDevice=NULL,pAttachedDevice=NULL;
PDEVICE_EXTENSION pDevExt=NULL;
//创建设备
//RtlInitUnicodeString(&devName,L"\\Device\\keyDevice");
status=IoCreateDevice(pDriverObject,
sizeof(DEVICE_EXTENSION),
NULL, //&devName,
FILE_DEVICE_KEYBOARD,
0,
TRUE,
&pkeyDevice
);
if (!NT_SUCCESS(status))
{return status;}
KdPrint(("创建设备成功pkeyDevice\n"));
//创建符号连接
//RtlInitUnicodeString(&symLinkName,L"\\??\\keyddxx");
//status = IoCreateSymbolicLink(&symLinkName,&devName);
//if (!NT_SUCCESS(status))
//{
//IoDeleteDevice(pkeyDevice);
//return status;
//}
pkeyDevice->Flags=pkeyDevice->Flags | (DO_BUFFERED_IO | DO_POWER_PAGABLE);
pkeyDevice->Flags=pkeyDevice->Flags & ~DO_DEVICE_INITIALIZING;
RtlZeroMemory(pkeyDevice->DeviceExtension,sizeof(DEVICE_EXTENSION));
pDevExt=(PDEVICE_EXTENSION)pkeyDevice->DeviceExtension;
CCHAR namebuffer[64]="\\Device\\KeyboardClass0";
STRING namestring;
RtlInitAnsiString(&namestring,namebuffer);
RtlAnsiStringToUnicodeString(&keyName,&namestring,TRUE);
status=IoAttachDevice(pkeyDevice,&keyName,&pAttachedDevice);
if (!NT_SUCCESS(status))
{
KdPrint(("附加到键盘失败\n"));
pDevExt->pDevice=pkeyDevice;
//pDevExt->ustrDeviceName=devName;
//pDevExt->ustrSymLinkName=symLinkName;
pDevExt->pkeyboardDevice=NULL;
}
RtlFreeUnicodeString(&keyName);
//填充设备扩展
pDevExt->pDevice=pkeyDevice;
//pDevExt->ustrDeviceName=devName;
//pDevExt->ustrSymLinkName=symLinkName;
pDevExt->pkeyboardDevice=pAttachedDevice;
return status;
}
======================================================
key.h
=======================================================
#pragma once
#ifdef __cplusplus
extern "C"
{
#endif
#include <NTDDK.h>
#ifdef __cplusplus
}
#endif
#define PAGEDCODE code_seg("PAGE")
#define LOCKEDCODE code_seg()
#define INITCODE code_seg("INIT")
#define PAGEDDATA data_seg("PAGE")
#define LOCKEDDATA data_seg()
#define INITDATA data_seg("INIT")
#define arraysize(p) (sizeof(p)/sizeof((p)[0]))
typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT pDevice; //自己的设备
UNICODE_STRING ustrDeviceName; //设备名称
UNICODE_STRING ustrSymLinkName; //符号链接名
PDEVICE_OBJECT pkeyboardDevice; //键盘
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课