Veo que le estas agarrando la mano al lenguaje, te dejo un par de notas, recomiendo usar la función "Espacio" en vez de "RepCarac", según recuerdo crea un buffer inicializado a cero, básicamente lo que quieres hacer con "RepCarac", pero sin el FillMemory.
No es necesario asignar una variable de retorno a los procedimientos, puedes procesarlos directamente desde una sentencia "Si".
La instrucción "Devolver" retorna un valor y finaliza la ejecución de tu procedimiento, por lo que nunca llega a cerrar el registro.
Te dejo acá el código como creo que debería quedar
Importar "Cramel.cml"
API RegOpenKeyEx(hKey:Entero,lpSubKey:Cadena,ulOptions,samDesired:Entero,Referencia phkResult:Entero):Entero, "Advapi32.dll" "RegOpenKeyExA"
API RegQueryValueEx(hKey:Entero,lpValueName:Cadena,lpReserved:Entero,Referencia lpType:Entero,Referencia lpData:Cadena,Referencia lpcbData:Entero):Entero, "Advapi32.dll" "RegQueryValueExA"
API RegCloseKey(hKey:Entero):Entero, "Advapi32.dll"
'=> Obtiene Nombre del Sistema Operativo
'=> Retorna Cadena
Proc SistemaOperativo():Cadena
Var SubKey, ValueName, CadenaFinal:Cadena
Var Result,ret,Data,Tipo,resData:Entero
Result = &80000002 'HKLM
SubKey = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
ValueName = "ProductName"
Si RegOpenKeyEx(Result, SubKey, 0, &20019, Result) <> &0 Entonces Devolver "Desconocido"
RegQueryValueEx(Result, ValueName, 0, 0, CadenaFinal, Data)
CadenaFinal = Espacio(Data)
RegQueryValueEx(Result, ValueName, 0, 0, CadenaFinal, Data)
RegCloseKey(Result)
Resultado = CadenaFinal
FinProc
Mensaje(SistemaOperativo())
Bueno, mas haya de ese par de pequeños problemas, tu código es excelente y una muy buena manera de obtener el nombre del sistema operativo.