一个很简短的驱动问题

biweilun 2009-06-28 10:16:23
这个驱动加载和服务启动都没有问题,但是服务停止却会蓝屏,是不是退出函数有问题?老大们帮我看看


#include <ntddk.h>
#define INITCODE code_seg("INIT")

typedef struct _DEVICE_EXTENSION{
PDEVICE_OBJECT pDevice;
UNICODE_STRING ustrDeviceName;
UNICODE_STRING ustrSymLinkName;
}DEVICE_EXTENSION,*PDEVICE_EXTENSION;

extern "C" NTSTATUS CreateDevice(
IN PDRIVER_OBJECT pDriverObject)
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;
PDEVICE_EXTENSION pDevExt;

UNICODE_STRING szDevName;
RtlInitUnicodeString(&szDevName,L"\\Device\\MyWDKDevice");
status=IoCreateDevice(pDriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)szDevName,
FILE_DEVICE_UNKNOWN,
0,TRUE,&pDevObj);
if(!NT_SUCCESS(status))
return status;
pDevObj->Flags|=DO_BUFFERED_IO;
pDevExt=(PDEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt->pDevice=pDevObj;
pDevExt->ustrDeviceName=szDevName;

UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\?\\HelloWDK");
pDevExt->ustrSymLinkName=symLinkName;

status=IoCreateSymbolicLink(&symLinkName,&szDevName);
if(!NT_SUCCESS(status))
{
IoDeleteDevice(pDevObj);
return status;
}
return STATUS_SUCCESS;
}

extern "C" VOID RaiseIRQL()
{
KIRQL oldIrql;
ASSERT(KeGetCurrentIrql()<=DISPATCH_LEVEL);
if(KeGetCurrentIrql()==PASSIVE_LEVEL)
{
DbgPrint("PASSIVE_LEVEL");
DbgPrint("%d",KeGetCurrentIrql());
KeRaiseIrql(DISPATCH_LEVEL,&oldIrql);
}
DbgPrint("%d",KeGetCurrentIrql());
KeLowerIrql(oldIrql);
if(KeGetCurrentIrql()==PASSIVE_LEVEL)
{
DbgPrint("PASSIVE_LEVEL recover");
DbgPrint("%d",KeGetCurrentIrql());
}
}


extern "C" VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT pNextObj;
DbgPrint("Enter DriverUnload\n");
pNextObj=pDriverObject->DeviceObject;
while(pNextObj!=NULL)
{
PDEVICE_EXTENSION pDevExt=(PDEVICE_EXTENSION)pNextObj->DeviceExtension;
UNICODE_STRING pLinkName=pDevExt->ustrSymLinkName;
IoDeleteSymbolicLink(&pLinkName);
pNextObj=pNextObj->NextDevice;
IoDeleteDevice(pDevExt->pDevice);
}
DbgPrint("DriverUnload Complete!\n");
}


extern "C" NTSTATUS DDKDispatchRoutine(
IN PDEVICE_OBJECT pDeviceObj,
IN PIRP pIrp)
{
DbgPrint("Enter DDKDispatchRoutine \n");
PIO_STACK_LOCATION stack=IoGetCurrentIrpStackLocation(pIrp);
static CHAR* irpname[]=
{
"IRP_MJ_CREATE",
"IRP_MJ_CREATE_NAMED_PIPE",
"IRP_MJ_CLOSE",
"IRP_MJ_READ",
"IRP_MJ_WRITE",
"IRP_MJ_QUERY_INFORMATION",
"IRP_MJ_SET_INFORMATION",
"IRP_MJ_QUERY_EA",
"IRP_MJ_SET_EA",
"IRP_MJ_FLUSH_BUFFERS",
"IRP_MJ_QUERY_VOLUME_INFORMATION",
"IRP_MJ_SET_VOLUME_INFORMATION",
"IRP_MJ_DIRECTORY_CONTROL",
"IRP_MJ_FILE_SYSTEM_CONTROL",
"IRP_MJ_DEVICE_CONTROL",
"IRP_MJ_INTERNAL_DEVICE_CONTROL",
"IRP_MJ_SHUTDOWN",
"IRP_MJ_LOCK_CONTROL",
"IRP_MJ_CLEANUP",
"IRP_MJ_CREATE_MAILSLOT",
"IRP_MJ_QUERY_SECURITY",
"IRP_MJ_MJ_POWER",
"IRP_MJ_SYSTEM_CONTROL",
"IRP_MJ_DEVICE_CHANGE",
"IRP_MJ_QUERY_QUOTA",
"IRP_MJ_SET_QUOTA",
"IRP_MJ_PNP"
};
UCHAR type=stack->MajorFunction;
if(type>=ARRAYSIZE(irpname))
DbgPrint("UnKnown TRP,major type is %x\n",type);
else
DbgPrint("\t%s\n",irpname[type]);
NTSTATUS status=STATUS_SUCCESS;
pIrp->IoStatus.Status=status;
pIrp->IoStatus.Information=0;

IoCompleteRequest(pIrp,IO_NO_INCREMENT);
DbgPrint("Leave DispatchRoutine\n");
return status;

}

