⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fatmaster.h

📁 可以为FAT32下的文件加入tag
💻 H
字号:
#ifndef FATMASTER_H
#define FATMASTER_H

#include <Windows.h>
#include <Winbase.h>
#include <windef.h>
#include <tchar.h>

#include <string>
#include <iostream>

//using namespace::std;

typedef struct{
	BYTE key[32];
	BYTE value[32];
}FATG, *PFTAG;

typedef struct{
	char preName[128];
	UINT32 preSize;
	char extName[16];
	UINT32 extSize;
}FILE_NAME, *PFILE_NAME;

typedef struct{
	UINT32 firCluNum;
	UINT32 length;
}FILEENTINFO, *PFILEENTINFO;

#pragma pack(1)
typedef struct{
	typedef struct{
		BYTE rsv1:1;
		BYTE lst:1;
		BYTE rsv2:1;
		BYTE seq:5;
	}ATTR;
	ATTR attr;
	WORD name1[5];
	BYTE flag;
	BYTE rsv;
	BYTE chksum;
	WORD name2[6];
	WORD clu;
	WORD name3[2];	
}LONG_NAME_ENT, *PLONG_NAME_ENT;

typedef struct{
	BYTE name[8];
	BYTE ext[3];
	BYTE attr;
	BYTE rsv;
	BYTE crtTimeTenth;
	WORD crtTime;
	WORD crtDate;
	WORD acsData;
	WORD fstCluHi;
	WORD wrtTime;
	WORD wrtDate;
	WORD fstCluLo;
	UINT32 length;
}FAT32_DIR_ENT, *PFAT32_DIR_ENT;

typedef struct{
	BYTE name[8];
	BYTE ext[3];
	BYTE attr;
	BYTE rsv[10];
	WORD chgTime;
	WORD chgDate;
	WORD fstClu;
	UINT32 length;
}FAT16_DIR_ENT, *PFAT16_DIR_ENT;

#pragma pack()

class FatMaster
{
public:
	FatMaster() {}
	~FatMaster() {}

	BOOL WriteTags(const char* fileName, char* pTags, PUINT32 tagsNum);

	BOOL ReadTags(const char* fileName, char** ppTags, PUINT32 tagsNum);

	BOOL WriteFATFile(const char* fileName, char* pBuffer, PUINT32 size);

	BOOL ReadFATFile(const char* fileName, char** ppBuffer, PUINT32 size);

private:
	
	BOOL GetBPBofDisk(HANDLE hDev);
	
	BOOL GetDiskName(char** ppFilePath, char* diskName);
	BOOL GetFileEntry(HANDLE hDisk, char *pFilePath, PFILEENTINFO pFileEntInfo);
	INT32 GetTopDirName(char** ppPath, char* pDirName);
	BOOL SearchRootFileEnt(HANDLE hDisk, UINT32 startSecNum, char* pName, PFILEENTINFO pFileEntInfo);
	BOOL SearchFileEntByName(HANDLE hDisk, UINT32 startSecNum, char* pName, PFILEENTINFO pFileEntInfo);
	BOOL MatchSNameWithSEnt(FILE_NAME* pName, PFAT32_DIR_ENT pdirEnt);
	BOOL MatchLNameWithSEnt(FILE_NAME* pName, PFAT32_DIR_ENT pdirEnt); 
	BOOL MatchLNameWithLEnt(char* pName, UINT32 pos, PBYTE pCur, PBYTE pLst);
	BOOL WriteTagsIn( PFILEENTINFO pfileEntInfo, char* pTags, PUINT32 tagsNum);
	BOOL ReadTagsOut( PFILEENTINFO pfileEntInfo, char** ppTags, PUINT32 tagsNum);
	BOOL LocateFileLastSec( PFILEENTINFO pfileEntInfo, PUINT32 secNum);
	BOOL FindNextCluSeq(PUINT32 pCluNum, int num);
	BOOL ComCharAndWchar(char* pa, PWORD pb, UINT32 n);

	HANDLE OpenDisk(char* diskName) {
		//here should using diskName to replace the default one.
		//pay attention with unicode transfer.
		return 	CreateFile( _T("\\\\.\\E:"), 
		GENERIC_READ | GENERIC_WRITE, 
		FILE_SHARE_WRITE, 
		NULL, 
		OPEN_EXISTING, 
		0, 
		NULL);
	}
	
	void CloseDisk(HANDLE hDev) {
		CloseHandle(hDev);
	}

private:
	static const UINT32 SEC_SIZE = 512;
	static const UINT32 DIR_ENT_SIZE = 32;
	static const UINT32 FIR_CLU = 2;
	static const UINT32 BUF_SIZE = 4096;
	static const UINT32 CHAR_PER_LDIR = 13;

	BYTE mBuf[BUF_SIZE*2]; //ping pang buffer
	
	HANDLE hDisk;
	BYTE diskName[8];
	UINT32 secPerClu;
	UINT32 rsvSecNum;
	UINT32 numofFat;
	UINT32 rootEntNum;
	UINT32 secPerFat;
	UINT32 maxSecNum;
	BOOL bFat32;
	UINT32 fstSecofRootDir;
	UINT32 fstSecofData;
	UINT32 fstSecofFat;
	UINT32 maxCluNum;
};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -