/*----------------------------------------------------------------------------- * MemoryIni.cpp *----------------------------------------------------------------------------- * ¾ÏȣȭµÈ IniÆÄÀÏÀ» ¸Þ¸ð¸®¿¡¼­ ÀÐ°í ¾µ¼ö ÀÖ°Ô Çϱâ À§ÇÏ¿© ¸¸µç Ŭ·¡½º *----------------------------------------------------------------------------- **---------------------------------------------------------------------------*/ #include "MemoryIni.h" // MemoryIni::MemoryIni() : m_bInit(FALSE), m_bParsed(FALSE), m_data(NULL), m_data_size(0) { m_sec.clear(); } MemoryIni::~MemoryIni() { if ( NULL != m_data ) { free(m_data); m_data = NULL; } m_sec.clear(); m_data_size = 0; } /** ----------------------------------------------------------------------- \brief ppos¹öÆÛ¿¡¼­ linszº¸´Ù ÀÛÀº Å©±â·Î ÇÑÁÙ Àо line¿¡ ä¿ò \remark sgets2()ÇÔ¼ö¸¦ ¸®ÆÑÅ丵ÇÑ ÇÔ¼öÀÓ \param line - ÇÑ LineÀÌ Ã¤¿öÁü linesz - line ÀÇ Å©±â ppos - lineÀ» °Ë»öÇÒ ¹öÆÛ(IN/OUT°â¿ë) \return ¼º°ø½Ã ÀÐÇôÁø ¶óÀÌÀÇ ±æÀÌ, 0À» ¸®ÅÏÇϸé LineÀ¸·Î Ãë±ÞÇÒ ¹®ÀÚ°¡ ¾øÀ¸¹Ç·Î(¿¹:¿¬¼ÓµÈ ij¸®Áö¸®Åϵé, ¿¬¼ÓµÈ NULL¹®ÀÚµé) ½ÇÆÐ½Ã -1À» ¸®ÅÏÇÔ \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::sgets2(LPSTR line, DWORD linesz, LPSTR *ppos) { _ASSERTE( NULL != line ); _ASSERTE( NULL != ppos ); _ASSERTE( linesz > 0 ); if ( IsBadWritePtr(line, linesz) || NULL == ppos || 0 == linesz ) { _ASSERTE(!"Invalid parameter"); return -1; } int nread = 0; LPSTR end = (LPSTR)&m_data[m_data_size]; LPSTR pos = *ppos; // ÇöÀçÀ§Ä¡°¡ ³¡À̰ųª(ÀÌ¹Ì °Ë»ö³¡³µÀ» °æ¿ì) ¿¡·¯ ¸®ÅÏ // if ( pos >= end ) { return -1; } // ÇöÀç À§Ä¡°¡ ³¡À» ³ÑÁö ¾ÊÀ¸¸ç, ä¿ï¼ö ÀÖ´Â ¹öÆÛ°¡ ³²¾ÆÀÖÀ»¶§±îÁö ¹Ýº¹ // while ( pos < end && linesz > 0 ) { int chsize = (int)_tcsnbcnt( pos, 1 ); UINT ch = _tcsnextc(pos); if ( ch == _T('\0') ) { if ( !nread ) { // pos = CharNext(pos) °¡ ¾Æ´Ô!! // ¿Ö³ÄÇϸé *pos°¡ NULLÀÌ¸é °°Àº Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϱ⠶§¹® pos++; continue; } break; } else if ( ch == _T('\r') || ch == _T('\n') ) { pos = CharNext(pos); if ( !nread ) { continue; } break; } // Áß¿ä!! // ³²¾ÆÀÖ´Â ¹öÆÛ»çÀÌÁî°¡ chsizeº¸´Ù ÀÛ´Ù¸é chsize¸¦ Á¶ÀýÇÔ // ¿©±â¼­ üũ¸¦ ÇÏÁö ¾ÊÀ¸¸é linsz´Â À½¼ö°ªÀÌ µÉ°ÍÀ̸ç // line°ú linesz¿¡µµ À߸øµÈ °á°ú°¡ µé¾î°¥ °ÍÀÌ´Ù // if ( linesz < (DWORD)chsize ) { break; } memcpy( (PVOID)&line[nread], pos, chsize ); nread += chsize; linesz -= chsize; pos = CharNext(pos); } *ppos = pos; if ( nread > 0 ) { line[nread] = _T('\0'); } return nread; } /** ----------------------------------------------------------------------- \brief ppos¹öÆÛ¿¡¼­ linszº¸´Ù ÀÛÀº Å©±â·Î ÇÑÁÙ Àо line¿¡ ä¿ò \param line - ÇÑ LineÀÌ Ã¤¿öÁü linesz - line ÀÇ Å©±â ppos - lineÀ» °Ë»öÇÒ ¹öÆÛ(IN/OUT°â¿ë) \return ¼º°ø½Ã ÀÐÇôÁø ¶óÀÌÀÇ ±æÀÌ, 0À» ¸®ÅÏÇϸé LineÀ¸·Î Ãë±ÞÇÒ ¹®ÀÚ°¡ ¾øÀ¸¹Ç·Î(¿¹:¿¬¼ÓµÈ ij¸®Áö¸®Åϵé, ¿¬¼ÓµÈ NULL¹®ÀÚµé) ½ÇÆÐ½Ã -1À» ¸®ÅÏÇÔ \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::sgets(LPTSTR line, DWORD linesz, LPTSTR *ppos) { _ASSERTE( NULL != line ); _ASSERTE( NULL != ppos ); _ASSERTE( linesz > 0 ); if ( 0 != IsBadWritePtr((LPVOID)line, linesz) || NULL == ppos || 0 == linesz ) { return -1; } LPTSTR end_marker = (LPTSTR) &m_data[m_data_size]; LPTSTR pos = *ppos; UINT ch = _T('\0'); size_t i = 0; // pos¿Í end_marker¿Í °°´Ù¸é ÀÌ¹Ì ¼øÈ¸¸¦ ¸¶Ä£ °æ¿ì¹Ç·Î ¿¡·¯ // if (pos >= end_marker) { return -1; } // // ÇöÀç pos°¡ end_marker¿¡ µµ´ÞÇϱâÀü±îÁöÀÇ NULL¹®ÀÚ´Â ¹«½ÃÇÔ // pos°¡ end_marker¿Í °°Áö ¾ÊÀºµ¥ NULLÀ̶ó¸é Æ÷ÀÎÅÍ Áõ°¡ // while ( pos < end_marker ) { if ( _T('\0') != _tcsnextc(pos) ) break; LPSTR oldpos = pos; pos = CharNext(pos); if ( pos == oldpos ) pos++; } while ( linesz > 0 && _T('\0') != _tcsnextc(pos) ) { size_t ByteCount = _tcsnbcnt( pos, 1 ); ch = _tcsnextc( pos ); if ( ch == _T('\r') || ch == _T('\n') ) { if ( 0 == i ) { pos = CharNext(pos); if (pos == end_marker) break; continue; } else break; } memcpy( (PVOID)&line[i], pos, ByteCount ); i = i + ByteCount; linesz = linesz - ByteCount; pos = CharNext(pos); if (pos == end_marker) break; } // ´õÀÌ»ó »ý¼ºÇÒ ¶óÀÎÀÌ ¾øÀ» °æ¿ì // if (0 == i && pos == end_marker) return -1; line[i] = _T('\0'); *ppos = pos; return (int)i; } /** ----------------------------------------------------------------------- \brief ÀÎÀÚ·Î ¹ÞÀº sÀÇ Ã³À½ºÎÅÍ °Ë»öÇÏ¿© ³Î ¸¸³ª±â Àü±îÁö °ø¹é¹®ÀÚ¸¦ °Ë»öÇÏ¿© °Ç³Ê¶Ü \param s - ½ºÆ®¸µ \return ½ÇÆÐ½Ã NULL¸®ÅÏ, ¼º°ø½Ã °ø¹é¹®ÀÚ°¡ ¾Æ´Ñ À§Ä¡¸¦ ¸®ÅÏÇÔ \code \endcode -------------------------------------------------------------------------*/ LPTSTR MemoryIni::strskip( LPTSTR s ) { if ( NULL == s ) return NULL; while ( _istspace(_tcsnextc(s)) && _T('\0') != _tcsnextc(s) ) s = CharNext(s); return s; } /** ----------------------------------------------------------------------- \brief ÁÂ¿ì °ø¹é¹®ÀÚ°¡ Á¸ÀçÇÏ¸é »èÁ¦ÇÔ \param str - °ø¹é¹®ÀÚ¸¦ »èÁ¦ÇÒ ½ºÆ®¸µ \return ¸®Åϰª ¾øÀ½ \code \endcode -------------------------------------------------------------------------*/ void MemoryIni::strip( LPTSTR str ) { LPTSTR s = str; int l; while ( _istspace(_tcsnextc(s)) ) s = CharNext(s); l = (int) _tcslen(s); if (s != str) memmove(str, s, l+1); if (0 == l) return; s = str + l - 1; while ( _istspace(_tcsnextc(s)) ) { *s = _T('\0'); s = CharPrev( str, s ); } } /** ----------------------------------------------------------------------- \brief ¼½¼Ç¸íÀ» ÀÎÀÚ·Î ¹ÞÀ¸¸ç »õ·Î¿î ¼½¼ÇÀ» Ãß°¡ÇÔ \param name - ¼½¼Ç¸í \return \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::addNewSection(LPCTSTR name) { INI_SECTION ini_sec = {0}; const size_t kLength = (sizeof(ini_sec.name) / sizeof(ini_sec.name[0])); ::strncpy(ini_sec.name, name, kLength); ini_sec.keys.clear(); m_sec.push_back( ini_sec ); return 0; } /** ----------------------------------------------------------------------- \brief ÇöÀç ºÐ¼®Çϰí ÀÖ´Â ¼½¼ÇÁß °¡Àå ÃÖ±Ù ¼½¼Ç¿¡ key, value ½ÖÀ» Ãß°¡ÇÔ \remark Internal ÇÔ¼öÀÓ \param key - Ãß°¡ÇÒ Å°À̸§ value - Ãß°¡ÇÒ °ªµ¥ÀÌÅÍ \return \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::addtoLastSection(LPCTSTR key, LPCTSTR value) { // °¡Àå ÃÖ±Ù¿¡ ¼½¼ÇÀÌ µî·ÏµÈ°Ô ¾ø´Ù¸é key, value°ªÀ» µî·ÏÇÒ ¼ö ¾øÀ½ // if ( !m_sec.empty() ) { INI_SECTION &ini_sec = m_sec.back(); KEYDATA keydata = {0}; strncpy(keydata.key, key, MAX_LINE); strncpy(keydata.value, value, MAX_LINE); ini_sec.keys.push_back( keydata ); } return 0; } /** ----------------------------------------------------------------------- \brief ¿¡µðÅÍ¿¡¼­ ¼öÁ¤À» À§ÇÏ¿© ÀÎÅÍÆäÀ̽º ³ëÃâÇÔ(µð¹ö±ë½Ã ÇÊ¿ä) \remark MemoryIni¿¡ ´ã±ä m_data¸¦ Á÷Á¢ È®ÀÎÇϱâ À§ÇØ ÇÊ¿ä \param \return \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::SetData(LPTSTR ini_data, DWORD ini_size) { _ASSERTE( NULL != ini_data ); _ASSERTE( 0 < ini_size ); if ( NULL == ini_data || 0 == ini_size ) { return -1; } if ( NULL != m_data ) { free(m_data); m_data = NULL; m_data_size = 0; } m_data = (PBYTE) calloc(1, ini_size); if ( NULL == m_data ) { return -1; } RtlCopyMemory(m_data, ini_data, ini_size); m_data_size = ini_size; parseData(); return 0; } /** ----------------------------------------------------------------------- \brief ¿¡µðÅÍ¿¡¼­ ¼öÁ¤À» À§ÇÏ¿© ÀÎÅÍÆäÀ̽º ³ëÃâÇÔ(µð¹ö±ë½Ã ÇÊ¿ä) \param \return \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::GetData(LPTSTR ini_data, DWORD ini_size, PDWORD ini_written) { _ASSERTE( NULL != ini_data ); _ASSERTE( 0 < ini_size ); _ASSERTE( NULL != ini_written ); DWORD copy_size = m_data_size; if ( NULL == ini_data || NULL == ini_written || 0 == ini_size ) { return -1; } if ( NULL == m_data || 0 == m_data_size) { return -1; } if ( ini_size <= m_data_size ) { copy_size = ini_size; } RtlCopyMemory( ini_data, (LPTSTR)m_data, copy_size ); *ini_written = copy_size; return 0; } /** ----------------------------------------------------------------------- \brief m_data¿¡ ´ã±ä iniµ¥ÀÌÅ͸¦ ºÐ¼®ÇÔ \remark Internal ÇÔ¼öÀÓ \param \return ½ÇÆÐ½Ã -1, ¼º°ø½Ã 0 \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::parseData() { _ASSERTE( NULL != m_data ); _ASSERTE( 0 != m_data_size ); if (NULL == m_data || 0 == m_data_size ) { return -1; } LPTSTR pos = (LPTSTR) m_data; TCHAR key[MAX_LINE] = {0,}; TCHAR line[MAX_LINE] = {0,}; TCHAR value[MAX_LINE] = {0,}; TCHAR section[MAX_LINE] = {0,}; memset( section, 0, sizeof(section) ); memset( value, 0, sizeof(value) ); memset( key, 0, sizeof(key) ); memset( line, 0, sizeof(line) ); m_sec.clear(); while ( 0 <= sgets2(line, MAX_LINE-1, &pos) ) { // °ø¹éÀ» °Ç³Ê¶Ú´Ù LPTSTR bc = strskip(line); if ( _T(';') == _tcsnextc(bc) || _T('#') == _tcsnextc(bc) || _T('\0') == _tcsnextc(bc) ) { continue; } if ( 1 == _stscanf(line, _T("[%[^]]"), section) ) { addNewSection(section); } else if ( 2 == _stscanf(bc, _T("%[^=] = \"%[^\"]\""), key, value) || 2 == _stscanf(bc, _T("%[^=] = '%[^\']'"), key, value) || 2 == _stscanf(bc, _T("%[^=] = %[^;#]"), key, value) ) { strip(key); strip(value); if ( !_tcscmp(value, _T("\"\"")) || !_tcscmp(value, _T("''")) ) { value[0] = _T('\0'); } addtoLastSection( key, value ); } memset( section, 0, sizeof(section) ); memset( value, 0, sizeof(value) ); memset( key, 0, sizeof(key) ); memset( line, 0, sizeof(line) ); } m_bParsed = TRUE; return 0; } /** ----------------------------------------------------------------------- \brief \param \return \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::getValue(LPCTSTR section, LPCTSTR key, LPCTSTR value, DWORD slen) { if ( 0 == m_sec.size() ) { return -1; } std::vector::iterator it = m_sec.begin(); for (it; it != m_sec.end(); it++) { PINI_SECTION ini_sec = &(*it); if ( 0 == _tcsicmp(ini_sec->name, section) ) { std::vector::iterator it_key = ini_sec->keys.begin(); for ( ; it_key != ini_sec->keys.end(); it_key++) { PKEYDATA ini_key = &(*it_key); if ( 0 == _tcsicmp(ini_key->key, key) ) { strncpy((LPTSTR)value, ini_key->value, slen); return 0; } } } } return -1; } /** ----------------------------------------------------------------------- \brief \param \return \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::putValue(LPCTSTR section, LPCTSTR key, LPCTSTR value) { if ( 0 == m_sec.size() ) { addNewSection( section ); addtoLastSection( key, value); return 0; } // MAX_LINEÀ» ³ÑÄ¡Áö ¾Ê°Ô Çϱâ À§Çؼ­ key, value ±æÀ̸¦ Á¶Àý // size_t valuelen; std::vector::iterator it = m_sec.begin(); for (it; it != m_sec.end(); it++) { PINI_SECTION ini_sec = &(*it); if ( 0 == _tcsicmp(ini_sec->name, section) ) { std::vector::iterator it_key = ini_sec->keys.begin(); for ( ; it_key != ini_sec->keys.end(); it_key++) { PKEYDATA ini_key = &(*it_key); // ±âÁ¸¿¡ key°¡ ÀÖ´Ù¸é ¼öÁ¤ ÇÔ // if ( 0 == _tcsicmp(ini_key->key, key) ) { valuelen = MAX_LINE - _tcslen(ini_key->key); strncpy(ini_key->value, value, valuelen); return 0; } } // key°¡ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é, »õ·Î¿î ۸¦ Ãß°¡ valuelen = MAX_LINE - _tcslen(key); KEYDATA keydata = {0}; strncpy(keydata.key, key, MAX_LINE); strncpy(keydata.value, value, valuelen); ini_sec->keys.push_back( keydata ); return 0; } } // sectionÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é, »õ·Î¿î ¼½¼Ç Ãß°¡ addNewSection( section ); addtoLastSection( key, value ); return 0; } /** ----------------------------------------------------------------------- \brief ¸Þ¸ð¸® INIÁ¤º¸¿¡ StringÁ¤º¸¸¦ °¡Á® ¿È \param \return \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::getString(LPCTSTR section, LPCTSTR key, LPTSTR pStr, DWORD slen) { _ASSERTE( NULL != section); _ASSERTE( NULL != key); _ASSERTE( NULL != pStr); _ASSERTE( 0 < slen); if ( NULL == section || NULL == key || NULL == pStr || 0 == slen ) { return -1; } //if ( !m_bParsed ) //{ // return -1; //} if ( 0 > getValue(section, key, pStr, slen) ) { return -1; } return 0; } /** ----------------------------------------------------------------------- \brief ¸Þ¸ð¸® INIÁ¤º¸¿¡ IntegerÁ¤º¸¸¦ °¡Á® ¿È \param \return \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::getInteger(LPCTSTR section, LPCTSTR key, LONG *pInt) { _ASSERTE( NULL != section); _ASSERTE( NULL != key); _ASSERTE( NULL != pInt); if ( NULL == section || NULL == key || NULL == pInt ) { return -1; } //if ( !m_bParsed ) //{ // return -1; //} TCHAR value[MAX_LINE] = {0,}; if ( 0 > getValue(section, key, value, MAX_LINE-1) ) { return -1; } *pInt = _tstoi(value); return 0; } /** ----------------------------------------------------------------------- \brief ¸Þ¸ð¸® INIÁ¤º¸¿¡ StringÁ¤º¸¸¦ Ãß°¡ ÇÔ \param \return \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::putString(LPCTSTR section, LPCTSTR key, LPCTSTR pStr) { _ASSERTE( NULL != section); _ASSERTE( NULL != key); _ASSERTE( NULL != pStr); if ( NULL == section || NULL == key || NULL == pStr ) { return -1; } //if ( !m_bParsed ) //{ // return -1; //} if ( 0 > putValue(section, key, pStr) ) { return -1; } return 0; } /** ----------------------------------------------------------------------- \brief ¸Þ¸ð¸® INIÁ¤º¸¿¡ IntegerÁ¤º¸¸¦ Ãß°¡ ÇÔ \param \return \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::putInteger(LPCTSTR section, LPCTSTR key, LONG value) { _ASSERTE( NULL != section); _ASSERTE( NULL != key); if ( NULL == section || NULL == key ) { return -1; } //if ( !m_bParsed ) //{ // return -1; //} TCHAR valstr[MAX_LINE] = {0,}; #if (_MSC_VER >= 1500) // vs2008 ÀÌ»ó sprintf_s(valstr, MAX_LINE, _T("%d"), value); #else StringCchPrintf(valstr, MAX_LINE, _T("%d"), value); #endif if ( 0 > putValue( section, key, valstr ) ) { return -1; } return 0; } int MemoryIni::dumpData() { if ( 0 == m_sec.size() ) { return -1; } // ¸Þ¸ð¸®ÇÒ´ç¿¡ ÇÊ¿äÇÑ ±æÀ̸¦ ±¸ÇÔ // ULONG tmp_size = MAX_LINE * 100; PBYTE tmp_data = (PBYTE) calloc( 1, tmp_size ); ULONG written_size = 0; if ( NULL == tmp_data ) { return -1; } TCHAR line[MAX_LINE] = {0}; std::vector::iterator it = m_sec.begin(); for (it; it != m_sec.end(); it++) { PINI_SECTION ini_sec = &(*it); #if (_MSC_VER >= 1500) // vs2008 ÀÌ»ó sprintf_s( line, MAX_LINE, _T("[%s]\r\n"), ini_sec->name ); #else StringCchPrintf( line, MAX_LINE, _T("[%s]\r\n"), ini_sec->name ); #endif // ¸Þ¸ð¸® ÇÒ´çÀÌ ½ÇÆÐÇÏ¸é ´õ¿í ´Ã·ÁÁØ´Ù if ( 0 > sputs( line, (LPTSTR)tmp_data, tmp_size ) ) { tmp_size = tmp_size * 3; tmp_data = (PBYTE) realloc(tmp_data, tmp_size); if ( NULL == tmp_data ) { free(tmp_data); tmp_data = NULL; return -1; } sputs( line, (LPTSTR)tmp_data, tmp_size ); } written_size = written_size + (_tcslen(line) * sizeof(TCHAR)); std::vector::iterator it_key = ini_sec->keys.begin(); for ( ; it_key != ini_sec->keys.end(); it_key++) { PKEYDATA ini_key = &(*it_key); #if (_MSC_VER >= 1500) // vs2008 ÀÌ»ó sprintf_s( line, MAX_LINE, _T("%s = %s\r\n"), ini_key->key, ini_key->value ); #else StringCchPrintf( line, MAX_LINE, _T("%s = %s\r\n"), ini_key->key, ini_key->value ); #endif // ¸Þ¸ð¸® ÇÒ´çÀÌ ½ÇÆÐÇÏ¸é ´õ¿í ´Ã·ÁÁØ´Ù if ( 0 > sputs( line, (LPTSTR)tmp_data, tmp_size ) ) { tmp_size = tmp_size * 3; tmp_data = (PBYTE) realloc(tmp_data, tmp_size); if ( NULL == tmp_data ) { free(tmp_data); tmp_data = NULL; return -1; } sputs( line, (LPTSTR)tmp_data, tmp_size ); } written_size = written_size + (_tcslen(line) * sizeof(TCHAR)); } } // m_data ¿ì¼± free½ÃÄÑ¾ß ÇÑ´Ù // if ( NULL != m_data ) { free( m_data ); } m_data = tmp_data; m_data_size = written_size; return 0; } int MemoryIni::sputs(LPCTSTR line, LPCTSTR data, ULONG datasz) { size_t linesz = _tcslen(line) * sizeof(TCHAR); size_t fillsz = _tcslen(data) * sizeof(TCHAR); size_t leftsz = datasz - fillsz; if ( leftsz <= linesz ) { return -1; } // dummy code if (FAILED(strcat((LPTSTR)data, line))) { return -1; } return 0; } /** ----------------------------------------------------------------------- \brief ¸Þ¸ð¸®ÀÇ INIÁ¤º¸¸¦ ÆÄÀÏ·Î ¾¸ \param \return \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::SaveToFile(LPCTSTR inifile, INI_CRYPT encrypt = NULL) { _ASSERTE( NULL != inifile); if ( NULL == inifile) return -1; // ÆÄÀÏ·Î ÀúÀåÇϱâ Àü¿¡ INIÇüÅ·Πµ¥ÀÌÅ͸¦ º¯È¯ ÇÔ // if ( 0 > dumpData() ) { return -1; } HANDLE hFile = CreateFile( inifile, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if ( INVALID_HANDLE_VALUE == hFile ) return -1; // ¾Ïȣȭ¸¦ ¿øÇÑ´Ù¸é ¾Ïȣȭ½ÃÄѼ­ ÀúÀå // int retval = 0; DWORD dwWritten = 0; if ( encrypt ) { PBYTE save_data = NULL; DWORD save_size = 0; if ( 0 != encrypt(m_data, m_data_size, &save_data, &save_size) ) { CloseHandle(hFile); return -1; } retval = WriteFile(hFile, save_data, save_size, &dwWritten, NULL); free(save_data); } else { retval = WriteFile(hFile, m_data, m_data_size, &dwWritten, NULL); } if ( 0 == retval ) { CloseHandle(hFile); return -1; } CloseHandle(hFile); return 0; } /** ----------------------------------------------------------------------- \brief INIÆÄÀÏÀ» ¸Þ¸ð¸®·Î ·ÎµåÇÔ \param \return \code \endcode -------------------------------------------------------------------------*/ int MemoryIni::LoadFromFile(LPCTSTR inifile, INI_CRYPT decrypt = NULL) { _ASSERTE( NULL != inifile); if ( NULL == inifile) return -1; HANDLE hFile = CreateFile( inifile, FILE_SHARE_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if ( INVALID_HANDLE_VALUE == hFile ) return -1; PBYTE load_data = NULL; DWORD load_size = 0; DWORD dwSizeLow = 0; DWORD dwSizeHigh = 0; dwSizeLow = GetFileSize(hFile, &dwSizeHigh); load_size = dwSizeHigh << 16 | dwSizeLow; HANDLE hMap = CreateFileMapping( hFile, NULL, PAGE_READONLY, 0, 0, NULL ); if ( INVALID_HANDLE_VALUE == hFile ) { CloseHandle(hFile); return -1; } PBYTE pMap = (PBYTE) MapViewOfFile( hMap, FILE_MAP_READ, 0, 0, 0 ); if ( NULL == pMap ) { CloseHandle(hMap); CloseHandle(hFile); return -1; } load_data = (PBYTE) calloc( 1, load_size ); if ( NULL == load_data ) { CloseHandle(hMap); CloseHandle(hFile); return -1; } RtlCopyMemory( load_data, pMap, load_size ); UnmapViewOfFile( pMap ); CloseHandle( hMap ); CloseHandle( hFile ); // ÀÌÀü¿¡ m_data°¡ ÀÖÀ¸¸é ¸Þ¸ð¸® ÇØÁ¦ // if ( NULL != m_data) { free(m_data); m_data = NULL; m_data_size = 0 ; } // ¾ÏȣȭµÈ ÆÄÀÏ¿¡ ´ëÇÑ º¹È£È­¸¦ ¿øÇÑ´Ù¸é // if ( decrypt ) { if ( 0 != decrypt(load_data, load_size, &m_data, &m_data_size) ) { free(load_data); return -1; } free(load_data); load_data = NULL; load_size = 0; } else { m_data = load_data; m_data_size = load_size; } // ·ÎµåµÈ INIµ¥ÀÌÅ͸¦ ÆÄ½ÌÇÑ´Ù // parseData(); return 0; }