wangmingliang
驱动牛犊
驱动牛犊
  • 注册日期2008-05-21
  • 最后登录2009-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望106点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2568回复:10

请教关于UNICODE_STRING的问题

楼主#
更多 发布于:2008-11-01 11:10
个位高手,菜鸟请教大家一个问题。我在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了。我的代码有问题吗?
webcat
驱动牛犊
驱动牛犊
  • 注册日期2007-04-04
  • 最后登录2010-03-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望7点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-11-01 12:08
L"." == FileName.Buffer 字符和宽字符指针相等?
这儿我觉得倒不会出现蓝屏,你的Buffer 初始话了吗,字符串有串尾符吗?
驱网无线,快乐无限
my530
驱动牛犊
驱动牛犊
  • 注册日期2006-06-30
  • 最后登录2009-06-25
  • 粉丝2
  • 关注0
  • 积分7分
  • 威望79点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-11-01 12:46
你的程序有问题,如 c:\abc.txt.a 用你的程序明显有问题。

如果你用minifilter方便很多,只需用FltGetFileNameInformation,然后FltParseFileNameInformation
wangmingliang
驱动牛犊
驱动牛犊
  • 注册日期2008-05-21
  • 最后登录2009-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望106点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-11-01 18:22
我写错了。应该是if (L"." == FileName.Buffer)
wangmingliang
驱动牛犊
驱动牛犊
  • 注册日期2008-05-21
  • 最后登录2009-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望106点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-11-01 18:31
FileName的Buffer有无串尾符我不能保证,因为是UNICODE_STRING,FileName的Buffer确定已经初始化了;
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
5楼#
发布于:2008-11-02 10:14
应该是if (L"." == FileName.Buffer)

这个明显有错误,你想说明什么?这是两个指针比较...

如果你是想知道是不是点,可以这样写 if( L'.' == * FileName.Buffer)
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
Da Vinci
驱动牛犊
驱动牛犊
  • 注册日期2008-10-22
  • 最后登录2009-06-15
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望59点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-11-02 11:40
if (L"." == FileName.Buffer) 这个不好
我是菜鸟
jyss1644
驱动牛犊
驱动牛犊
  • 注册日期2007-08-15
  • 最后登录2011-04-11
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望180点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-11-02 13:53
if (L"." == FileName.Buffer)不好,应该用RtlCompareMemory()
wangmingliang
驱动牛犊
驱动牛犊
  • 注册日期2008-05-21
  • 最后登录2009-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望106点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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);
 }
}
            
    
                        
        
wangmingliang
驱动牛犊
驱动牛犊
  • 注册日期2008-05-21
  • 最后登录2009-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望106点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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;
}
wangmingliang
驱动牛犊
驱动牛犊
  • 注册日期2008-05-21
  • 最后登录2009-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望106点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-11-05 09:32
怎没人回应呢?
游客

返回顶部