Gracias , podria me explicar cual la diferençia destos offsets para los otros ?
En la memoria del main se encuentra guardado el string que corresponde a ese archivo.
Por ejemplo si usted va a 0x0077C7C0 encontrará el string que corresponde a "Data\\Local\\Text.bmd"
El problema es si usted hace un MemoryCpy y le inserta un string más grande, podría suceder que usted pise un valor alojado en la memoria continua. Por ejemplo:
"Data\\Local\\Text.bmd" tiene 21 caracteres en total, por lo que ocupará en memoria desde el offset 0x0077C7C0 hasta 0x0077C7C0 + 21 como máximo, entonces el main puede guardar otro valor en 0x0077C7C0 + 22 que podría ser otro string, otra variable, lo que sea.
Si usted coloca con MemoryCpy un string más grande, por ejemplo "Data\\Local\\Text_%s.bmd" este string tiene más caracteres (24 exactamente) por lo que cuando aplique MemoryCpy usted está modificando para que el dato ocupe desde 0x0077C7C0 hasta 0x0077C7C0 + 24 pero si existía un dato en 0x0077C7C0 + 22 usted ya lo acaba de pisar con el nuevo string que extendió. No sé si me logra comprender con esto que expliqué.
Respecto al SetDword... La funcionalidad de SetDword es asignar un valor DWORD (4 bytes) a un offset específico. Todas las referencias a otro offset se utilizan a través de un valor DWORD que contiene el offset en cuestión. Por ejemplo 0x0077C7C0 es un DWORD. Cuando usted lee en asm "Push Offset variable" lo que está haciendo es empujar la dirección de memoria de "variable" que sería un valor DWORD como por ejemplo 0x0077C7C0. Entonces cuando dice "Push Offset variable" es lo mismo que "Push 0x0077C7C0".
Entonces si usted busca donde diga "Push offset item_a" (ese item_a es el offset donde está almacenado "Data\\Local\\Item.bmd" por ejemplo) usted puede intervenir y cambiar ese "offset item_a" por un string que usted tenga almacenado en una variable suya lo que resultaría en esto "Push offset miVariable".
Entonces cuando usted hace SetDword(0x..., (DWORD)&miVariable); le está indicando a esa instrucción asm en ese offset que en lugar de usar "offset item_a" utilice "offset miVariable" y de esa manera usted puede hacer referencias a strings almacenados en variables propias en su DLL sin necesidad de pisar o perjudicar datos en la memoria del main.
Es difícil de explicar el funcionamiento del ASM, lo siento si no fui muy claro.