For each I/O request, the IOS determines which drivers to call and in what order to call them by using the calldown chain in the given DCB. Initially, the IOS sets the IOP_calldown_ptr member in the IOP structure to the address of the first entry in the calldown chain. Each driver in the chain is responsible for updating this member by setting it to the address of the next entry in the chain. A driver updates this member by obtaining the next calldown entry from the DCB_cd_next field of the current calldown entry. After updating, the current driver calls the next driver in the chain by pushing the address of the IOP on the stack and calling the next driver's entry point:
mov eax,[ebx+IOP_calldown_ptr] ; eax now points to calldown entry
mov eax,[eax+DCB_cd_next] ; eax now points to next calldown entry
mov [ebx+IOP_calldown_ptr],eax ; update the IOP's calldown pointer
push ebx ; place *IOP on stack
call [eax+DCB_cd_io_address] ; call next layer
add esp,4 ; restore stack
DCB, DCB_cd_entry, IOP