📄 tcsylist.h
字号:
{
BYTE byHeadFlag[16]; // 有效标识
DWORD dwHeadSize; // 标头大小
BOOL bUpdateRecent; // 最近更新
BYTE byRecentRun[8]; // 最近更新
DWORD dwValCRC32; // 校验码值
BOOL EncodeHead(BOOL bUpdate) // 打包标头
{
memcpy(byHeadFlag, ZNN_REG_HEAD_FLAG, sizeof(byHeadFlag));
dwHeadSize = sizeof(SFileRegistHead);
bUpdateRecent = bUpdate;
if(bUpdate) {if(!GetCurrDate(byRecentRun)) return FALSE;}
const LONG nChckSize = sizeof(SFileRegistHead) - sizeof(DWORD);
dwValCRC32 = GenerateCRC32((BYTE *)this, nChckSize);
BYTE byKeys[sizeof(DATA_KEYS)];
CryptXOR(byKeys, DATA_KEYS, sizeof(DATA_KEYS));
SckDesBin(0, (BYTE *)this, sizeof(SFileRegistHead), byKeys);
return TRUE;
}
BOOL DecodeHead(VOID) // 解包标头
{
BYTE byKeys[sizeof(DATA_KEYS)];
CryptXOR(byKeys, DATA_KEYS, sizeof(DATA_KEYS));
SckDesBin(1, (BYTE *)this, sizeof(SFileRegistHead), byKeys);
if(memcmp(byHeadFlag, ZNN_REG_HEAD_FLAG, sizeof(byHeadFlag)))
return FALSE;
if(dwHeadSize != sizeof(SFileRegistHead)) return FALSE;
const LONG nChckSize = sizeof(SFileRegistHead) - sizeof(DWORD);
return (dwValCRC32 == GenerateCRC32((BYTE *)this, nChckSize));
}
SFileRegistHead() // 构造函数
{
memcpy(byHeadFlag, ZNN_REG_HEAD_FLAG, sizeof(byHeadFlag));
dwHeadSize = sizeof(SFileRegistHead);
bUpdateRecent = FALSE;
memset(byRecentRun, 0xFF, sizeof(byRecentRun));
dwValCRC32 = 0;
} // 置默认值
};
//=========================================================================//
// 自定义数据所处的扇区位置,在扇区内的字节偏移
struct STcsyRegistAddr
{
DWORD dwSectNum; // 第几扇区
LONG nByteOffs; // 区内偏移
STcsyRegistAddr() // 构造函数
{
dwSectNum = 0; nByteOffs = 0;
}
VOID Set(DWORD dw = 0L, LONG n = 0L) // 复位函数
{
dwSectNum = dw; nByteOffs = n;
} // 置默认值
};
//-------------------------------------------------------------------------//
// 自定义扇区内注册数据单元条:扇区内实体
struct STcsyRegistItem
{
BYTE byItemFlag[8]; // 有效标识
STcsyRegistData RegData; // 注册数据
STcsyRegistAddr AddrPrior; // 上单元位
STcsyRegistAddr AddrNext; // 下单元位
STcsyRegistAddr AddrSelf; // 本身位置
DWORD dwValCRC32; // 校验码值
STcsyRegistItem() // 构造函数
{
memcpy(byItemFlag, SCK_REG_ITEM_FLAG, sizeof(byItemFlag));
dwValCRC32 = 0;
} // 置默认值
};
//-------------------------------------------------------------------------//
// 自定义扇区内注册类头:扇区内实体
struct STcsyRegistHead
{
BYTE byHeadFlag[16]; // 有效标识
LONG nItemCount; // 单元个数
STcsyRegistAddr AddrStart; // 起始单元
STcsyRegistAddr AddrEnd; // 结束单元
STcsyRegistAddr AddrSelf; // 本身位置
DWORD dwValCRC32; // 校验码值
STcsyRegistHead() // 构造函数
{
memcpy(byHeadFlag, SCK_REG_HEAD_FLAG, sizeof(byHeadFlag));
nItemCount = -1; // Indicate NOT load list from disk
dwValCRC32 = 0;
} // 置默认值
};
//-------------------------------------------------------------------------//
// 自定义扇区内注册数据结点位:内存中实体
struct STcsyRegistNode
{
STcsyRegistItem ItemData; // 单元数据
STcsyRegistNode *PtrPrior; // 上节点位
STcsyRegistNode *PtrNext; // 下节点位
STcsyRegistNode() // 构造函数
{
PtrPrior = PtrNext = NULL;
} // 置默认值
};
/////////////////////////////////////////////////////////////////////////////
// 自定义扇区内注册管理双向链表类:主控制类
class CTcsyRegistList
{
LONG m_nOperAlow; // 操作类型
CHAR m_chFileName[MAX_PATH]; // 文件路径
CMemMapFile m_ZnnFile; // 映象文件
BOOL m_bUserRegisted; // 是否注册
STcsyRegistAddr AddrRegist; // 登陆地址
BOOL m_bFirstRunRegist; // 首次注册
STcsyRegistHead TcsyHead; // 扇内标头
LONG m_nNodeCount; // 节点个数
STcsyRegistNode *PtrStart; // 开始节点
STcsyRegistNode *PtrEnd; // 结束节点
STcsyRegistNode *PtrCurr; // 当前节点
//-------------------------------------------------------//
BOOL IsCorrectZnnFile(const CHAR *chFile); // 校验文件
BOOL IsZnnFileUpdate(VOID); // 是否更新
BOOL SaveZnnFileHead(BOOL bUpdate); // 写入标头
VOID WriteNewFlag(BYTE *pStart, WORD wDataSize);// 首.NEW尾
VOID ByteToUpper(VOID *pSrc, INT nLen); // 转为大写
INT ConvertStringFormat(char chDes[], const char chSrc[]);
VOID ByteNullSet(VOID *pSrc, INT nLen); // NULL结束
VOID ByteNullCpy(VOID *pDes, const VOID *pSrc, INT nLen);
INT GenerateReturnCode(const CHAR chHdiskSn[], const BYTE byDate[],
CHAR chReturn[]); // 生成返回
INT GenerateRegistCode(const CHAR chName[], const CHAR chProduct[],
const CHAR chReturn[], CHAR chRegist[]);// 生成注册
BOOL SaveRegistFile(const STcsyRegistData &sData); // 存注册
VOID ResetListData(VOID); // 初始链表
BOOL IsKeepAs(BYTE *pCurr, LONG nLen, BYTE byData);
BOOL IsValidAddr(const STcsyRegistAddr &sAddr); // 地址有效
BOOL IsSameAddr(const STcsyRegistAddr &sAddr, // 判断地址
const STcsyRegistAddr &dAddr); // 是否相同
BOOL IsEnableDiskIO(VOID); // 扇可用否
BOOL FileSectorIO(BYTE *pSector, DWORD dwStart, LONG bOpera);
BOOL HandleSectorIO(BYTE *pSector, DWORD dwStart, LONG bOpera);
BOOL New(STcsyRegistAddr &sAddr, WORD wDataSize, const BYTE *pData = NULL);
BOOL Delete(STcsyRegistAddr sAddr); // 释放扇区
BOOL FindUserRegist(const BYTE byProduct[], STcsyRegistItem **ppItem = NULL);
LONG ReverseSearchValid(const STcsyRegistHead &sHead,
const STcsyRegistAddr &eAddr, const STcsyRegistAddr &fAddr,
STcsyRegistItem &sItem); // 反向搜索
BOOL SaveDiskHead(STcsyRegistHead sHead, BOOL bFileIO = FALSE);
BOOL LoadDiskItem(STcsyRegistItem &sItem, BOOL bFileIO = FALSE);
BOOL SaveDiskItem(STcsyRegistItem sItem, BOOL bFileIO = FALSE);
BOOL AddEndDiskItem(STcsyRegistItem &sItem); // 尾追单元
LONG DelEnd(BOOL bDelItem); // 尾删数据
LONG DelStart(BOOL bDelItem); // 首删数据
public:
CTcsyRegistList(); // 构造函数
~CTcsyRegistList(); // 析构函数
LONG GetItemCount(VOID); // 获取总数
VOID GetTcsyHead(STcsyRegistHead *pHead); // 获取标头
BOOL FindListHeadInDisk(STcsyRegistHead *pHead);// 查找标头
BOOL LoadListFromDisk(const STcsyRegistHead *pHead = NULL,
BOOL bFind = TRUE); // 装载链表
BOOL AddEnd(const STcsyRegistData *pData); // 尾追数据
BOOL ReadCurr(STcsyRegistData *pData); // 读当前节
BOOL WriteCurr(const STcsyRegistData *pData); // 写当前节
LONG RemoveCurr(BOOL bDelItem); // 移除节点
VOID ToRewind(BOOL bEndOrNot); // 假首真尾
BOOL ToPrior(VOID); // 到上一点
BOOL ToNext(VOID); // 到下一点
BOOL DirectRemove(DWORD dwNumb, LONG nOffs); // 底层直删
BOOL DestroyList(BOOL bDelItem, BOOL bDelHead); // 移除链表
VOID SetFirstRunRegist(BOOL bRegist); // 首次注册
BOOL RegistUserProduct(SckRegistOrder *pOrder, BOOL bRegDIY = FALSE);
};
/////////////////////////////////////////////////////////////////////////////
#endif // #ifndef TCSY_LIST_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -