RAW READ ~~~ 从磁盘读取文件

本文讨论了如何使用RAW READ方法从磁盘读取文件,通过创建文件对象并发送FSCTL_GET_RETRIEVAL_POINTERS控制代码获取相关信息。提供了应用层的示例代码,展示了如何实现这一过程,涉及Windows API函数如CreateFile, DeviceIoControl等。" 130905910,8053702,AUTOSAR应用层与软件组件详解,"['车载系统', '软件架构', '组件通信']
vxk   头衔: 无名氏
门派: 使徒十三
  

等级: 大天使
信息:  
威望: +5 积分: 2081  
现金: 5904 雷傲元
存款: 2552072 雷傲元
贷款: 没贷款
来自: 保密 
发帖: 1916 篇
精华: 8 篇
在线: 54 时 10 分 45 秒
注册: 2002/08/05 08:43am
造访: 2006/02/11 08:40pm
  消息 查看 搜索 好友 复制 引用 回复 只看我  [楼 主]

  最近真的很烦,FSDIO由于某些原因不能公开,只能在这里稍微谈论下RAW READ了,RAWREAD就是从磁盘读取文件得说,通过打开////.//X:来进行读取文件的操作~~
不过之前要先通过给文件对象发送FSCTL_GET_RETRIEVaL_POINTERS获得相关信息——懒得自己计算的说~~
具体给个应用层例子好了(kernel mode的代码大家自己想一下,自己动手~~)::
#define _WIN32_WINNT 0x0400
#include <windows.h>
#include <winioctl.h>


ULONGLONG *GetFileClusters(
                   PCHAR lpFileName,
                   ULONG ClusterSize,
                   ULONG *ClCount,
                   ULONG *FileSize
                   )
{
   HANDLE  hFile;
   ULONG   OutSize;
   ULONG   Bytes, Cls, CnCount, r;
   ULONGLONG *Clusters = NULL;
   BOOLEAN Result = FALSE;
   LARGE_INTEGER PrevVCN, Lcn;
   STARTING_VCN_INPUT_BUFFER  InBuf;
   PRETRIEVaL_POINTERS_BUFFER OutBuf;

   hFile = CreateFile(lpFileName, FILE_READ_ATTRIBUTES,
                      FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                      NULL, OPEN_EXISTING, 0, 0);

   if (hFile != INVALID_HANDLE_value)
   {
       *FileSize = GetFileSize(hFile, NULL);

       OutSize = sizeof(RETRIEVaL_POINTERS_BUFFER) + (*FileSize / ClusterSize) * sizeof(OutBuf->Extents);

       OutBuf = malloc(OutSize);

       InBuf.StartingVcn.QuadPart = 0;

       if (DeviceIoControl(hFile, FSCTL_GET_RETRIEVaL_POINTERS, &InBuf,
                           sizeof(InBuf), OutBuf, OutSize, &Bytes, NULL))
       {
           *ClCount = (*FileSize + ClusterSize - 1) / ClusterSize;

           Clusters = malloc(*ClCount * sizeof(ULONGLONG));

           PrevVCN = OutBuf->StartingVcn;

           for (r = 0, Cls = 0; r < OutBuf->ExtentCount; r++)
           {
               Lcn = OutBuf->Extents[r].Lcn;

               for (CnCount = (ULONG)(OutBuf->Extents[r].NextVcn.QuadPart - PrevVCN.QuadPart);
                    CnCount; CnCount--, Cls++, Lcn.QuadPart++) Clusters[Cls] = Lcn.QuadPart;

               PrevVCN = OutBuf->Extents[r].NextVcn;
           }
       }

       free(OutBuf);

       CloseHandle(hFile);
   }
   return Clusters;
}

