指明代码加载内存位置的几种方式

来源:互联网 发布:风险矩阵分析法应用 编辑:程序博客网 时间:2024/06/05 20:27

//第一种方法
//
//  demo.h
//
#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")


//
//   demo.cpp
//
#include "demo.h"


#pragma INITCODE
extern "C" NTSTATUS DriverEntry(....)
{
}

#pragma PAGEDCODE
NTSTATUS  DispatchRoutine(IN PDEVICE_OBJECT pDevObj,
     IN PIRP pIrp)
{
}

#pragma PAGEDCODE
VOID DriverUnload (IN PDRIVER_OBJECT pDriverObject) 
{
}
------------------------------------------------

//
//第二种方法

//使编译器把代码放到特定段的传统方法是使用alloc_text编译指示。但不是每种编译器都支持这个编译指示,
//判断是否定义了ALLOC_PRAGMA可以帮助决定能否使用alloc_text编译指示,这个编译指示可以把驱动程
//序的单独例程放到特定段中

#ifdef ALLOC_PRAGMA

#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(INIT, StartHook)
#pragma alloc_text(PAGE, DispatchIoCtrl)
#pragma alloc_text(PAGE, RemoveHook)
#pragma alloc_text(PAGE, UnloadDriver)

#endif

0 0