вобщем вызываю сабж и он возвращает ошибку, что мол мало памяти ... но прикол в том, что в ollydbg все нормально проходит ... сначало было подумал, что мб нужны отладочные привелегие ... но как оказалось нифига ... вобщем разъясните мне, где грабли
>> Надо проверить параметры этой функции в отладчике. ты или не хочешь думать или не умешь, в отладчике все работает ... если не веришь олли ... вот смотри код Код (Text): char *pszBuf = ( char * )GlobalAlloc( GPTR, dwMemSize ); if ( pszBuf) { // ... if ( GlobalReAlloc( pConfig, dwMemSize, GPTR ) ) { // ... } // end if // ... GlobalFree( pszBuf ); } // end if >> Экстрасенсы в отпуске. остаряк блин, с тобой прямо не соскучиешься ... кроме глумежа и оффтопов, мысли реальные будут ?
leo Сомневаюсь, что поймёт. Нужно чтобы в Оле перестало работать, чтобы топикстартер усомнился в безглючности своего кода.
Ну тогда ему следует заглянуть в топик На что влияет NtGlobalFlag, чтобы 1) понять, что под Олей куча работает в особом отладочном режиме, поэтому многие ошибки при работе с кучей проявляются по разному при отладке и без нее 2) скачать последнюю версию плагина HideDebugger by Asterix и посмотреть как поведет себя Оля, если включить все опции или хотя бы последнюю (что-то типа Heap tricks - точно не помню
>>Экстрасенсы действительно в отпуске >>Выделяешь pszBuf, а реаллок делаешь для pConfig - вот и пойми блин ничайно накосячил ... конечно же там GlobalReAlloc( pszBuf, dwMemSize, GPTR ) ) >>Сомневаюсь, что поймёт. Нужно чтобы в Оле перестало работать, чтобы топикстартер >>усомнился в безглючности своего кода. об стену с разбега убейся ... мозг всех епть времен и народов ... ладно спасибо за первую более или менее конкретную инфу ... только одно не понятно ... если куча работает в спец отладочном режиме, что мне то делать ... как заставить GlobalReAlloc выделять доп. память ... ?
el- бычара, да простят меня модеры за эмоции, лучше бы спасибо сказал, за то, что тебе вообще внимание уделили
>>вот и на васме начали такие появляться ... =( ничего подобного, я не такой я хуже (: а вабще Quantum просто о себе мнения слишком высокого ... вот и не сдержался ... >>бычара, да простят меня модеры за эмоции, лучше бы >>спасибо сказал, за то, что тебе вообще внимание уделили слыш овечка, мне время уделил из всего поста только leo ... который по теме сказал .. остальные же мастера и войны дзена я так понял могут только тупо глумится ... ибо или нихера не знают или мб не могут снезайти до простых смертных ... да и вабще многоуважаемый defaultplayer вы какого ... так сказать ... влезли если по топику ничего сказать не можете ...
el- если бы мне посчастливилась такая возможность встретить тебя, я бы за эти слова, вырвал тебе глотку, помочился в образовавшееся отверстие, снял с живого скальп, засунул все это в задницу, потом вымазал в смолу, обвалял в перьях и посадил на шест и сказал что ты таким уже родился (с) masquer такому бычаре как ты, я вообще никогда ниче не отвечу
el- Если ты хочешь разобраться в проблеме, а не разводить тут флуд на грани фола, то подумай как тебе могут помочь, если ты сам кроме общих слов еще ничего конкретно не сказал. У тебя сабж возвращает ошибку, а у меня не возвращает, и Quantum'а не возвращает и наш опыт "сын ошибок трудных" подсказывает, что дело скорее всего может быть в каком-то элементарном косяке с указателем или размером. А ты вместо того, чтобы выложить нормальный кусок кода, приводишь какие-то бестолковые обгрызки, да еще и сам огрызаешься Хочешь разобраться - давай конкретнее, не хочешь - до свидания
вобщем ладно ... давай те помогите на конкретном примере ... вот код, в нем два вызова GlobalReAlloc и не один из них не работает ( во всяком случае у меня ) о чем свидетельствуют MessageBox'ы ... вобщем укажите мне на косяк ... Код (Text): typedef struct _keys { char *pszKeyName; char *pszKeyVal; } KEYS, *PKEYS; typedef struct _sections { char *pszSectionName; struct _keys *pKeys; } SECTIONS, *PSECTIONS; typedef struct _config { char *pszCfgPath; char *pszSections; char *pszKeys; struct _sections *pSections; } CONFIG, *PCONFIG; #pragma comment( linker, "/RELEASE" ) #pragma comment( linker, "/ENTRY:WinMain" ) #pragma comment( linker, "/MERGE:.rdata=.data" ) #pragma comment( linker, "/MERGE:.text=.data" ) #pragma comment( linker, "/MERGE:.reloc=.data" ) #pragma comment( linker, "/SECTION:.text,EWRX" ) #pragma comment( linker, "/IGNORE:4078" ) #pragma comment( linker, "/FILEALIGN:0x200" ) #pragma comment( linker, "/SUBSYSTEM:WINDOWS" ) #pragma comment( lib, "kernel32" ) #pragma comment( lib, "user32" ) #include < windows.h > #define dw DWORD #include "el-strings.hpp" /* ================ Cfg_LoadConfig ================ */ int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { HANDLE hCfg; dw dwRet; dw dwSize; dw dwMemSize; dw nNumSection; dw nNumKey; dw dwTemp; char *pszSections; char *pszKeys; char *pszVals; PCONFIG pConfig; PSECTIONS pSections; PKEYS pKeys; char pszPathCfg[ ] = "C:\\_123\\el-brute-maggot\\el-brute-maggot-v0.02\\core\\maggot.cfg"; if ( *pszPathCfg ) { if ( ( hCfg = CreateFile( pszPathCfg, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ) != INVALID_HANDLE_VALUE ) { dwSize = GetFileSize( hCfg, NULL ); CloseHandle( hCfg ); dwMemSize = sizeof( CONFIG ) + dwSize + 4; pConfig = ( PCONFIG )GlobalAlloc( GPTR, dwMemSize ); if ( pConfig ) { pConfig -> pszCfgPath = pszPathCfg; pszSections = pConfig -> pszSections = ( char * )pConfig + sizeof( CONFIG ); dw dwTemp = GetPrivateProfileSectionNames( pConfig -> pszSections, dwSize, pszPathCfg ); pszKeys = pConfig -> pszKeys = pszSections + dwTemp + 1; dwTemp = ( dw )pConfig + dwMemSize; pSections = pConfig -> pSections = ( PSECTIONS )dwTemp; dwMemSize += sizeof( SECTIONS ); nNumSection = 0; do { dwMemSize += sizeof( SECTIONS ); if ( GlobalReAlloc( pConfig, dwMemSize, GPTR ) ) { pSections[ nNumSection ].pszSectionName = pszSections; } // end if else { MessageBox( NULL, "fuck1", "fuck1", MB_OK ); ExitProcess( 0 ); } nNumSection ++; } while ( ( pszSections = elnextstr( pszSections ) ) ); // end do nNumSection = 0; while( pSections[ nNumSection ].pszSectionName ) { if ( ( dwRet = GetPrivateProfileSection( pSections[ nNumSection ].pszSectionName, pszKeys, dwSize, pszPathCfg ) ) ) { nNumKey = 0; dwMemSize += sizeof( KEYS ); dwTemp = ( dw )pConfig + dwMemSize - sizeof( KEYS ); pKeys = pSections[ nNumSection ].pKeys = ( PKEYS )dwTemp; do { dwMemSize += sizeof( KEYS ); if ( GlobalReAlloc( pConfig, dwMemSize, GPTR ) ) { pKeys[ nNumKey ].pszKeyName = pszKeys; while ( *pszKeys != '=' ) { pszKeys ++; } // end while *pszKeys = '\0'; pszKeys ++; pKeys[ nNumKey ].pszKeyVal = pszKeys; } // end if else { MessageBox( NULL, "fuck2", "fuck2", MB_OK ); ExitProcess( 0 ); } nNumKey ++; pszKeys += elstrlen( pszKeys ) + 1; } while ( *pszKeys ); // end do pszKeys ++; } // end if nNumSection ++; } // end while } // end if MessageBox( NULL, "ok", "ok", MB_OK ); return ( int )pConfig; } // end if } // end if return NULL; }
el- Указываю GlobalRealloc возвращает указатель на реаллоцированный блок, который ты почему-то игнорируешь. Видимо наивно полагаешь, что pConfig при Realloc не изменится, хотя этого никто гарантировать не может. А если изменяется pConfig, то и все прочие связанные с ним указатели становятся инвалидными. Придется тебе батенька все заново продумывать - или на VirtualAlloc переходить или вместо указателей использовать смещения от начала pConfig
>> Указываю имхо пальцем в небо ... >> 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): if ( GlobalReAlloc( pConfig, dwMemSize, GPTR ) ) { // ... } если функция возвращает не ноль ... то ... а т.к. у меня GlobalReAlloc возвращает NULL собственно и вылетает MessageBox ... для наглядности ... заменим первый вызов GlobalReAlloc c Код (Text): dwMemSize += sizeof( SECTIONS ); if ( GlobalReAlloc( pConfig, dwMemSize, GPTR ) ) { pSections[ nNumSection ].pszSectionName = pszSections; } // end if else { MessageBox( NULL, "fuck1", "fuck1", MB_OK ); ExitProcess( 0 ); } на Код (Text): dwMemSize += sizeof( SECTIONS ); dw dwTestDword; if ( ( dwTestDword = ( DWORD )GlobalReAlloc( pConfig, dwMemSize, GPTR ) ) ) { pSections[ nNumSection ].pszSectionName = pszSections; } // end if else { char sztmp[ 256 ]; wsprintf( sztmp, "eax: %.8x\nGetLastError:%d", dwTestDword, GetLastError( ) ); MessageBox( NULL, sztmp, "fuck1", MB_OK ); ExitProcess( 0 ); } и о чудо, что за мессагу я вижу ... eax: 00000000 GetLastError:8 ( что есть ни что иное как ERROR_NOT_ENOUGH_MEMORY ) leo ты наивно пологаешь, что перед тем как запостить свой вопрос, я не проверил все что только смог ...? а вабще меня интересует вот еще что, ты говорил что куча в отладчиках, как то хитро настроена ... могу ли я повторить это в своей проги и не мучится ? если да, можно увидить сей волшебный код ...
el- Опять ты за свое Ты читать, то умеешь или нет: the return value is the handle of the reallocated memory object, т.е. нужно делать так Код (Text): pConfig1 = (PCONFIG) GlobalRealloc(pConfig,dwMemSize, GPTR ) if pConfig1 { if pComfig1 != pConfig //!!! произошла реаллокация блока на новое место { //тут нужно вычислить разницу delta = pConfig1 - pConfig //и скорректировать все указатели pSections += delta и т.д. ... pConfig = pConfig1 } ... } else //error И pSections = pConfig -> pSections = ( PSECTIONS )dwTemp ты устанавливаешь еще до Realloc в надежде, что pConfig не изменится. Неправильно все это, сделай сначала по человечески, потом посмотрим
мб я внатуре тугой, но хоть убей я не могу понять каким образо я расчитаю дельту если GlobalReAlloc возвращет NULL ... т.е. реллокации не происходит вовсе ... Код (Text): pConfig1 = (PCONFIG) GlobalRealloc(pConfig,dwMemSize, GPTR ) if pConfig1 { // у меня до всего этого не доходит ... // pConfig1 = NULL а GetLastError = 8 // каким макаром я из этого дельту получю .. } else //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 ... единственное что хотелось бы узнать ... это про настройки кучи в отладчиках и реализацию этого метода ...