首页
社区
课程
招聘
求助]又是蓝瓶的。救一下。
发表于: 2010-11-21 17:29 7079

求助]又是蓝瓶的。救一下。

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;
}

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//