5.13 Closing a Transport Address or Control Channel
After closing any associated connection(s), a TDI client is ready to close an open transport address.
When a client no longer has any use for an open transport address or control channel, it must release that object as follows:
·Pass the file object pointer returned by ObReferenceObjectByHandle to ObDereferenceObject.
·Pass the file handle that was returned by ZwCreateFile when the connection endpoint was opened to ZwClose.
In a similar manner, a TDI client also can close any control channel it has opened in its underlying transport driver.
If the client opened the file object representing a control channel with a call to IoGetDeviceObjectPointer, it must pass the returned file object pointer to ObDereferenceObject to release the file object.
Then, the I/O Manager submits IRPs to the transport's TdiDispatchCleanup and TdiDispatchClose routines.
These transport routines immediately close the transport address or control channel and free all associated client-specific transport driver resources. For example, TdiDispatchCleanup cancels any pending requests on a transport address that is being closed, deregisters any ClientEventXxx handlers on that address, and cleans up client-specific state for that address. If this client has released the last file handle for a particular transport address, the transport also releases internal state for that transport address.
After ZwClose returns to the client, it cannot submit a request to the underlying transport for the transport address or control channel it previously had open. The client-specific file object representing that address or control channel no longer exists.