<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 12/08/2022 15:53, Radosław Smogura
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:DB7PR07MB5499647C3B9BF9D6B9BE2BF1E0679@DB7PR07MB5499.eurprd07.prod.outlook.com">
      
      <meta name="Generator" content="Microsoft Word 15 (filtered
        medium)">
      <!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]-->
      <style>@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        font-size:10.0pt;
        font-family:"Courier New";}span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";}.MsoChpDefault
        {mso-style-type:export-only;}div.WordSection1
        {page:WordSection1;}</style>
      <div class="WordSection1">
        <p class="MsoNormal">Hi all,</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">I could guess that debugger uses network
          and uses low level API to send and receive packets, which can
          cause error to be reset. But this is only my guess.</p>
        <p class="MsoNormal"><o:p> </o:p></p>
      </div>
    </blockquote>
    <p>I tend to agree with your (educated) guess.</p>
    <p>Maurizio<br>
    </p>
    <blockquote type="cite" cite="mid:DB7PR07MB5499647C3B9BF9D6B9BE2BF1E0679@DB7PR07MB5499.eurprd07.prod.outlook.com">
      <div class="WordSection1">
        <p class="MsoNormal">Kind regards,</p>
        <p class="MsoNormal">Rado Smogura</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <div style="mso-element:para-border-div;border:none;border-top:solid
          #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
          <p class="MsoNormal" style="border:none;padding:0in"><b>From:
            </b><a href="mailto:maurizio.cimadamore@oracle.com" moz-do-not-send="true">Maurizio Cimadamore</a><br>
            <b>Sent: </b>Friday, August 12, 2022 4:51 PM<br>
            <b>To: </b><a href="mailto:pedro.lamarao@prodist.com.br" moz-do-not-send="true">Pedro Lamarão</a>; <a href="mailto:manuel.bleichenbacher@gmail.com" moz-do-not-send="true">
              Manuel Bleichenbacher</a><br>
            <b>Cc: </b><a href="mailto:panama-dev@openjdk.org" moz-do-not-send="true" class="moz-txt-link-freetext">panama-dev@openjdk.org</a><br>
            <b>Subject: </b>Re: GetLastError() (with and without
            debugger)</p>
        </div>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p><o:p> </o:p></p>
        <div>
          <p class="MsoNormal">On 12/08/2022 15:43, Pedro Lamarão wrote:<o:p></o:p></p>
        </div>
        <blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
          <div>
            <div>
              <p class="MsoNormal"><o:p> </o:p></p>
            </div>
            <div>
              <blockquote style="border:none;border-left:solid #CCCCCC
                1.0pt;padding:0in 0in 0in
6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt">
                <div>
                  <div>
                    <div>
                      <div>
                        <p class="MsoNormal" style="margin-left:40.8pt">This
                          is incorrect. WriteFile() indicates an error,
                          but GetLastError() returns 0 (= NO_ERROR).
                          Could it be that the debugger calls another
                          Windows API function between those two
                          functions, resetting the last error?<o:p></o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal" style="margin-left:40.8pt"><o:p> </o:p></p>
                      </div>
                      <div>
                        <p class="MsoNormal" style="margin-left:40.8pt">In
                          my project that's a major issue. Since the
                          software behaves incorrectly with the
                          debugger, the software can no longer be
                          debugged. This doesn't just affect it when
                          debugging this particular piece of code but
                          anytime this code is run in a debugging
                          session.<o:p></o:p></p>
                      </div>
                    </div>
                  </div>
                </div>
              </blockquote>
              <div>
                <p class="MsoNormal"><o:p> </o:p></p>
              </div>
              <div>
                <p class="MsoNormal"><o:p> </o:p></p>
              </div>
              <div>
                <p class="MsoNormal">This would be a blocker for all
                  applications of Windows API functions via panama.<o:p></o:p></p>
              </div>
              <div>
                <p class="MsoNormal">Windows Sockets has a similar
                  mechanism called WSAGetLastError.<o:p></o:p></p>
              </div>
            </div>
          </div>
        </blockquote>
        <p>And JNI - I doubt there's anything Panama specific here
          (unless proven otherwise).</p>
        <p>So that it's clear - it's not that GetLastError fails in
          general. It fails when a debugger is attached. As I explained,
          this could be due to _which_ debugger is attached, or some
          existing issue (predating Panama) in the way jdb/JPDA deal
          with some Windows system calls.</p>
        <p>Maurizio</p>
        <blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
          <div>
            <div>
              <div>
                <p class="MsoNormal"><o:p> </o:p></p>
              </div>
              <div>
                <p class="MsoNormal">As far as I know, GetLastError and
                  WSAGetLastError are getter-like functions for
                  effectively thread local data.<o:p></o:p></p>
              </div>
              <div>
                <p class="MsoNormal">It is safe to call Windows API
                  functions from inside the same process but another
                  thread.<o:p></o:p></p>
              </div>
              <div>
                <p class="MsoNormal">If some piece of software
                  infrastructure has perturbed your program, then it has
                  called a Windows API function from inside our program<o:p></o:p></p>
              </div>
              <div>
                <p class="MsoNormal"><o:p> </o:p></p>
              </div>
              <div>
                <p class="MsoNormal"> <o:p></o:p></p>
              </div>
              <blockquote style="border:none;border-left:solid #CCCCCC
                1.0pt;padding:0in 0in 0in
6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt">
                <div>
                  <div>
                    <div>
                      <p class="MsoNormal" style="margin-left:40.8pt">Is
                        there something I'm not doing incorrectly? Or is
                        there a fix or workaround?<o:p></o:p></p>
                    </div>
                    <div>
                      <p class="MsoNormal" style="margin-left:40.8pt"><o:p> </o:p></p>
                    </div>
                    <div>
                      <p class="MsoNormal" style="margin-left:40.8pt">Here's
                        the Java code:<o:p></o:p></p>
                    </div>
                    <div>
                      <p class="MsoNormal" style="margin-left:40.8pt"><o:p> </o:p></p>
                    </div>
                    <div>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">import </span><span style="color:#A9B7C6">java.lang.foreign.*</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">import </span><span style="color:#A9B7C6">java.lang.invoke.MethodHandle</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832"><o:p> </o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">import static </span><span style="color:#A9B7C6">java.lang.foreign.MemoryAddress.</span><i><span style="color:#9876AA">NULL</span></i><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">import static </span><span style="color:#A9B7C6">java.lang.foreign.ValueLayout.</span><i><span style="color:#9876AA">ADDRESS</span></i><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">import static </span><span style="color:#A9B7C6">java.lang.foreign.ValueLayout.</span><i><span style="color:#9876AA">JAVA_INT</span></i><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832"><o:p> </o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">public class </span><span style="color:#A9B7C6">WinApi {<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">    </span><span style="color:#CC7832">static final </span><span style="color:#A9B7C6">MethodHandle </span><i><span style="color:#9876AA">WriteFile$Func</span></i><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">    static final </span><span style="color:#A9B7C6">MethodHandle </span><i><span style="color:#9876AA">GetLastError$Func</span></i><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">    static final </span><span style="color:#A9B7C6">MemoryAddress </span><i><span style="color:#9876AA">INVALID_HANDLE_VALUE </span></i><span style="color:#A9B7C6">= MemoryAddress.<i>ofLong</i>(-</span><span style="color:#6897BB">1</span><span style="color:#A9B7C6">)</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832"><o:p> </o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">    static </span><span style="color:#A9B7C6">{<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">        </span><span style="color:#CC7832">var </span><span style="color:#A9B7C6">linker = Linker.<i>nativeLinker</i>()</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">        var </span><span style="color:#A9B7C6">lookup = SymbolLookup.<i>libraryLookup</i>(</span><span style="color:#6A8759">"Kernel32"</span><span style="color:#CC7832">, </span><span style="color:#A9B7C6">MemorySession.<i>global</i>())</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832"><o:p> </o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">        </span><i><span style="color:#9876AA">WriteFile$Func </span></i><span style="color:#A9B7C6">= linker.downcallHandle(<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">                lookup.lookup(</span><span style="color:#6A8759">"WriteFile"</span><span style="color:#A9B7C6">).get()</span><span style="color:#CC7832">,<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">                </span><span style="color:#A9B7C6">FunctionDescriptor.<i>of</i>(</span><i><span style="color:#9876AA">JAVA_INT</span></i><span style="color:#CC7832">, </span><i><span style="color:#9876AA">ADDRESS</span></i><span style="color:#CC7832">, </span><i><span style="color:#9876AA">ADDRESS</span></i><span style="color:#CC7832">, </span><i><span style="color:#9876AA">JAVA_INT</span></i><span style="color:#CC7832">, </span><i><span style="color:#9876AA">ADDRESS</span></i><span style="color:#CC7832">, </span><i><span style="color:#9876AA">ADDRESS</span></i><span style="color:#A9B7C6">)<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">        )</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">        </span><i><span style="color:#9876AA">GetLastError$Func </span></i><span style="color:#A9B7C6">= linker.downcallHandle(<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">                lookup.lookup(</span><span style="color:#6A8759">"GetLastError"</span><span style="color:#A9B7C6">).get()</span><span style="color:#CC7832">,<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">                </span><span style="color:#A9B7C6">FunctionDescriptor.<i>of</i>(</span><i><span style="color:#9876AA">JAVA_INT</span></i><span style="color:#A9B7C6">)<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">        )</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">    </span><span style="color:#A9B7C6">}<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6"><o:p> </o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">    </span><span style="color:#CC7832">public static void </span><span style="color:#FFC66D">main</span><span style="color:#A9B7C6">(String[] args) {<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">        </span><span style="color:#CC7832">var </span><span style="color:#A9B7C6">res = <i>WriteFile</i>(</span><i><span style="color:#9876AA">INVALID_HANDLE_VALUE</span></i><span style="color:#CC7832">, </span><i><span style="color:#9876AA">NULL</span></i><span style="color:#CC7832">, </span><span style="color:#6897BB">0</span><span style="color:#CC7832">, </span><i><span style="color:#9876AA">NULL</span></i><span style="color:#CC7832">, </span><i><span style="color:#9876AA">NULL</span></i><span style="color:#A9B7C6">)</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">        var </span><span style="color:#A9B7C6">err = <i>GetLastError</i>()</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">        </span><span style="color:#A9B7C6">System.</span><i><span style="color:#9876AA">out</span></i><span style="color:#A9B7C6">.printf(</span><span style="color:#6A8759">"WriteFile result: %d, GetLastError result: %d</span><span style="color:#CC7832">\n</span><span style="color:#6A8759">"</span><span style="color:#CC7832">, </span><span style="color:#A9B7C6">res</span><span style="color:#CC7832">, </span><span style="color:#A9B7C6">err)</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">    </span><span style="color:#A9B7C6">}<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6"><o:p> </o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">    </span><span style="color:#CC7832">static int </span><span style="color:#FFC66D">WriteFile</span><span style="color:#A9B7C6">(MemoryAddress hFile</span><span style="color:#CC7832">, </span><span style="color:#A9B7C6">MemoryAddress lpBuffer</span><span style="color:#CC7832">, int </span><span style="color:#A9B7C6">nNumberOfBytesToWrite</span><span style="color:#CC7832">,<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">                         </span><span style="color:#A9B7C6">MemoryAddress lpNumberOfBytesWritten</span><span style="color:#CC7832">, </span><span style="color:#A9B7C6">MemoryAddress lpOverlapped) {<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">        </span><span style="color:#CC7832">try </span><span style="color:#A9B7C6">{<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">            </span><span style="color:#CC7832">return </span><span style="color:#A9B7C6">(</span><span style="color:#CC7832">int</span><span style="color:#A9B7C6">) </span><i><span style="color:#9876AA">WriteFile$Func</span></i><span style="color:#A9B7C6">.invokeExact((Addressable)hFile</span><span style="color:#CC7832">, </span><span style="color:#A9B7C6">(Addressable)lpBuffer</span><span style="color:#CC7832">, </span><span style="color:#A9B7C6">nNumberOfBytesToWrite</span><span style="color:#CC7832">,<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">                    </span><span style="color:#A9B7C6">(Addressable)lpNumberOfBytesWritten</span><span style="color:#CC7832">, </span><span style="color:#A9B7C6">(Addressable)lpOverlapped)</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">        </span><span style="color:#A9B7C6">} </span><span style="color:#CC7832">catch </span><span style="color:#A9B7C6">(Throwable e) {<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">            </span><span style="color:#CC7832">throw new </span><span style="color:#A9B7C6">RuntimeException(e)</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">        </span><span style="color:#A9B7C6">}<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">    }<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6"><o:p> </o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">    </span><span style="color:#CC7832">static int </span><span style="color:#FFC66D">GetLastError</span><span style="color:#A9B7C6">() {<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">        </span><span style="color:#CC7832">try </span><span style="color:#A9B7C6">{<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">            </span><span style="color:#CC7832">return </span><span style="color:#A9B7C6">(</span><span style="color:#CC7832">int</span><span style="color:#A9B7C6">) </span><i><span style="color:#9876AA">GetLastError$Func</span></i><span style="color:#A9B7C6">.invokeExact()</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">        </span><span style="color:#A9B7C6">} </span><span style="color:#CC7832">catch </span><span style="color:#A9B7C6">(Throwable e) {<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">            </span><span style="color:#CC7832">throw new </span><span style="color:#A9B7C6">RuntimeException(e)</span><span style="color:#CC7832">;<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#CC7832">        </span><span style="color:#A9B7C6">}<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">    }<o:p></o:p></span></pre>
                      <pre style="background:#2B2B2B"><span style="color:#A9B7C6">}<o:p></o:p></span></pre>
                    </div>
                    <div>
                      <p class="MsoNormal" style="margin-left:40.8pt"><o:p> </o:p></p>
                    </div>
                  </div>
                  <div>
                    <p class="MsoNormal" style="margin-left:40.8pt">Cheers<o:p></o:p></p>
                  </div>
                  <div>
                    <p class="MsoNormal" style="margin-left:40.8pt">Manuel<o:p></o:p></p>
                  </div>
                  <div>
                    <p class="MsoNormal" style="mso-margin-top-alt:0in;margin-right:0in;margin-bottom:12.0pt;margin-left:40.8pt"><o:p> </o:p></p>
                  </div>
                </div>
              </blockquote>
            </div>
            <p class="MsoNormal"><br clear="all">
              <o:p></o:p></p>
            <div>
              <p class="MsoNormal"><o:p> </o:p></p>
            </div>
            <p class="MsoNormal">-- <o:p></o:p></p>
            <div>
              <div>
                <div>
                  <p class="MsoNormal">Pedro Lamarão<o:p></o:p></p>
                </div>
                <div>
                  <p class="MsoNormal"><a href="https://urldefense.com/v3/__https://www.prodist.com.br__;!!ACWV5N9M2RV99hQ!KJSQL21z0JqqkoKWi_1XM7-gUTuT4M89VbpDuAwRrxMfDBoh5PVL6l-TkZVGAzxGZkk0wM2pgmZU3ewcNenvlw$" target="_blank" moz-do-not-send="true">https://www.prodist.com.br</a><o:p></o:p></p>
                </div>
                <div>
                  <p class="MsoNormal">Securing Critical Systems<o:p></o:p></p>
                </div>
                <div>
                  <p class="MsoNormal">Tel: +55 11 4380-6585<o:p></o:p></p>
                </div>
                <div>
                  <p class="MsoNormal"><img style="width:3.125in;height:.618in" id="_x0000_i1025" src="https://ci3.googleusercontent.com/mail-sig/AIorK4wgjsxiTyEHhb40ITzhw-mChttfn1y6GautnhGEr5tVa82AzYOrJJ9lEh-34sfDfoCQkFlQ7oY" moz-do-not-send="true" width="300" height="59" border="0"><o:p></o:p></p>
                </div>
              </div>
            </div>
          </div>
        </blockquote>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;margin-right:.5in;margin-bottom:12.0pt;margin-left:.5in"><span style="font-size:8.0pt;font-family:"Arial",sans-serif;color:#003366">Antes
            de imprimir esta mensagem e seus anexos, certifique-se que
            seja realmente necessário.<br>
            Proteger o meio ambiente é nosso dever.<br>
            Before printing this e-mail or attachments, be sure it is
            necessary.<br>
            It is in our hands to protect the environment.</span><span style="color:#222222"><o:p></o:p></span></p>
        <p class="MsoNormal"><o:p> </o:p></p>
      </div>
    </blockquote>
  </body>
</html>