求助!!!驱动卸载时蓝屏 驱动正常启动 并能输出相关信息

fdgsDZ 2018-09-06 05:08:13
刚学驱动开发 借鉴的是楚狂人的《寒江独钓》系列 结果在写键盘过滤时 卸载功能却无法使用 当时不以为意 然后尝试写一个鼠标过滤设备时 结果还是在驱动卸载这块发生问题
DriverEntry 入口函数
mouDispatchGeneral 通用处理 (打印信息) 正常工作
moBindFilter 绑定过滤设备 应该正常工作 否则 dbgview就不输出信息了
mouUnload 驱动卸载 问题就出这 其调用mouDetach
mouDetach 解除绑定

VOID
mouDetach(IN PDEVICE_OBJECT pDeviceObject)
{
PC2P_DEV_EXT devExt;
//BOOLEAN NoRequestsOutstanding = FALSE;
devExt = (PC2P_DEV_EXT)pDeviceObject->DeviceExtension;

IoDetachDevice(devExt->TargetDeviceObject);
devExt->TargetDeviceObject = NULL;
IoDeleteDevice(pDeviceObject);
devExt->pFilterDerivceObject = NULL;
DbgPrint(("Detach Finished\n"));

return;
}

全部相关代码

#include <ntddk.h>

#define KBD_DRIVER_NAME L"\\driver\\mouclass"
#define DELAY_ONE_MICROSECOND (-10)
#define DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)
#define DELAY_ONE_SECOND (DELAY_ONE_MILLISECOND*1000)
typedef struct _C2P_DEV_EXT
{
ULONG NodeSize;
PDEVICE_OBJECT pFilterDerivceObject;
KSPIN_LOCK IoRequestsSpinLock;
KEVENT IoInprogressEvent;
PDEVICE_OBJECT TargetDeviceObject;
PDEVICE_OBJECT LowerDeviceObject;
} C2P_DEV_EXT, *PC2P_DEV_EXT;
NTSTATUS ObReferenceObjectByName(PUNICODE_STRING ObjectName, ULONG Attributes, PACCESS_STATE AccessState, ACCESS_MASK DesiredAccess, POBJECT_TYPE ObjectType, KPROCESSOR_MODE AccessMode, PVOID ParseContext, PVOID *object);
extern POBJECT_TYPE *IoDriverObjectType;


NTSTATUS mouDevExtInit(
_In_ PC2P_DEV_EXT devExt,
_In_ PDEVICE_OBJECT pFilterDeviceObject,
_In_ PDEVICE_OBJECT pTargetDeviceObject,
_In_ PDEVICE_OBJECT pLowerDeviceobject)
{
memset(devExt, 0, sizeof(C2P_DEV_EXT));
devExt->NodeSize = sizeof(C2P_DEV_EXT);
devExt->pFilterDerivceObject = pFilterDeviceObject;
KeInitializeSpinLock(&(devExt->IoRequestsSpinLock));
KeInitializeEvent(&(devExt->IoInprogressEvent), NotificationEvent, FALSE);
devExt->TargetDeviceObject = pTargetDeviceObject;
devExt->LowerDeviceObject = pLowerDeviceobject;
return(STATUS_SUCCESS);

}

