阅读:2528回复:6
关于在是sfilter中获得文件全路径的问题!!!
这两天看了楚狂人的文件系统过滤驱动的书,书中提到在SfCreate例程中获得文件全路径的问题,若是太早的调用ObQueryNameString就是只能得到盘符不能得到文件名,所以我就在IoCallDriver之后进行调用,并且对文件时是不是目录和是不是新建等进行了判断,当加载驱动后新建个目录这时只能得到目录的盘符(这时判断为新建),但当双击该目录时就可得到该文件的全路径(这时判断为打开已经存在的文件),我想做的是在新建的时候就能获得全路径名而不需要双击打开一次......小弟初学还请多多指教......
status = IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp ); // // Wait for the completion routine to be called // if (STATUS_PENDING == status) { NTSTATUS localStatus = KeWaitForSingleObject(&waitEvent, Executive, KernelMode, FALSE, NULL); ASSERT(STATUS_SUCCESS == localStatus); }else if (NT_SUCCESS(status)) { irpSp = IoGetCurrentIrpStackLocation(Irp); file_obj = irpSp->FileObject; if(file_obj!=NULL && (irpSp->Parameters.Create.Options & FILE_DIRECTORY_FILE)!=0) {//文件是目录 //判断新建还是打开 CreateDisposition = (irpSp->Parameters.Create.Options >> 24) & 0x000000ff; if (CreateDisposition == FILE_CREATE) { //获得文件全路径 UCHAR buf[64] = {0}; PUCHAR new_buf = NULL; ULONG length = 64, ret_length; POBJECT_NAME_INFORMATION name_infor = (POBJECT_NAME_INFORMATION)buf; NTSTATUS statusOfGetPath; UCHAR ansi_buf = NULL; PANSI_STRING pansi_string = NULL; RtlUnicodeStringToAnsiString(pansi_string, &file_obj->FileName, FALSE); statusOfGetPath = ObQueryNameString(file_obj, name_infor, length, &ret_length); if (statusOfGetPath == STATUS_INFO_LENGTH_MISMATCH) { new_buf = ExAllocatePool(NonPagedPool, ret_length); if (new_buf == NULL) { KdPrint(("mem not enough\r\n")); }else{ name_infor = (POBJECT_NAME_INFORMATION)new_buf; statusOfGetPath = ObQueryNameString(file_obj, name_infor, length, &ret_length); if (NT_SUCCESS(statusOfGetPath)) { KdPrint(("dir file path : %wZ", &name_infor->Name)); //希望在此处打印文件全路径...... } } } if(new_buf != NULL) { ExFreePool(new_buf); } }else{ KdPrint(("open exist dir file : %ws\r\n", &file_obj->FileName)); } } } |
|
沙发#
发布于:2009-11-25 13:05
我是新手各位大大帮帮忙哈
|
|
板凳#
发布于:2009-11-26 11:13
最新版本的sfilter使用namelookup库来获得完整路径,这个在新建等操作中都能获得完整路径,你参考一下!
|
|
地板#
发布于:2009-11-26 14:47
谢谢楼上,我的wdk版本是7600.16385.0,但是里面好像没有sfilter的源代码,最新的sfilter的源码指的是那个版本里面的sfilter??.......
|
|
地下室#
发布于:2009-12-08 00:01
给你一份吧,正好电脑上有
6001.18002版本的,貌似这个版本以后的wdk没有sfilter了,不晓得以后的会不会也没 |
|
|
5楼#
发布于:2009-12-08 19:00
新建的时候是可以获得全路径的,在create之后,调用ObQueryNameString,就可以获得全路径,这在sfilter里面是已经实现的吧!
|
|
6楼#
发布于:2009-12-11 10:30
谢谢4,5楼的,问题已经解决了哈,之前困扰了几天的问题,貌似是不能打印中文要把Unicode转成Ansi而且不能用局部变量转(好像局部变量转会bosd,因为我也是初学不太会通过调试来分析但是猜会不会是因为内核栈溢出的原因...)最要用个全局变量来转.....
|
|