void FileRead(
       PCHAR lpSrcName
PCHAR lpOutBuffer
       )
{
   ULONG         ClusterSize, BlockSize;
   ULONGLONG    *Clusters;
   ULONG         ClCount, FileSize, Bytes;
   HANDLE        hDrive, hFile;
   ULONG         SecPerCl, BtPerSec, r;
   PVOID         Buff;
   LARGE_INTEGER Offset;
   CHAR          Name[7];

   Name[0] = lpSrcName[0];
   Name[1] = ':';
   Name[2] = 0;

   GetDiskFreeSpace(Name, &SecPerCl, &BtPerSec, NULL, NULL);

   ClusterSize = SecPerCl * BtPerSec;

   Clusters = GetFileClusters(lpSrcName, ClusterSize, &ClCount, &FileSize);

   if (Clusters)
   {
       Name[0] = '//';
       Name[1] = '//';
       Name[2] = '.';
       Name[3] = '//';
       Name[4] = lpSrcName[0];
       Name[5] = ':';
       Name[6] = 0;

       hDrive = CreateFile(Name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);

       if (hDrive != INVALID_HANDLE_value)
       {
        
               Buff = malloc(FileSize);
lpOutBuff = (PCHAR)Buff;
               for (r = 0; r < ClCount; r++, FileSize -= BlockSize)
               {
                   Offset.QuadPart = ClusterSize * Clusters[r];

                   SetFilePointer(hDrive, Offset.LowPart, &Offset.HighPart, FILE_BEGIN);

                   ReadFile(hDrive, Buff, ClusterSize, &Bytes, NULL);

                   BlockSize = FileSize < ClusterSize ? FileSize : ClusterSize;

                   Buff+=BlockSize;
               }

       CloseHandle(hDrive);
       }
       free(Clusters);
   }
return ;
}

int main()
{
PCHAR mybuf = NULL;
FileRead("C://mylog.txt",mybuf);
printf("%s/n",mybuf);
return 0;
}




  











编辑 屏蔽 2006/01/26 11:39am IP: 已设置保密 [本文共6604字节]   
  

  vxk   头衔: 无名氏
门派: 使徒十三
  

等级: 大天使
信息:  
威望: +5 积分: 2081  
现金: 5904 雷傲元
存款: 2552072 雷傲元
贷款: 没贷款
来自: 保密 
发帖: 1916 篇
精华: 8 篇
在线: 54 时 10 分 45 秒
注册: 2002/08/05 08:43am
造访: 2006/02/11 08:40pm
  消息 查看 搜索 好友 复制 引用 回复 只看我  [第 2 楼]

  如果在驱动里用自己创建IRP的方法来做,这个东西就更爽了~~嘿嘿~~
  











编辑 屏蔽 删除 2006/01/26 11:41am IP: 已设置保密 [本文共61字节]   
  

  baiyuanfan   头衔: 总版主

  

等级: 病毒精灵
信息:  
威望: 0 积分: 153  
现金: 5262 雷傲元
存款: 没开户
贷款: 没贷款
来自: 保密 
发帖: 168 篇
精华: 1 篇
资料:  
在线: 39 时 53 分 33 秒
注册: 2004/11/05 02:47pm
造访: 2006/02/11 08:29pm
  消息 查看 搜索 好友 复制 引用 回复 只看我  [第 3 楼]

  hehe super_FSDio?


[补充该文...]

  











编辑 屏蔽 删除 2006/01/29 00:55am IP: 已设置保密 [本文共17字节]   
  

  baiyuanfan   头衔: 总版主

  

等级: 病毒精灵
信息:  
威望: 0 积分: 153  
现金: 5262 雷傲元
存款: 没开户
贷款: 没贷款
来自: 保密 
发帖: 168 篇
精华: 1 篇
资料:  
在线: 39 时 53 分 33 秒
注册: 2004/11/05 02:47pm
造访: 2006/02/11 08:29pm
  消息 查看 搜索 好友 复制 引用 回复 只看我  [第 4 楼]

  不过你那个fileio TMD bug不是个一般的多
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值