楼主: 银砾石
收起左侧

[原创工具] 火流星(2011-2-15 FS.DLL更新---bug修复)

  [复制链接]
银砾石
 楼主| 发表于 2009-10-15 23:02:12 | 显示全部楼层
/*FILE1.H*/
#define maxsize 255
#define commaxsize 4096
#define FS_NotExists 0x01
#define FS_NotDir 0x02
#define FS_Empty 0x03
#define FS_NotReady 0x04

class FS_TIME{
public:
WORD year;
BYTE month;
BYTE day;
BYTE zero;
BYTE hour;
BYTE minute;
BYTE second;
};

typedef class  FAT {
public:
        WORD ErrorCode;
        WORD fs;
        BYTE filetype;
        WCHAR shortname[13];
        WCHAR longname[maxsize];
        LARGE_INTEGER filesize;
        LARGE_INTEGER base;
        LARGE_INTEGER r_base;
        DWORD offset;
        DWORD clust;
        FS_TIME ctime;
        FS_TIME mtime;
        FAT * head;
        FAT * next;
        FAT * pre;
}FS_FAT,*pFS_FAT;

typedef class NTFS {
public:
        WORD ErrorCode; //错误信息
        WORD fs; //FS标记
        BYTE filetype;//文件类型--目录、文件
        WCHAR shortname[13];//短文件名
        WCHAR longname[maxsize];
        //        BYTE padding1;
    LARGE_INTEGER filesize;//文件大小
        DWORD mftnum;//MFT记录号
        //        BYTE padding2;
        FILETIME ctime;//创建日期
        FILETIME mtime;//修改日期
        FILETIME mfttime;//MFT修改日期
        NTFS * head;
        NTFS * next;
        NTFS * pre;
        BYTE hardlinkname[commaxsize];         
        BYTE symboliclinkname[commaxsize];
        BYTE streamname[commaxsize];

}FS_NTFS,*pFS_NTFS;

typedef BYTE * (* FSREAD)(LARGE_INTEGER base,DWORD size) ;
typedef bool (* FSWRITE)(LARGE_INTEGER base,DWORD size,BYTE * mem) ;
typedef bool ( * FS_PRE_READ)(FSREAD FSIO_READ);
typedef bool ( * FS_PRE_WRITE)(FSWRITE FSIO_WRITE);
typedef void *  (* FS_ENUMFILE)(wchar_t * path,void * node) ;
typedef int (* FS_COPYFILE)(wchar_t * path,wchar_t * Stream);
typedef bool (* FS_REGFIRE)(wchar_t * regcode);


//unit1.cpp---------------------------------------------------------------------------

#include <iostream.h>
#include <vcl.h>
#include "file1.h"
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

HANDLE hDev=NULL,hFile=NULL;
BYTE * buffer=new BYTE[65536];
void * node=NULL;
HINSTANCE DLLInst = NULL;
FS_ENUMFILE  enumfile;
FS_COPYFILE  copyfile;
FS_PRE_READ read;
FS_PRE_WRITE write;
FS_REGFIRE regfire;

void fun0();
void fun1();

BYTE * Read(LARGE_INTEGER a,DWORD b)
{
if (hDev!=INVALID_HANDLE_VALUE)
{
    DWORD dwRet;
    SetFilePointer(hDev,a.LowPart,&a.HighPart,FILE_BEGIN);
    ReadFile(hDev,buffer,b,&dwRet,0);
}
else
{
}
return buffer;
}

bool Write(LARGE_INTEGER a,DWORD b,Byte * mem)
{
if (hFile!=INVALID_HANDLE_VALUE)
{
    DWORD dwRet;
    SetFilePointer(hFile,a.LowPart,&a.HighPart,FILE_BEGIN);
    WriteFile(hFile,mem,b,&dwRet,0);
}
else
{
}
return 1;
}

int main(int argc, char* argv[])
{
int num=0;
loop:
cout<<endl<<"请选择功能:0-枚举文件;1-复制文件;9-退出。";
cin>>num;
switch(num)
{
case 0:
fun0();
break;
case 1:
fun1();
break;
case 9:
return 0;
}
goto loop;
}

