能力值:
( LV2,RANK:10 )
|
-
-
2 楼
无盘-…!?
|
能力值:
(RANK:10 )
|
-
-
3 楼
不是无盘,类似ramdisk之类。
求解答。主要是不能解决休眠的问题,头痛,求解答。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
看SystemCrashDumpStateInformation
你的Driver(DriverObject) 创建一个\Device\ScsiPortX(X=0,1,2....) , 如果DriverObject对应的名字是123 最后就会加载dmp_123.sys
可以看看:
nt!IopGetDumpStack 这个函数。
不过貌似WIN7已经没有这套机制了
|
能力值:
(RANK:10 )
|
-
-
5 楼
我是这么做的,vimg.sys生成一个fdo名字\Device\ScsiPort9,但是并没有加载dump_vimg.sys。
而我看了iastor生成的fdo名字不是scsiport而是iastor0,一样也可以生成dump_iastor.sys。
所以我觉得一定是有哪个地方不对,而不是名字为scsiport的原因。
是不是 IRP_MN_QUERY_INTERFACE需要正确应答啊?我的IRP_MN_QUERY_INTERFACE是无返回值的。
但是IRP_MN_QUERY_INTERFACE的具体参数求解释啊。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
所以让你看看IopGetDumpStack啊。。。
它首先给打开启动的磁盘设备(IoArcBootDeviceName,比如\ArcName\multi(0)disk(0)rdisk(0)partition(1),这是个符号链接,通常指向启动的分区设备,如\Device\Harddisk0\Partition1
然后发送IOCTL_SCSI_GET_ADDRESS,然后取到SCSI_ADDRESS->PortNumber
接着在加载dmp_xxx.sys驱动时,这样处理,使用\Device\ScsiPort[SCSI_ADDRESS->PortNumber] 路径,打开设备(如\Device\ScsiPort0)
获取设备的 DriverObject->DriverName,然后去加载对应的驱动文件,路径拼接的方式是从 DriverName取到文件名(例如\Driver\123,则为123),然后就会加载\systemroot\system32\123.sys
123.sys在通过MmLoadSystemImage使用perfix(“dump_"),于是在load data table entry(加载模块列表)里的名字就成了dump_123.sys ,但实际上加载的PE还是123.sys
所以,如果你确定你的驱动没被加载,你要看看这么几个问题:
1. 什么系统,至少XP是这样的
2. port number是否是boot device所在的那个
3.驱动是否在driver路径下,记得加载的是123.sys,而不是dump_123.sys,只是加载列表的名字是那个。
其实调试下IopGetDumpStack有什么问题也就很清楚了。
|
能力值:
(RANK:10 )
|
-
-
7 楼
谢谢,可能是这一句有作用“然后发送IOCTL_SCSI_GET_ADDRESS,然后取到SCSI_ADDRESS->PortNumber”,我的设备名是 \device\scsiport9,但是IOCTL_SCSI_GET_ADDRESS,然后取到SCSI_ADDRESS->PortNumber”=0;可能就是这个地方出了问题。
|
能力值:
(RANK:10 )
|
-
-
8 楼
但是又另外一个问题:iastor的设备名是\device\iastor0,这个并不是scsiportX的设备名,这个又是如何加载dump_iastor.sys的呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
在XP上是不行的,你是不是高版本系统?
在VISTA以后,系统开始支持多种PORT DRIVER来做DUMP,你看看XP和WIN7的IoGetDumpStack的变化就知道了。
Win7上改用crashdmp.sys这个驱动来专门实现port driver加载,对于在\Device\ScsiPortX建立符号链接或设备的驱动,仍是支持的(称为Legacy Port Driver)
对于Iastor这类的port driver,则是在crashdmp!CrashDmpLoadDumpStack中调用QueryPortDriver
QueryPortDriver获取dump driver的关键在于向磁盘设备发送IOCTL_SCSI_GET_DUMP_POINTERS设备控制
返回结果中就指明了要加载的dump driver的设备驱动,这是除ScsiPort这种legacy方式外另一种dump port driver的加载方式,也就是你的问题的答案。
分析一下iastor.sys就知道该驱动是实现了对IOCTL_SCSI_GET_DUMP_POINTERS的支持的,当然光实现这个还不行的。
所以就你的问题来说,还是用scsiport来解决比较方便,不过我看你的原始问题其实不是dump,而是休眠?那就是另一个问题了。
关于dump port driver,搜了下有人也做过一些分析
http://hi.baidu.com/heartdbg/item/54ed1185f85e57844414cfd1
http://crashdmp.wordpress.com/crash-mechanism/overview/
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
xp不行,nt5.0的内核全部不支持新硬盘接口,不用想了,百分百通不过。倒不是软件上的通不过,主要是BIOS版本大部份已经支持不了,老的IDE或ATA规范,无法应用到新的ATA规范里去iastor.sys典型的新驱动。不用挣扎了,XP时代已经过去。咱们要拜INTEL福,本来老接口挺好的,就为了应合微软的WIN8大战略,妹的,他全面升级新硬盘接口。
|
能力值:
(RANK:10 )
|
-
-
11 楼
好像是你说的这样,但是又来另一个疑问了。
在xp系统下面,既然没有加载dump_iastor.sys,那么蓝屏的时候,dump文件时照样生成成功了啊。而且,休眠也是成功的,这又为何呢?我所知道休眠应该是加载hiber_iastor.sys。你说休眠
的问题又不通,我以为hiber_iastor.sys和dump_iastor.sys是同类问题,既然不通,那又有哪些区别呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
XP压根就没有iastor.sys
|
能力值:
(RANK:10 )
|
-
-
13 楼
iastor.sys是intel系列主板的SATA 驱动程序,8系主板没有xp的SATA驱动程序,但是7系主板是有xp的SATA驱动程序的,在7系主板上安装好xp以后,可以看到C盘的驱动程序正是iastor.sys。确实,在xp系统下没有发现
dump_iastor.sys,但是,系统崩溃以后的dump功能是正常的,可以看到dmp文件已经存放在c盘上面,而c盘正是 intel sata接口 接入的硬盘,不知道windows如何把dmp文件存放到这个硬盘上的,也许仍然是通过dump_iastor.sys存入,但我用pchunter没有发现dump_iastor.sys,不知为什么。而且休眠也是成功的,
也是将hibernat.sys存入sata硬盘,但是也没有发现hiber_iastor.sys,这又是为什么呢?
|
能力值:
(RANK:10 )
|
-
-
14 楼
系统在启动过程中,会向磁盘驱动链发送一个IOCTL_SCSI_GET_DUMP_POINTERS请求,一般是由最底层的PORT驱动来填写在Irp->AssociatedIrp.SystemBuffer这个位置的DUMP_POINTERS结构,这个结构里每个值都需要填写,其中成员DeviceObject就是当DISK DUMP时调用的驱动程序所包含的设备对象
启动过程在NtCreatePagingFile时会调用内核的IopLoadDiskDumpDriver加载DUMP驱动,在需要做DUMP时,调用该驱动的DriverEntry,参数为(NULL,PMMDUMP_FUNCTIONS_DESCRIPTOR pDump),第一个参数为0,第二个参数为一个结构,需要向内填写初始化信息,包括直接写DUMP数据进硬盘的函数地址,在其后调用该函数写硬盘
看来这个IOCTL_SCSI_GET_DUMP_POINTERS才是关键,我的123.sys驱动确实没有处理这个IOcontrol,
但是具体如何处理呢?这方面的资料根本查不到,这些数据结构定义都不知道。PMMDUMP_FUNCTIONS_DESCRIPTOR这个结构具体定义是怎样的?根本查不到啊。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
DUMP_POINTERS的结构在DDK里有
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
帮你看了下hiber的问题,我之前说的不对,和dump是同个机制的,都基于dump stack,由IoGetDumpStack实现,只是前缀不一样.
看看IoGetDumpStack的交叉引用就知道了。所以搞定了dump_等同于搞定了hiber_
|
能力值:
(RANK:10 )
|
-
-
17 楼
可是PMMDUMP_FUNCTIONS_DESCRIPTOR这个结构好像DDK里我没查到啊。哪里有这个结构定义?
|
能力值:
(RANK:10 )
|
-
-
18 楼
使用google大法,国内是找不到了。
http://www.osronline.com/showThread.cfm?link=82275
typedef struct _DUMP_IRP
{
ULONG unknown1[3];
PVOID Buffer; //0ch,
PVOID Buffer1; //10h
ULONG Length; //14h,
}DUMP_IRP, *PDUMP_IRP;
ypedef struct _MMDUMP_FUNCTIONS_DESCRIPTOR
{
ULONG StructSize; //0h,
ULONG unknown1[9]; //4h
ULONG DumpData10; //28h
NTSTATUS (__stdcall *DumpInit)
(LARGE_INTEGER PartitionOffset);
//2ch,init function pointer
NTSTATUS (__stdcall *DumpWrite)
(PLARGE_INTEGER StartOffset, PDUMP_IRP pDumpIrp);
//30h, write function pointer
NTSTATUS (__stdcall *DumpFinish)(void);
//34h, finish function pointer
ULONG unknown2[2]; //38h,
ULONG DumpData; //40h
ULONG unknown3[5]; //44h
}MMDUMP_FUNCTIONS_DESCRIPTOR, *PMMDUMP_FUNCTIONS_DESCRIPTOR;
|
能力值:
( LV4,RANK:50 )
|
-
-
19 楼
mark
|
|
|