首页
社区
课程
招聘
[求助]IoVolumeDeviceToDosName蓝屏问题
发表于: 2011-7-24 23:53 8826

[求助]IoVolumeDeviceToDosName蓝屏问题

2011-7-24 23:53
8826
HookZwWriteFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID Buffer,
IN ULONG Length,
IN PLARGE_INTEGER ByteOffset OPTIONAL,
IN PULONG Key OPTIONAL
)
{
        if (TurnOnFileMon==1)//如果功能开启的话
        {
                PDEVICE_EXTENSION        deviceExtension;//设备扩展
                char ansiProcessName[PROCNAMELEN];
                UNICODE_STRING *volumeDosName;
                WCHAR        DelFullName[1024];
                PCWSTR WriteFileName;
                PFILE_OBJECT fileobj;
                FILE_INFORMATION_CLASS FileInformationClass = FileNameInformation ;
                if ( FileHandle != NULL)
                {
                        NTSTATUS nts = STATUS_UNSUCCESSFUL;
                //得到进程路径和进程名
                        UNICODE_STRING UniProcessPath,volumeDosName;
                        ANSI_STRING        AnsiProcessPath,ansiProcessName1;
                        ANSI_STRING ansipath,apathpre;
                        UNICODE_STRING unipath,upathpre;
                        PCWSTR ProcessPath = GetCurrentProcessFileName();//进程路径
                        RtlInitUnicodeString(&UniProcessPath,ProcessPath);
                        RtlUnicodeStringToAnsiString(&AnsiProcessPath,&UniProcessPath,TRUE);
                          
                        GetProcessName(ansiProcessName); //进程名
                        RtlInitAnsiString(&ansiProcessName1,ansiProcessName);
                       
                        KdPrint(("%s(%s)修改文件 \r\n",ansiProcessName,AnsiProcessPath.Buffer));
                                                                          ObReferenceObjectByHandle(FileHandle,GENERIC_READ,NULL,KernelMode,&fileobj,NULL);          
                        WriteFileName=fileobj->FileName.Buffer;
                        RtlInitUnicodeString(&unipath,WriteFileName);
                        RtlUnicodeStringToAnsiString(&ansipath,&unipath,TRUE);       
                        //KdPrint(("%s(%s)修改文件 %s\r\n",ansiProcessName,AnsiProcessPath.Buffer,ansipath.Buffer));
                       
                       
                        IoVolumeDeviceToDosName(fileobj->DeviceObject, &volumeDosName );
                        RtlInitUnicodeString(&upathpre,volumeDosName.Buffer);
                        RtlUnicodeStringToAnsiString(&apathpre,&upathpre,TRUE);       
                        KdPrint(("%s(%s)修改文件  %s(%s) \r\n",ansiProcessName,AnsiProcessPath.Buffer,apathpre.Buffer,ansipath.Buffer));
                        ExFreePool(volumeDosName.Buffer);
                       
                        ObDereferenceObject(fileobj);
                        RtlFreeAnsiString(&apathpre);
                        RtlFreeAnsiString(&ansipath);
                        RtlFreeAnsiString(&AnsiProcessPath);

                }
        }
       
        return RealZwWriteFile(
           FileHandle,
           Event OPTIONAL,
           ApcRoutine OPTIONAL,
           ApcContext OPTIONAL,
           IoStatusBlock,
           Buffer,
           Length,
           ByteOffset OPTIONAL,
           Key OPTIONAL
           );
}       

不用IoVolumeDeviceToDosName的话都很正常,加上就会蓝屏。
分析dump文件,错误指向ObDereferenceObject(fileobj) 这一行,可是我找不到明显的错误,特来求助。自己弄了几天了,实在没能找到原因......水平是太菜了。。。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
2
After the buffer is no longer required, a caller of this routine should use ExFreePool to free it.
你试下
2011-7-25 00:30
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不在需要buffer之后 这个调用需要用 EXFREEPOOL来释放它   
2011-7-25 08:51
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
4
大哥哥,UNICODE_STRING *volumeDosName;
你定义个指针干啥用?,要直接定义个UNICODE_STRING~
改成这样看看~:
UNICODE_STRING ucVolumeDosName
IoVolumeDeviceToDosName(fileobj->DeviceObject,&ucVolumeDosName);
2011-7-25 11:57
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
确实是有这个问题,谢谢啦,也谢谢上面的几位~
不过不要叫人家大哥哥嘛,会害羞的

补充一下,后来把这个指针改了,还是会蓝屏,同学说的,需要给volumeDosName.Buffer申请内存
volumeDosName.Buffer = ExAllocatePool( PagedPool, 16);                                        volumeDosName.MaximumLength=8;
这样,确实就好了
不过看msdn只说要释放,都没说要分配的。。。
2011-7-25 16:02
0
雪    币: 115
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
蓝屏的原因不是这个吧??
我记得IoVolumeDeviceToDosName会自动申请内存的
IoVolumeDeviceToDosName allocates the Unicode string buffer for the MS-DOS path from the memory pool.

明显是你参数就传错了
你的定义是

UNICODE_STRING *volumeDosName;

函数定义是NTSTATUS
  IoVolumeDeviceToDosName(
    IN  PVOID  VolumeDeviceObject,
    OUT PUNICODE_STRING  DosName
    );
你调用函数却用IoVolumeDeviceToDosName(fileobj->DeviceObject, &volumeDosName );
明显DosName应该传UNICODE_STRING的指针。。你却传的是PUNICODE_STRING的指针。。不蓝屏才奇怪了。。
作者不知道会不会回来看。。。。。。
2011-7-25 21:47
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我定义volumeDosName的时候定义了两遍,代码里后来又定义了一个UNICODE_STRING volumeDosName,编译的时候报错,发现了这个问题,改过了的
帖子上传的代码是我本地机器的。。因为是用vnc连着远程在调,所以远程机器上改了,本地没改,忘了。。。抱歉

不知道为什么,在我机器上确实试了,用IoVolumeDeviceToDosName时,如果不分配内存,运行一下就会蓝屏,虽然msdn的文档确实是如你所说的。。。我也很困惑
2011-7-25 22:17
0
雪    币: 225
活跃值: (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
估计是权限问题。
2011-7-26 09:38
0
雪    币: 154
活跃值: (90)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
UNICODE_STRING                volumeDosName = { 0 }; 初始化,就好了。
2011-9-8 10:07
0
游客
登录 | 注册 方可回帖
返回
//