begin process at 2012 05 27 15:06:33
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > CPUID : DES INFORMATIONS SUR VOTRE PROCESSEUR (INTEL ET AMD)

CPUID : DES INFORMATIONS SUR VOTRE PROCESSEUR (INTEL ET AMD)


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Système Niveau :Initié Date de création :21/08/2004 Date de mise à jour :23/08/2004 11:29:20 Vu / téléchargé :8 899 / 567

Auteur : ShareVB

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Ce code permet gràce à l'instruction ASM CPUID de déterminer le type de processeur, sa description et diverses informations sur ses caches,...

Ce code est aussi la base de ma source CPUID (la dll) sur vbfrance.com

Pour avoir un aperçu de la sortie de cpuid, regarder la capture

Testé avec un AMD sur 98/XP

Source

  • //ce code n'est pas la totalité de la source
  • // ProcessorInfo.cpp : définit le point d'entrée pour l'application DLL.
  • //
  • //#include "stdio.h"
  • #include "ProcessorInfo.h"
  • //Teste si CPUID est présent
  • BOOL WINAPI IsCPUIDAvailable()
  • {
  • //premiere méthode
  • /*__asm {
  • PUSH EBX
  • PUSHFD
  • POP EAX
  • MOV EBX,EAX
  • XOR EAX,0x00200000
  • PUSH EAX
  • POPFD
  • PUSHFD
  • POP EAX
  • CMP EAX,EBX
  • JE unsupported
  • XOR EAX,EAX
  • MOV EAX,1
  • JMP fin
  • unsupported:
  • XOR EAX,EAX
  • fin:
  • POP EBX
  • }*/
  • //seconde méthode
  • __try
  • {
  • __asm{
  • XOR EAX,EAX
  • XOR EBX,EBX
  • XOR ECX,ECX
  • XOR EDX,EDX
  • CPUID
  • }
  • }
  • __except(EXCEPTION_EXECUTE_HANDLER)
  • {
  • return FALSE;
  • }
  • return TRUE;
  • }
  • //retourne la valeur max de EAX pour CPUID
  • //ou 0 si CPUID n'est pas présent
  • _declspec(naked) DWORD WINAPI GetMaxCPUIDValue()
  • {
  • //DWORD dwMaxCPUIDValue=0;
  • //if (IsCPUIDAvailable()==TRUE)
  • //{
  • __asm {
  • PUSH EBP
  • MOV EBP,ESP
  • CALL IsCPUIDAvailable
  • TEST EAX,EAX
  • JE No_CPUID
  • PUSH EBX
  • XOR EAX,EAX
  • XOR EBX,EBX
  • XOR ECX,ECX
  • XOR EDX,EDX
  • CPUID //0
  • //MOV dwMaxCPUIDValue,EAX
  • POP EBX
  • POP EBP
  • RET
  • No_CPUID:
  • XOR EAX,EAX
  • POP EBP
  • RET
  • }
  • //}
  • //return dwMaxCPUIDValue;
  • }
  • //retourne la valeur maximum de EAX pour CPUID extended
  • //ou 0 si CPUID n'est pas présent
  • _declspec(naked) DWORD WINAPI GetMaxCPUIDExtendedValue()
  • {
  • //DWORD dwMaxCPUIDExValue=0;
  • //if (IsCPUIDAvailable()==TRUE)
  • //{
  • __asm {
  • PUSH EBP
  • MOV EBP,ESP
  • CALL IsCPUIDAvailable
  • TEST EAX,EAX
  • JE No_CPUID
  • PUSH EBX
  • XOR EAX,EAX
  • XOR EBX,EBX
  • XOR ECX,ECX
  • XOR EDX,EDX
  • MOV EAX,0x80000000
  • CPUID //0x80000000
  • //MOV dwMaxCPUIDExValue,EAX
  • POP EBX
  • POP EBP
  • RET
  • No_CPUID:
  • XOR EAX,EAX
  • POP EBP
  • RET
  • }
  • //}
  • //return dwMaxCPUIDExValue;
  • }
  • _declspec(naked) BOOL WINAPI GetCPUVendorID(char* lpszVendorID,DWORD* lpdwMaxCPUIDValue)
  • {
  • // DWORD REGEBX,REGECX,REGEDX;
  • // if (IsCPUIDAvailable()==TRUE)
  • // {
  • __asm {
  • PUSH EBP
  • MOV EBP,ESP
  • CALL IsCPUIDAvailable
  • TEST EAX,EAX
  • JE No_CPUID
  • PUSH EBX
  • XOR EAX,EAX
  • XOR EBX,EBX
  • XOR ECX,ECX
  • XOR EDX,EDX
  • CPUID //0
  • //copie les données
  • PUSH EDI
  • MOV EDI,[lpdwMaxCPUIDValue]
  • MOV [EDI],EAX
  • //MOV REGEBX,EBX
  • //MOV REGECX,ECX
  • //MOV REGEDX,EDX
  • CMP [lpszVendorID],0
  • JE No_CPUID
  • MOV EDI,[lpszVendorID]
  • MOV [EDI],EBX
  • MOV [EDI+4],EDX
  • MOV [EDI+8],ECX
  • MOV [EDI+12],0
  • MOV EAX,1
  • POP EDI
  • POP EBX
  • POP EBP
  • RET 8
  • No_CPUID:
  • XOR EAX,EAX
  • POP EBP
  • RET 8
  • }
  • //si le tampon passé à la fontion est correcte
  • //if (lpszVendorID)
  • //{
  • //on copie la chaine
  • //CopyMemory(lpszVendorID,&REGEBX,4);
  • //CopyMemory(lpszVendorID+4,&REGEDX,4);
  • //CopyMemory(lpszVendorID+8,&REGECX,4);
  • //lpszVendorID[12]=0;
  • //}
  • //return TRUE;
  • //}
  • //else
  • //{
  • // return FALSE;
  • //}
  • }
  • //renvoie les caractéristiques standards
  • _declspec(naked) BOOL WINAPI GetProcessorStdFeatures(DWORD* FeatureFlags)
  • {
  • //if (IsCPUIDAvailable()==TRUE)
  • //{
  • //CPUID 1
  • //if (GetMaxCPUIDValue() >= 1)
  • //{
  • __asm {
  • PUSH EBP
  • MOV EBP,ESP
  • CALL IsCPUIDAvailable
  • TEST EAX,EAX
  • JE No_CPUID
  • CALL GetMaxCPUIDValue
  • CMP EAX,1
  • JB No_CPUID
  • PUSH EBX
  • XOR EAX,EAX
  • XOR EBX,EBX
  • XOR ECX,ECX
  • XOR EDX,EDX
  • MOV EAX,1
  • CPUID //1
  • //on copie les données
  • MOV EAX,[FeatureFlags]
  • MOV [EAX],EDX
  • POP EBX
  • MOV EAX,1
  • POP EBP
  • RET 4
  • No_CPUID:
  • XOR EAX,EAX
  • POP EBP
  • RET 4
  • }
  • /* return TRUE;
  • }
  • else
  • {
  • return FALSE;
  • }
  • }
  • else
  • {
  • return FALSE;
  • }*/
  • }
  • //renvoie la signature du prcesseur
  • BOOL WINAPI GetProcessorSignature(Signature* ProcSignature)
  • {
  • //#pragma warning (disable : 4244)
  • DWORD REGEAX,REGEBX;
  • if (IsCPUIDAvailable()==TRUE)
  • {
  • //CPUID 1
  • if (GetMaxCPUIDValue() >= 1)
  • {
  • __asm {
  • PUSH EBX
  • XOR EAX,EAX
  • XOR EBX,EBX
  • XOR ECX,ECX
  • XOR EDX,EDX
  • MOV EAX,1
  • CPUID //1
  • //on copie les données
  • MOV REGEAX,EAX
  • MOV REGEBX,EBX
  • POP EBX
  • }
  • //si le tampon passé est correct
  • if (ProcSignature)
  • {
  • //on met en forme les données
  • ProcSignature->SteppingID = (REGEAX & 0x0000000F);
  • ProcSignature->ModelNumber = ((REGEAX>>4) & 0x0000000F);
  • ProcSignature->FamilyCode = ((REGEAX>>8) & 0x0000000F);
  • ProcSignature->INTELProcessorType = ((REGEAX>>12) & 0x00000003);
  • ProcSignature->ExtendedModel = ((REGEAX>>16) & 0x0000000F);
  • ProcSignature->ExtendedFamily = ((REGEAX>>20) & 0x000000FF);
  • ProcSignature->BrandID = (REGEBX & 0xF);
  • ProcSignature->CLFLUSHLineSize = ((REGEBX>>8) & 0xF);
  • ProcSignature->CountOfLogicalProcessors = ((REGEBX>>16) & 0xF);
  • ProcSignature->APICID = ((REGEBX>>24) & 0xF);
  • }
  • return TRUE;
  • }
  • else
  • {
  • return FALSE;
  • }
  • }
  • else
  • {
  • return FALSE;
  • }
  • }
  • //renvoie le nom du processeur
  • BOOL WINAPI GetProcessorNameString(char* lpszProcName)
  • {
  • DWORD REGEAX,REGEBX,REGECX,REGEDX;
  • if (IsCPUIDAvailable()==TRUE)
  • {
  • //CPUID 0x80000004
  • if (GetMaxCPUIDExtendedValue() >=4)
  • {
  • for (DWORD i=2;i<4;i++)
  • {
  • _asm {
  • PUSH EBX
  • XOR EAX,EAX
  • XOR EBX,EBX
  • XOR ECX,ECX
  • XOR EDX,EDX
  • MOV EAX,0x80000000
  • OR EAX,i
  • CPUID //0x80000004
  • //on copie les données
  • MOV REGEAX,EAX
  • MOV REGEBX,EBX
  • MOV REGECX,ECX
  • MOV REGEDX,EDX
  • POP EBX
  • }
  • //si le tampon est correcte
  • if (lpszProcName)
  • {
  • //on copie le nom dans le tampon
  • CopyMemory(lpszProcName + (i-2) * 16,&REGEAX,4);
  • CopyMemory(lpszProcName + (i-2) * 16 + 4,&REGEBX,4);
  • CopyMemory(lpszProcName + (i-2) * 16 + 8,&REGECX,4);
  • CopyMemory(lpszProcName + (i-2) * 16 + 12,&REGEDX,4);
  • REGEAX=REGEBX=REGECX=REGEDX=0;
  • }
  • }
  • return TRUE;
  • }
  • else
  • {
  • return FALSE;
  • }
  • }
  • else
  • {
  • return FALSE;
  • }
  • }
  • //permet de connaitre les résultats dans les registres du processeur suite à un CPUID
  • _declspec(naked) BOOL WINAPI GetCPUIDResult(DWORD* REGEAX,DWORD* REGEBX,DWORD* REGECX,DWORD* REGEDX)
  • {
  • /* if (IsCPUIDAvailable() == TRUE)
  • {*/
  • _asm {
  • PUSH EBP
  • MOV EBP,ESP
  • CALL IsCPUIDAvailable
  • TEST EAX,EAX
  • XOR EAX,EAX
  • JE No_CPUID
  • PUSH EBX
  • PUSH EDI
  • XOR EAX,EAX
  • XOR EBX,EBX
  • XOR ECX,ECX
  • XOR EDX,EDX
  • //on copie REGEAX dans EAX
  • MOV EAX,[REGEAX]
  • MOV EAX,[EAX]
  • //on execute CPUID
  • CPUID
  • //on copie l'adresse de *REGEAX
  • MOV EDI,[REGEAX]
  • //si le pointeur est nul
  • TEST EDI,EDI
  • JE Fin
  • //on copie EAX dans REGEAX
  • MOV [EDI],EAX
  • //pareil pour EBX,ECX,EDX
  • MOV EDI,[REGEBX]
  • TEST EDI,EDI
  • JE Fin
  • MOV [EDI],EBX
  • MOV EDI,[REGECX]
  • TEST EDI,EDI
  • JE Fin
  • MOV [EDI],ECX
  • MOV EDI,[REGEDX]
  • TEST EDI,EDI
  • JE Fin
  • MOV [EDI],EDX
  • FIN:
  • MOV EAX,1
  • No_CPUID:
  • POP EDI
  • POP EBX
  • POP EBP
  • RET 16
  • }
  • /* return TRUE;
  • }
  • else
  • {
  • return FALSE;
  • }*/
  • }
