Monday, 13 May 2013

grub4dos and environment variables

Whilst developing Easy2Boot, I found that I kept running out of variables space.
grub4dos has a meagre limit of only 60 variables  (and up to 512 bytes per value). Try to define any more than 60 and it simply refuses to put them into the environment.
I devised some nifty grub4dos code that would count how many variables I had left (see below).
This led me to realise that I could not use variables to store the names of all the files in a folder - thus reducing the number of files I could allow in a folder.
So I had to re-write Easy2Boot so that it used system memory to store the variables and then find and retrieve the value of a specified variable from memory when I wanted it!

VarsLeft.g4b
=========
!BAT
# grub4dos can have only 60 variables defined (512 bytes max per value)
# set *   will clear all variables - to find the max limit use set * followed by calling this batch file.

# take a copy of the current environment
setlocal

# Now lets fill up the environment until it fails!

# n is our counter
set n=1
:LOOP
# any more than 600 and it is probably not worth worrying about!
if "%n%"=="600" goto :end
set AAA%n%=FFF
# on first loop AAA1=FFF
# now we need to read back AAA1 by writing a small batch file in memory - e.g.
# !BAT
# set B=%AAA1%
echo -e !BAT\nset B=%^AAA%n%%% > (md)0x3000+1
# now call the batch file we just made to set B to the value of AAA1
call (md)0x3000+1
if not "%B%"=="FFF" echo Approx. %n% Variables left! && exit
# increment n for next loop
set /a n=%n%+1  > nul
goto :LOOP

# restore the copy of the current environment
# this is not really required as 'exit' also restore the environment
endlocal
# quit!
exit