1. RE: peek and poke under Windows XP
- Posted by George Orr <georgeorr at donet.com> Mar 29, 2002
- 407 views
Martin - I am trying to create functions to rapidly put and get strings from memory using allocate_string() and peek. The basic functions are constant maxlength = 22 -- maximum length of word in dictionary function put_word(sequence word) atom aword aword = allocate_string(word) return aword end function function get_word(atom a) sequence w integer i w = peek({a,maxlength}) i = 1 while w[i]>0 do i += 1 end while return w[1..i-1] end function The above functions work in Windows XP using ex.exe or exw.exe with trace turned on. Using under exw.exe without trace gives system errors. As you suggested, this seems to be an XP Virtual Machine issue. The peek({a,maxlength}) accesses memory that has not been allocated. Using ex.exe or exw.exe with trace on, this returns junk in the later bytes of the string, but the original string can be recovered by searching for the first 0 byte. Apparently the XP virutal machine objects to accessing memory that has not been allocated. When I modify the put_word function to pad the string to length maxlength, everything works in exw.exe. blankstr = repeat(0,maxlength) function put_word(sequence word) atom aword sequence bword bword = blankstr for i = 1 to length(word) do bword[i] = word[i] end for aword = allocate_string(bword) return aword end function There may be other problems with my coding, but it looks like the XP Virtual Machine may just be too smart for me! Thanks for your help. Please let me know if you see anything else that may be causing this. George Martin Stachon wrote: > From: "George Orr" <georgeorr at donet.com> > > Has anyone had trouble with peek and poke when running EXW.EXE under > > Windows XP? I have a simple program which runs fine under EX.EXE but > > has a fatal error under EXW.EXE. From EXW.EXE it runs fine with trace > > and trace(1), but not with trace(0). > > > > This may have been discussed before, but suddenly I can't get the > > Tropican search to find anything in our list..... > > Could you provide us the program? I guess the program has a little bug > (it could be a one byte array overflow) which doesn't come out with DOS, > but > is caught by XP. > > Martin > >
2. RE: peek and poke under Windows XP
- Posted by George Orr <georgeorr at donet.com> Mar 30, 2002
- 380 views
Martin - Thanks. I had tried that. I was using the peek({a,n}) function because it is significantly faster than looping through p(a). It's amazing how much trouble I get into trying to go faster! Euman sent me another fix using a kernel32.dll function to find the length of the string from the address. I suspect something like this or a c-function equivalent is needed to do this sort of thing using Windows XP and exw.exe. The XP virtual machine gets upset when I try to read memory I have not allocated. Thanks to both of you. George Martin Stachon wrote: > George Orr <georgeorr at donet.com> writes: > > I am trying to create functions to rapidly put and get strings from > > memory using allocate_string() and peek. The basic functions are > > > > constant maxlength = 22 -- maximum length of word in dictionary > > > > function put_word(sequence word) > > atom aword > > aword = allocate_string(word) > > return aword > > end function > > > > function get_word(atom a) > > sequence w > > integer i > > w = peek({a,maxlength}) > > i = 1 > > while w[i]>0 do i += 1 end while > > return w[1..i-1] > > end function > > > > The above functions work in Windows XP using ex.exe or exw.exe with > > trace turned on. Using under exw.exe without trace gives system errors. > > > > As you suggested, this seems to be an XP Virtual Machine issue. The > > peek({a,maxlength}) accesses memory that has not been allocated. Using > > ex.exe or exw.exe with trace on, this returns junk in the later bytes of > > > > the string, but the original string can be recovered by searching for > > the first 0 byte. Apparently the XP virutal machine objects to > > accessing memory that has not been allocated. When I modify the > > put_word function to pad the string to length maxlength, everything > > works in exw.exe. > > > > blankstr = repeat(0,maxlength) > > function put_word(sequence word) > > atom aword > > sequence bword > > bword = blankstr > > for i = 1 to length(word) do > > bword[i] = word[i] > > end for > > aword = allocate_string(bword) > > return aword > > end function > > > > There may be other problems with my coding, but it looks like the XP > > Virtual Machine may just be too smart for me! > > No more the DOS days when you could do everything with the machine... > > > > Thanks for your help. Please let me know if you see anything else that > > may be causing this. > > The other way to fix is to replace get_word(): > > function get_word(atom a) > integer i,char > sequence s > i = 0 > s = "" > while 1 do > char = peek(a+i) > if char = 0 then > -- end of string > exit > else > s &= char > i += 1 > end if > end while > return s > end function > > -- Martin > >