Hi everyone,
I have been working on the registry.inc file again, I have now updated it to include enumerating keys, sub keys, and registry values.
This is a test program with examples of how to use the registry.inc file and the new Enum commands - hope this is of use to all, any questions please reply to this post and I will try and help.
The new registry.inc file is after the progam.
$INCLUDE "Registry.inc"
DEF oldretval:string 
DEF examkey:string 
DEF values:INT
DEF getval:string 
Def result as INT 
Def resultin as string
'================================================================================================================
'
'Extended registry commands - please enjoy - Andrew.
'
'Def result as INT 
'Def resultin as string
'Two return values I use with these registry commands 
'
'result = RegCreateKey("HKEY_CURRENT_USER\Software\KMS")    - Creates a registry key
'
'result = RegCreateKey("HKEY_CURRENT_USER\Software\KMS\OT") - Creates a registry sub key
'                 - Creates both key and sub key if key does not exist
' 
'result = RegDeleteKey("HKEY_CURRENT_USER\Software\KMS")    - Deletes a registry key
'                 - Deletes a registry key AND sub keys - be careful!
'
'result = RegDeleteKey("HKEY_CURRENT_USER\Software\KMS\OT") - Deletes a registry sub key
'
'resultin = RegDeleteValue("HKEY_CURRENT_USER\Software\KMS", "RP") 
'                - Deletes a registry entry called "RP"
'
'result = RegGetValue - Gives you the value of the entry
' 
'result = RegSetValue("HKEY_CURRENT_USER\Software\KMS", "something", "tutorial")
'                - Creates a string entry called "tutorial"
'                - Sets it's value to "something"
' 
'result = RegSetDWValue("HKEY_CURRENT_USER\Software\KMS", 1, "test")
'                - Creates a Dword entry called "test"
'                - Sets value to 1
'
'
'The following commands are exampled below in this program:
'
'RegCountSubKeys - counts the number of sub keys for "HKEY_CURRENT_USER\\Software\\KMS" 
'
'RegEnumKey      - lists a sub key name of ("HKEY_CURRENT_USER\\Software\\KMS",0) 
'                - you must count from zero, the next sub key is 1, the 2 etc
'
'RegCountEntries - Counts the number of registry entries for "HKEY_CURRENT_USER\\Software\\KMS"
'
'RegEnumEntryName- lists the name of an registry entry at the specified key "HKEY_CURRENT_USER\\Software\\KMS"
'                - you must count from zero, the next entry is 1, then 2 etc
'       
'RegGetEntryType - Tells you if it's a String or Dword entry
'
'================================================================================================================
 
'Key to be enumerated - CHANGE THIS TO A VALID REGISTRY KEY OF YOUR CHOICE
examkey = "HKEY_CURRENT_USER\\Software\\KMS"
OPENCONSOLE
PRINT
PRINT "Key to enumerated = ",examkey
PRINT
'Count the number of sub keys
ret = RegCountSubKeys(examkey)
PRINT "Number of sub-keys = ", ret
PRINT
'Enumerate sub keys
FOR y = 0 to (ret-1)
retval = RegEnumKey(examkey,y)
PRINT "Sub-key ",(y+1), retval
NEXT y
PRINT
PRINT "Press any key to list registry entries for ",examkey
DO:UNTIL INKEY$ <> ""
PRINT CLS
'Count the number of values (entries) for the key "HKEY_CURRENT_USER\\Software\\KMS"
PRINT
values = RegCountEntries(examkey)
PRINT values,"entries for ",examkey
PRINT
'Enumerate the entry names 
FOR y = 0 to (values-1)
retval = RegEnumEntryName(examkey,y)
PRINT examkey," entry ",(y+1), retval
'Display the type - string,dword etc
showtype = RegGetEntryType(examkey,retval)
IF showtype = 1
   PRINT "The entry '",retval,"' is a String"
ENDIF
IF showtype = 4
   PRINT "The entry '",retval,"' is a Dword"
ENDIF
'Display the stored value of the entry
resultin = RegGetValue(examkey,retval)
PRINT "Value is ",resultin
PRINT
NEXT y
'Finish
PRINT "Press any key to finish."
DO:UNTIL INKEY$ <> ""
END
 ---------------------------- This is the new registry.inc file ------------------------------------------------------------------------------------------
TYPE FileTime
   INT dwLowDateTime
   INT dwHighDateTime
