A contention manager is associated with each device. The contention manager is essentially a VxD that guards against simultaneous access to a device by different sources at the same time. VCOMM looks for the "contention" entry in the software section for the devnode of the device and then loads it at boot time and calls its control procedure with eax = GET_CONTENTION_ENTRY. The contention VxD returns with the address of the procedure to call in eax. If VCOMM does not find the entry or if the VxD does not respond to the GET_CONTENTION_ENTRY call, VCOMM uses its internal contention handling function in place of the contention VxD. However, this function does not manage contention between different VMs (and other system components); it just manages contention between different VxDs trying to access the same device.
The function returned by GET_CONTENTION_ENTRY is a C-style function that accepts a variable number of parameters, depending on the desired action. The basic subfunctions provided by the contention VxD are as follows (VCOMM provides a common channel to clients for accessing all these services):
VCOMM provides a common way for all clients to use these services.