Viendo el codigo de The Swash re-arme el codigo de una forma mas limpia y evitando errores a toda costa, inclusive ante los archivos incompletos mas que nada, o que los imiten de alguna manera, pero no al 100%.
Código: Seleccionar todo
unsigned long long GetPeSize(const char *fPath)
/** Retorna el Byte donde termina TODOS los bytes de un Ejecutable en formato PE **/
{ /* By BlackZerox ( http://Infrangelux.sytes.net/ ) */
IMAGE_DOS_HEADER v_idh;
IMAGE_NT_HEADERS v_inh;
IMAGE_SECTION_HEADER v_ish;
FILE *v_pFile;
unsigned long long v_ullTemp = 0;
if ( (v_pFile = fopen(fPath,"r")) != NULL)
{
fseek(v_pFile, 0, SEEK_SET);
if ( fread(&v_idh, 1, sizeof(IMAGE_DOS_HEADER) , v_pFile) == sizeof(IMAGE_DOS_HEADER ))/* ¿leimos lo desedo? [se evitan errores estupidos]*/
if (v_idh.e_magic == IMAGE_DOS_SIGNATURE)/* ¿Es PEFormat? */
if ( fseek(v_pFile, v_idh.e_lfanew, SEEK_SET) == 0 )/* [se evitan errores estupidos] */
if ( fread(&v_inh, 1 , sizeof(IMAGE_NT_HEADERS), v_pFile) == sizeof(IMAGE_NT_HEADERS) )/* ¿leimos lo desedo? [se evitan errores estupidos] */
if (v_inh.Signature == IMAGE_NT_SIGNATURE)/* ¿Es PEFormat? */
if ( v_inh.FileHeader.NumberOfSections > 0 )/* [se evitan errores estupidos] */
v_ullTemp = v_idh.e_lfanew + sizeof(IMAGE_NT_HEADERS) + ((v_inh.FileHeader.NumberOfSections-1)*sizeof(IMAGE_SECTION_HEADER));
if ( fseek(v_pFile, v_ullTemp , SEEK_SET) == 0 )/* [se evitan errores estupidos] */
if ( sizeof(IMAGE_SECTION_HEADER) == fread(&v_ish, 1 , sizeof(IMAGE_SECTION_HEADER) , v_pFile))/* ¿leimos lo desedo? [se evitan errores estupidos] */
v_ullTemp = v_ish.SizeOfRawData + v_ish.PointerToRawData;
fclose(v_pFile);
}
return v_ullTemp;
}
Código: Seleccionar todo
unsigned long long GetPeSize(const char *fPath)
/** Retorna el Byte donde termina TODOS los bytes de un Ejecutable en formato PE **/
{ /* By BlackZerox ( http://Infrangelux.sytes.net/ ) */
IMAGE_DOS_HEADER v_idh;
IMAGE_NT_HEADERS v_inh;
IMAGE_SECTION_HEADER v_ish;
FILE *v_pFile;
unsigned long long v_ullTemp = 0;
if ( (v_pFile = fopen(fPath,"r")) != NULL)
{
fseek(v_pFile, 0, SEEK_SET);
if ( fread(&v_idh, 1, sizeof(IMAGE_DOS_HEADER) , v_pFile) == sizeof(IMAGE_DOS_HEADER ))
{/* ¿leimos lo desedo? [se evitan errores estupidos]*/
if (v_idh.e_magic == IMAGE_DOS_SIGNATURE)
{/* ¿Es PEFormat? */
if ( fseek(v_pFile, v_idh.e_lfanew, SEEK_SET) == 0 )
{/* [se evitan errores estupidos] */
if ( fread(&v_inh, 1 , sizeof(IMAGE_NT_HEADERS), v_pFile) == sizeof(IMAGE_NT_HEADERS) )
{/* ¿leimos lo desedo? [se evitan errores estupidos] */
if (v_inh.Signature == IMAGE_NT_SIGNATURE)
{/* ¿Es PEFormat? */
if ( v_inh.FileHeader.NumberOfSections > 0 )
{/* [se evitan errores estupidos] */
v_ullTemp = v_idh.e_lfanew + sizeof(IMAGE_NT_HEADERS) + ((v_inh.FileHeader.NumberOfSections-1)*sizeof(IMAGE_SECTION_HEADER));
if ( fseek(v_pFile, v_ullTemp , SEEK_SET) == 0 )
{/* [se evitan errores estupidos] */
if ( sizeof(IMAGE_SECTION_HEADER) == fread(&v_ish, 1 , sizeof(IMAGE_SECTION_HEADER) , v_pFile))
{/* ¿leimos lo desedo? [se evitan errores estupidos] */
v_ullTemp = v_ish.SizeOfRawData + v_ish.PointerToRawData;
}
}
}
}
}
}
}
}
fclose(v_pFile);
}
return v_ullTemp;
}
.