#pragma INITCODE
extern "C" NTSTATUS DriverEntry(
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
{

pDriverObject->DriverUnload=DriverUnload;

/*
PEPROCESS pEProcess=PsGetCurrentProcess();
PTSTR pName=(PSTR)((ULONG)pEProcess+0x16c);
DbgPrint("%s\n",pName);
RaiseIRQL();
*/
DbgPrint("DriverEntry Started!\n");

pDriverObject->MajorFunction[IRP_MJ_CREATE]=DDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_CLOSE]=DDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_READ]=DDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_WRITE]=DDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_CLEANUP]=DDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_SET_INFORMATION]=DDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_SHUTDOWN]=DDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL]=DDKDispatchRoutine;

NTSTATUS status=CreateDevice(pDriverObject);

DbgPrint("DriverEntry Ended!\n");
return STATUS_SUCCESS;
}

...全文
164 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tushuguanqlf 2009-08-31
  • 打赏
  • 举报
回复
看到了.
Jacky_Sunx 2009-07-09
  • 打赏
  • 举报
回复
说一下啥问题啊,大家引以为戒
Jacky_Sunx 2009-07-09
  • 打赏
  • 举报
回复
学习了,接分!
biweilun 2009-06-30
  • 打赏
  • 举报
回复
自己解决了,不是代码的问题。
来人接分啊
beyondma 2009-06-30
  • 打赏
  • 举报
回复
像是野指针的问题。你的LOG在哪呢?
jasonM2008 2009-06-30
  • 打赏
  • 举报
回复
xd 来接分了!!!!
cnzdgs 2009-06-29
  • 打赏
  • 举报
回复
调试看下执行到哪行代码时蓝屏,查看相关变量的值,另外参考蓝屏的错误码分析错误原因(估计是访问了无效的内存地址)。
biweilun 2009-06-28
  • 打赏
  • 举报
回复

#include <ntddk.h>
#define INITCODE code_seg("INIT")

typedef struct _DEVICE_EXTENSION{
PDEVICE_OBJECT pDevice;
UNICODE_STRING ustrDeviceName;
UNICODE_STRING ustrSymLinkName;
}DEVICE_EXTENSION,*PDEVICE_EXTENSION;

extern "C" NTSTATUS CreateDevice(
IN PDRIVER_OBJECT pDriverObject)
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;
PDEVICE_EXTENSION pDevExt;

UNICODE_STRING szDevName;
RtlInitUnicodeString(&szDevName,L"\\Device\\MyWDKDevice");
status=IoCreateDevice(pDriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)szDevName,
FILE_DEVICE_UNKNOWN,
0,TRUE,&pDevObj);
if(!NT_SUCCESS(status))
return status;
pDevObj->Flags|=DO_BUFFERED_IO;
pDevExt=(PDEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt->pDevice=pDevObj;
pDevExt->ustrDeviceName=szDevName;

UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\?\\HelloWDK");
pDevExt->ustrSymLinkName=symLinkName;

status=IoCreateSymbolicLink(&symLinkName,&szDevName);
if(!NT_SUCCESS(status))
{
IoDeleteDevice(pDevObj);
return status;
}
return STATUS_SUCCESS;
}


extern "C" VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT pNextObj;
DbgPrint("Enter DriverUnload\n");
pNextObj=pDriverObject->DeviceObject;
while(pNextObj!=NULL)
{
PDEVICE_EXTENSION pDevExt=(PDEVICE_EXTENSION)pNextObj->DeviceExtension;
UNICODE_STRING pLinkName=pDevExt->ustrSymLinkName;
IoDeleteSymbolicLink(&pLinkName);
pNextObj=pNextObj->NextDevice;
IoDeleteDevice(pDevExt->pDevice);
}
DbgPrint("DriverUnload Complete!\n");
}

#pragma INITCODE
extern "C" NTSTATUS DriverEntry(
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
{

pDriverObject->DriverUnload=DriverUnload;

DbgPrint("DriverEntry Started!\n");


NTSTATUS status=CreateDevice(pDriverObject); //没有这行就不会错

DbgPrint("DriverEntry Ended!\n");
return STATUS_SUCCESS;
}




简化掉了不必要的代码,请大家帮我看下服务停止的问题
zxq6 2009-06-28
  • 打赏
  • 举报
回复
楼主尝试调试一下看看。或者参看ddk里面的例程看看。
biweilun 2009-06-28
  • 打赏
  • 举报
回复
不是这个问题
cnzdgs 2009-06-28
  • 打赏
  • 举报
回复
可能是L"\\?\\HelloWDK"这个字符串也分配在INIT区,初始化之后被释放掉了,你先把#pragma INITCODE去掉验证一下。

21,616

社区成员

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

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