[libbus,driver,dummy] Don't thread the main bus
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Fri, 7 Jan 2011 06:50:16 +0000 (01:50 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Fri, 7 Jan 2011 14:33:33 +0000 (09:33 -0500)
commitbb6f3afd661b714d7df0b26697f3e032c6658c6d
treec9b2409b016e89e41b4e9ee266f68131f5845698
parent373af111ccdace848779afa87799447677e553ac
[libbus,driver,dummy] Don't thread the main bus

*sigh* There was a major problem with the strategy of
enqueueing all IRPs bound for the bus; one cannot return
STATUS_PENDING for just any IRP.

The symptom that led to this realization was: while
performing a driver update for the WinVBlock bus in
Device Manager, an IRP_MN_QUERY_ID was being sent
immediately after an IRP_MN_REMOVE_DEVICE.  This doesn't
appear to make sense until realizing that the PnP
manager most likely took the STATUS_PENDING for the
removal the wrong way; it assumed that the bus FDO would
still be attached for its next IRP, which was actually
intended to be bound for the PDO.

So we don't enqueue any IRPs for the bus any more.  One
of the original reasons for doing so was so that dummy
PDO child devices could be created by the thread.  So
this commit allows for an IOCTL to produce a dummy PDO,
which was on the to-do list, anyway.  The fun of that
is the potential to add arbitrary PDOs from user-land;
arbitrary in the sense of their reported IDs.  It will
be interesting to test the installation of non-existent
hardware and find out what IRPs their function drivers
send down.

The dummy ID generation macro(s) have been changed for
greater automation and aesthetic.  It creates an object
large enough to hold the dummy ID "header" as well as
the WCHAR string data, and initializes the object.  One
can qualify the object as 'const', even.  Quite nice.

Threading was decoupled from the bus library entirely.
One of the other reasons for their association was in
order to keep the list of children race-free.  So now
we have WvlBusLock() and WvlBusUnlock() functions to
assist with race-free iteration.
src/aoe/bus.c
src/aoe/driver.c
src/include/bus.h
src/include/driver.h
src/include/dummy.h
src/winvblock/bus.c
src/winvblock/driver.c
src/winvblock/dummy.c
src/winvblock/libbus/libbus.c
src/winvblock/libbus/pnp.c