Annotation of ntddk/src/vdd/com_vdd/readme, revision 1.1

1.1     ! root        1: 
        !             2: This VDD sample implements serial port support for the Virtual DOS
        !             3: Machine (VDM) under Windows NT.
        !             4: 
        !             5: The Windows NT VDM has a built-in Virtual Device Driver for serial
        !             6: communications, so this sample driver is completely redundant.  It
        !             7: illustrates how serial support might have been implemented using Win32
        !             8: and the Windows NT DDK.  This sample is based in part on the built-in
        !             9: serial driver, but it has been significantly modified and works
        !            10: differently.  You should not rely on any feature of this driver when
        !            11: writing serial I/O code that might be used under Windows NT.
        !            12: 
        !            13: To install this VDD, use regedit to modify
        !            14: 
        !            15: HKEY_LOCAL_MACHINE
        !            16:  \ SYSTEM
        !            17:   \ CurrentControlSet
        !            18:    \ Control
        !            19:     \ VirtualDeviceDrivers
        !            20:      \ VDD
        !            21: 
        !            22: to include ddkroot\lib\*\com_vdd.dll from your DDK tree.  Shutdown and
        !            23: restart Windows NT to let this change take effect.  Note: once you
        !            24: install the DLL as a VDD you can only modify (rebuild) it when no
        !            25: VDM's are running.  Use regedit to uninstall the VDD from
        !            26: HKEY_LOCAL_MACHINE\...\VDD if you want to use the built-in serial
        !            27: support.
        !            28: 
        !            29: An optional feature of a VDD is the direct dispatch function.  Your
        !            30: application can call this function directly instead of through the I/O
        !            31: instruction trap.  A sample direct dispatch function is included
        !            32: (VDDDispatch), but it has not been completed or tested at this time.
        !            33: You may use it as a guide, but be aware of its status.  Also, there is
        !            34: no equivalent to this function in the built-in serial support.
        !            35: 
        !            36: The code is split into three modules.  The first module (COM_VDD.C) is
        !            37: the VDD interface.  This holds the code to install the VDM hooks and
        !            38: initialize the virtual UARTs, and to close and release them.  The
        !            39: second module (PC_COM.C) implements the DOS interface to the virtual
        !            40: UARTs.  It handles IN and OUT instructions to the UART ports and
        !            41: generates simulated interrupts as appropriate.  The final module
        !            42: (NT_COM.C) implements the interface to Win32.
        !            43: 
        !            44: Unlike the built-in serial support there is no provision for this VDD
        !            45: to ever release the serial port once it is used.  As long as the VDM
        !            46: remains active you will be able to access the serial port from it, but
        !            47: otherwise the serial port is locked out.  You should consider whether
        !            48: this is the way you want your VDD to act, and how you might deal with
        !            49: this problem.  One option would be to dynamically load and unload your
        !            50: VDD rather than installing it permanently.
        !            51: 
        !            52: This VDD is multithreaded.  Besides the thread that executes the DOS
        !            53: code there is a thread that monitors the serial port status and an
        !            54: optional thread for transmit buffering.  Multithreading is one way you
        !            55: can get better performance and reduce the drag on other apps.
        !            56: Transmit buffering is an example of how this works.  Through testing
        !            57: it was found that byte transmission offered the most room for
        !            58: improvement.  Each transmitted byte was being output using a WriteFile
        !            59: call.  By collecting several byt es into a buffer before doing the
        !            60: WriteFile the overhead can be reduced.  A separate transmit thread
        !            61: helps this work by delaying the actual write for a few milliseconds
        !            62: while trying to fill the buffer.
        !            63: 
        !            64: Transmit buffering also shows an example of how queues can be
        !            65: implemented using Win32.  Queues are not supported directly by Win32,
        !            66: but they are easy to implement using a mutual exclusion object and a
        !            67: semaphore object.  The TX_enqueue and TX_dequeue functions and
        !            68: TX_queue structure show one way to do this.
        !            69: 
        !            70: Overlapped I/O is another point that this VDD illustrates well.  Under
        !            71: Win32 you must specify overlapped I/O or any file operation will block
        !            72: all others until it completes.  For serial communications this
        !            73: includes WaitCommEvent as well as ReadFile and WriteFile.  In the VDD
        !            74: this would have prevented any reads or writes while the status
        !            75: monitoring thread was waiting for a comm event.  See the wait_comm,
        !            76: read_comm and write_comm routines for details.
        !            77: 
        !            78: A CRITICAL_SECTION object is used to control access to the UART state.
        !            79: This allows the status monitoring thread to update the virtual UART
        !            80: state asynchronously.  A Mutex object could have been used as with the
        !            81: transmit buffers, but a critical section is more appropriate in this
        !            82: context.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.