Ist dieser Code gut?
-
Hey,
ich habe diesen Code hier gefunden, welcher die Größe eines Modules bzw. einer DLL zurückgeben sollte. Ich brauch diese, um nach einem Pattern in einem Module zu suchen. Sieht zwar gut aus, aber jemand sagte, dass dieser Code falsche Werte liefern könnte. Ist das blödsinn?DWORD GetModuleSize( char* szModuleName ) { HANDLE hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, 0 ); MODULEENTRY32 mModule32 = { sizeof( MODULEENTRY32 ) }; if( Module32First( hSnapShot, &mModule32 ) ) { BOOL meNext = Module32First( hSnapShot, &mModule32 ); while( meNext ) { if( !_stricmp( mModule32.szModule, szModuleName ) ) { CloseHandle ( hSnapShot ); return mModule32.modBaseSize; } meNext = Module32Next( hSnapShot, &mModule32 ); } } CloseHandle( hSnapShot ); return 0; }
-
Du könntest die Funktionsnamen nehmen und auf der MSDN nachschauen. Vielleicht steht dort etwas zu diesem Fall. Du könntest es aber auch einfach testen.
Aber ganz nebenbei, bei den ersten beiden Variablen wird das Rückgabe Ergebnis garnicht geprüft und verlässt sich darauf das Module32First() das handelt. Ich hab mir die jetzt nicht angeschaut aber das solltest du dann mal machen. Quelltexte aus dem Internet sind wie Bonbons von netten Onkeln, man sollte denen nicht einfach so vertrauen.
-
Dann teste noch die Variable szModuleName gegen einen Null-Pointer. Das wird da zur Zeit nicht gemacht. Und wenn geht, nehme da einen std::string und hole dir den Const-Char-Pointer per c_str() ala:
DWORD GetModuleSize( const std::string &ModuleName ) { HANDLE hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, 0 ); if ( !hSnapShot ) return 1; MODULEENTRY32 mModule32 = { sizeof( MODULEENTRY32 ) }; if( Module32First( hSnapShot, &mModule32 ) ) { BOOL meNext = Module32First( hSnapShot, &mModule32 ); while( meNext ) { if( !_stricmp( mModule32.szModule, ModuleName.c_str() ) ) { CloseHandle ( hSnapShot ); return mModule32.modBaseSize; } meNext = Module32Next( hSnapShot, &mModule32 ); } } CloseHandle( hSnapShot ); return 0; }Funktion würde ich auch mal gegenlesen mittels MSDN!
Gruß Kimmi
-
Warum wird Module32First eigentlich zweimal aufgerufen? Den zweiten Aufruf könnte man durch
BOOL meNext = TRUE;ersetzen.