Get Your Armadillo/Software Passport Functions

BlitzMax Forums/BlitzMax Programming/Get Your Armadillo/Software Passport Functions

gellyware(Posted 2006) [#1]
'*********************************************************************
' ARMADILLO ACCESS FUNCTIONS
' Compiled by Gellyware - 2006
'*********************************************************************


'*********************************************************************
'get environment variable
'*********************************************************************

Extern "Win32"
   Function GetEnvironmentVariable(lpName$z, lpBuffer:Byte Ptr, nSize) = "GetEnvironmentVariableA@12" 
End Extern

Function GetEnv$(envVar$)
  Local buff:Byte[256]
  
  Local rtnLen = GetEnvironmentVariable(envVar$, buff, buff.length) 
  If rtnLen > (buff.length - 1)
    buff = buff[..rtnLen]
    rtnLen = GetEnvironmentVariable(envVar$, buff, buff.length)
  EndIf
  
  Return String.FromBytes(buff, rtnLen)
End Function

'*********************************************************************
'armaccess.dll functions
'*********************************************************************
Global Libary=LoadLibraryA("ArmAccess.dll")
Global CheckCode( Name:String, Code:String )"win32"=getprocaddress(Libary,"CheckCode")
Global VerifyKey( Name:String, Code:String )"win32"=getprocaddress(Libary,"VerifyKey")
Global InstallKey( Name:String, Code:String )"win32"=getprocaddress(Libary,"InstallKey")
Global InstallKeyLater( Name:String, Code:String )"win32"=getprocaddress(Libary,"InstallKeyLater")
Global UninstallKey()"win32"=getprocaddress(Libary,"UninstallKey")
Global SetDefaultKey()"win32"=getprocaddress(Libary,"SetDefaultKey")
Global UpdateEnvironment()"win32"=getprocaddress(Libary,"UpdateEnvironment")
Global IncrementCounter()"win32"=getprocaddress(Libary,"IncrementCounter")
Global CopiesRunning()"win32"=getprocaddress(Libary,"CopiesRunning")
Global ChangeHardwareLock()"win32"=getprocaddress(Libary,"ChangeHardwareLock")
Global GetShellProcessID()"win32"=getprocaddress(Libary,"GetShellProcessID")
Global FixClock( FixClockKey:String )"win32"=getprocaddress(Libary,"FixClock")
Global RawFingerprintInfo( Item:Int )"win32"=getprocaddress(Libary,"RawFingerprintInfo")
Global SetUserString( Which:Int, Str:String )"win32"=getprocaddress(Libary,"SetUserString")
Global VBGetUserString( Which:Int )"win32"=getprocaddress(Libary,"VBGetUserString")
Global WriteHardwareChangeLog( FileName:String )"win32"=getprocaddress(Libary,"WriteHardwareChangeLog")
Global ConnectedToServer()"win32"=getprocaddress(Libary,"ConnectedToServer")
Global CallBuyNowURL( ParentWindow:Int )"win32"=getprocaddress(Libary,"CallBuyNowURL")
Global CallCustomerServiceURL( ParentWindow:Int )"win32"=getprocaddress(Libary,"CallCustomerServiceURL")
Global ShowReminderMessage( ParentWindow:Int )"win32"=getprocaddress(Libary,"ShowReminderMessage")
Global ShowReminderMessage2( ParentWindow:Int )"win32"=getprocaddress(Libary,"ShowReminderMessage2")
Global ShowEnterKeyDialog( ParentWindow:Int )"win32"=getprocaddress(Libary,"ShowEnterKeyDialog")
Global ExpireCurrentKey()"win32"=getprocaddress(Libary,"ExpireCurrentKey")


'*********************************************************************
'KEY INFORMATION
'*********************************************************************

Function getAltUserName$()
	Rem
	This is the name on the user's key, or the string "DEFAULT" 
	(without the quotation marks) If they're using the default certificate. Same as USERNAME. 
	Possible values: 
   	The name that the currently-installed key was made For, Or "DEFAULT". 
	EndRem 
	
	Return GetEnv("ALTUSERNAME")
EndFunction 

Function getCopiesAllowed$()
	Rem 
	If your program uses the Limit Copies feature, this variable is set to the number of 
	copies permitted for the current certificate and key. 

	Possible values: 
   The number of copies permitted by the current certificate and key, if the current 
	certificate uses the Limit Copies option. Otherwise NULL. 
	EndRem 
	
	Return GetEnv("COPIESALLOWED") 
EndFunction 

Function getDaysInstalled$()
	Rem
	This variable contains the number of days since the current key was installed. 

	Possible values: 
    The decimal value of the number of days the current key has been installed. 
	EndRem 
	
	Return GetEnv("DAYSINSTALLED") 
EndFunction 

Function getDaysInstalledBitx$()
	Rem
	This is actually fifteen different variables, 
	DAYSINSTALLEDBIT1 through DAYSINSTALLEDBIT15. 
	They contain the number of days since the corresponding 
	"extra information" bit was last changed, and can be used with 
	Modification Keys to set up a trial period for separate modules in your program. 
	
	Note: although SoftwarePassport/Armadillo now supports 32 extra-info bits, 
	only bits 1 through 15 have a days-installed entry. This is by design. 
	
	Possible values: 
	The decimal value of the number of days the current key has been installed. 
	EndRem 
	
	Return GetEnv("DAYSINSTALLEDBITx") 
EndFunction 

Function getExtraInfo$()
	Rem
	Contains any user-defined "extra information" you have placed in the key, in decimal format. 

	Possible values: 
    The user-defined "extra information" stored in the key, if any. Otherwise "0". 
	EndRem 
	
	Return GetEnv("EXTRAINFO") 
EndFunction 

Function getExtraInfoBits$()
	Rem
	This stores the same information as the EXTRAINFO variable, but in binary format. 
	The least-significant bit (bit 1) is the first character of the string; the last 
	character is the most-significant bit (bit 32). If the bit is set (on), the character 
	in the corresponding location will be a one ("1"); otherwise, it will be a zero ("0"). 
	This string will always be thirty-two characters long, regardless of the information 
	stored in it. It is designed for those languages that don't have easy access to 
	bit-manipulation operators. 

	Possible values: 
    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", where each "x" can be a zero character or a one character. 
	EndRem 
	
	Return GetEnv("EXTRAINFOBITS") 
EndFunction 

Function getKeyCreated$()
	Rem
	This contains the date that the currently-installed key was created on. 

	Possible values: 
	The date, in the form "YYYY.MM.DD", that the currently-installed key was created on, 
	or NULL if the program is using the default certificate. 
	EndRem 
	
	Return GetEnv("KEYCREATED") 
EndFunction 

Function getUserKey$()
	Rem
    This is the key that the program is currently running under. It is not set for the default key. 

    Possible values: 
    The key that the program is currently using, if one was entered. 
    "CLIENT" if this is a client copy of a client/server Network Licensing setup. 
    NULL if neither of those applies. 
	EndRem 
	
	Return GetEnv("USERKEY") 
EndFunction 

Function getSeverKey$()
	Rem
	The USERKEY environment variable is set to "CLIENT" for the client side of a client/server 
	Network Licensing system. If you want to have access to the server's key on such a system, 
	you can use the SERVERKEY environment variable instead. It's not set unless USERKEY is "CLIENT". 

	Possible values: 
    The key used on the server copy, or NULL if this is not a client copy of the program. 
	EndRem 
	
	Return GetEnv("SERVERKEY") 
EndFunction 

Function getSeverAdress$()
	Rem
	On the client systems of a client/server Network Licensing system, the SERVERADDRESS 
	environment variable contains the IP address of the server. 

	Possible values: 
    The IP address, in dotted-decimal format, of the server (if this is a client copy). Otherwise NULL. 
	EndRem 
	
	Return GetEnv("SERVERADDRESS") 
EndFunction 

Function getStolenKey$()
	Rem
	When a key is entered or was previously entered, and is found to be in the Stolen Codes 
	Database, the program sets the STOLENKEY environment variable to that key. This variable 
	remains set until the program exits, or until a new key is successfully installed. 

	Possible values: 
   	The stolen key that was entered or found on the system, or NULL if no stolen key was found. 
	EndRem 
	
	Return GetEnv("STOLENKEY") 
EndFunction 

Function getTotalUses$()
	Rem
	This variable contains the total number of times that the program has been started since 
	the current key was installed. It is incremented every time the program is started. 

	Possible values: 
    The number of times the program has been started since the current key was installed. 
	Note that this will start at zero if the key was installed during the current run, but 
	that installing a key via the INI file method is done before the count is incremented, 
	so it will start at one in that case. 
	EndRem 
	
	Return GetEnv("TOTALUSES") 
EndFunction 

Function getTotalUsesAllKeys$()
	Rem
	Similar to TOTALUSES, but doesn't get reset when a key is installed. 

	Possible values: 
    The total number of times the program has been started since it was installed. 
	EndRem 
	
	Return GetEnv("TOTALUSESALLKEYS") 
EndFunction 

Function getUserName$()
	Rem
	This is the name on the user's key, or the string "DEFAULT" 
	(without the quotation marks) if they're using the default certificate. 

	Please note that Windows also sets this variable, to the name of the 
	logged-in user. SoftwarePassport/Armadillo will override this for protected programs, 
	but because of this, you cannot use the existence of USERNAME as an indication that 
	he program is protected. For this reason, the environment variable ALTUSERNAME carries the same information. 

	Possible values: 
    The name that the currently-installed key was made for, or "DEFAULT". 
	EndRem 
	
	Return GetEnv("USERNAME") 
EndFunction 

'*********************************************************************
'EXPIRATION 
'*********************************************************************

Function getDaysLeft$()
	Rem
	For date- and day-limited certificates, this is set to the number of valid days left 
	on the key. When this is set to 1, the key will expire at midnight. 
	
	Possible values: 
	The number of days remaining on the certificate, or NULL if the certificate is not 
	date- or days-limited. 
	EndRem 
	
	Return GetEnv("DAYSLEFT") 
EndFunction 

Function getExpired$()
	Rem
	This variable is set if you've chosen the "don't show expiration message" option and the 
	certificate is expired, if the key entered via ArmAccess.DLL's functions is already expired, 
	or if the current key becomes expired after a call to an ArmAccess.DLL function. 
	
	SoftwarePassport/Armadillo can only automatically stop the program from running if the key 
	is expired when the program starts up; if the key expires after that, and the program is 
	still running, it will continue to run unless you check for the existence of this variable, 
	and take action if it's set. 
	
	Possible values: 
	"True" if the certificate is expired, otherwise NULL. 
	EndRem 
	
	Return GetEnv("EXPIRED") 
EndFunction 

Function getExpiredDate$()
	Rem
	For expire-by-date certificates (only), this is set to the date the certificate expires on. 
	
	Possible values: 
	The date the expire-by-date certificate expires on, in YYYY.MM.DD format, or NULL 
	if the certificate is not expire-by-date. 
	EndRem 
	
	Return GetEnv("EXPIREDATE") 
EndFunction 

Function getExpiredEver$()
	Rem
	For expire-by-version certificates, this tells you what version the key will expire on. 
	
	Possible values: 
	The decimal value of the expiration version, with two digits after the decimal point, 
	if the current certificate is expire-by-version, otherwise NULL. Example: "3.75". 
	EndRem 
	
	Return GetEnv("EXPIREVER") 
EndFunction 

Function getTimeLeftNow$()
	Rem
	If you set the expire-by-minutes per-run timer, the TIMELEFTNOW environment variable 
	is set to the amount of time left in this run, in the form HH:MM:SS, where HH is the 
	number of hours (one or two digits), MM is the number of minutes (always two digits), 
	and SS is the number of seconds (again, always two digits). 
	
	Possible values: 
	The amount of time left during this run, in hours, minutes, and seconds, or NULL if 
	the per-run timer isn't used in this certificate. 
	EndRem 
	
	Return GetEnv("TIMELEFTNOW") 
EndFunction 

Function getTimeLeftTotal$()
	Rem
	If you set the expire-by-minutes total-time timer, the TIMELEFTTOTAL environment 
	variable is set to the total amount of time left on the timer, in the form HH:MM:SS, 
	where HH is the number of hours (one, two, or three digits), MM is the number of minutes 
	(always two digits), and SS is the number of seconds (again, always two digits). 
	
	Possible values: 
	The amount of time left on the timer, in hours, minutes, and seconds, or NULL if 
	the total-time timer isn't used in this certificate. 
	EndRem 
	
	Return GetEnv("TIMELEFTTOTAL") 
EndFunction 

Function getUsesLeft$()
	Rem
	For certificates offering a limited number-of-uses, this is set to the number of 
	uses remaining. If the user is on the last use, this is set to 1. 
	
	Possible values: 
	The number of uses remaining, in decimal format, if the certificate is one of 
	the expire-by-uses ones. Otherwise NULL. 
	EndRem 
	
	Return GetEnv("USESLEFT") 
EndFunction 

Function getUsesLeftAfter$()
	Rem
	This will always be equal to USESLEFT minus one, and is intended for use in the 
	show-after Reminder Message. 
	
	Possible values: 
	The number of uses remaining minus one, in decimal format, if the certificate is 
	one of the expire-by-uses ones. Otherwise NULL. 
	EndRem 
	
	Return GetEnv("USESLEFTAFTER") 
EndFunction 

'*********************************************************************
'CLOCK PROBLEMS
'*********************************************************************

Function getClockBack$()
	Rem
	If you have chosen To disable SoftwarePassport/Armadillo's clock-back checking 
	(by way of the Don't Report Clock-Back option), this variable will be set when 
	SoftwarePassport/Armadillo detects a system clock that has been turned back. 
	
	Possible values: 
	"True" If the clock has been set back, otherwise NULL. 
	EndRem 
	
	Return GetEnv("CLOCKBACK")
EndFunction

Function getClockForward$()
	Rem
	Similar To CLOCKBACK. If you have chosen To disable the clock-forward checking 
	(using the Don't Report Clock-Forward option), this variable will be set when 
	SoftwarePassport/Armadillo detects a system clock that has been set to a date 
	in the future. Please note that SoftwarePassport/Armadillo allows for several weeks' 
	leeway before reporting a problem. 

	Possible values: 
    "True" If the clock has been set forward, otherwise NULL. 
	EndRem 
	
	Return GetEnv("CLOCKFORWARD")
EndFunction

Function getClockWhy$()
	Rem
	When CLOCKBACK Or CLOCKFORWARD are set, CLOCKWHY contains the reason-code that would 
	normally be shown on the error screen. 

	Possible values: 
   "CCB-A" (For CLOCKFORWARD only) 
   "CCB-F" (CLOCKBACK) 
   "CCB-TT" (special) 
   "GDDM" (same as CCB-F, but For Limit Install Time keys) 
   "xxxx,yyyy,zzzz" (where x, y, And z are numbers; CLOCKBACK) 
    Null (If there is no clock problem) 

	If you need To know the meaning of a particular code, please contact us by e-mail 
	at support@.... 
	EndRem
	
	Return GetEnv("CLOCKWHY")
EndFunction


'*********************************************************************
'HARDWARE FINGERPRINTS
'*********************************************************************
Function getEnhFingerprint$()
	Rem
	Similar to the FINGERPRINT variable, this one holds the enhanced hardware-locking 
	fingerprint, for certificates that use enhanced hardware locking. 
	
	Possible values: 
	The 32-bit Enhanced hardware fingerprint, in hexadecimal format, separated into two 
	four-digit groups by a dash. Example: "A1B2-C3D4". 
	EndRem 
	
	Return GetEnv("ENHFINGERPRINT") 
EndFunction 

Function getFingerPrint$()
	Rem
	This variable contains the eight-digit hexadecimal "machine fingerprint" of the 
	computer your program is currently running on, which is necessary to make a 
	hardware-locked key. This is the Standard fingerprint value; for the Enhanced 
	fingerprint value, see ENHFINGERPRINT. 
	
	Possible values: 
	The 32-bit Standard hardware fingerprint, in hexadecimal format, separated into 
	two four-digit groups by a dash. Example: "A1B2-C3D4". 
	EndRem 
	
	Return GetEnv("FINGERPRINT") 
EndFunction 

'*********************************************************************
'MISCELANEOUS OR SPECIAL PURPOSE
'*********************************************************************

Function getCommandLine$()
	Rem
	When you have enabled the Allow Only One Copy option, and a user tries to start 
	a second copy of your program, the raw command line of the second copy is passed 
	to your program via this variable. Please see the description of the Allow Only One 
	Copy option for details. 
	
	Possible values: 
	The command line arguments of the second copy. 
	EndRem 
	
	Return GetEnv("COMMANDLINE") 
EndFunction 

Function getControlPID$()
	Rem
	When using CopyMem-II or the Debugger-Blocker, this variable will contain the program 
	ID of the SoftwarePassport/Armadillo control process for your program (the number that 
	is normally returned by the GetCurrentProcessId() API call), in decimal format. This is 
	sometimes needed to handle DDE messages. 
	
	Possible values: 
	This variable will either contain the ProcessID of the control process 
	(if using the Debugger-Blocker or CopyMem-II settings) or the ProcessID of the current process. 

	EndRem 
	
	Return GetEnv("CONTROLPID") 
EndFunction 

Function getDateLastRun$()
	Rem
	Contains the date that this program was last run on this system. 
	The first time it's run, this will contain the current date. 
	
	Possible values: 
	The date of the last time the program was run, in YYYY.MM.DD format. 
	EndRem 
	
	Return GetEnv("DATELASTRUN") 
EndFunction 

Function getDr_Tagged$()
	Rem
	If your program is tagged for use with the Digital River Network, this environment 
	variable will be set. 
	
	Possible values: 
	"True" or NULL. 
	EndRem 
	
	Return GetEnv("DR_TAGGED") 
EndFunction 

Function getEmulator$()
	Rem
	If your protected program is running under the VMware or VirtualPC emulators, 
	the EMULATOR environment variable will be set. Your program can use this to refuse 
	to run under such emulators, if desired. 
	
	Possible values: 
	"VMware", "VirtualPC", or "VirtualPC/Mac" (without the quotation marks) if your 
	program is running under one of those emulators. Otherwise NULL. 
	EndRem 
	
	Return GetEnv("EMULATOR") 
EndFunction 

Function getFirstRun$()
	Rem
	This variable is set on the first run of your program. Your program can use it to 
	initialize things that are only set on the first run, or to show dialogs that only 
	need to be shown once. 
	
	Possible values: 
	"True" on the first run of your program on a particular machine, otherwise NULL. 

	EndRem 
	
	Return GetEnv("FIRSTRUN") 
EndFunction 

Function getInvalidKey$()
	Rem
	This variable is used if you have the "Auto-revert on invalid key" option set, and the key 
	stored on a user's system is invalid (probably because you've changed an encryption template 
	(this is referred to as encryption key in the SoftwarePassport GUI) or disabled or removed 
	the certificate entirely). It is only set during the first such run, and the program will 
	automatically revert to the default certificate, if any. This is intended to let your program 
	gracefully warn the user of the change. 
	
	It is also now set if the key was found in the Stolen Codes Database. 
	
	Possible values: 
	"True" if the previously-installed key was invalid or discovered in the Stolen Codes Database, 
	otherwise NULL. 
	EndRem 
	
	Return GetEnv("INVALIDKEY") 
EndFunction 

Function getLoadingWindow$()
	Rem
	If you use a custom bitmap splash screen window, this variable holds the handle of 
	this window. You can use this handle to hide the splash screen window when your program 
	starts up, if you don't wish to rely on SoftwarePassport/Armadillo's timer (you can't close 
	it directly, because it's opened by a different thread). 
	
	Possible values: 
	The value of the window handle, in hexadecimal format, if your program has a splash screen. 
	Otherwise NULL. 
	EndRem 
	
	Return GetEnv("LOADINGWINDOW") 
EndFunction 

Function getProtectedFile$()
	Rem
	This variable holds the path and filename of the protected file. Not really needed anymore, but it remains for compatibility. 
	
	Possible values: 
	The full path and filename of the protected file. 
	EndRem 
	
	Return GetEnv("PROTECTEDFILE") 
EndFunction 

Function getProtectedFilePath$()
	Rem
	This is the directory path to the protected file, without the filename. 
	For example, if the protected program (stored in PROTECTEDFILE) is 
	"C:\Program Files\My Program\My Program.exe", then the PROTECTEDFILEPATH will be 
	"C:\Program Files\My Program\". This is primarily here for backwards compatibility, 
	but can also be used in HTML messages to locate graphics files. 
	
	Possible values: 
	The full directory path to the protected file, without the filename. It always ends 
	in a back-slash. 
	EndRem 
	
	Return GetEnv("PROTECTEDFILEPATH") 
EndFunction 

Function getVersionNumber$()
	Rem
	If you define a version (on the Edit Project screen), SoftwarePassport/Armadillo will put that 
	version number in this variable. 
	
	Possible values: 
	The version number you've entered on the Edit Project screen, if any, in decimal format with 
	two digits after the decimal point. Otherwise NULL. 
	EndRem 
	
	Return GetEnv("VERSIONNUMBER") 
EndFunction 

Function getWebsiteUrl$()
	Rem
	This contains the URL you've entered into the Website/Buy Now box in 
	SoftwarePassport/Armadillo, if any. 
	
	Possible values: 
	The URL in the Website/Buy Now box for the current certificate, if any. Otherwise NULL. 
	EndRem 
	
	Return GetEnv("WEBSITEURL") 
EndFunction 










Hopefully this will save someone a lot of work!


coffeedotbean(Posted 2006) [#2]
An old post but Very handy thankyou. *bookmarked


Grey Alien(Posted 2006) [#3]
Yeah I booked it too the first time round. Shall be using these very soon...

Thanks Gellyware!


siread(Posted 2008) [#4]
When I do this:

Global registered:Int = InstallKey(name, key)

On some machines it returns 0 or 1 if the license key is valid or not, on other machines it returns "2147348480" or "2147348481". I guess this is an address??? What am I doing wrong?


Gabriel(Posted 2008) [#5]
I've spotted this happening in other libraries too. I think Bass was one that would do it. I never investigated what was causing it, but I suspect it is because C++ has a bool datatype and BlitzMax does not. BlitzMax initializes all datatypes to zero, but C++ does not ( well technically, it does in debug and does not in release ) and I think you are getting random garbage in the 31 bits of the integer you don't use.

So... long explanation, short answer. Ignore all the other bits and only check the last bit.

Try

Global Registered:Int = InstallKey(Name,Key) & 1


This should account for the values you are getting, but also any other hypothetical values you might be getting.


VIP3R(Posted 2008) [#6]
InstallKey returns a Byte not an Int (most of those functions do), so the extra info is probably 3 bytes of random values.

Doing what Gabriel posted will work, but the correct method should be...

Global Registered:Byte = InstallKey(Name,Key)



siread(Posted 2008) [#7]
Thanks for your help guys. Works perfectly now. :)