文件过滤驱动短名转长名实现

本文介绍了一种将Windows系统的短文件名转换为长文件名的方法。通过使用ZwCreateFile和ZwQueryDirectoryFile等API,递归地查询指定路径下每个短文件名对应的长文件名。
 

网上只找到了楚狂人写下的方法:
思想是:
首先你假设你得到一个路径 /aaaaaa~1/bbbbbb~1/cccccc~1/dddddd~1.txt.然后你把它分解成:
/aaaaaa~1
bbbbbb~1
cccccc~1  
dddddd~1.txt
以上 5 个对象.首先打开用 ZwCreateFile 打开第一个目录.第一个目录总是"/",这不可能是短名.然后调用
ZwQueryDirectoryFile 枚举下面所有的文件和目录.如果你用 FileIdBothDirectoryInformation 进行查询.那么
会得到一组 FILE_ID_BOTH_DIR_INFORMATION结构里有WCHAR FileName[1]; 即为长名。长短名都到手了,
那么我们当然可以找到"/"之下的第一个"aaaaaa~1"所对应的长名了.然后依次类推,逐个查询.
直接打开 /aaaaaa~1/bbbbbb~1/cccccc~1/dddddd~1.txt  或者/aaaaaa~1/bbbbbb~1/cccccc~1/
来QueryNameString依然会得到短文件名。

我实现方法得到了此方法的启发, 首先找到第一个~1的位置,然后得到上一级目录的全路径名。对此路径下的文件作遍历,
找到包含此短名的长文件名。然后再对下一级循环,知道找到给定文件名结束。下面简单贴下概要代码。


 do
 {
  pWchar =  FindSubStringW( pWori, &nTemp, L"~1\\" );

  if ( nTemp2 != 0 )
  {
   nCopytmp = nTemp2 + 3 + oldLen - nTemp ;
  }
  else
  {
   //取得~1短文件名上一级目录
   nCopytmp = nCopytmp + oldLen - nTemp - 6;
  }
  if ( pWchar != NULL )
  {
   chPos = nTemp ;
   RtlUnicodeStringCchCopyN( &strTemp, pobjName, nCopytmp );
   RtlUnicodeStringCchCopyN( &strTemp2, pobjName, nCopytmp + 8 );
   if ( nTemp2 == 0 )
    RtlUnicodeStringCchCopyN( &strFileName, &strTemp, strTemp.Length );

   nTemp2 = nCopytmp;
   nTemp = oldLen - nCopytmp - 3;
   oldLen = nTemp;

   //得到当前完整目录 
   GetFrdFile(&strTemp, &strTemp2);

   RtlInitUnicodeString( &strFilePos, L"\\" );

   RtlUnicodeStringCchCatN( &strFileName, &strTemp2, strTemp2.Length );
   RtlUnicodeStringCchCatN( &strFileName, &strFilePos, strFilePos.Length );
   pWori = pWchar + 3;
   chPos = nCopytmp + 8;

  }


 }while ( pWchar != NULL );

strFileName即为长名。GetFrdFile就是ZwCreateFile打开路径文件,查询路径属性,找到短名对应的长名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值