示例#1
0
        UlGetOverlappedResult(
            IntPtr pUnmanagedOverlapped,       // pointer to overlapped structure
            ref int pNumberOfBytesTransferred, // pointer to actual bytes count
            bool bWait                         // wait flag
            )
        {
            GlobalLog.Print("Entering UlGetOverlappedResult(" + Convert.ToString(pUnmanagedOverlapped) + ")");

            if (hDevice == NativeMethods.INVALID_HANDLE_VALUE)
            {
                return(NativeMethods.ERROR_INVALID_PARAMETER);
            }

            if ((long)pUnmanagedOverlapped == 0)
            {
                return(NativeMethods.ERROR_INVALID_PARAMETER);
            }

            if (bWait)
            {
                AutoResetEvent m_Event = new AutoResetEvent(false);

                m_Event.SetHandle(Marshal.ReadInt32(pUnmanagedOverlapped + Win32.OverlappedhEventOffset));

                bOK = m_Event.WaitOne();

                pNumberOfBytesTransferred = Marshal.ReadInt32(pUnmanagedOverlapped + Win32.OverlappedInternalHighOffset);
            }
            else
            {
                pNumberOfBytesTransferred = Marshal.ReadInt32(pUnmanagedOverlapped + Win32.OverlappedInternalHighOffset);

                if (Marshal.ReadInt32(pUnmanagedOverlapped + Win32.OverlappedInternalOffset) == NativeMethods.ERROR_IO_PENDING)
                {
                    return(NativeMethods.ERROR_IO_INCOMPLETE);
                }
            }

            return(Marshal.ReadInt32(pUnmanagedOverlapped + Win32.OverlappedInternalOffset));
        } // UlGetOverlappedResult