阅读:2568回复:10
请教关于UNICODE_STRING的问题
个位高手,菜鸟请教大家一个问题。我在IRP_MJ_READ中取到文件名后,我想取得文件扩展名。我是这样写的:
{ UNICODE_STRING FileName; WCHAR Buffer[256]; ...... for (i = 0; i < FileName.Length; i++) { if (L"." == FileName.Buffer) { int nIndex = 0; int j ; for (j = i + 1; j < FileName.Length; j++,nIndex++) { Buffer[nIndex] = FileName.Buffer[j]; } break; } } } 当程序运行时BSOD了。我的代码有问题吗? |
|
沙发#
发布于:2008-11-01 12:08
L"." == FileName.Buffer 字符和宽字符指针相等?
这儿我觉得倒不会出现蓝屏,你的Buffer 初始话了吗,字符串有串尾符吗? |
|
|
板凳#
发布于:2008-11-01 12:46
你的程序有问题,如 c:\abc.txt.a 用你的程序明显有问题。
如果你用minifilter方便很多,只需用FltGetFileNameInformation,然后FltParseFileNameInformation |
|
地板#
发布于:2008-11-01 18:22
我写错了。应该是if (L"." == FileName.Buffer)
|
|
地下室#
发布于:2008-11-01 18:31
FileName的Buffer有无串尾符我不能保证,因为是UNICODE_STRING,FileName的Buffer确定已经初始化了;
|
|
5楼#
发布于:2008-11-02 10:14
应该是if (L"." == FileName.Buffer)
这个明显有错误,你想说明什么?这是两个指针比较... 如果你是想知道是不是点,可以这样写 if( L'.' == * FileName.Buffer) |
|
|
6楼#
发布于:2008-11-02 11:40
if (L"." == FileName.Buffer) 这个不好
|
|
|
7楼#
发布于:2008-11-02 13:53
if (L"." == FileName.Buffer)不好,应该用RtlCompareMemory()
|
|
8楼#
发布于:2008-11-04 12:15
我怎么还没写对呢?应该是if (L"." == FileName.Buffer).对不起大家是笔误。扩展名能取到。但是当执行到下面的return SfPassThrough(DeviceObject,Irp)时就报错了,但是只要把extBuffer[nIndex] = fullUniName.Buffer[j]去掉就不报错。请各位大牛帮我看一下
; NTSTATUS SfRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION pIrpSp; PFILE_OBJECT pFileObject; PSFILTER_DEVICE_EXTENSION devExt; pIrpSp = IoGetCurrentIrpStackLocation(Irp); pFileObject = pIrpSp->FileObject; devExt = DeviceObject->DeviceExtension; // 对控制设备的操作,直接失败 if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) { Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_INVALID_DEVICE_REQUEST; } // 对文件系统其他设备的操作,passthru. if (devExt->StorageStackDeviceObject == NULL) { return SfPassThrough(DeviceObject,Irp); } // 到这里说明是对卷的文件操作 { UNICODE_STRING fullUniName; UNICODE_STRING extName; WCHAR fullUniNameBuffer[1024]; WCHAR extBuffer[256]; USHORT i; fullUniName.Length = pFileObject->FileName.Length; fullUniName.MaximumLength = pFileObject->FileName.MaximumLength; RtlInitEmptyUnicodeString(&fullUniName,fullUniNameBuffer,MAXPATHLEN*sizeof(WCHAR)); RtlCopyUnicodeString(&fullUniName,&(pFileObject->FileName)); RtlInitEmptyUnicodeString(&extName,extBuffer,256*sizeof(WCHAR)); for (i = 0; i < fullUniName.Length; i++) { if (L'.' == fullUniName.Buffer) { USHORT nIndex = 0; USHORT j; extName.Length = fullUniName.Length - i - 1; for (j = i+1; j < fullUniName.Length; j++,nIndex++) { extBuffer[nIndex] = fullUniName.Buffer[j]; } break; } } return SfPassThrough(DeviceObject,Irp); } } |
|
9楼#
发布于:2008-11-04 13:46
NTSTATUS SfPassThrough(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{ NTSTATUS ret; ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT( DeviceObject )); ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject )); IoSkipCurrentIrpStackLocation( Irp ); ret = IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp ); return ret; } |
|
10楼#
发布于:2008-11-05 09:32
怎没人回应呢?
|
|