Para que te des cuenta de las bobadas que dices y que el que tienes que repasar aquí eres tú:
Si yo le mando un XXX le estoy mandando el contenido de XXX. <--- Pues va a ser que no
Si yo le mando una caja le estoy mandando el contenido de la caja. <--- Pues va a ser que no
Si yo le mando el puntero le estoy mandando el contenido del puntero. <--- Pues tampoco
Lo lamento pero es que me ha dolido
Sobre lo del "puntero a puntero a char" para "modificar el puntero a char", decirte que sigue siendo extraño e inútil, para eso se devuelve el puntero char * ya reservado, y no pasar un **... Así logras programas de locura. Sobre lo de long*, es otra locura, no me parece a mi juicio bien programado. Las funciones, cuantos menos argumentos-modificables tengan mejor. Y si no, usa referencias para lo que intentas hacer que para eso existen y no lías más el programa con punteros... ;) O mejor aún, nada de las dos: ¡Junta las dos funciones y deja de pasar cosas extrañas!
Por cierto, lo que te dije es totalmente correcto. Sobre lo del long, no es long sino "unsigned long", y el limite no es 64000 sino 4294967296, y el unsigned short sí son 65536 que es lo que aproximabas.