以文本方式查看主題 - 曙海教育集團論壇 (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); |