BYTE: Número entero sin signo de 8 bits (0 a 255). Uso: bytes en bruto, buffers, bytes de shellcode, datos binarios
WORD: Número entero sin signo de 16 bits (0 a 65.535). Uso: valores numéricos pequeños, flags, campos de la estructura PE
DWORD: Número entero sin signo de 32 bits ("Double WORD"). Uso: flags, IDs de proceso (PID), IDs de hilo (TID), códigos de error, tamaños
LONG: Número entero con signo de 32 bits (puede ser negativo). Uso: valores con signo, campos de estado, miembros de estructuras
ULONG: Número entero sin signo de 32 bits ("Unsigned LONG"). Uso: valores sin signo, contadores, flags
BOOL: Booleano guardado como entero (4 bytes). Uso: valor de retorno de funciones Win32: TRUE si funciona, FALSE si falla
BOOLEAN: Booleano guardado en un solo byte. Uso: estructuras de bajo nivel de Windows y código estilo NT (ntdll)
CHAR: Carácter ANSI de 8 bits. Uso: cadenas ANSI y datos de tamaño byte
WCHAR: Carácter "ancho" de 16 bits ("Wide CHAR"). Uso: cadenas Unicode UTF-16, que es lo que usa Windows internamente
LPSTR: Puntero a una cadena ANSI modificable. Uso: buffers donde se escribe texto ANSI
LPCSTR: Puntero a una cadena ANSI constante (solo lectura). Uso: cadenas ANSI que no se van a modificar
LPWSTR: Puntero a una cadena Unicode modificable. Uso: buffers donde se escribe texto Unicode
LPCWSTR: Puntero a una cadena Unicode constante (solo lectura). Uso: cadenas Unicode que no se van a modificar
PVOID: Puntero genérico, sin tipo concreto (equivale a void*). Uso: direcciones de memoria y buffers genéricos
LPVOID: Igual que PVOID (puntero genérico, void*). Uso: direcciones de memoria y buffers genéricos
HANDLE: "Manejador": un identificador que Windows te da para referirte a un objeto. Uso: ficheros, procesos, hilos, snapshots, eventos, mutex
HMODULE: Handle a un módulo cargado en memoria. Uso: referencia a una DLL o EXE cargado (en la práctica, su dirección base)
SIZE_T: Entero sin signo lo bastante grande para representar tamaños de memoria. Uso: tamaños de buffers, tamaños de reservas de memoria, operaciones con memoria
DWORD_PTR: Entero sin signo del tamaño de un puntero. Uso: guardar valores que deben "crecer" al pasar de x86 a x64
ULONG_PTR: Entero sin signo del tamaño de un puntero. Uso: aritmética de punteros y valores del tamaño de un puntero
UINT_PTR: Entero sin signo del tamaño de un puntero. Uso: valores sin signo del tamaño de un puntero
Pointers & Pointer-Sized
Importan porque en 32 bits los punteros ocupan 4 bytes (32 bits), y en 64 bits ocupan 8 bytes
⚠️ MAL en 64
c
DWORD value = (DWORD) pBuffer; // DWORD es 32 bits
✅ BIEN en 64 y 32
c
ULONG_PTR value = (ULONG_PTR)pBuffer;
Prefixes
Ejemplo: dwSize
dw → prefijo "Es un DWORD"
Size → lo que representa: "un tamaño"
b: Booleano o byte (BOOL, BOOLEAN, BYTE). Ej: bEnabled, bInheritHandle. Suele ser verdadero/falso, pero comprueba el tipo real
f: Flag o condición booleana (BOOL). Ej: fSuccess, fCreate. Indica una condición sí/no
w: WORD. Ej: wVersion, wFlags. Entero sin signo de 16 bits
dw: DWORD. Ej: dwSize, dwFlags, dwProcessId. El más común en Win32
u: Entero sin signo (UINT). Ej: uExitCode, uMsg
ul: Unsigned long (ULONG). Ej: ulSize, ulFlags
n: Número o cantidad (int). Ej: nSize, nIndex, nCmdShow. Entero normal
i: Índice (int). Ej: i, iItem, iIndex. Contadores de bucles, posiciones
cb: Count of Bytes: número de bytes. Ej: cbSize, cbBuffer. Clave en buffers y reservas de memoria
cch: Count of Characters: número de caracteres. Ej: cchName, cchPath. No es lo mismo que bytes (ver abajo)
ch: Un carácter (CHAR, WCHAR). Ej: chDrive. Un solo carácter
sz: String Zero: cadena terminada en \0. Ej: szName, szPath. Normalmente un array de caracteres
psz: Puntero a cadena terminada en \0. Ej: pszName, pszPath
lpsz: Long pointer a cadena terminada en \0. Ej: lpszFileName, lpszCommandLine. Estilo antiguo, igual que psz
p: Puntero. Ej: pBuffer, pInfo. Apunta a un objeto, buffer o estructura
pp: Puntero a puntero. Ej: ppBuffer. Cuando una función te "devuelve" un puntero por parámetro
pv: Puntero a void (PVOID). Ej: pvBuffer, pvReserved. Puntero genérico
ppv: Puntero a puntero a void (void**). Ej: ppvObject. Muy típico en COM
lp: Long pointer. Ej: lpBuffer, lpAddress. Herencia de 16 bits; hoy es igual que p