Salut,
SHGetMalloc
est deprecated.
%APPDATA% utilisé dans un chemin... On est pas dans le DOS.
Faut plutôt la récupérer avec
GetEnvironmentVariable.
#define UNICODE
/*
Pour compiler sous gcc en release, ajouter :
-nostartfiles -nodefaultlibs -nostdlib
dans les options du lieur.
*/
/* Suppression de la CRT sous VC */
#ifdef NDEBUG
#pragma comment(linker, "/NODEFAULTLIB")
#endif
/* Gestion de la compilation en unicode */
#ifdef UNICODE
#define _T(x) L ## x
typedef unsigned short TCHAR;
#else
#define _T(x) x
typedef char TCHAR;
#endif
#include "windows.h"
/**
* Alloue une zone mémoire en utilisant VirtualAlloc
*
* @param nSize Taille de la zone à allouer
* @return Pointeur sur la zone allouée
*/
void* __stdcall Memory_AllocPage(DWORD nSize)
{
return VirtualAlloc(NULL, nSize,
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE);
}
/**
* Libère une zone mémoire allouée avec Memory_AllocPage
*
* @param Pointeur sur la zone allouée
*/
void __stdcall Memory_FreePage(void* lpAddress)
{
VirtualFree(lpAddress, 0, MEM_RELEASE);
}
/**
* Attend que l'utilisateur presse une touche avant de continuer l'exécution
*/
void __stdcall Console_Pause()
{
HANDLE hInput; /* Handle de l'entrée standard */
DWORD nRead; /* Nombre d'octets lus */
TCHAR buffer; /* Réception du caractère */
DWORD nOldMode; /* Sauvegarde le mode précédent pour le restituer */
hInput = GetStdHandle(STD_INPUT_HANDLE);
GetConsoleMode(hInput, &nOldMode);
SetConsoleMode(hInput, 0);
ReadConsole(hInput, &buffer, 1, &nRead, NULL);
SetConsoleMode(hInput, nOldMode);
}
/**
* Affiche le texte indiqué dans la console
*
* @param lpText Texte à écrire dans la console
* @return FALSE en cas de problème
*/
BOOL __stdcall Console_Write(TCHAR* lpText)
{
DWORD nWritten; /* Réception du nombre de caractère écris */
char* lpOemText; /* Texte traduit en OEM */
DWORD nSize; /* Taille du texte à écrire */
BOOL bRes;
/* Traduction des caractère àùéè... */
nSize = lstrlen(lpText);
lpOemText = (char*)Memory_AllocPage(nSize);
CharToOem(lpText, lpOemText);
bRes = WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), lpOemText,
nSize, &nWritten, NULL);
Memory_FreePage(lpOemText);
return bRes;
}
/**
* Affiche le message d'erreur associé à la dernière erreur Win32
*
* @return Le code de la dernière erreur
*/
DWORD __stdcall ShowLastError()
{
DWORD nLastError; /* Code de la dernière erreur */
TCHAR* lpMessageBuffer; /* Message d'erreur associé */
/* Récupération du numéro de l'erreur */
nLastError = GetLastError();
/* Formatage du message */
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMessageBuffer, 0, NULL);
/* Affichage du message */
MessageBox(NULL, lpMessageBuffer, _T("ERROR"), MB_OK | MB_ICONERROR);
return nLastError;
}
/**
* Point d'entrée du programme
*
* @return Code d'erreur du processus
*/
#ifdef NDEBUG
int __cdecl mainCRTStartup()
#else
int main()
#endif
{
TCHAR lpAppData[MAX_PATH];
DWORD nSize;
nSize = GetEnvironmentVariable(_T("APPDATA"), lpAppData, MAX_PATH);
if (nSize == 0)
ExitProcess(ShowLastError());
if (nSize > MAX_PATH)
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
ExitProcess(ShowLastError());
}
lstrcat(lpAppData, _T("\\inject32"));
Console_Write(lpAppData);
Console_Pause();
return 0;
}