-
-
求助]又是蓝瓶的。救一下。
-
发表于: 2010-11-21 17:29 7079
-
小弟刚学习驱动,教材是《Windows驱动开发技术详解》。有个定时器不知道怎么用。老是过5秒钟后就开始蓝屏。代码如下:
同时请教何时用分页内存。何时用非分页内存?谢谢看贴的每一个人。
#pragma once
// C++定义
#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")
// 自定义设备扩展结构
typedef struct _DEVICE_EXTENSION {
PDEVICE_OBJECT pDevice; //设备扩展关联的设备
UNICODE_STRING ustrDeviceName; //设备名称
UNICODE_STRING ustrSymLinkName; //符号链接名
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
// 函数声明
VOID TestSYSUnload (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS TestSYSDispatchRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
#pragma LOCKEDCODE
VOID DPCRoutine(IN PKDPC Dpc,IN PVOID DeferredContext,IN PVOID SystemArgument1,IN PVOID SystemArgument2)
{
KdPrint(("Test Is OK!"));
}
#pragma INITCODE
extern "C" NTSTATUS DriverEntry (
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath )
{
NTSTATUS status;
//注册其他驱动调用函数入口
pDriverObject->DriverUnload = TestSYSUnload;
pDriverObject->MajorFunction[IRP_MJ_CREATE] = TestSYSDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = TestSYSDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_WRITE] = TestSYSDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_READ] = TestSYSDispatchRoutine;
PDEVICE_OBJECT pDevObj;
PDEVICE_EXTENSION pDevExt;
//创建设备名称
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\\Device\\TestSYSDevice");
//创建设备
status = IoCreateDevice( pDriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
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 = devName;
//创建符号链接
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\??\\TestSYS");
pDevExt->ustrSymLinkName = symLinkName;
status = IoCreateSymbolicLink( &symLinkName,&devName );
if (!NT_SUCCESS(status))
{
IoDeleteDevice( pDevObj );
return status;
}
KTIMER ktimer;
KeInitializeTimer(&ktimer);
KDPC dpc;
KeInitializeDpc(&dpc,DPCRoutine,NULL);
KeSetTimer(&ktimer,RtlConvertLongToLargeInteger(-10*1000*1000*5),&dpc);
return status;
}
#pragma PAGEDCODE
VOID TestSYSUnload (IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT pDevObj = pDriverObject->DeviceObject;
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
UNICODE_STRING unistrLinkName = pDevExt->ustrSymLinkName;
IoDeleteSymbolicLink(&unistrLinkName);
IoDeleteDevice(pDevExt->pDevice);
}
#pragma PAGEDCODE
NTSTATUS TestSYSDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp)
{
NTSTATUS status = STATUS_SUCCESS;
// 完成IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return status;
}
同时请教何时用分页内存。何时用非分页内存?谢谢看贴的每一个人。
#pragma once
// C++定义
#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")
// 自定义设备扩展结构
typedef struct _DEVICE_EXTENSION {
PDEVICE_OBJECT pDevice; //设备扩展关联的设备
UNICODE_STRING ustrDeviceName; //设备名称
UNICODE_STRING ustrSymLinkName; //符号链接名
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
// 函数声明
VOID TestSYSUnload (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS TestSYSDispatchRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
#pragma LOCKEDCODE
VOID DPCRoutine(IN PKDPC Dpc,IN PVOID DeferredContext,IN PVOID SystemArgument1,IN PVOID SystemArgument2)
{
KdPrint(("Test Is OK!"));
}
#pragma INITCODE
extern "C" NTSTATUS DriverEntry (
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath )
{
NTSTATUS status;
//注册其他驱动调用函数入口
pDriverObject->DriverUnload = TestSYSUnload;
pDriverObject->MajorFunction[IRP_MJ_CREATE] = TestSYSDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = TestSYSDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_WRITE] = TestSYSDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_READ] = TestSYSDispatchRoutine;
PDEVICE_OBJECT pDevObj;
PDEVICE_EXTENSION pDevExt;
//创建设备名称
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\\Device\\TestSYSDevice");
//创建设备
status = IoCreateDevice( pDriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
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 = devName;
//创建符号链接
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\??\\TestSYS");
pDevExt->ustrSymLinkName = symLinkName;
status = IoCreateSymbolicLink( &symLinkName,&devName );
if (!NT_SUCCESS(status))
{
IoDeleteDevice( pDevObj );
return status;
}
KTIMER ktimer;
KeInitializeTimer(&ktimer);
KDPC dpc;
KeInitializeDpc(&dpc,DPCRoutine,NULL);
KeSetTimer(&ktimer,RtlConvertLongToLargeInteger(-10*1000*1000*5),&dpc);
return status;
}
#pragma PAGEDCODE
VOID TestSYSUnload (IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT pDevObj = pDriverObject->DeviceObject;
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
UNICODE_STRING unistrLinkName = pDevExt->ustrSymLinkName;
IoDeleteSymbolicLink(&unistrLinkName);
IoDeleteDevice(pDevExt->pDevice);
}
#pragma PAGEDCODE
NTSTATUS TestSYSDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp)
{
NTSTATUS status = STATUS_SUCCESS;
// 完成IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0; // bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return status;
}
赞赏
他的文章
- [求助]求Vb6 与VC2008(vs2008)联合调试方法?? 4131
- [求助]这个ocx控件VB怎么调用(带源码). 9099
- [求助]硬盘扇区读写不了。麻烦呀。 4846
- [求助]这段代码怎么老是5秒后蓝屏 5025
- 求助]又是蓝瓶的。救一下。 7080
看原图
赞赏
雪币:
留言: