Jump to content

FileRead works on Autorun.inf while Ini functions sometimes don't


Go to solution Solved by LWC,

Recommended Posts

I've made a program that relies on IniReadSectionNames. It reads (~3K) Autorun.inf files in the working folder and creates a GUI based on their contents.

I made sure to revert to a default GUI upon @error.

But someone (with Windows XP SP3 32-bit) reported to me he always gets the default menu.

I sent him a FileRead command instead and it works! So seemingly there's no access problem to AutoRun.inf.

In the following demo code, I always hit success, but he always ends up with semi-success:

Local $hIniLocation = "Autorun.inf"
    Local $aSections = IniReadSectionNames($hIniLocation)
    If @error Then
        $aSections = FileRead($hIniLocation)
        if @error then
            msgbox(48, "Double error", "Alternative access failed too due to:" & @crlf & @error & @crlf & @extended)
        else
            msgbox(0, "Semi-success", "IniReadSectionNames failed, but alternativaly this file contains:" & @crlf & @crlf & $aSections)
        endif
    else
        msgbox(0, "Success", "IniReadSectionNames worked!")
    endif

Why is that? Is there something further to check with him?

Autorun.inf

Edited by LWC
More general topic and tag
Link to comment
Share on other sites

It seems to be about Autorun.inf specifically. If I change my script to use autorun.ini or something_else.inf, then it works for him.

But if FileRead works on Autorun.inf itself, why doesn't IniReadSectionNames?

Can I check the relevant rights and/or pipe IniReadSectionNames through FileRead (without creating a temp file just so it won't be called Autorun.inf)?

Edited by LWC
Link to comment
Share on other sites

Checking the rights for this particular file on one particular PC could be not easy if trouble comes from antivirus policy etc
But if FileRead works you might provide an alternative way as a workaround

#include <Array.au3>
$txt = FileRead(@ScriptDir & "\Autorun.inf")
$sections = StringRegExp($txt, '^|(?m)^\s*\[([^\]]+)', 3)
$sections[0] = UBound($sections)-1
_ArrayDisplay($sections)

 

Link to comment
Share on other sites

That's very smart and works perfectly, thanks!

I'll submit a bug report asking to use your code internally in IniReadSectionNames as a fallback (unless of course they'll fix it directly).

But...IniReadSection suffers from the same issue. Can you suggest a bypass for it too?

Edited by LWC
Link to comment
Share on other sites

1 hour ago, LWC said:

I'll submit a bug report

IMHO it's not a good idea as the problem certainly comes from some particular configuration on the user's PC
Workarounds exist for most Ini* funcs. How many of these funcs is your script using ?

Link to comment
Share on other sites

I assume that File/Ini funcs don't all work the same way. Question for developpers  :)

Here is a possible workaround for IniReadSection

#include <Array.au3>

$txt = FileRead(@ScriptDir & "\Autorun.inf")
$sections = StringRegExp($txt, '^|(?m)^\s*\[([^\]]+)', 3)
$sections[0] = UBound($sections)-1
;_ArrayDisplay($sections)

For $i = 1 To $sections[0]
   ; read content of section
   $content = StringRegExp($txt, '\Q' & $sections[$i] & ']\E\s+([^\[]+)', 1)
   If IsArray($content) Then 
       ; get key/value pairs
       $tmp = StringRegExp($content[0], '(?m)^([^\v;=]+)=([^;\v]*)\N*$', 3)
       If not IsArray($tmp) Then 
            Msgbox(0,"", "section " & $sections[$i] & " is empty")
            ContinueLoop
       EndIf
       ; format to 2D array
       $n = UBound($tmp)
       Local $aArray[$n/2+1][2]
       For $j = 0 To $n-1
            $aArray[Int($j/2)+1][Mod($j, 2)] = $tmp[$j]
       Next
       $aArray[0][0] = $n/2
      _ArrayDisplay($aArray, "section " & $sections[$i])
   Else
      Msgbox(0,"", "section " & $sections[$i] & " is empty")
   EndIf
Next

 

Edited by mikell
Link to comment
Share on other sites

  • Solution

I used your first regexp, but then continued with some simpler code combined with ideas from here.

#include <Array.au3>

$txt = FileRead(@ScriptDir & "\Autorun.inf")
$aSections = StringRegExp($txt, '^|(?m)^\s*\[([^\]]+)', 3)
$aSections[0] = UBound($aSections)-1
;_ArrayDisplay($aSections)

    For $iCount = 1 To $aSections[0]
        if $filecontent="" then
            $aKV = IniReadSection($hIniLocation, $aSections[$iCount])
            If @error Then ; If empty section then ignore (treat as void)
                ContinueLoop
            endif
        else
            $value = StringRegExp($filecontent, "\Q" & $aSections[$iCount] & ']\E\s+([^\[]+)', 1)
            If not IsArray($value) Then ; If empty section then ignore (treat as void)
                ContinueLoop
            endif
            If StringInStr($value[0], @CRLF, 1, 1) Then
                $value = StringSplit(StringStripCR($value[0]), @LF)
            ElseIf StringInStr($value[0], @LF, 1, 1) Then
                $value = StringSplit($value[0], @LF)
            Else
                $value = StringSplit($value[0], @CR)
            EndIf
            local $aKV[1][2]
            For $xCount = 1 To $value[0]
                if $value[$xCount]="" or StringLeft($value[$xCount], 1)=";" then ContinueLoop
                ReDim $aKV[ubound($aKV)+1][ubound($aKV, 2)]
                $value_temp = StringSplit($value[$xCount], "=", 2)
                $aKV[ubound($aKV)-1][0] = $value_temp[0]
                $aKV[ubound($aKV)-1][1] = $value_temp[1]
                $aKV[0][0] += 1
            next
            if $aKV[0][0]="" then ContinueLoop
        EndIf
        _ArrayDisplay($aKV, $aSections[$iCount])
    Next

What do you think?

Edited by LWC
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...