GlobalReAlloc

Тема в разделе "WASM.BEGINNERS", создана пользователем el-, 14 сен 2006.

  1. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    вобщем вызываю сабж и он возвращает ошибку, что мол мало памяти ... но прикол в том, что в ollydbg все нормально проходит ... сначало было подумал, что мб нужны отладочные привелегие ... но как оказалось нифига ... вобщем разъясните мне, где грабли
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    el-
    Надо проверить параметры этой функции в отладчике.

    Экстрасенсы в отпуске.
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    :) Гениально! :)
     
  4. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    >> Надо проверить параметры этой функции в отладчике.
    ты или не хочешь думать или не умешь, в отладчике все работает ... если не веришь олли ... вот смотри код

    Код (Text):
    1. char *pszBuf = ( char * )GlobalAlloc( GPTR, dwMemSize );
    2. if ( pszBuf)
    3. {
    4.    // ...
    5.   if ( GlobalReAlloc( pConfig, dwMemSize, GPTR ) )
    6.   {
    7.      // ...
    8.   } // end if
    9.    // ...
    10.    GlobalFree( pszBuf );
    11. } // end if
    >> Экстрасенсы в отпуске.
    остаряк блин, с тобой прямо не соскучиешься ...

    кроме глумежа и оффтопов, мысли реальные будут ?
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Экстрасенсы действительно в отпуске ;)
    Выделяешь pszBuf, а реаллок делаешь для pConfig - вот и пойми
     
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    leo
    Им зарплату не выдают уже который год, а ты про отпуск! :)
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    leo
    Сомневаюсь, что поймёт. Нужно чтобы в Оле перестало работать, чтобы топикстартер усомнился в безглючности своего кода.
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ну тогда ему следует заглянуть в топик На что влияет NtGlobalFlag, чтобы
    1) понять, что под Олей куча работает в особом отладочном режиме, поэтому многие ошибки при работе с кучей проявляются по разному при отладке и без нее
    2) скачать последнюю версию плагина HideDebugger by Asterix и посмотреть как поведет себя Оля, если включить все опции или хотя бы последнюю (что-то типа Heap tricks - точно не помню ;)
     
  9. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    >>Экстрасенсы действительно в отпуске ;)
    >>Выделяешь pszBuf, а реаллок делаешь для pConfig - вот и пойми

    блин ничайно накосячил ... конечно же там GlobalReAlloc( pszBuf, dwMemSize, GPTR ) )

    >>Сомневаюсь, что поймёт. Нужно чтобы в Оле перестало работать, чтобы топикстартер
    >>усомнился в безглючности своего кода.

    об стену с разбега убейся ... мозг всех епть времен и народов ...


    ладно спасибо за первую более или менее конкретную инфу ... только одно не понятно ... если куча работает в спец отладочном режиме, что мне то делать ... как заставить GlobalReAlloc выделять доп. память ... ?
     
  10. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    el-

    бычара, да простят меня модеры за эмоции, лучше бы спасибо сказал, за то, что тебе вообще внимание уделили
     
  11. tmp_name_0001

    tmp_name_0001 New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    85
    вот и на васме начали такие появляться ... =(
     
  12. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    >>вот и на васме начали такие появляться ... =(

    ничего подобного, я не такой я хуже (: а вабще Quantum просто о себе мнения слишком высокого ... вот и не сдержался ...

    >>бычара, да простят меня модеры за эмоции, лучше бы
    >>спасибо сказал, за то, что тебе вообще внимание уделили

    слыш овечка, мне время уделил из всего поста только leo ... который по теме сказал .. остальные же мастера и войны дзена я так понял могут только тупо глумится ... ибо или нихера не знают или мб не могут снезайти до простых смертных ... да и вабще многоуважаемый defaultplayer вы какого ... так сказать ... влезли если по топику ничего сказать не можете ...
     
  13. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    el-

    если бы мне посчастливилась такая возможность встретить тебя, я бы за эти слова, вырвал тебе глотку, помочился в образовавшееся отверстие, снял с живого скальп, засунул все это в задницу, потом вымазал в смолу, обвалял в перьях и посадил на шест и сказал что ты таким уже родился (с) masquer

    такому бычаре как ты, я вообще никогда ниче не отвечу
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    el-
    Если ты хочешь разобраться в проблеме, а не разводить тут флуд на грани фола, то подумай как тебе могут помочь, если ты сам кроме общих слов еще ничего конкретно не сказал. У тебя сабж возвращает ошибку, а у меня не возвращает, и Quantum'а не возвращает и наш опыт "сын ошибок трудных" подсказывает, что дело скорее всего может быть в каком-то элементарном косяке с указателем или размером. А ты вместо того, чтобы выложить нормальный кусок кода, приводишь какие-то бестолковые обгрызки, да еще и сам огрызаешься ;) Хочешь разобраться - давай конкретнее, не хочешь - до свидания ;)
     
  15. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    вобщем ладно ... давай те помогите на конкретном примере ... вот код, в нем два вызова GlobalReAlloc и не один из них не работает ( во всяком случае у меня ) о чем свидетельствуют MessageBox'ы ... вобщем укажите мне на косяк ...


    Код (Text):
    1. typedef struct _keys
    2. {
    3.  char    *pszKeyName;
    4.  char    *pszKeyVal;
    5. } KEYS, *PKEYS;
    6.  
    7. typedef struct _sections
    8. {
    9.  char    *pszSectionName;
    10.  struct _keys  *pKeys;
    11. } SECTIONS, *PSECTIONS;
    12.  
    13. typedef struct _config
    14. {
    15.  char    *pszCfgPath;
    16.  char    *pszSections;
    17.  char    *pszKeys;
    18.  struct _sections *pSections;
    19. } CONFIG, *PCONFIG;
    20.  
    21. #pragma comment( linker, "/RELEASE" )
    22. #pragma comment( linker, "/ENTRY:WinMain" )
    23. #pragma comment( linker, "/MERGE:.rdata=.data" )
    24. #pragma comment( linker, "/MERGE:.text=.data" )
    25. #pragma comment( linker, "/MERGE:.reloc=.data" )
    26. #pragma comment( linker, "/SECTION:.text,EWRX" )
    27. #pragma comment( linker, "/IGNORE:4078" )
    28. #pragma comment( linker, "/FILEALIGN:0x200" )
    29. #pragma comment( linker, "/SUBSYSTEM:WINDOWS" )
    30. #pragma comment( lib, "kernel32" )
    31. #pragma comment( lib, "user32" )
    32.  
    33.  
    34. #include < windows.h >
    35.  
    36. #define dw DWORD
    37.  
    38. #include "el-strings.hpp"
    39.  
    40. /*
    41. ================
    42. Cfg_LoadConfig
    43. ================
    44. */
    45. int
    46. APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
    47. {
    48.  HANDLE hCfg;
    49.  dw dwRet;
    50.  dw dwSize;
    51.  dw dwMemSize;
    52.  dw nNumSection;
    53.  dw nNumKey;
    54.  dw dwTemp;
    55.  char *pszSections;
    56.  char *pszKeys;
    57.  char *pszVals;
    58.  PCONFIG pConfig;
    59.  PSECTIONS pSections;
    60.  PKEYS pKeys;
    61.  char pszPathCfg[ ] = "C:\\_123\\el-brute-maggot\\el-brute-maggot-v0.02\\core\\maggot.cfg";
    62.  if ( *pszPathCfg )
    63.  {
    64.   if ( ( hCfg = CreateFile( pszPathCfg,
    65.      GENERIC_READ,
    66.      FILE_SHARE_READ,
    67.      NULL,
    68.      OPEN_EXISTING,
    69.      FILE_ATTRIBUTE_NORMAL,
    70.      NULL ) ) != INVALID_HANDLE_VALUE )
    71.      {
    72.       dwSize = GetFileSize( hCfg, NULL );
    73.       CloseHandle( hCfg );
    74.       dwMemSize = sizeof( CONFIG ) + dwSize + 4;
    75.       pConfig = ( PCONFIG )GlobalAlloc( GPTR, dwMemSize );
    76.       if ( pConfig )
    77.       {
    78.        pConfig -> pszCfgPath = pszPathCfg;
    79.        pszSections = pConfig -> pszSections = ( char * )pConfig + sizeof( CONFIG );
    80.        dw dwTemp = GetPrivateProfileSectionNames( pConfig -> pszSections, dwSize, pszPathCfg );
    81.        pszKeys = pConfig -> pszKeys = pszSections + dwTemp + 1;
    82.        dwTemp = ( dw )pConfig + dwMemSize;
    83.        pSections = pConfig -> pSections = ( PSECTIONS )dwTemp;
    84.        dwMemSize += sizeof( SECTIONS );
    85.        nNumSection = 0;
    86.        do
    87.        {
    88.         dwMemSize += sizeof( SECTIONS );
    89.         if ( GlobalReAlloc( pConfig, dwMemSize, GPTR ) )
    90.         {
    91.          pSections[ nNumSection ].pszSectionName = pszSections;
    92.         } // end if
    93.         else
    94.         {
    95.          MessageBox( NULL, "fuck1", "fuck1", MB_OK );
    96.          ExitProcess( 0 );
    97.         }
    98.         nNumSection ++;
    99.        }
    100.        while ( ( pszSections = elnextstr( pszSections ) ) ); // end do
    101.        nNumSection = 0;
    102.        while( pSections[ nNumSection ].pszSectionName )
    103.        {
    104.         if ( ( dwRet = GetPrivateProfileSection(
    105.           pSections[ nNumSection ].pszSectionName,
    106.           pszKeys, dwSize, pszPathCfg ) ) )
    107.         {
    108.          nNumKey = 0;
    109.          dwMemSize += sizeof( KEYS );
    110.          dwTemp = ( dw )pConfig + dwMemSize - sizeof( KEYS );
    111.          pKeys = pSections[ nNumSection ].pKeys = ( PKEYS )dwTemp;
    112.          do
    113.          {
    114.           dwMemSize += sizeof( KEYS );
    115.           if ( GlobalReAlloc( pConfig, dwMemSize, GPTR ) )
    116.           {
    117.            pKeys[ nNumKey ].pszKeyName = pszKeys;
    118.            while ( *pszKeys != '=' )
    119.            {
    120.             pszKeys ++;
    121.            } // end while
    122.            *pszKeys = '\0';
    123.            pszKeys ++;
    124.            pKeys[ nNumKey ].pszKeyVal = pszKeys;
    125.           } // end if
    126.           else
    127.           {
    128.            MessageBox( NULL, "fuck2", "fuck2", MB_OK );
    129.            ExitProcess( 0 );
    130.           }
    131.           nNumKey ++;
    132.           pszKeys += elstrlen( pszKeys ) + 1;
    133.          }
    134.          while ( *pszKeys ); // end do
    135.          pszKeys ++;
    136.         } // end if
    137.         nNumSection ++;
    138.        } // end while
    139.       } // end if
    140.       MessageBox( NULL, "ok", "ok", MB_OK );
    141.       return ( int )pConfig;
    142.      } // end if
    143.  } // end if
    144.  return NULL;
    145. }
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    el-
    Указываю ;)
    GlobalRealloc возвращает указатель на реаллоцированный блок, который ты почему-то игнорируешь. Видимо наивно полагаешь, что pConfig при Realloc не изменится, хотя этого никто гарантировать не может. А если изменяется pConfig, то и все прочие связанные с ним указатели становятся инвалидными.
    Придется тебе батенька все заново продумывать - или на VirtualAlloc переходить или вместо указателей использовать смещения от начала pConfig
     
  17. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    >> Указываю ;)
    имхо пальцем в небо ...

    >> GlobalRealloc возвращает указатель на реаллоцированный блок, который ты почему-то
    >> игнорируешь. Видимо наивно полагаешь, что pConfig при Realloc не изменится, хотя
    >> этого никто гарантировать не может. А если изменяется pConfig, то и все прочие
    >> связанные с ним указатели становятся инвалидными.
    вы многоуважаемый не поняли кода ... вот вырезка по GlobalReAlloc

    If the function succeeds, the return value is the handle of the reallocated memory object.
    If the function fails, the return value is NULL. To get extended error information, call GetLastError.

    как думаете для чего я делал следующию проверку ...

    Код (Text):
    1. if ( GlobalReAlloc( pConfig, dwMemSize, GPTR ) )
    2. {
    3.   // ...
    4. }
    если функция возвращает не ноль ... то ...
    а т.к. у меня GlobalReAlloc возвращает NULL собственно и вылетает MessageBox ... для наглядности ...

    заменим первый вызов GlobalReAlloc c
    Код (Text):
    1.         dwMemSize += sizeof( SECTIONS );
    2.         if ( GlobalReAlloc( pConfig, dwMemSize, GPTR ) )
    3.         {
    4.          pSections[ nNumSection ].pszSectionName = pszSections;
    5.         } // end if
    6.         else
    7.         {
    8.          MessageBox( NULL, "fuck1", "fuck1", MB_OK );
    9.          ExitProcess( 0 );
    10.         }
    на
    Код (Text):
    1.  dwMemSize += sizeof( SECTIONS );
    2.  dw dwTestDword;
    3.  if ( ( dwTestDword = ( DWORD )GlobalReAlloc( pConfig, dwMemSize, GPTR ) ) )
    4.  {
    5.   pSections[ nNumSection ].pszSectionName = pszSections;
    6.  } // end if
    7.  else
    8.  {
    9.   char sztmp[ 256 ];
    10.   wsprintf( sztmp, "eax: %.8x\nGetLastError:%d", dwTestDword, GetLastError( ) );
    11.   MessageBox( NULL, sztmp, "fuck1", MB_OK );
    12.   ExitProcess( 0 );
    13.  }
    и о чудо, что за мессагу я вижу ...
    eax: 00000000
    GetLastError:8 ( что есть ни что иное как ERROR_NOT_ENOUGH_MEMORY )

    leo
    ты наивно пологаешь, что перед тем как запостить свой вопрос, я не проверил все что только смог ...? а вабще меня интересует вот еще что, ты говорил что куча в отладчиках, как то хитро настроена ... могу ли я повторить это в своей проги и не мучится ? если да, можно увидить сей волшебный код ...
     
  18. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    el-
    Опять ты за свое :dntknw:
    Ты читать, то умеешь или нет: the return value is the handle of the reallocated memory object, т.е. нужно делать так
    Код (Text):
    1. pConfig1 = (PCONFIG) GlobalRealloc(pConfig,dwMemSize, GPTR )
    2. if pConfig1
    3. { if pComfig1 != pConfig  //!!! произошла реаллокация блока на новое место
    4.   { //тут нужно вычислить разницу delta = pConfig1 - pConfig
    5.      //и скорректировать все указатели pSections += delta и т.д.
    6.     ...
    7.     pConfig = pConfig1
    8.   }
    9.   ...
    10. }
    11. else
    12.   //error
    И pSections = pConfig -> pSections = ( PSECTIONS )dwTemp ты устанавливаешь еще до Realloc в надежде, что pConfig не изменится. Неправильно все это, сделай сначала по человечески, потом посмотрим ;)
     
  19. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    leo
    (шёпотом) не трать на него своё время - пациент страдает патологической нехваткой разума.
     
  20. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    мб я внатуре тугой, но хоть убей я не могу понять каким образо я расчитаю дельту если GlobalReAlloc возвращет NULL ... т.е. реллокации не происходит вовсе ...

    Код (Text):
    1. pConfig1 = (PCONFIG) GlobalRealloc(pConfig,dwMemSize, GPTR )
    2. if pConfig1
    3. {
    4.   // у меня до всего этого не доходит ...
    5.   // pConfig1 = NULL а GetLastError = 8
    6.   // каким макаром я из этого дельту получю ..
    7. }
    8. else
    9.   //error
    у меня проблема не в расчете новых смещений а вот в чем
    If the function fails, the return value is NULL. To get extended error information, call GetLastError. и я фиг могу понять почему ...

    зы.: мб я все не правильно понимаю ... в функцию передается сначало хендл уже выделенной памяти, потом желаемый размер, потом флаг ( в данный момент GPTR ) ... а возвращает она новый хендл ( ака указатель на новый блок ) или ноль когда нифига не получилось и произошла ошибка ...

    update:
    все я одуплил ... дело совсем не в делта смещение ( хотя его конечно придется считать ), а в том, что GPTR не что иное как GMEM_FIXED | GMEM_ZEROINT ... т.е. память выделяется фиксированного размера и забивается нулями ... надо просто использовать GHND, где вместо GMEM_FIXED, GMEM_MOVEABLE ...

    единственное что хотелось бы узнать ... это про настройки кучи в отладчиках и реализацию этого метода ...