<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>
    以文本方式查看主題

    -  曙海教育集團論壇  (http://www.hufushizhe.com/bbs/index.asp)
    --  Windows驅動開發  (http://www.hufushizhe.com/bbs/list.asp?boardid=75)
    ----  驅動加入code_seg("INIT")出現藍屏,  (http://www.hufushizhe.com/bbs/dispbbs.asp?boardid=75&id=2720)

    --  作者:wangxinxin
    --  發布時間:2010-12-17 11:59:04
    --  驅動加入code_seg("INIT")出現藍屏,
    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);
    

    主站蜘蛛池模板: 中文字幕无码视频专区| 天天5g天天爽永久免费看欧美| 国产午夜福利内射青草| 久久99国产精品尤物| 真实国产乱人伦在线视频播放| 天天摸天天做天天爽天天弄| 亚洲精品无码久久久久AV麻豆| 777奇米视频| 日韩精品久久无码中文字幕| 国产免费无遮挡精品视频 | 欧美日韩在线一区| 国产精品一区二区av不卡| 亚洲区小说区图片区qvod| 色噜噜在线视频| 女人色毛片女人色毛片中国 | 一区二区三区视频在线| 欧美成人精品第一区二区三区| 国产欧美日韩三级| 久久男人av资源网站无码软件 | 日韩不卡高清视频| 国产乱人伦偷精品视频不卡| 夫妇交换性三中文字幕| 人妻巨大乳hd免费看| 黑人巨大白妞出浆| 成年网站在线看| 农民人伦一区二区三区| 99re免费99re在线视频手机版| 日韩精品久久久久久| 四虎影视永久在线观看| fc2ppv在线观看| 日韩精品一区二区三区中文 | 国产综合精品一区二区三区| 亚洲一级黄色大片| 精品无码成人片一区二区98| 天堂а√8在线最新版在线| 亚洲国产成人久久笫一页| 老司机亚洲精品影院| 在线观看无码av网站永久免费| 亚洲av无码一区二区二三区| 精品brazzers欧美教师| 国产精品美女乱子伦高|