//ce code n'est pas la totalité de la source
// ProcessorInfo.cpp : définit le point d'entrée pour l'application DLL.
//

//#include "stdio.h"
#include "ProcessorInfo.h"

//Teste si CPUID est présent
BOOL WINAPI IsCPUIDAvailable()
{
	//premiere méthode
	/*__asm {
		PUSH EBX
		PUSHFD
		POP EAX
		MOV EBX,EAX
		XOR EAX,0x00200000
		PUSH EAX
		POPFD
		PUSHFD
		POP EAX
		CMP EAX,EBX
		JE unsupported
		XOR EAX,EAX
		MOV EAX,1
		JMP fin
		
unsupported:
		XOR EAX,EAX

fin:
		POP EBX
	}*/
	//seconde méthode
	__try
	{
		__asm{
			XOR EAX,EAX
			XOR EBX,EBX
			XOR ECX,ECX
			XOR EDX,EDX
			CPUID
		}
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		return FALSE;
	}
	return TRUE;
}

//retourne la valeur max de EAX pour CPUID
//ou 0 si CPUID n'est pas présent
_declspec(naked) DWORD WINAPI GetMaxCPUIDValue()
{
	//DWORD dwMaxCPUIDValue=0;
	//if (IsCPUIDAvailable()==TRUE)
	//{
		__asm {
			PUSH EBP
			MOV EBP,ESP
			CALL IsCPUIDAvailable
			TEST EAX,EAX
			JE No_CPUID

			PUSH EBX
			XOR EAX,EAX
			XOR EBX,EBX
			XOR ECX,ECX
			XOR EDX,EDX
			CPUID //0
			//MOV dwMaxCPUIDValue,EAX
			POP EBX
			POP EBP
			RET
No_CPUID:
			XOR EAX,EAX
			POP EBP
			RET
	}
	//}
	//return dwMaxCPUIDValue;
}

