'C3 KMS (IWB)

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,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

DEF zz:string 
zz = ""

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_EXPAND_SZ",2
SETID "REG_BINARY", 3 
SETID "REG_DWORD", 4  
'SETID "REG_QWORD", 11 


declare import,RegLoadKeyA(_
	HKEY    hKey, _
	LPCSTR  lpSubKey, _
	LPCSTR  lpFile _
	),LONG
	
declare import,RegLoadKeyW (_
	HKEY    hKey, _
	LPCWSTR  lpSubKey, _
	LPCWSTR  lpFile _
	),LONG
$ifdef UNICODE
declare import,RegLoadKey alias RegLoadKeyW (_
	HKEY    hKey, _
	LPCWSTR  lpSubKey, _
	LPCWSTR  lpFile _
	),LONG
$else
declare import,RegLoadKey alias RegLoadKeyA(_
	HKEY    hKey, _
	LPCSTR  lpSubKey, _
	LPCSTR  lpFile _
	),LONG
$endif

declare import,RegUnLoadKeyA(_
	HKEY    hKey, _
	LPCSTR lpSubKey _
	),LONG
	
declare import,RegUnLoadKeyW (_
	HKEY    hKey, _
	LPCWSTR lpSubKey _
	),LONG
	
$ifdef UNICODE
declare import,RegUnLoadKey alias RegUnLoadKeyW (_
	HKEY    hKey, _
	LPCWSTR lpSubKey _
	),LONG
$else
declare import,RegUnLoadKey alias RegUnLoadKeyA(_
	HKEY    hKey, _
	LPCSTR lpSubKey _
	),LONG
$endif

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=2:'Expand_SZ 
      '   ln=255 
      '   RegQueryValueExA(Ret,ValueName,NULL,typ,getdw,ln) 
      '   retval=str$(getdw) 
      'endif

      if typ=4:'Dword 
         ln=4 
         RegQueryValueExA(Ret,ValueName,NULL,typ,getdw,ln) 
         retval=str$(getdw) 
      endif 

      if typ=11:'Qword 
         ln=8 
         RegQueryValueExA(Ret,ValueName,NULL,typ,getdw,ln) 
         retval=str$(getdw) 
      endif

'PRINT typ

   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 RegSetBWValue(Key as string,lns as Uint,Value as int,opt ValueName as string),int 
   string rf,ky 
   UInt root,ret,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=8 
   retval=RegSetValueExA(ret,ValueName,tmp,@REG_BINARY,Value,lns) 
   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

    string rf,ky
	string retval
    zz=""
	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,zz,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