SysIni Function Not Compatible With Virtual Store in 64-bit 4.1.2 on Windows 7

Help
RodD
2012-12-17
2012-12-18
  • RodD
    RodD
    2012-12-17

    I am in the processing of moving from my 32-bit Windows 7 system (with OORexx 4.0.1) to a 64-bit Windows 7 System (with OORexx 4.1.2). The SysIni function behaves differently using 64-bit 4.1.2 OORexx than it did on the 32-bit 4.0.1 system with regard to respecting the VirtualStore directory. I believe the 32-bit 4.0.1 system was correct. An INI file residing in the %localappdata%\Virtualstore\Windows directory was found (without specifying the directory) in 32-bit 4.0.1, but it is not found in 64-bit 4.1.2.

    This is turning into a real show-stopper for moving off my old system to my new 64-bit machine. Is this a known bug? Does it work on an earlier 4.1 on 64-bit Windows, or 4.0 on 64-bit Windows?

     
  • Mark Miesfeld
    Mark Miesfeld
    2012-12-17

    This is not a bug in ooRexx, but rather the way Windows works. The SysIni function has no knowledge of Windows virtualization.

    A file found in one location on 32-bit Windows has no guarantee of being found in the same place in Windows 64-bit

    From MSDN:

    Virtualization is only enabled for:
    32 bit interactive processes
    ...
    Virtualization is disabled for:
    64 bit processes

    Virtualization being turned off for 64-bit processes is the cause of your problem.

    Here is another quote from MSDN concerning the Windows API that the SysIni function uses:

    Note This function is provided only for compatibility with 16-bit Windows-based applications. Applications should store initialization information in the registry.

    So, you are using technology that is pretty out-of-date.

     
  • RodD
    RodD
    2012-12-18

    You appear to be correct. Standard file access appears to work as if UAC is turned off as well. The following "exists" function returns 0 for "C:\Windows\My.ini" on 64-bit Windows where the file is in the Virtual Store, while it returns 1 on 32-bit Windows.

    exists: procedure
    if stream(arg(1),"C","QUERY EXISTS") = ''
    then return 0
    else return 1

    Using the registry is generally a total pain when you want to be able to use a text editor to change your Rexx application's parameters. It looks like I will need to change the Rexx programs to specifically look in the Virtual Store. It sure beats running it in an XP-mode virtual machine.