ENDTYPE
DECLARE IMPORT,RegOpenKeyExA(hkey  as Uint,subkey as string,options  as int,security  as int,result as pointer),INT 
DECLARE IMPORT,RegQueryValueExA(hkey as Uint,valuename as string,reserved  as pointer,typ as pointer,keyvalue as pointer,size as pointer),INT 
DECLARE IMPORT,RegCloseKey(hkey  as Uint),INT 
DECLARE IMPORT,RegCreateKeyExA(hKey AS INT,lpSubKey AS STRING,Reserved AS INT,lpClass AS STRING,dwOptions AS INT,samDesired AS INT,lpSecurityAttributes AS int,phkResult AS INT BYREF,lpdwDisposition AS INT BYREF),INT 
DECLARE IMPORT,RegDeleteKeyA(hKey AS Uint,SubKey AS STRING),INT 
DECLARE IMPORT,RegSetValueExA(hKey AS INT,lpValueName AS STRING,Reserved AS INT,dwType AS INT,lpData AS POINTER,cbData AS INT),INT 
DECLARE IMPORT,RegDeleteValueA(hKey:INT, lpValueName:STRING),INT  
DECLARE IMPORT,RegEnumKeyExA(hKey AS INT,dwIndex AS INT,lpName AS STRING,lpcbName AS POINTER,lpReserved AS INT,lpClass AS STRING,lpcbClass AS POINTER,lpftLastWriteTime AS FILETIME),INT
DECLARE IMPORT,RegEnumValueA(hKey AS INT,dwIndex AS INT,lpValueName AS STRING,lpcbValueName AS POINTER,lpReserved AS INT,lpType AS POINTER,lpData AS POINTER BYREF,lpcbData AS POINTER),INT
DECLARE IMPORT,RegQueryInfoKeyA(INT hKey,POINTER lpClass,POINTER lpcchClass,POINTER lpReserved,POINTER lpcSubKeys,POINTER lpcbMaxSubKeyLen,POINTER lpcbMaxClassLen,POINTER lpcValues,POINTER lpcbMaxValueNameLen,POINTER lpcbMaxValueLen,POINTER lpcbSecurityDescriptor,FILETIME lpftLastWriteTime),INT
SETID "HKEY_CLASSES_ROOT", 0x80000000 
SETID "HKEY_CURRENT_USER", 0x80000001 
SETID "HKEY_LOCAL_MACHINE", 0x80000002 
SETID "HKEY_USERS", 0x80000003 
SETID "HKEY_PERFORMANCE_DATA",0x80000004 
SETID "HKEY_CURRENT_CONFIG", 0x80000005 
SETID "HKEY_DYN_DATA", 0x80000006 
SETID "KEY_ALL_ACCESS", 63 
SETID "REG_SZ",1 
SETID "REG_BINARY", 3 
SETID "REG_DWORD", 4    
Sub GetRoot(Key as string),UInt 
   string rf 
   UInt retval 
   retval=0 
   rf=left$(Key,instr(Key,"\\")-1) 
   select rf 
      case "HKEY_CLASSES_ROOT" 
         retval= @HKEY_CLASSES_ROOT 
      case "HKEY_CURRENT_USER" 
         retval=@HKEY_CURRENT_USER 
      case "HKEY_LOCAL_MACHINE" 
         retval=@HKEY_LOCAL_MACHINE 
      case "HKEY_USERS" 
         retval=@HKEY_USERS 
      case "HKEY_PERFORMANCE_DATA" 
         retval=@HKEY_PERFORMANCE_DATA 
      case "HKEY_CURRENT_CONFIG" 
         retval=@HKEY_CURRENT_CONFIG 
      case "HKEY_DYN_DATA" 
         retval=@HKEY_DYN_DATA 
   endselect 
   return retval 
EndSub 
Sub RegGetValue(Key as string,opt ValueName as string),string 
   string retval,rf,ky 
   UInt root,ret,ln,typ 
   int getdw 
   retval="" 
   ln=255 
   rf=left$(Key,instr(Key,"\\")-1) 
   ky=right$(Key,len(Key)-1-len(rf)) 
   if RegOpenKeyExA(GetRoot(Key),ky,0,@KEY_ALL_ACCESS,ret) = 0 
      RegQueryValueExA(Ret,ValueName,NULL,typ,retval,ln) 
      if typ=4:'Dword 
         ln=4 
         RegQueryValueExA(Ret,ValueName,NULL,typ,getdw,ln) 
         retval=str$(getdw) 
      endif 
   endif 
   RegCloseKey(ret) 
   return retval 
EndSub 
Sub RegGetEntryType(Key as string,opt ValueName as string),INT 
   string retval,rf,ky 
   UInt root,ret,ln,typ 
   int getdw 
   retval="" 
   ln=255 
   rf=left$(Key,instr(Key,"\\")-1) 
   ky=right$(Key,len(Key)-1-len(rf)) 
   if RegOpenKeyExA(GetRoot(Key),ky,0,@KEY_ALL_ACCESS,ret) = 0 
      RegQueryValueExA(Ret,ValueName,NULL,typ,retval,ln)
   endif 
   RegCloseKey(ret)
   return typ 
EndSub 
Sub RegDeleteValue(Key as string,opt ValueName as string),string 
   string retval,rf,ky 
   UInt root,ret,ln,typ 
   int getdw
   retval="" 
   ln=255 
   rf=left$(Key,instr(Key,"\\")-1) 
   ky=right$(Key,len(Key)-1-len(rf)) 
   if RegOpenKeyExA(GetRoot(Key),ky,0,@KEY_ALL_ACCESS,ret) = 0 
   IF RegDeleteValueA(ret,valuename) = 0
       retval = "0"
    ELSE
       retval = "1"
    ENDIF
   endif 
   RegCloseKey(ret) 
   return retval 
