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不是个一般的多
门派: 使徒十三
等级: 大天使
信息:
威望: +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不是个一般的多
本文讨论了如何使用RAW READ方法从磁盘读取文件,通过创建文件对象并发送FSCTL_GET_RETRIEVAL_POINTERS控制代码获取相关信息。提供了应用层的示例代码,展示了如何实现这一过程,涉及Windows API函数如CreateFile, DeviceIoControl等。"
130905910,8053702,AUTOSAR应用层与软件组件详解,"['车载系统', '软件架构', '组件通信']

被折叠的 条评论
为什么被折叠?



