午夜伦理在线-午夜伦理在线观看-午夜毛片免费看-午夜美女久久久久爽久久-午夜免费

Rss & SiteMap

曙海教育集團論壇 http://www.bjzhda.cn

曙海教育集團論壇
共1 條記錄, 每頁顯示 10 條, 頁簽: [1]
[瀏覽完整版]

標題:驅動加入code_seg("INIT")出現藍屏,

1樓
wangxinxin 發表于:2010-12-17 11:59:04
DeviceExtension:
8207fea8  8207fdf0 00280026 f8a77150 001a0018
8207feb8  f8a77130 00000000 0000000d 8207fdf0

DriverEntry結束后8207feb8空間被釋放,驅動卸載時調用IoDeleteSymbolicLink函數藍屏,如果將code_seg("INIT")去掉可正常,啟動/停止。

驅動源碼來自《windows驅動開發技術詳解》,詫異的是在網上查詢沒找到該問題的答案然道都能正常運行?

源碼如下:

代碼:
/************************************************************************
* 文件名稱:Driver.cpp                                                 
* 作    者:張帆
* 完成日期:2007-11-1
*************************************************************************/

#include "Driver.h"

/************************************************************************
* 函數名稱:DriverEntry
* 功能描述:初始化驅動程序,定位和申請硬件資源,創建內核對象
* 參數列表:
      pDriverObject:從I/O管理器中傳進來的驅動對象
      pRegistryPath:驅動程序在注冊表的中的路徑
* 返回 值:返回初始化驅動狀態
*************************************************************************/
#pragma INITCODE
extern "C" NTSTATUS DriverEntry (
      IN PDRIVER_OBJECT pDriverObject,
      IN PUNICODE_STRING pRegistryPath  ) 
{
  NTSTATUS status;
  KdPrint(("Enter DriverEntry\n"));

  //注冊其他驅動調用函數入口
  pDriverObject->DriverUnload = HelloDDKUnload;
  pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
  pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
  pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
  pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;
  
  //創建驅動設備對象
  status = CreateDevice(pDriverObject);

  KdPrint(("DriverEntry end\n"));
  return status;
}

/************************************************************************
* 函數名稱:CreateDevice
* 功能描述:初始化設備對象
* 參數列表:
      pDriverObject:從I/O管理器中傳進來的驅動對象
* 返回 值:返回初始化狀態
*************************************************************************/
#pragma INITCODE
extern "C" NTSTATUS CreateDevice (
    IN PDRIVER_OBJECT  pDriverObject) 
{
  NTSTATUS status;
  PDEVICE_OBJECT pDevObj;
  PDEVICE_EXTENSION pDevExt;
  
  //創建設備名稱
  UNICODE_STRING devName;
  RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");
  
  //創建設備
  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"\\??\\HelloDDK");
  pDevExt->ustrSymLinkName = symLinkName;
  status = IoCreateSymbolicLink( &symLinkName,&devName );
  if (!NT_SUCCESS(status)) 
  {
    IoDeleteDevice( pDevObj );
    return status;
  }
  return STATUS_SUCCESS;
}

/************************************************************************
* 函數名稱:HelloDDKUnload
* 功能描述:負責驅動程序的卸載操作
* 參數列表:
      pDriverObject:驅動對象
* 返回 值:返回狀態
*************************************************************************/
#pragma PAGEDCODE
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject) 
{
  PDEVICE_OBJECT  pNextObj;
  KdPrint(("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 );
  }
}

/************************************************************************
* 函數名稱:HelloDDKDispatchRoutine
* 功能描述:對讀IRP進行處理
* 參數列表:
      pDevObj:功能設備對象
      pIrp:從IO請求包
* 返回 值:返回狀態
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
                 IN PIRP pIrp) 
{
  KdPrint(("Enter HelloDDKDispatchRoutine\n"));
  NTSTATUS status = STATUS_SUCCESS;
  // 完成IRP
  pIrp->IoStatus.Status = status;
  pIrp->IoStatus.Information = 0;  // bytes xfered
  IoCompleteRequest( pIrp, IO_NO_INCREMENT );
  KdPrint(("Leave HelloDDKDispatchRoutine\n"));
  return status;
}

代碼:
/************************************************************************
* 文件名稱:Driver.h                                                 
* 作    者:張帆
* 完成日期:2007-11-1
*************************************************************************/
#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;  //符號鏈接名
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

// 函數聲明

extern "C" NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject);
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
                 IN PIRP pIrp);
共1 條記錄, 每頁顯示 10 條, 頁簽: [1]

Copyright © 2000 - 2009 曙海教育集團
Powered By 曙海教育集團 Version 2.2
Processed in .03125 s, 2 queries.
主站蜘蛛池模板: 日本久久久久久久中文字幕 | 丁香综合 | 最新国产午夜精品视频成人 | 最新精品在线 | 国产欧美日韩中文久久 | 就去色综合 | 国产在线拍揄自揄视频不卡99 | 黄色大片视频网站 | 亚洲国产成人精品激情 | 黄色毛片儿 | 国产精品jizz视频 | 欧美日韩a∨毛片一区 | 天天影视亚洲 | 日韩欧美一区二区三区 | 久久福利一区二区三区 | 日韩中文在线观看 | 图片专区亚洲色图 | 免费高清a毛片 | 丁香婷婷综合五月六月 | 亚洲精品美女久久久久99 | 香蕉视频精品 | 免费看黄色一级毛片 | 韩国18videos极品 | 国产成人久久精品二区三区 | 一本高清在线视频 | 91美女视频在线 | 国产综合视频在线 | 国产剧情精品在线 | 亚洲精品久久99久久一 | 免费一级毛片一级毛片aa | 97精品国产高清自在线看超 | 色爱区综合激月婷婷激情五月 | 亚洲好色网| 在线视频免费观看a毛片 | 正在播放国产巨作 | 中文字幕日韩在线观看 | 久久精品一区二区三区四区 | 亚洲黄色网址在线观看 | 国产黄色大片网站 | zzzzxxxx日本 | 亚洲国产成人99精品激情在线 |