//retourne la valeur maximum de EAX pour CPUID extended
//ou 0 si CPUID n'est pas présent
_declspec(naked) DWORD WINAPI GetMaxCPUIDExtendedValue()
{
	//DWORD dwMaxCPUIDExValue=0;
	//if (IsCPUIDAvailable()==TRUE)
	//{
		__asm {
			PUSH EBP
			MOV EBP,ESP
			CALL IsCPUIDAvailable
			TEST EAX,EAX
			JE No_CPUID

			PUSH EBX
			XOR EAX,EAX
			XOR EBX,EBX
			XOR ECX,ECX
			XOR EDX,EDX
			MOV EAX,0x80000000
			CPUID //0x80000000
			//MOV dwMaxCPUIDExValue,EAX
			POP EBX
			POP EBP
			RET
No_CPUID:
			XOR EAX,EAX
			POP EBP
			RET
	}
	//}
	//return dwMaxCPUIDExValue;
}

_declspec(naked) BOOL WINAPI GetCPUVendorID(char* lpszVendorID,DWORD* lpdwMaxCPUIDValue)
{
//	DWORD REGEBX,REGECX,REGEDX;
//	if (IsCPUIDAvailable()==TRUE)
//	{
		__asm {
			PUSH EBP
			MOV EBP,ESP
			CALL IsCPUIDAvailable
			TEST EAX,EAX
			JE No_CPUID

			PUSH EBX
			XOR EAX,EAX
			XOR EBX,EBX
			XOR ECX,ECX
			XOR EDX,EDX
			CPUID //0
			//copie les données
			PUSH EDI
			MOV EDI,[lpdwMaxCPUIDValue]
			MOV [EDI],EAX
			//MOV REGEBX,EBX
			//MOV REGECX,ECX
			//MOV REGEDX,EDX
			CMP [lpszVendorID],0
			JE No_CPUID
			MOV EDI,[lpszVendorID]
			MOV [EDI],EBX
			MOV [EDI+4],EDX
			MOV [EDI+8],ECX
			MOV [EDI+12],0
			MOV EAX,1
			POP EDI
			POP EBX
			POP EBP
			RET 8
No_CPUID:
			XOR EAX,EAX
			POP EBP
			RET 8
	}
		//si le tampon passé à la fontion est correcte
		//if (lpszVendorID)
		//{
			//on copie la chaine
			//CopyMemory(lpszVendorID,&REGEBX,4);
			//CopyMemory(lpszVendorID+4,&REGEDX,4);
			//CopyMemory(lpszVendorID+8,&REGECX,4);
			//lpszVendorID[12]=0;
		//}
		//return TRUE;
	//}
	//else
	//{
	//	return FALSE;
	//}
}
//renvoie les caractéristiques standards
_declspec(naked) BOOL WINAPI GetProcessorStdFeatures(DWORD* FeatureFlags)
{
	//if (IsCPUIDAvailable()==TRUE)
	//{
		//CPUID 1
		//if (GetMaxCPUIDValue() >= 1)
		//{
			__asm {
				PUSH EBP
				MOV EBP,ESP
				CALL IsCPUIDAvailable
				TEST EAX,EAX
				JE No_CPUID
				
				CALL GetMaxCPUIDValue
				CMP EAX,1
				JB No_CPUID

				PUSH EBX
				XOR EAX,EAX
				XOR EBX,EBX
				XOR ECX,ECX
				XOR EDX,EDX
				MOV EAX,1
				CPUID //1
				//on copie les données
				MOV EAX,[FeatureFlags]
				MOV [EAX],EDX
				POP EBX
			MOV EAX,1
			POP EBP
			RET 4
No_CPUID:
			XOR EAX,EAX
			POP EBP
			RET 4
			}
/*			return TRUE;
		}
		else
		{
			return FALSE;
		}
	}
	else
	{
		return FALSE;
	}*/
}

