slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
阅读:1706回复:9

如何让驱动永远不会被移出系统内存(物理内存)?

楼主#
更多 发布于:2007-01-16 13:23
  正常情况下,驱动永远是在系统内存里边的(除了特别指明alloc_text编译指示以外)。但是最近我碰到的蓝屏却比较奇怪,在DriverEntry()里边下段点,看那个例程,代码是正常的。但是出蓝屏之后,Softice弹出来后,我再查看那个例程的代码,全部是?????????INVALID。我想应该就是这个例程被移出系统内存了。

但是我又没有指明alloc_text,怪了。

另外说明:

1、我是在XP SP2上加载的驱动。
2、我在DriverEntry()中调用KeWaitForSingoeObject()之后才出现蓝屏。
3、这个驱动代码在2K SP4上完全正常。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-01-16 13:42
代码贴上来看看,嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-01-16 15:13
代码很简单的,就是在一个驱动1中加载另外一个驱动2,但是驱动1出现蓝屏。

NTSTATUS
DriverEntry (
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
{
    //
    // 加载驱动
    //
    PLOAD_DRIVER    pLoadDriver;

    pLoadDriver = (PLOAD_DRIVER)ExAllocatePool(NonPagedPool,sizeof(LOAD_DRIVER));
    
    // Init pLoadDriver...
    
    KeInitializeEvent(&pLoadDriver->LoadCompleteEvent,SynchronizationEvent,false);

    KlCreateWorkerThread(LoadDriverThread,pLoadDriver);
    
    KeWaitForSingleObject(
        &pLoadDriver->LoadCompleteEvent,
        Executive,
        KernelMode,
        false,
        NULL
        );

    //
    // 没有执行到这里,只要从上面的KeWaitForSingleObject()返回之后,系统就挂了,这个时候整个驱动的代码全部是???INVALID
    //
    ExFreePool(pLoadDriver);
    
    return STATUS_SUCCESS;
}

//
// 出现蓝屏时,Softice停止在线程代码的入口点,全部是????INVALID
//
void
__stdcall
LoadDriverThread(
    IN PLOAD_DRIVER LoadDriver
    )
{
    KdPrint(("Enter LoadDriverThread()..."));

    __try
    {
        // ... do something here
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
    }
}
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-01-17 09:04
driverentry默认是INIT段,也就是说,加载后自动卸载,所以你必须自己修改段属性,嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
地下室#
发布于:2007-01-17 09:19
不是init段,有时候也可能不在内存里~~
没有战争就没有进步 X3工作组 为您提供最好的军火
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-01-17 11:00
好像默认都是在非分页内存里的,除非你显式指定了其他值。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-01-17 11:01
KlCreateWorkerThread是干嘛的
我最老实
驱动小牛
驱动小牛
  • 注册日期2005-09-11
  • 最后登录2010-01-27
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望253点
  • 贡献值0点
  • 好评度189点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-01-17 11:21
蓝苹后的dump信息是什么?
养牛专业户
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2007-01-17 11:57
建议用IDA分析下,看DRIVERENTRY到底在哪个段里?
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-01-17 12:09
答:
1、KlCreateWorkerThread()只是简单PsCreateSystemThread()的。
2、蓝屏后是Page Fault(0004),就是执行了非法的代码,都??INVALID,当然是非法了。

疑问:

1、不管DriverEntry()执行在那个段,我想都应该等到DriverEntry()返回之后才移出吧?我现在还没有返回啊。

   另:DriverEntry()在.TEXT段(OFFSTE:0x103D0),INIT段在:0x1088B-0x10980。

2、不是init段,有时候也可能不在内存里~~
    --------------------
     那怎么让它在永远内存里边啊?
游客

返回顶部