GetOverlappedResult (kernel32)
Last changed: -60.29.18.98

.
Summary

C# Signature:

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GetOverlappedResult(IntPtr hFile,
   [In] ref System.Threading.NativeOverlapped lpOverlapped,
   out uint lpNumberOfBytesTransferred, bool bWait);

VB.Net Signature:

<DllImport("kernel32.dll", SetLastError := True)> _

Private Shared Function GetOverlappedResult(ByVal hFile As IntPtr, <[In]()> ByRef lpOverlapped As System.Threading.NativeOverlapped, ByRef lpNumberOfBytesTransferred As UInteger, ByVal bWait As Boolean) As Boolean

End Function

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

Warning! GetOverlappedResult writes to the address of the buffer specified in the ORIGINAL OPERATION (ie/ ReadFile or WriteFile). .NET may move the address of the buffer before GetOverlappedResult returns, resulting in a buffer overflow. Use AllocHGlobal and FreeHGlobal or otherwise ensure the buffer is pinned between the two calls.

Sample Code:

    public static bool WriteUSB(IntPtr hDevice, byte[] pBuffer, uint dwBytesToWrite, ref uint lpNumberOfBytesWritten)
    {
        NativeOverlapped lpOverlapped = new NativeOverlapped();

        if (!WriteFile(hDevice, pBuffer, dwBytesToWrite, ref lpNumberOfBytesWritten, ref lpOverlapped) &&
        Marshal.GetLastWin32Error() == ERROR_IO_PENDING)
        {
        return GetOverlappedResult(hDevice, ref lpOverlapped, ref lpNumberOfBytesWritten, true);
        }
        return false;
    }

Alternative Managed API:

Do you know one? Please contribute it!

Documentation