void fun0()
{
String path="";
cout<<"请输入待枚举目录全路径(包括盘符)";
char   letter;
cin>>letter;
while(letter!='\n')
{
   path=path+letter;
   letter=getchar();
}
String temp="\\\\.\\"+path.SubString(1,2);
hDev=CreateFile(temp.c_str(),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
if (hDev==INVALID_HANDLE_VALUE){cout<<endl<<"打开磁盘错误。";return;}
temp=path.SubString(1,2);
DWORD fstype;char name[10];
GetVolumeInformation(temp.c_str(),NULL,NULL,0,0,&fstype,name,10);
if( NULL == DLLInst ) DLLInst = LoadLibrary("FS.dll");
if (DLLInst) {regfire=(FS_REGFIRE)GetProcAddress( DLLInst, "FS_REGFIRE" );enumfile=(FS_ENUMFILE)GetProcAddress( DLLInst, "FS_ENUMFILE" );read=(FS_PRE_READ)GetProcAddress( DLLInst, "FS_PRE_READ" );}//write=(FS_PRE_WRITE)GetProcAddress( DLLInst, "FS_PRE_WRITE" );copyfile=(FS_COPYFILE)GetProcAddress( DLLInst, "FS_COPYFILE" );
else{cout<<"DLL加载失败。";return;}
if(!regfire(L"银砾石")){cout<<"注册失败。";return;}
read(Read);
WideString Path=path;
node=enumfile(Path.c_bstr(),node);
temp=name;String a,b;
  if(temp=="NTFS")
  {
   FS_NTFS * fp=(FS_NTFS *)node;
   cout<<endl<<"*****************目录清单******************"<<endl;
   while(fp!=NULL)
    {
     if (fp->ErrorCode==0x01){cout<<"指定路径不存在"<<endl;break;}
     if (fp->ErrorCode==0x02){cout<<"指定路径不是一个目录"<<endl;break;}
     a=fp->longname;
     if (fp->filetype==1){b="目录";}else{b="文件";}
     cout<<a<<" "+b<<endl;
     fp=fp->next;
    }
  }
  if(temp=="FAT16"||temp=="FAT32")
  {
   FS_FAT * fp=(FS_FAT *)node;
   cout<<endl<<"*****************目录清单******************"<<endl;
   while(fp!=NULL)
    {
     if (fp->ErrorCode==0x01){cout<<"指定路径不存在"<<endl;break;}
     if (fp->ErrorCode==0x02){cout<<"指定路径不是一个目录"<<endl;break;}
     a=fp->longname;
     if (fp->filetype==1){b="目录";}else{b="文件";}
     if(a!="")
     {
      cout<<a<<" "+b<<endl;
     }
     else
     {
      a=fp->shortname;
      cout<<a<<" "+b<<endl;
     }
     fp=fp->next;
    }
  }
CloseHandle(hDev);
}

void fun1()
{
String path="";
cout<<"请输入待复制文件全路径(包括盘符)";
char   letter;
cin>>letter;
while(letter!='\n')
{
   path=path+letter;
   letter=getchar();
}
String temp="\\\\.\\"+path.SubString(1,2);
hDev=CreateFile(temp.c_str(),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
if (hDev==INVALID_HANDLE_VALUE){cout<<endl<<"打开磁盘错误。";return;}
if( NULL == DLLInst ) DLLInst = LoadLibrary("FS.dll");
if (DLLInst) {regfire=(FS_REGFIRE)GetProcAddress( DLLInst, "FS_REGFIRE" );copyfile=(FS_COPYFILE)GetProcAddress( DLLInst, "FS_COPYFILE" );read=(FS_PRE_READ)GetProcAddress( DLLInst, "FS_PRE_READ" );write=(FS_PRE_WRITE)GetProcAddress( DLLInst, "FS_PRE_WRITE" );}
else{cout<<"DLL加载失败。";return;}
if(!regfire(L"银砾石")){cout<<"注册失败。";return;}
read(Read);
write(Write);
WideString Path=path;
path="";
cout<<"请输入目标全路径(包括盘符)";
cin>>letter;
while(letter!='\n')
{
   path=path+letter;
   letter=getchar();
}
hFile=CreateFile(path.c_str(),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_ALWAYS,0,0);
if (hFile==INVALID_HANDLE_VALUE){cout<<endl<<"写入失败。";return;}
int re=copyfile(Path.c_bstr(),L"");
switch(re)
{
case 0:
cout<<"文件成功复制。"<<endl;
break;
case 1:
cout<<"不存在。"<<endl;
break;
case 2:
break;
case 3:
cout<<"文件大小为0。"<<endl;
break;
case 4:
cout<<"未准备好。"<<endl;
break;
}
CloseHandle(hDev);
CloseHandle(hFile);
}
//---------------------------------------------------------------------------

console.rar

207.15 KB, 下载次数: 54

例子程序

评分

参与人数 1人气 +1 收起 理由
tawny2008 + 1 辛苦了

查看全部评分

tawny2008
发表于 2009-10-15 23:24:03 | 显示全部楼层
过来支持石头
olly
发表于 2009-10-18 15:45:03 | 显示全部楼层
今天使用dll写了个枚举文件的界面,
可是释放内存,那个传入node应该怎么做呢?我的一直泄露 = =

Filemask.part1.rar

480 KB, 下载次数: 19

Filemask.part2.rar

218.21 KB, 下载次数: 20

评分

参与人数 1人气 +1 收起 理由
银砾石 + 1 感谢支持,欢迎常来: )

查看全部评分

银砾石
 楼主| 发表于 2009-10-18 17:32:16 | 显示全部楼层
NODE使用全局
每次枚举完后在下次枚举时作为参数传入
最后一次枚举时文件名为空,参数仍为NODE,(返回也是NODE)传入
除了返回的FS_FAT(FS_NTFS)清单不释放可能造成泄露,其他就只有这一句了
tstringstream ss(Path);
while(getline(ss,name,TEXT('\\'))){;}
另外,FS_PRE_READ相关的读磁盘的函数里使用的BUFFER建议也使用全局,DLL里对此块内存不负责回收的,BUFFER大小最大为簇大小,一般来说128K够了

评分

参与人数 1经验 +5 收起 理由
tawny2008 + 5 感谢解答

查看全部评分

olly
发表于 2009-10-18 18:08:05 | 显示全部楼层
原帖由 银砾石 于 2009-10-18 17:32 发表
NODE使用全局
每次枚举完后在下次枚举时作为参数传入
最后一次枚举时文件名为空,参数仍为NODE,(返回也是NODE)传入
除了返回的FS_FAT(FS_NTFS)清单不释放可能造成泄露,其他就只有这一句了
tstringstream ss( ...


也就是说传入的路径要为空,不能为NULL,改了下,,果然好多了O(∩_∩)O~

另外,不知道为什么我直接传静态字串e.g _T("c:\"),dll就会崩溃,而用CString 的 AllocSysString()方法产生的动态字串就能正常工作。。。。

期待FS.dll越来越完善,\(^o^)/~

FileMask.part1.rar

480 KB, 下载次数: 21

FileMask.part2.rar

222.01 KB, 下载次数: 22

FScpp.rar

3.63 KB, 下载次数: 22

我的FS.dll的相关声明,不知道对不对- -

银砾石
 楼主| 发表于 2009-10-18 18:39:24 | 显示全部楼层
刚看错了

传静态字串出现的是什么错误?
传入L"c:\\"看看是不是因为传入的不是UNICODE的
对了,你写的_T"C:\"没缺一个"\" ?

[ 本帖最后由 银砾石 于 2009-10-18 18:50 编辑 ]
olly
发表于 2009-10-18 18:53:42 | 显示全部楼层

回复 336楼 银砾石 的帖子

额,是_T("c:\\");帖子中打错了。。
唔,我再试试看。。

[ 本帖最后由 olly 于 2009-10-18 18:57 编辑 ]
银砾石
 楼主| 发表于 2009-10-18 19:01:45 | 显示全部楼层

回复 337楼 olly 的帖子

看来看去,没看出什么问题
        if (!m_buffer) delete []m_buffer;
这个是if(m_buffer)吧?
olly
发表于 2009-10-18 19:04:45 | 显示全部楼层
恩,,我直接这样不行。

  1. CMyFileSystem::MyInitFS(_T("j"), _T("FS.DLL"), _T("银砾石"));
  2. void * node=NULL;
  3.   node = (FS_FAT *)CMyFileSystem::MyEnumFile(_T("j:\"), node);
  4. FS_FAT * fp=(FS_FAT *)node;
  5. while (fp) {
  6.   MessageBox(fp->shortname);
  7.   fp = fp->next;
  8. }
复制代码

程序出错退出。

而这样的话就可以

  1. CMyFileSystem::MyInitFS(_T("j"), _T("FS.DLL"), _T("银砾石"));
  2. void * node=NULL;
  3. TCHAR patch[] = _T("j:\");
  4. node = (FS_FAT *)CMyFileSystem::MyEnumFile(patch, node);
  5. FS_FAT * fp=(FS_FAT *)node;
  6. while (fp) {
  7.   MessageBox(fp->shortname);
  8.   fp = fp->next;
  9. }

  10. = =
复制代码
olly
发表于 2009-10-18 19:08:14 | 显示全部楼层
原帖由 银砾石 于 2009-10-18 19:01 发表
看来看去,没看出什么问题
        if (!m_buffer) delete []m_buffer;
这个是if(m_buffer)吧?



这个居然写错了
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-12-28 03:14 , Processed in 0.102330 second(s), 17 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表