Here’s a shorter version of the original explanation, reposted with agreement from DT staff.
Lots of people reacted violently to the original version without knowing the background of this
story or my motivations, and I don’t feel like explaining anything to them. In the end DT users
are more knowledgeable about the tool they use and the next DT version will be more robust than
it would have been without this post, and it’s all that matters.
Here’s a graphical overview of the main components of Daemon Tools (DT) :
daemon.exe -------------> daemon.dll ----------------> Lang\1033.dll funcs(1-15) |\---------------------> Plugins\Images\*.DLL |\---------------------> pfctoc.dll | | DeciceIOControl | V d344bus.sys <----> d344prt.sys
This program is located in the installation directory and is started automatically by
an entry in HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. It handles the
graphical interface of DT (tray icon) and takes care of the support functionalities
(helpfile, homepage, email) as well as the command line switches (lock, noicon, …),
which it saves in its own startup command line in the registry. However, the main role of
daemon.exe is to translate the options selected by the user into commands to daemon.dll.
This DLL is always stored in windows system directory and is loaded by daemon.exe.
It is responsible for opening and parsing the image files (using Plugins\Images*.DLL),
and providing language support (using Lang\1033.dll). On top of the officialy supported
image formats, DT also seem to be able to mount Simdisc2 (.sd2) and CDRwin (.cdr)
images, for which it uses pfctoc.dll. Furthermore, this DLL translates the requests received
by daemon.exe (through one of its 15 exported functions) into commands to the bus driver
This is the SCSI miniport driver, which is located in the driver subdirectory of
windows system directory, and which is started as a service by windows. As
a miniport driver, its only task is to initialize the SCSI port and to intercept
all the SCSI events to notify the bus driver. Only the minimum required
functions of a SCSI miniport driver are implemented, i.e. HwScsiInitialize,
HwScsiStartIo, HwScsiFindAdapter and HwScsiResetBus, which are forwarded
to the bus driver.
This is the bus driver, which is located in the same location as the port driver,
and which is also started as a service. This driver is the core of the emulation
tool. First it handles the new drive letter for both DOS and windows (via the mount
manager), then it receives commands from the DLL, events from the port driver
and reads data from the image. In version 3.44 this driver can emulate 50 SCSI
commands and handles them according to its configuration.
For instance, whenever a READ_CD command is sent to the virtual drive, first the
port driver receives a HwScsiStartIo->SRB_FUNCTION_EXECUTE_SCSI command, which it
forwards to the bus driver. There, the command is handled by the READ_CD (BEh)
code, based on the data contained in the image file and the Safedisc, Securom,
Laserlock and RMPS settings. Then the bus driver fills the buffer of the SRB
(SCSI Request Block) with these data, which go back to the port driver, then
to the OS and finally to the calling application.