首页
社区
课程
招聘
[求助]读取独占文件的问题 ntfs可以fat32不会 求救啊
发表于: 2011-1-13 04:46 5414

[求助]读取独占文件的问题 ntfs可以fat32不会 求救啊

2011-1-13 04:46
5414
#include <Windows.h>
#include <stdio.h>
#include <winioctl.h>
#include <malloc.h>
BOOL GetFileClusters(ULONGLONG ** Clusters, ULONG * ClusterSize, PCHAR lpFileName)
{
    HANDLE hFile;
	ULONG	ClCount, FileSize;
    ULONG   OutSize;
    ULONG   Bytes, Cls, CnCount, r;
    LARGE_INTEGER PrevVCN, Lcn;
    STARTING_VCN_INPUT_BUFFER InBuf;
    PRETRIEVAL_POINTERS_BUFFER OutBuf;
    CHAR          Name[7];
    DWORD SecPerCl;
    DWORD BtPerSec;
	
    Name[0] = lpFileName[0];
    Name[1] = ':';
    Name[2] = 0;
	
    GetDiskFreeSpace(Name, &SecPerCl, &BtPerSec, NULL, NULL);	
    *ClusterSize = SecPerCl * BtPerSec;
	
    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 = (RETRIEVAL_POINTERS_BUFFER *)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 = (ULONGLONG *)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;
            }
        }else
		{			
			free(OutBuf);		
			CloseHandle(hFile);
			return FALSE;
		}
    }else
		return FALSE;
    return TRUE;
}

void Read(PCHAR lpSrcName)
{
    ULONG         ClusterSize, Bytes;
    ULONGLONG    *Clusters = 0;
    HANDLE        hDrive;

    PVOID         Buff;
    LARGE_INTEGER Offset;
    CHAR          Name[7];
	
    if (GetFileClusters(&Clusters, &ClusterSize, lpSrcName))
    {
        Name[0] = '\\';
        Name[1] = '\\';
        Name[2] = '.';
        Name[3] = '\\';
        Name[4] = lpSrcName[0];
        Name[5] = ':';
        Name[6] = 0;
		
        hDrive = CreateFile(Name, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
		
        if (hDrive != INVALID_HANDLE_VALUE)
        {
			Buff = malloc(ClusterSize);						
			Offset.QuadPart = ClusterSize * Clusters[0];			
			SetFilePointer(hDrive, Offset.LowPart, &Offset.HighPart, FILE_BEGIN);			
			ReadFile(hDrive, Buff, ClusterSize, &Bytes, NULL);
			printf("%s",Buff);			
            free(Buff);			
            CloseHandle(hDrive);
        }
        free(Clusters);
    }
}

int main(int argc, char* argv[])
{
	Read("D:\\test.rar");
	return 0;
}

修改网上的代码 小弟对文件系统并不熟悉,上面的程序在ntfs文件系统可以正确的读取内容
可是在fat32文件系统却不行 读取的数据是错误的!
google,baidu好半天 是说  
"RETRIEVAL_POINTERS_BUFFER 获得的 LCN 还要加上卷隐含扇区数,才是簇的绝对起始位置。这里的隐含扇区包括保留扇区、 2 个 FAT 表占用的扇区。"

这保留扇区和俩个FAT表怎么计算呢?

是不是计算结果加上RETRIEVAL_POINTERS_BUFFER的Extents域中的 LCN 就是该簇的绝对位置呢?

走过路过的哥哥们 麻烦说下.... 谢谢啊

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
参考这里 9ecK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4G2k6r3g2H3M7X3!0B7k6h3y4@1i4K6u0W2j5$3!0E0i4K6u0r3d9@1u0Q4x3V1k6X3K9h3I4W2M7#2)9J5c8V1k6p5N6h3#2H3i4K6u0W2j5i4y4H3P5q4)9K6c8X3c8A6M7%4m8D9j5i4W2Q4x3@1c8b7M7X3W2F1N6l9`.`.
需要解析FAT DBR
FatNum * FatSectors + ReservedSectors
2011-1-13 09:12
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢啊 已经搞定了
2011-1-13 10:07
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
FAT还是比较容易搞的。。。
2011-1-13 12:06
0
游客
登录 | 注册 方可回帖
返回