NTSTATUS moBindFilter(PDRIVER_OBJECT driverObject)
{
UNICODE_STRING uniNTNameString;
NTSTATUS status;
PC2P_DEV_EXT devext;


PDRIVER_OBJECT moclassDriverObject;
PDEVICE_OBJECT TargDevicerObject;
PDEVICE_OBJECT FilterDeviceObject;
PDEVICE_OBJECT LowDeviceObject;


KdPrint(("mouse:bind start\n"));

RtlInitUnicodeString(&uniNTNameString, KBD_DRIVER_NAME);

status = ObReferenceObjectByName(
&uniNTNameString,
OBJ_CASE_INSENSITIVE,
NULL,
0,
*IoDriverObjectType,
KernelMode,
NULL,
&moclassDriverObject
);
if (!NT_SUCCESS(status))
{
KdPrint(("mouse:bind error\n"));
return(status);
}
else
{
ObDereferenceObject(driverObject);
}
TargDevicerObject = moclassDriverObject->DeviceObject;
while (TargDevicerObject)
{
status = IoCreateDevice(
driverObject,
sizeof(C2P_DEV_EXT),
NULL,
TargDevicerObject->DeviceType,
TargDevicerObject->Characteristics,
FALSE,
&FilterDeviceObject
);
if (!NT_SUCCESS(status))
{
KdPrint(("mouse:createdevice error\n"));
return (status);
}
LowDeviceObject = IoAttachDeviceToDeviceStack(FilterDeviceObject, TargDevicerObject);//绑定过滤设备 返回原来的过滤设备
if (!LowDeviceObject)
{
KdPrint(("myattach:Couldn't attach to mytest device object \n"));
IoDeleteDevice(FilterDeviceObject);
FilterDeviceObject = NULL;
return(status);
}
devext = (PC2P_DEV_EXT)(FilterDeviceObject->DeviceExtension);
mouDevExtInit(devext, FilterDeviceObject, TargDevicerObject, LowDeviceObject);
FilterDeviceObject->Characteristics = LowDeviceObject->Characteristics;
FilterDeviceObject->StackSize = LowDeviceObject->StackSize;
FilterDeviceObject->DeviceType = LowDeviceObject->DeviceType;
FilterDeviceObject->Flags = FilterDeviceObject->Flags | (LowDeviceObject->Flags&(DO_BUFFERED_IO | DO_DIRECT_IO | DO_POWER_PAGABLE));
TargDevicerObject = TargDevicerObject->NextDevice;

}
return status;

}
NTSTATUS mouDispatchGeneral(
_In_ PDEVICE_OBJECT deviceobject,
_In_ PIRP irp
)
{
KdPrint(("other diapatch!"));
IoSkipCurrentIrpStackLocation(irp);
return IofCallDriver(((PC2P_DEV_EXT)deviceobject->DeviceExtension)->LowerDeviceObject, irp);
}
VOID
mouDetach(IN PDEVICE_OBJECT pDeviceObject)
{
PC2P_DEV_EXT devExt;
//BOOLEAN NoRequestsOutstanding = FALSE;
devExt = (PC2P_DEV_EXT)pDeviceObject->DeviceExtension;

IoDetachDevice(devExt->TargetDeviceObject);
devExt->TargetDeviceObject = NULL;
IoDeleteDevice(pDeviceObject);
devExt->pFilterDerivceObject = NULL;
DbgPrint(("Detach Finished\n"));

return;
}

VOID
mouUnload(
IN PDRIVER_OBJECT driverobject
)
{
PDEVICE_OBJECT DeviceObject;
//PDEVICE_OBJECT oldDeviceObject;
//PC2P_DEV_EXT devext;


/* PRKTHREAD currentthread;

currentthread = KeGetCurrentThread();

KeSetPriorityThread(currentthread, LOW_REALTIME_PRIORITY);*/


KdPrint(("DRIVERENTRY unLoading..\n"));

DeviceObject = driverobject->DeviceObject;

while (DeviceObject)
{
mouDetach(DeviceObject);
DeviceObject = DeviceObject->NextDevice;
}
ASSERT(NULL == driverobject->DeviceObject);

return;

}



NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT driver,
_In_ PUNICODE_STRING path
)
{
ULONG i;
NTSTATUS status;
UNREFERENCED_PARAMETER(path);
KdPrint(("key.sys:driverEntry \n"));
for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
{
driver->MajorFunction[i] = mouDispatchGeneral;
}


driver->DriverUnload = mouUnload;


status = moBindFilter(driver);
return status;

}


...全文
565 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
刘仕豪 2018-10-29
  • 打赏
  • 举报
回复
看你写的驱动有没有删除注册表里的信息。
  • 打赏
  • 举报
回复
其实你不应该这样问问题的,这样子的问题,必须完整看你的代码,还不一定能找到问题
至少应该告诉别人兰屏的兰屏代码,这样才能有针对性的看一看代码,更何况那样不是非常仔细也找不到问题。
我告诉你驱动的调试方法吧,你要是做驱动开发,至少准备好虚拟机内核调试环境,然后在内核出现兰屏问题的时候,调试机的windbg上会有详细的出错原因,甚至出错的代码位置,哪怕不能双机调试,也需要开启windows的内核转储,这样兰屏时候会产生一个兰屏文件,告诉你是什么原因,什么位置出现问题,如果用windbg打开,幸运的是你又有代码,也同样可以定位到出错的代码行,然后你可以去想想为什么出现这个错误了
不好意思,实在不想再建立环境编译你的代码了,你就这样试试看吧
fdgsDZ 2018-09-06
  • 打赏
  • 举报
回复
以前学应用程序开发时 程序崩溃还能使用调试器看下问题出在那 但现在刚学驱动开发 崩溃蓝屏却不知从何入手解决 望前辈们指条明路

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