//renvoie la signature du prcesseur
BOOL WINAPI GetProcessorSignature(Signature* ProcSignature)
{
//#pragma warning (disable : 4244)
	DWORD REGEAX,REGEBX;
	if (IsCPUIDAvailable()==TRUE)
	{
		//CPUID 1
		if (GetMaxCPUIDValue() >= 1)
		{
			__asm {
				PUSH EBX
				XOR EAX,EAX
				XOR EBX,EBX
				XOR ECX,ECX
				XOR EDX,EDX
				MOV EAX,1
				CPUID //1
				//on copie les données
				MOV REGEAX,EAX
				MOV REGEBX,EBX
				POP EBX
			}
			//si le tampon passé est correct
			if (ProcSignature)
			{
				//on met en forme les données
				ProcSignature->SteppingID = (REGEAX & 0x0000000F);
				ProcSignature->ModelNumber = ((REGEAX>>4) & 0x0000000F);
				ProcSignature->FamilyCode = ((REGEAX>>8) & 0x0000000F);
				ProcSignature->INTELProcessorType = ((REGEAX>>12) & 0x00000003);
				ProcSignature->ExtendedModel = ((REGEAX>>16) & 0x0000000F);
				ProcSignature->ExtendedFamily = ((REGEAX>>20) & 0x000000FF);

				ProcSignature->BrandID = (REGEBX & 0xF);
				ProcSignature->CLFLUSHLineSize = ((REGEBX>>8) & 0xF);
				ProcSignature->CountOfLogicalProcessors = ((REGEBX>>16) & 0xF);
				ProcSignature->APICID = ((REGEBX>>24) & 0xF);
			}

				return TRUE;
		}
		else
		{
			return FALSE;
		}
	}
	else
	{
		return FALSE;
	}
}