EndSub 
Sub RegSetValue(Key as string,Value as string,opt ValueName as string),int 
   string rf,ky 
   UInt root,ret,ln,typ 
   int retval,tmp 
   retval=0 
   tmp=0 
   ln=255 
   rf=left$(Key,instr(Key,"\\")-1) 
   ky=right$(Key,len(Key)-1-len(rf)) 
   RegCreateKeyExA(GetRoot(Key),ky,0,"",0,@KEY_ALL_ACCESS,0,ret,tmp) 
   tmp=0 
   ln=len(value)+1 
   retval=RegSetValueExA(ret,ValueName,tmp,@REG_SZ,Value,ln) 
   RegCloseKey(ret) 
   return retval 
EndSub 
Sub RegSetDWValue(Key as string,Value as int,opt ValueName as string),int 
   string rf,ky 
   UInt root,ret,ln,typ 
   int retval,tmp 
   retval=0 
   tmp=0 
   ln=255 
   rf=left$(Key,instr(Key,"\\")-1) 
   ky=right$(Key,len(Key)-1-len(rf)) 
   RegCreateKeyExA(GetRoot(Key),ky,0,"",0,@KEY_ALL_ACCESS,0,ret,tmp) 
   tmp=0 
   ln=4 
   retval=RegSetValueExA(ret,ValueName,tmp,@REG_DWORD,Value,ln) 
   RegCloseKey(ret) 
   return retval 
EndSub 
Sub RegCreateKey(Key as string),int 
   string rf,ky 
   UInt root,ret 
   int retval,tmp,ln
   tmp=0 
   ln=255 
   rf=left$(Key,instr(Key,"\\")-1) 
   ky=right$(Key,len(Key)-1-len(rf)) 
   retval=RegCreateKeyExA(GetRoot(Key),ky,0,"",0,@KEY_ALL_ACCESS,0,ret,tmp) 
   RegCloseKey(ret) 
   return retval 
EndSub 
Sub RegDeleteKey(Key as string),int 
   string rf,ky 
   int retval 
   rf=left$(Key,instr(Key,"\\")-1) 
   ky=right$(Key,len(Key)-1-len(rf)) 
   retval=RegDeleteKeyA(GetRoot(Key),ky) 
   return retval 
EndSub
Sub RegEnumKey(STRING Key,INT Index),STRING
    FileTime ft
    UInt root,ret,ln
    INT x
    string rf,ky
   string retval,ln$
   ln=255
   rf=left$(Key,INSTR(Key,"\\")-1)
   ky=right$(Key,(len(Key)-1)-len(rf))
    if RegOpenKeyExA(GetRoot(Key),ky,0,@KEY_ALL_ACCESS,ret) = 0
       RegEnumKeyExA(ret,index,retval,ln,NULL,"",ln,ft) 
    ENDIF
   RegCloseKey(ret)
   return retval
EndSub
Sub RegEnumEntryName(STRING Key,INT Index),string
   FileTime ft
    int getdw 
   UINT ret,typ
   STRING retval
    string rf,ky
   INT ln
   lpClass="" 
    ln=255
   rf=left$(Key,INSTR(Key,"\\")-1)
   ky=right$(Key,(len(Key)-1)-len(rf))
   if RegOpenKeyExA(GetRoot(Key),ky,0,@KEY_ALL_ACCESS,ret) = 0
       RegEnumValueA(ret,Index,retval,ln,NULL,typ,NULL,NULL)
    ENDIF
   RegCloseKey(ret)
   return retval
EndSub
Sub RegCountSubKeys(STRING Key),INT
   FileTime ft
   INT ln,retval 
    ln=255
   UINT ret
   lpClass=""
   rf=left$(Key,INSTR(Key,"\\")-1)
   ky=right$(Key,(len(Key)-1)-len(rf))
   if RegOpenKeyExA(GetRoot(Key),ky,0,@KEY_ALL_ACCESS,ret) = 0
      RegQueryInfoKeyA(ret,lpClass,ln,NULL,retval,NULL,NULL,NULL,NULL,NULL,NULL,ft)
   RegCloseKey(ret)
    ENDIF
   'Returns the number of sub-keys under this key, or 0 for error
   return retval
EndSub
Sub RegCountEntries(STRING Key),INT
   FileTime ft
   UINT ret
   INT ln
   INT retval
   STRING lpClass
    string rf,ky
    lpClass = ""
    ln=255
   rf=left$(Key,INSTR(Key,"\\")-1)
   ky=right$(Key,(len(Key)-1)-len(rf))
   if RegOpenKeyExA(GetRoot(Key),ky,0,@KEY_ALL_ACCESS,ret) = 0
      RegQueryInfoKeyA(ret,lpClass,ln,NULL,NULL,NULL,NULL,retval,NULL,NULL,NULL,ft)
   RegCloseKey(ret)
    ENDIF
   'Returns the number of values under this key
   return retval
EndSub
---------------------------------------------------------------------------------------------------------------------------------------
Hope this helps you,
Best wishes,
Andrew.