#include "stdafx.h" #include ".\ddlfile.h" DDLFile::DDLFile(void) { _hFile=0; } DDLFile::~DDLFile(void) { if (_hFile!=0) CloseHandle(_hFile); } bool DDLFile::OpenDDLFile(WString filename) { _hFile=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,NULL); if (_hFile==INVALID_HANDLE_VALUE) { _hFile=0; return false; } return true; } bool DDLFile::ReadFile(void *data, size_t sz) { DWORD readed=0; if (::ReadFile(_hFile,data,sz,&readed,NULL)==FALSE) return false; if (readed!=sz) return false; return true; } bool DDLFile::EnumFiles(IDDLFileEnumerator &enmClass) { uint32_t firstGroup; uint32_t groupEndOffset; uint32_t endGroups; int i; int ngroups; SetFilePointer(_hFile,0,0,FILE_BEGIN); if (ReadFile(&firstGroup,sizeof(firstGroup))==false) return false; if (ReadFile(&groupEndOffset,sizeof(firstGroup))==false) return false; uint32_t *group=(uint32_t *)alloca(groupEndOffset); group[0]=firstGroup; group[1]=groupEndOffset; ngroups=groupEndOffset/8; if (groupEndOffset!=8 && ReadFile(group+2,groupEndOffset-8)==false) return false; SetFilePointer(_hFile,12,0,FILE_CURRENT); if (ReadFile(&endGroups,sizeof(endGroups))==false) return false; for (i=0;i