//renvoie le nom du processeur
BOOL WINAPI GetProcessorNameString(char* lpszProcName)
{
	DWORD REGEAX,REGEBX,REGECX,REGEDX;
	if (IsCPUIDAvailable()==TRUE)
	{
		//CPUID 0x80000004
		if (GetMaxCPUIDExtendedValue() >=4)
		{
			for (DWORD i=2;i<4;i++)
			{
				_asm {
					PUSH EBX
					XOR EAX,EAX
					XOR EBX,EBX
					XOR ECX,ECX
					XOR EDX,EDX
					MOV EAX,0x80000000
					OR EAX,i
					CPUID //0x80000004
					//on copie les données
					MOV REGEAX,EAX
					MOV REGEBX,EBX
					MOV REGECX,ECX
					MOV REGEDX,EDX
					POP EBX
				}
				//si le tampon est correcte
				if (lpszProcName)
				{
					//on copie le nom dans le tampon
					CopyMemory(lpszProcName + (i-2) * 16,&REGEAX,4);
					CopyMemory(lpszProcName + (i-2) * 16 + 4,&REGEBX,4);
					CopyMemory(lpszProcName + (i-2) * 16 + 8,&REGECX,4);
					CopyMemory(lpszProcName + (i-2) * 16 + 12,&REGEDX,4);
					REGEAX=REGEBX=REGECX=REGEDX=0;
				}
			}
			return TRUE;
		}
		else
		{
			return FALSE;
		}
	}
	else
	{
		return FALSE;
	}
}

//permet de connaitre les résultats dans les registres du processeur suite à un CPUID
_declspec(naked) BOOL WINAPI GetCPUIDResult(DWORD* REGEAX,DWORD* REGEBX,DWORD* REGECX,DWORD* REGEDX)
{
/*	if (IsCPUIDAvailable() == TRUE)
	{*/
		_asm {
			PUSH EBP
			MOV EBP,ESP
			CALL IsCPUIDAvailable
			TEST EAX,EAX
			XOR EAX,EAX
			JE No_CPUID

			PUSH EBX
			PUSH EDI
			XOR EAX,EAX
			XOR EBX,EBX
			XOR ECX,ECX
			XOR EDX,EDX
			//on copie REGEAX dans EAX
			MOV EAX,[REGEAX]
			MOV EAX,[EAX]
			//on execute CPUID
			CPUID
			//on copie l'adresse de *REGEAX
			MOV EDI,[REGEAX]
			//si le pointeur est nul
			TEST EDI,EDI
			JE Fin
			//on copie EAX dans REGEAX
			MOV [EDI],EAX
			//pareil pour EBX,ECX,EDX
			MOV EDI,[REGEBX]
			TEST EDI,EDI
			JE Fin
			MOV [EDI],EBX
			MOV EDI,[REGECX]
			TEST EDI,EDI
			JE Fin
			MOV [EDI],ECX
			MOV EDI,[REGEDX]
			TEST EDI,EDI
			JE Fin
			MOV [EDI],EDX
FIN:
			MOV EAX,1
No_CPUID:
			POP EDI
			POP EBX
			POP EBP
			RET 16
		}
/*		return TRUE;
	}
	else
	{
		return FALSE;
	}*/
}

 Conclusion

Ce code contient de l'ASM en ligne. Il a été fait avec Visual Studio .Net 2003...

N'hésitez pas à commenter et à noter...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

21 août 2004 18:03:58 :
Optimisation de certaines fonctions en pur ASM Remplacement des PUSHADs par le PUSH utiles
23 août 2004 11:29:20 :
Ajout de l'exe pour ceux qui veulent gagner du temps Ajout d'une capture d'écran

 Sources du même auteur

Source avec Zip LSOF : LA LISTE DES HANDLES OUVERTS PAR LES PROCESSUS (COMME...
Source avec Zip TRANSFERT D'IMAGELIST D'UN PROCESSUS À UN AUTRE
Source avec Zip ASPI : DES INFORMATIONS SUR VOS LECTEUR ET GRAVEURS DE CD ET...
Source avec Zip Source avec une capture SMBIOS/DMI : DES INFORMATIONS SUR VOTRE ORDINATEUR (MÉMOIRE,...
Source avec Zip Source avec une capture SAVOIR À QUEL PROGRAMME APPARTIENT UNE ICONE DE LA ZONE DE N...

 Sources de la même categorie

Source avec Zip Source avec une capture INFORMATION PROCESSEUR (CPUID) par Devils_Tiger
Source avec Zip Source avec une capture LECTURE TEMPÉRATURE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture LECTURE FRÉQUENCE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture UNE LISTE HÉTÉROGÈNE DOUBLEMENT CHAINÉE par pgl10
Source avec Zip Source avec une capture POUR AFFICHER LES CARACTÈRES ACCENTUÉS SOUS WINDOWS EN MODE ... par pgl10

Commentaires et avis

Commentaire de BruNews le 21/08/2004 13:50:18 administrateur CS

Pourquoi PUSHAD dans toutes ces fonctions quand tu n'utilises parfois qu'1 seul registre ?
CMP EDI,0 => TEST edi, edi
__declspec(naked) devant les fonctions pour les ecrire en pur asm et gagner pas mal de cycles.

Commentaire de BruNews le 22/08/2004 21:46:40 administrateur CS

Salut ShareVB,
http://www.cppfrance.com/code.aspx?ID=25597
j'ai remis un exemple, bien moins etendu que le tien, tu pourras jeter un oeil si tu veux pour voir comment supprimer CopyMemory et tous les transferts registres-memoire inutiles.
Si tu as des questions, pas de probleme.
ciao...

Commentaire de BlackGoddess le 23/08/2004 10:07:46

mettre _declspec(naked) et WINAPI ne sont pas contradictoires ?

Commentaire de BruNews le 23/08/2004 10:10:53 administrateur CS

aucunement, WINAPI est un alias de __stdcall.
Par contre, avec 'naked' il ne doit y avoir aucun code 'C', doit commencer par '__asm' et finir a 'ret xxx'.

Commentaire de BlackGoddess le 23/08/2004 10:58:44

il me semblait que __stdcall définissait une convention d'appel, et que _declspec(naked) supprimait l'en-tete de fonction ... l'implémentation de la convention ne se trouve donc pas dans l'en-tete ? je dois tout mélanger

Commentaire de BruNews le 23/08/2004 11:01:34 administrateur CS

naked supprime toute prise en charge de la fonction par le compilo, asm pur.
__stdcall est bien la convention d'appel, qui replace le pointeur de tack ESP.

Commentaire de BlackGoddess le 23/08/2004 17:32:41

d'accord, merci :)

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,045 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales