<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 5.5.2654.45">
<TITLE>RE: [Openib-windows] [RFC] changing kernel complib to be static library</TITLE>
</HEAD>
<BODY>

<P><FONT SIZE=2>i don't like the idea.</FONT>
<BR><FONT SIZE=2>Windows' kernel consists of DLLs and they change it with service packs anyway ...</FONT>
<BR><FONT SIZE=2>And what about IBAL.sys - it is also used now by several components ?</FONT>
</P>

<P><FONT SIZE=2>Using a static library can bring us to kind of "DLL mess" problem, when each driver works with its own version of COMPLIB and a bug, fixed in one version, continues to be present in others.</FONT></P>

<P><FONT SIZE=2>May be we can use another solutions, say:</FONT>
<BR>        <FONT SIZE=2>- add versioning to COMPLIB , so a new HCA driver will fail loading upon unappropriate COMPLIB version;</FONT>
<BR>        <FONT SIZE=2>- add checking of build_types of the components (also on startup);</FONT>
<BR>        <FONT SIZE=2>- (the worst case) to copy all the files to system\drivers upon driver update and require reboot! :(</FONT>
</P>
<BR>

<P><FONT SIZE=2>-----Original Message-----</FONT>
<BR><FONT SIZE=2>From: Fab Tillier [<A HREF="mailto:ftillier@silverstorm.com">mailto:ftillier@silverstorm.com</A>]</FONT>
<BR><FONT SIZE=2>Sent: Tuesday, July 12, 2005 11:32 PM</FONT>
<BR><FONT SIZE=2>To: openib-windows@openib.org</FONT>
<BR><FONT SIZE=2>Subject: [Openib-windows] [RFC] changing kernel complib to be static</FONT>
<BR><FONT SIZE=2>library</FONT>
</P>
<BR>

<P><FONT SIZE=2>Folks,</FONT>
</P>

<P><FONT SIZE=2>Currently, the kernel level component library driver is a kernel DLL.  This</FONT>
<BR><FONT SIZE=2>places a few restrictions on the user:</FONT>
</P>

<P><FONT SIZE=2>1. All kernel drivers must be of the same build type as complib.  Unmatched</FONT>
<BR><FONT SIZE=2>drivers can put the system in a state where it crashes on boot, and safe mode</FONT>
<BR><FONT SIZE=2>doesn't always help.  Recovering from this is really difficult, and it's almost</FONT>
<BR><FONT SIZE=2>easier to just re-install the system (yes, that's how bad this is).</FONT>
</P>

<P><FONT SIZE=2>2. Driver updates don't always properly track DLL dependencies, so updating the</FONT>
<BR><FONT SIZE=2>complib DLL might not take effect, resulting in odd behavior.  Say someone</FONT>
<BR><FONT SIZE=2>updates the HCA driver, which installs a new version of complib driver to disk.</FONT>
<BR><FONT SIZE=2>If there are any existing drivers loaded with a dependency on complib, the</FONT>
<BR><FONT SIZE=2>complib driver won't be unloaded.  When the HCA driver starts, it will end up</FONT>
<BR><FONT SIZE=2>using the existing complib driver, not the updated one.  This could be messy,</FONT>
<BR><FONT SIZE=2>depending on the update to complib.</FONT>
</P>

<P><FONT SIZE=2>The fix for this is to make complib a static library, but the result is larger</FONT>
<BR><FONT SIZE=2>binary footprint (1% total, but up to 50% for some drivers for release builds),</FONT>
<BR><FONT SIZE=2>and likely a larger memory footprint due to things being duplicated.  This is</FONT>
<BR><FONT SIZE=2>exacerbated in debug builds, where debug code is duplicated in each driver (e.g.</FONT>
<BR><FONT SIZE=2>the memory tracker).</FONT>
</P>

<P><FONT SIZE=2>Lastly, changing to a static library requires changing drivers to explicitly</FONT>
<BR><FONT SIZE=2>initialize and cleanup global complib stuff (like the memory tracker and object</FONT>
<BR><FONT SIZE=2>manager).</FONT>
</P>

<P><FONT SIZE=2>Below is a patch that does this.  Please let me know if this seems worthwhile,</FONT>
<BR><FONT SIZE=2>and if so, if there are any issues or improvements.</FONT>
</P>

<P><FONT SIZE=2>Thanks,</FONT>
</P>

<P><FONT SIZE=2>- Fab</FONT>
</P>

<P><FONT SIZE=2>Index: ulp/ipoib/kernel/SOURCES</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- ulp/ipoib/kernel/SOURCES    (revision 36)</FONT>
<BR><FONT SIZE=2>+++ ulp/ipoib/kernel/SOURCES    (working copy)</FONT>
<BR><FONT SIZE=2>@@ -11,7 +11,7 @@</FONT>
<BR><FONT SIZE=2> INCLUDES=..;..\..\..\inc;..\..\..\inc\kernel;</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> C_DEFINES=$(C_DEFINES) -DNDIS_MINIPORT_DRIVER -DNDIS_WDM=1 \</FONT>
<BR><FONT SIZE=2>-       -DDEPRECATE_DDK_FUNCTIONS -DNDIS51_MINIPORT</FONT>
<BR><FONT SIZE=2>+       -DDEPRECATE_DDK_FUNCTIONS -DNDIS51_MINIPORT -DNEED_CL_OBJ</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> TARGETLIBS= \</FONT>
<BR><FONT SIZE=2>        $(TARGETPATH)\*\complib.lib \</FONT>
<BR><FONT SIZE=2>Index: ulp/ipoib/kernel/ipoib_adapter.c</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- ulp/ipoib/kernel/ipoib_adapter.c    (revision 36)</FONT>
<BR><FONT SIZE=2>+++ ulp/ipoib/kernel/ipoib_adapter.c    (working copy)</FONT>
<BR><FONT SIZE=2>@@ -129,9 +129,17 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        IPOIB_ENTER( IPOIB_DBG_INIT );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       if( !NT_SUCCESS( CL_INIT ) )</FONT>
<BR><FONT SIZE=2>+       {</FONT>
<BR><FONT SIZE=2>+               IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR,</FONT>
<BR><FONT SIZE=2>+                       ("cl_init failed.\n") );</FONT>
<BR><FONT SIZE=2>+               return IB_ERROR;</FONT>
<BR><FONT SIZE=2>+       }</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        p_adapter = cl_zalloc( sizeof(ipoib_adapter_t) );</FONT>
<BR><FONT SIZE=2>        if( !p_adapter )</FONT>
<BR><FONT SIZE=2>        {</FONT>
<BR><FONT SIZE=2>+               CL_DEINIT;</FONT>
<BR><FONT SIZE=2>                IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, </FONT>
<BR><FONT SIZE=2>                        ("Failed to allocate ipoib_adapter_t (%d bytes)",</FONT>
<BR><FONT SIZE=2>                        sizeof(ipoib_adapter_t)) );</FONT>
<BR><FONT SIZE=2>@@ -455,6 +463,8 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        cl_free( p_adapter );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       CL_DEINIT;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        IPOIB_EXIT( IPOIB_DBG_INIT );</FONT>
<BR><FONT SIZE=2> }</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>Index: ulp/ipoib/kernel/ipoib.rc</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- ulp/ipoib/kernel/ipoib.rc   (revision 40)</FONT>
<BR><FONT SIZE=2>+++ ulp/ipoib/kernel/ipoib.rc   (working copy)</FONT>
<BR><FONT SIZE=2>@@ -26,7 +26,7 @@</FONT>
<BR><FONT SIZE=2>  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE</FONT>
<BR><FONT SIZE=2>  * SOFTWARE.</FONT>
<BR><FONT SIZE=2>  *</FONT>
<BR><FONT SIZE=2>- * $Id$</FONT>
<BR><FONT SIZE=2>+ * $Id: ipoib.rc 1.13 05/07/12 10:46:54-07:00 ftillier@orbuild.infiniconsys.com</FONT>
<BR><FONT SIZE=2>$</FONT>
<BR><FONT SIZE=2>  */</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>Index: ulp/ipoib/kernel/ipoib_driver.c</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- ulp/ipoib/kernel/ipoib_driver.c     (revision 36)</FONT>
<BR><FONT SIZE=2>+++ ulp/ipoib/kernel/ipoib_driver.c     (working copy)</FONT>
<BR><FONT SIZE=2>@@ -516,6 +516,7 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        if( medium_index == medium_array_size ) /* Never found it */</FONT>
<BR><FONT SIZE=2>        {</FONT>
<BR><FONT SIZE=2>+               CL_DEINIT;</FONT>
<BR><FONT SIZE=2>                IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("No supported media.\n") );</FONT>
<BR><FONT SIZE=2>                return NDIS_STATUS_UNSUPPORTED_MEDIA;</FONT>
<BR><FONT SIZE=2>        }</FONT>
<BR><FONT SIZE=2>Index: ulp/srp/kernel/SOURCES</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- ulp/srp/kernel/SOURCES      (revision 36)</FONT>
<BR><FONT SIZE=2>+++ ulp/srp/kernel/SOURCES      (working copy)</FONT>
<BR><FONT SIZE=2>@@ -16,9 +16,10 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> !if defined(DDK_TARGET_OS) && "$(DDK_TARGET_OS)"=="WinXP"</FONT>
<BR><FONT SIZE=2> # storport.h in WinXP DDK already have "..._ALIASES" definition</FONT>
<BR><FONT SIZE=2>-C_DEFINES=$(C_DEFINES) -DDEPRECATE_DDK_FUNCTIONS -DWinXP</FONT>
<BR><FONT SIZE=2>+C_DEFINES=$(C_DEFINES) -DDEPRECATE_DDK_FUNCTIONS -DWinXP -DNEED_CL_OBJ</FONT>
<BR><FONT SIZE=2> !else</FONT>
<BR><FONT SIZE=2>-C_DEFINES=$(C_DEFINES) -DDEPRECATE_DDK_FUNCTIONS -DSTOR_USE_SCSI_ALIASES</FONT>
<BR><FONT SIZE=2>+C_DEFINES=$(C_DEFINES) -DDEPRECATE_DDK_FUNCTIONS -DSTOR_USE_SCSI_ALIASES \</FONT>
<BR><FONT SIZE=2>+       -DNEED_CL_OBJ</FONT>
<BR><FONT SIZE=2> !endif</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> TARGETLIBS= \</FONT>
<BR><FONT SIZE=2>Index: ulp/srp/kernel/srp_driver.c</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- ulp/srp/kernel/srp_driver.c (revision 36)</FONT>
<BR><FONT SIZE=2>+++ ulp/srp/kernel/srp_driver.c (working copy)</FONT>
<BR><FONT SIZE=2>@@ -204,12 +204,20 @@</FONT>
<BR><FONT SIZE=2>        IN              DRIVER_OBJECT               *p_drv_obj,</FONT>
<BR><FONT SIZE=2>        IN              UNICODE_STRING              *p_registry_path )</FONT>
<BR><FONT SIZE=2> {</FONT>
<BR><FONT SIZE=2>-       ULONG                       status =</FONT>
<BR><FONT SIZE=2>(ULONG)STATUS_INSUFFICIENT_RESOURCES;</FONT>
<BR><FONT SIZE=2>+       ULONG                       status;</FONT>
<BR><FONT SIZE=2>        HW_INITIALIZATION_DATA      hw_data;</FONT>
<BR><FONT SIZE=2>        cl_status_t                 cl_status;</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        SRP_ENTER( SRP_DBG_PNP );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       status = CL_INIT;</FONT>
<BR><FONT SIZE=2>+       if( !NT_SUCCESS(status) )</FONT>
<BR><FONT SIZE=2>+       {</FONT>
<BR><FONT SIZE=2>+               SRP_TRACE_EXIT( SRP_DBG_ERROR,</FONT>
<BR><FONT SIZE=2>+                       ("cl_init returned %08X.\n", status) );</FONT>
<BR><FONT SIZE=2>+               return status;</FONT>
<BR><FONT SIZE=2>+       }</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        gp_drv_obj = p_drv_obj;</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        cl_obj_construct( &g_drv_obj, SRP_OBJ_TYPE_DRV );</FONT>
<BR><FONT SIZE=2>@@ -271,10 +279,16 @@</FONT>
<BR><FONT SIZE=2>                }</FONT>
<BR><FONT SIZE=2>                else</FONT>
<BR><FONT SIZE=2>                {</FONT>
<BR><FONT SIZE=2>+                       CL_DEINIT;</FONT>
<BR><FONT SIZE=2>                        SRP_TRACE( SRP_DBG_ERROR,</FONT>
<BR><FONT SIZE=2>                                ("StorPortInitialize returned 0x%x.\n", status)</FONT>
<BR><FONT SIZE=2>);</FONT>
<BR><FONT SIZE=2>                }</FONT>
<BR><FONT SIZE=2>        }</FONT>
<BR><FONT SIZE=2>+       else</FONT>
<BR><FONT SIZE=2>+       {</FONT>
<BR><FONT SIZE=2>+               CL_DEINIT;</FONT>
<BR><FONT SIZE=2>+               status = (ULONG)STATUS_INSUFFICIENT_RESOURCES;</FONT>
<BR><FONT SIZE=2>+       }</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        SRP_TRACE_EXIT( SRP_DBG_PNP, ("DriverEntry returning status of 0x%x.\n",</FONT>
<BR><FONT SIZE=2>status) );</FONT>
<BR><FONT SIZE=2>        return status;</FONT>
<BR><FONT SIZE=2>@@ -291,6 +305,8 @@</FONT>
<BR><FONT SIZE=2>        SRP_TRACE( SRP_DBG_VERBOSE, ("Driver Object ref_cnt = %d\n",</FONT>
<BR><FONT SIZE=2>g_drv_obj.ref_cnt) );</FONT>
<BR><FONT SIZE=2>        cl_obj_destroy( &g_drv_obj );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       CL_DEINIT;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        /* Invoke the port driver's unload routine. */</FONT>
<BR><FONT SIZE=2>        SRP_TRACE( SRP_DBG_DEBUG, ("Invoking the port driver's unload</FONT>
<BR><FONT SIZE=2>routine.\n") );</FONT>
<BR><FONT SIZE=2>        gpfn_unload( p_drv_obj );</FONT>
<BR><FONT SIZE=2>Index: tests/alts/kernel/alts_driver.c</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- tests/alts/kernel/alts_driver.c     (revision 36)</FONT>
<BR><FONT SIZE=2>+++ tests/alts/kernel/alts_driver.c     (working copy)</FONT>
<BR><FONT SIZE=2>@@ -133,6 +133,7 @@</FONT>
<BR><FONT SIZE=2>        IN                              PDRIVER_OBJECT</FONT>
<BR><FONT SIZE=2>p_driver_obj,</FONT>
<BR><FONT SIZE=2>        IN                              PUNICODE_STRING</FONT>
<BR><FONT SIZE=2>p_registry_path )</FONT>
<BR><FONT SIZE=2> {</FONT>
<BR><FONT SIZE=2>+       NTSTATUS                        status;</FONT>
<BR><FONT SIZE=2> #ifdef _DEBUG_</FONT>
<BR><FONT SIZE=2>        static boolean_t        exit = FALSE;</FONT>
<BR><FONT SIZE=2> #endif</FONT>
<BR><FONT SIZE=2>@@ -150,6 +151,14 @@</FONT>
<BR><FONT SIZE=2>        }</FONT>
<BR><FONT SIZE=2> #endif</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       status = CL_INIT;</FONT>
<BR><FONT SIZE=2>+       if( !NT_SUCCESS(status) )</FONT>
<BR><FONT SIZE=2>+       {</FONT>
<BR><FONT SIZE=2>+               ALTS_TRACE_EXIT( ALTS_DBG_ERROR,</FONT>
<BR><FONT SIZE=2>+                       ("cl_init returned %08X.\n", status) );</FONT>
<BR><FONT SIZE=2>+               return status;</FONT>
<BR><FONT SIZE=2>+       }</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        p_driver_obj->MajorFunction[IRP_MJ_PNP] = cl_pnp;</FONT>
<BR><FONT SIZE=2>        p_driver_obj->MajorFunction[IRP_MJ_POWER] = cl_power;</FONT>
<BR><FONT SIZE=2> //     p_driver_obj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = alts_ioctl;</FONT>
<BR><FONT SIZE=2>@@ -170,6 +179,8 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        UNUSED_PARAM( p_driver_obj );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       CL_DEINIT;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        ALTS_EXIT( ALTS_DBG_DEV );</FONT>
<BR><FONT SIZE=2> }</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>Index: core/complib/kernel/SOURCES</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- core/complib/kernel/SOURCES (revision 36)</FONT>
<BR><FONT SIZE=2>+++ core/complib/kernel/SOURCES (working copy)</FONT>
<BR><FONT SIZE=2>@@ -1,6 +1,6 @@</FONT>
<BR><FONT SIZE=2> TARGETNAME=complib</FONT>
<BR><FONT SIZE=2> TARGETPATH=..\..\..\bin\kernel\obj$(BUILD_ALT_DIR)</FONT>
<BR><FONT SIZE=2>-TARGETTYPE=EXPORT_DRIVER</FONT>
<BR><FONT SIZE=2>+TARGETTYPE=DRIVER_LIBRARY</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> DLLDEF=cl_exports.def</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>Index: core/complib/kernel/cl_driver.c</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- core/complib/kernel/cl_driver.c     (revision 36)</FONT>
<BR><FONT SIZE=2>+++ core/complib/kernel/cl_driver.c     (working copy)</FONT>
<BR><FONT SIZE=2>@@ -33,43 +33,45 @@</FONT>
<BR><FONT SIZE=2> #include "complib/comp_lib.h"</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>-NTSTATUS </FONT>
<BR><FONT SIZE=2>-DriverEntry( </FONT>
<BR><FONT SIZE=2>-       IN                              DRIVER_OBJECT</FONT>
<BR><FONT SIZE=2>*pDevObj, </FONT>
<BR><FONT SIZE=2>-    IN                         UNICODE_STRING</FONT>
<BR><FONT SIZE=2>*RegistryPath )</FONT>
<BR><FONT SIZE=2>-{</FONT>
<BR><FONT SIZE=2>-       UNUSED_PARAM( pDevObj );</FONT>
<BR><FONT SIZE=2>-       UNUSED_PARAM( RegistryPath );</FONT>
<BR><FONT SIZE=2>-       return STATUS_SUCCESS;</FONT>
<BR><FONT SIZE=2>-}</FONT>
<BR><FONT SIZE=2>+//</FONT>
<BR><FONT SIZE=2>+//</FONT>
<BR><FONT SIZE=2>+//NTSTATUS </FONT>
<BR><FONT SIZE=2>+//DriverEntry( </FONT>
<BR><FONT SIZE=2>+//     IN                              DRIVER_OBJECT</FONT>
<BR><FONT SIZE=2>*pDevObj, </FONT>
<BR><FONT SIZE=2>+//    IN                               UNICODE_STRING</FONT>
<BR><FONT SIZE=2>*RegistryPath )</FONT>
<BR><FONT SIZE=2>+//{</FONT>
<BR><FONT SIZE=2>+//     UNUSED_PARAM( pDevObj );</FONT>
<BR><FONT SIZE=2>+//     UNUSED_PARAM( RegistryPath );</FONT>
<BR><FONT SIZE=2>+//     return STATUS_SUCCESS;</FONT>
<BR><FONT SIZE=2>+//}</FONT>
<BR><FONT SIZE=2>+//</FONT>
<BR><FONT SIZE=2>+//</FONT>
<BR><FONT SIZE=2>+//NTSTATUS</FONT>
<BR><FONT SIZE=2>+//DllInitialize(</FONT>
<BR><FONT SIZE=2>+//     IN                              UNICODE_STRING</FONT>
<BR><FONT SIZE=2>*RegistryPath )</FONT>
<BR><FONT SIZE=2>+//{</FONT>
<BR><FONT SIZE=2>+//     cl_status_t             status;</FONT>
<BR><FONT SIZE=2>+//     UNUSED_PARAM( RegistryPath );</FONT>
<BR><FONT SIZE=2>+//</FONT>
<BR><FONT SIZE=2>+//     __cl_mem_track( TRUE );</FONT>
<BR><FONT SIZE=2>+//</FONT>
<BR><FONT SIZE=2>+//     status = cl_obj_mgr_create();</FONT>
<BR><FONT SIZE=2>+//</FONT>
<BR><FONT SIZE=2>+//     return cl_to_ntstatus( status );</FONT>
<BR><FONT SIZE=2>+//}</FONT>
<BR><FONT SIZE=2>+//</FONT>
<BR><FONT SIZE=2>+//</FONT>
<BR><FONT SIZE=2>+//NTSTATUS</FONT>
<BR><FONT SIZE=2>+//DllUnload(void)</FONT>
<BR><FONT SIZE=2>+//{</FONT>
<BR><FONT SIZE=2>+//     cl_obj_mgr_destroy();</FONT>
<BR><FONT SIZE=2>+//</FONT>
<BR><FONT SIZE=2>+//     __cl_mem_track( FALSE );</FONT>
<BR><FONT SIZE=2>+//</FONT>
<BR><FONT SIZE=2>+//     return STATUS_SUCCESS;</FONT>
<BR><FONT SIZE=2>+//}</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>-NTSTATUS</FONT>
<BR><FONT SIZE=2>-DllInitialize(</FONT>
<BR><FONT SIZE=2>-       IN                              UNICODE_STRING</FONT>
<BR><FONT SIZE=2>*RegistryPath )</FONT>
<BR><FONT SIZE=2>-{</FONT>
<BR><FONT SIZE=2>-       cl_status_t             status;</FONT>
<BR><FONT SIZE=2>-       UNUSED_PARAM( RegistryPath );</FONT>
<BR><FONT SIZE=2>-</FONT>
<BR><FONT SIZE=2>-       __cl_mem_track( TRUE );</FONT>
<BR><FONT SIZE=2>-</FONT>
<BR><FONT SIZE=2>-       status = cl_obj_mgr_create();</FONT>
<BR><FONT SIZE=2>-</FONT>
<BR><FONT SIZE=2>-       return cl_to_ntstatus( status );</FONT>
<BR><FONT SIZE=2>-}</FONT>
<BR><FONT SIZE=2>-</FONT>
<BR><FONT SIZE=2>-</FONT>
<BR><FONT SIZE=2>-NTSTATUS</FONT>
<BR><FONT SIZE=2>-DllUnload(void)</FONT>
<BR><FONT SIZE=2>-{</FONT>
<BR><FONT SIZE=2>-       cl_obj_mgr_destroy();</FONT>
<BR><FONT SIZE=2>-</FONT>
<BR><FONT SIZE=2>-       __cl_mem_track( FALSE );</FONT>
<BR><FONT SIZE=2>-</FONT>
<BR><FONT SIZE=2>-       return STATUS_SUCCESS;</FONT>
<BR><FONT SIZE=2>-}</FONT>
<BR><FONT SIZE=2>-</FONT>
<BR><FONT SIZE=2>-</FONT>
<BR><FONT SIZE=2> CL_EXPORT NTSTATUS</FONT>
<BR><FONT SIZE=2> cl_to_ntstatus(</FONT>
<BR><FONT SIZE=2>        IN      cl_status_t     status )</FONT>
<BR><FONT SIZE=2>Index: core/complib/cl_memory.c</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- core/complib/cl_memory.c    (revision 36)</FONT>
<BR><FONT SIZE=2>+++ core/complib/cl_memory.c    (working copy)</FONT>
<BR><FONT SIZE=2>@@ -42,9 +42,11 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> #include "cl_memtrack.h"</FONT>
<BR><FONT SIZE=2>+#include <complib/cl_atomic.h></FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> cl_mem_tracker_t               *gp_mem_tracker = NULL;</FONT>
<BR><FONT SIZE=2>+atomic32_t                             g_mem_trk_ref = 0;</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> /*</FONT>
<BR><FONT SIZE=2>@@ -73,7 +75,10 @@</FONT>
<BR><FONT SIZE=2>        cl_status_t                     status;</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        if( gp_mem_tracker )</FONT>
<BR><FONT SIZE=2>+       {</FONT>
<BR><FONT SIZE=2>+               cl_atomic_inc( &g_mem_trk_ref );</FONT>
<BR><FONT SIZE=2>                return;</FONT>
<BR><FONT SIZE=2>+       }</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        /* Allocate the memory tracker object. */</FONT>
<BR><FONT SIZE=2>        gp_mem_tracker = (cl_mem_tracker_t*)</FONT>
<BR><FONT SIZE=2>@@ -112,6 +117,9 @@</FONT>
<BR><FONT SIZE=2>        if( !gp_mem_tracker )</FONT>
<BR><FONT SIZE=2>                return;</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       if( cl_atomic_dec( &g_mem_trk_ref ) )</FONT>
<BR><FONT SIZE=2>+               return;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        if( cl_qmap_count( &gp_mem_tracker->alloc_map ) )</FONT>
<BR><FONT SIZE=2>        {</FONT>
<BR><FONT SIZE=2>                /* There are still items in the list.  Print them out. */</FONT>
<BR><FONT SIZE=2>Index: core/complib/cl_obj.c</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- core/complib/cl_obj.c       (revision 36)</FONT>
<BR><FONT SIZE=2>+++ core/complib/cl_obj.c       (working copy)</FONT>
<BR><FONT SIZE=2>@@ -43,6 +43,7 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> /* The global object manager. */</FONT>
<BR><FONT SIZE=2> cl_obj_mgr_t                           *gp_obj_mgr = NULL;</FONT>
<BR><FONT SIZE=2>+atomic32_t                                     g_cl_obj_ref = 0;</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>@@ -57,7 +58,10 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        /* See if the object manager has already been created. */</FONT>
<BR><FONT SIZE=2>        if( gp_obj_mgr )</FONT>
<BR><FONT SIZE=2>+       {</FONT>
<BR><FONT SIZE=2>+               cl_atomic_inc( &g_cl_obj_ref );</FONT>
<BR><FONT SIZE=2>                return CL_SUCCESS;</FONT>
<BR><FONT SIZE=2>+       }</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        /* Allocate the object manager. */</FONT>
<BR><FONT SIZE=2>        gp_obj_mgr = cl_zalloc( sizeof( cl_obj_mgr_t ) );</FONT>
<BR><FONT SIZE=2>@@ -70,6 +74,8 @@</FONT>
<BR><FONT SIZE=2>        cl_async_proc_construct( &gp_obj_mgr->async_proc_mgr );</FONT>
<BR><FONT SIZE=2>        cl_qpool_construct( &gp_obj_mgr->rel_pool );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       cl_atomic_inc( &g_cl_obj_ref );</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        /* Initialize the spinlock. */</FONT>
<BR><FONT SIZE=2>        status = cl_spinlock_init( &gp_obj_mgr->lock );</FONT>
<BR><FONT SIZE=2>        if( status != CL_SUCCESS )</FONT>
<BR><FONT SIZE=2>@@ -110,6 +116,10 @@</FONT>
<BR><FONT SIZE=2>        if( !gp_obj_mgr )</FONT>
<BR><FONT SIZE=2>                return;</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       /* See if this is the last call. */</FONT>
<BR><FONT SIZE=2>+       if( cl_atomic_dec( &g_cl_obj_ref ) )</FONT>
<BR><FONT SIZE=2>+               return;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        /* Verify that all object's have been destroyed. */</FONT>
<BR><FONT SIZE=2>        for( p_list_item = cl_qlist_head( &gp_obj_mgr->obj_list );</FONT>
<BR><FONT SIZE=2>                 p_list_item != cl_qlist_end( &gp_obj_mgr->obj_list );</FONT>
<BR><FONT SIZE=2>Index: core/bus/kernel/bus_driver.c</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- core/bus/kernel/bus_driver.c        (revision 36)</FONT>
<BR><FONT SIZE=2>+++ core/bus/kernel/bus_driver.c        (working copy)</FONT>
<BR><FONT SIZE=2>@@ -327,6 +327,8 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        UNUSED_PARAM( p_driver_obj );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       CL_DEINIT;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        BUS_EXIT( BUS_DBG_DRV );</FONT>
<BR><FONT SIZE=2> }</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>@@ -340,6 +342,14 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        BUS_ENTER( BUS_DBG_DRV );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       status = CL_INIT;</FONT>
<BR><FONT SIZE=2>+       if( !NT_SUCCESS(status) )</FONT>
<BR><FONT SIZE=2>+       {</FONT>
<BR><FONT SIZE=2>+               BUS_TRACE_EXIT( BUS_DBG_ERROR,</FONT>
<BR><FONT SIZE=2>+                       ("cl_init returned %08X.\n", status) );</FONT>
<BR><FONT SIZE=2>+               return status;</FONT>
<BR><FONT SIZE=2>+       }</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        /* Store the driver object pointer in the global parameters. */</FONT>
<BR><FONT SIZE=2>        bus_globals.p_driver_obj = p_driver_obj;</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>@@ -347,6 +357,7 @@</FONT>
<BR><FONT SIZE=2>        status = __read_registry( p_registry_path );</FONT>
<BR><FONT SIZE=2>        if( !NT_SUCCESS(status) )</FONT>
<BR><FONT SIZE=2>        {</FONT>
<BR><FONT SIZE=2>+               CL_DEINIT;</FONT>
<BR><FONT SIZE=2>                BUS_TRACE_EXIT( BUS_DBG_ERROR, </FONT>
<BR><FONT SIZE=2>                        ("__read_registry returned %08x.\n", status) );</FONT>
<BR><FONT SIZE=2>                return status;</FONT>
<BR><FONT SIZE=2>Index: core/al/kernel/al_driver.c</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- core/al/kernel/al_driver.c  (revision 36)</FONT>
<BR><FONT SIZE=2>+++ core/al/kernel/al_driver.c  (working copy)</FONT>
<BR><FONT SIZE=2>@@ -239,10 +239,19 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        AL_ENTER( AL_DBG_DEV );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       status = CL_INIT;</FONT>
<BR><FONT SIZE=2>+       if( !NT_SUCCESS(status) )</FONT>
<BR><FONT SIZE=2>+       {</FONT>
<BR><FONT SIZE=2>+               AL_TRACE_EXIT( AL_DBG_ERROR,</FONT>
<BR><FONT SIZE=2>+                       ("cl_init returned %08X.\n", status) );</FONT>
<BR><FONT SIZE=2>+               return status;</FONT>
<BR><FONT SIZE=2>+       }</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        /* Get the registry values. */</FONT>
<BR><FONT SIZE=2>        status = __read_registry( p_registry_path );</FONT>
<BR><FONT SIZE=2>        if( !NT_SUCCESS(status) )</FONT>
<BR><FONT SIZE=2>        {</FONT>
<BR><FONT SIZE=2>+               CL_DEINIT;</FONT>
<BR><FONT SIZE=2>                AL_TRACE_EXIT( AL_DBG_ERROR, </FONT>
<BR><FONT SIZE=2>                        ("__read_registry returned %08x.\n", status) );</FONT>
<BR><FONT SIZE=2>                return status;</FONT>
<BR><FONT SIZE=2>@@ -258,6 +267,8 @@</FONT>
<BR><FONT SIZE=2> {</FONT>
<BR><FONT SIZE=2>        AL_ENTER( AL_DBG_DEV );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       CL_DEINIT;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        AL_EXIT( AL_DBG_DEV );</FONT>
<BR><FONT SIZE=2>        return STATUS_SUCCESS;</FONT>
<BR><FONT SIZE=2> }</FONT>
<BR><FONT SIZE=2>Index: core/iou/kernel/iou_driver.c</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- core/iou/kernel/iou_driver.c        (revision 36)</FONT>
<BR><FONT SIZE=2>+++ core/iou/kernel/iou_driver.c        (working copy)</FONT>
<BR><FONT SIZE=2>@@ -188,6 +188,8 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        UNUSED_PARAM( p_driver_obj );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       CL_DEINIT;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        IOU_EXIT( IOU_DBG_DRV );</FONT>
<BR><FONT SIZE=2> }</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>@@ -201,6 +203,14 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        IOU_ENTER( IOU_DBG_DRV );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       status = CL_INIT;</FONT>
<BR><FONT SIZE=2>+       if( !NT_SUCCESS(status) )</FONT>
<BR><FONT SIZE=2>+       {</FONT>
<BR><FONT SIZE=2>+               IOU_TRACE_EXIT( IOU_DBG_ERROR,</FONT>
<BR><FONT SIZE=2>+                       ("cl_init returned %08X.\n", status) );</FONT>
<BR><FONT SIZE=2>+               return status;</FONT>
<BR><FONT SIZE=2>+       }</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        /* Store the driver object pointer in the global parameters. */</FONT>
<BR><FONT SIZE=2>        iou_globals.p_driver_obj = p_driver_obj;</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>@@ -208,6 +218,7 @@</FONT>
<BR><FONT SIZE=2>        status = __read_registry( p_registry_path );</FONT>
<BR><FONT SIZE=2>        if( !NT_SUCCESS(status) )</FONT>
<BR><FONT SIZE=2>        {</FONT>
<BR><FONT SIZE=2>+               CL_DEINIT;</FONT>
<BR><FONT SIZE=2>                IOU_TRACE_EXIT( IOU_DBG_ERROR, </FONT>
<BR><FONT SIZE=2>                        ("__read_registry returned %08x.\n", status) );</FONT>
<BR><FONT SIZE=2>                return status;</FONT>
<BR><FONT SIZE=2>@@ -220,6 +231,8 @@</FONT>
<BR><FONT SIZE=2>        p_driver_obj->DriverUnload = iou_unload;</FONT>
<BR><FONT SIZE=2>        p_driver_obj->DriverExtension->AddDevice = iou_add_device;</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       status = cl_to_ntstatus( cl_obj_mgr_create() );</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        IOU_EXIT( IOU_DBG_DRV );</FONT>
<BR><FONT SIZE=2>-       return STATUS_SUCCESS;</FONT>
<BR><FONT SIZE=2>+       return status;</FONT>
<BR><FONT SIZE=2> }</FONT>
<BR><FONT SIZE=2>Index: inc/kernel/complib/cl_types_osd.h</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- inc/kernel/complib/cl_types_osd.h   (revision 36)</FONT>
<BR><FONT SIZE=2>+++ inc/kernel/complib/cl_types_osd.h   (working copy)</FONT>
<BR><FONT SIZE=2>@@ -46,6 +46,9 @@</FONT>
<BR><FONT SIZE=2> #include <wdmwarn4.h></FONT>
<BR><FONT SIZE=2> #if defined( NDIS_MINIPORT_DRIVER )</FONT>
<BR><FONT SIZE=2> #include <ndis.h></FONT>
<BR><FONT SIZE=2>+#if NDIS_WDM</FONT>
<BR><FONT SIZE=2>+#define CL_NTDDK</FONT>
<BR><FONT SIZE=2>+#endif /* NDIS_WDM */</FONT>
<BR><FONT SIZE=2> #elif !defined( _MINIPORT_ )</FONT>
<BR><FONT SIZE=2> #include <ntddk.h></FONT>
<BR><FONT SIZE=2> #define CL_NTDDK</FONT>
<BR><FONT SIZE=2>@@ -93,11 +96,7 @@</FONT>
<BR><FONT SIZE=2> #define UNUSED_PARAM   UNREFERENCED_PARAMETER</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>-#if !defined(EXPORT_CL_SYMBOLS)</FONT>
<BR><FONT SIZE=2>-#define CL_EXPORT              DECLSPEC_IMPORT</FONT>
<BR><FONT SIZE=2>-#else</FONT>
<BR><FONT SIZE=2>-#define CL_EXPORT              __declspec(dllexport)</FONT>
<BR><FONT SIZE=2>-#endif</FONT>
<BR><FONT SIZE=2>+#define CL_EXPORT</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> #if !defined( __cplusplus )</FONT>
<BR><FONT SIZE=2> #define inline                 __inline</FONT>
<BR><FONT SIZE=2>@@ -119,15 +118,33 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> #define CL_CONST64( x )        x##ui64</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>-CL_INLINE NTSTATUS</FONT>
<BR><FONT SIZE=2>+NTSTATUS</FONT>
<BR><FONT SIZE=2> cl_to_ntstatus(</FONT>
<BR><FONT SIZE=2>        IN      enum _cl_status status );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>-CL_INLINE enum _cl_status</FONT>
<BR><FONT SIZE=2>+enum _cl_status</FONT>
<BR><FONT SIZE=2> cl_from_ntstatus(</FONT>
<BR><FONT SIZE=2>        IN      NTSTATUS status );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+#ifdef MEM_TRACK_ON</FONT>
<BR><FONT SIZE=2>+#ifdef NEED_CL_OBJ</FONT>
<BR><FONT SIZE=2>+#define CL_INIT                __cl_mem_track( TRUE ), cl_obj_mgr_create()</FONT>
<BR><FONT SIZE=2>+#define CL_DEINIT      cl_obj_mgr_destroy(), __cl_mem_track( FALSE )</FONT>
<BR><FONT SIZE=2>+#else</FONT>
<BR><FONT SIZE=2>+#endif /* NEED_CL_OBJ */</FONT>
<BR><FONT SIZE=2>+#define CL_INIT                __cl_mem_track( TRUE ), STATUS_SUCCESS</FONT>
<BR><FONT SIZE=2>+#define CL_DEINIT      __cl_mem_track( FALSE )</FONT>
<BR><FONT SIZE=2>+#else  /* MEM_TRACK_ON */</FONT>
<BR><FONT SIZE=2>+#ifdef NEED_CL_OBJ</FONT>
<BR><FONT SIZE=2>+#define CL_INIT                cl_obj_mgr_create()</FONT>
<BR><FONT SIZE=2>+#define CL_DEINIT      cl_obj_mgr_destroy()</FONT>
<BR><FONT SIZE=2>+#else</FONT>
<BR><FONT SIZE=2>+#define CL_INIT                STATUS_SUCCESS</FONT>
<BR><FONT SIZE=2>+#define CL_DEINIT</FONT>
<BR><FONT SIZE=2>+#endif /* NEED_CL_OBJ */</FONT>
<BR><FONT SIZE=2>+#endif /* MEM_TRACK_ON */</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2> #ifdef __cplusplus</FONT>
<BR><FONT SIZE=2> }      /* extern "C" */</FONT>
<BR><FONT SIZE=2> #endif</FONT>
<BR><FONT SIZE=2>Index: hw/mt23108/vapi/mlxsys/os_dep/win/tdriver/Md.c</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- hw/mt23108/vapi/mlxsys/os_dep/win/tdriver/Md.c      (revision 36)</FONT>
<BR><FONT SIZE=2>+++ hw/mt23108/vapi/mlxsys/os_dep/win/tdriver/Md.c      (working copy)</FONT>
<BR><FONT SIZE=2>@@ -255,6 +255,10 @@</FONT>
<BR><FONT SIZE=2>        /* no context yet */</FONT>
<BR><FONT SIZE=2>        g_pDrvContext = NULL;</FONT>
<BR><FONT SIZE=2>        </FONT>
<BR><FONT SIZE=2>+       l_Status = CL_INIT;</FONT>
<BR><FONT SIZE=2>+       if( !NT_SUCCESS(l_Status) )</FONT>
<BR><FONT SIZE=2>+               return l_Status;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        /* create Control Device names */</FONT>
<BR><FONT SIZE=2>        if (!MdCreateDeviceNames(MD_CTL_DEVICE_NAME, &l_usNtDeviceName,</FONT>
<BR><FONT SIZE=2>&l_usDosDeviceName))</FONT>
<BR><FONT SIZE=2>        { /* failed - no resources */</FONT>
<BR><FONT SIZE=2>@@ -410,6 +414,8 @@</FONT>
<BR><FONT SIZE=2>        MdKdPrint( DBGLVL_ALWAYS ,("(MdDeviceInit) Device failed to initialize</FONT>
<BR><FONT SIZE=2>\n"));</FONT>
<BR><FONT SIZE=2> #pragma warning( pop )</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       CL_DEINIT;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        /* Write to event log */</FONT>
<BR><FONT SIZE=2>        WriteEventLogEntry(     pi_pDriverObject, MD_EVENT_LOG_LOAD_ERROR,</FONT>
<BR><FONT SIZE=2>                        0, l_Status, 1, l_Status );</FONT>
<BR><FONT SIZE=2>@@ -565,6 +571,9 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        /* free the driver context */</FONT>
<BR><FONT SIZE=2>        MdExFreePool( l_pDrvContext );</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>+       CL_DEINIT;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        g_pDrvContext = NULL;</FONT>
<BR><FONT SIZE=2>        </FONT>
<BR><FONT SIZE=2>        MDASSERT( g_pDbgData->m_nExAllocCount == 0 );</FONT>
<BR><FONT SIZE=2>Index: hw/mt23108/kernel/hca_driver.c</FONT>
<BR><FONT SIZE=2>===================================================================</FONT>
<BR><FONT SIZE=2>--- hw/mt23108/kernel/hca_driver.c      (revision 36)</FONT>
<BR><FONT SIZE=2>+++ hw/mt23108/kernel/hca_driver.c      (working copy)</FONT>
<BR><FONT SIZE=2>@@ -267,9 +267,18 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        HCA_ENTER( HCA_DBG_DEV );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       status = CL_INIT;</FONT>
<BR><FONT SIZE=2>+       if( !NT_SUCCESS(status) )</FONT>
<BR><FONT SIZE=2>+       {</FONT>
<BR><FONT SIZE=2>+               HCA_TRACE_EXIT( HCA_DBG_ERROR,</FONT>
<BR><FONT SIZE=2>+                       ("cl_init returned %08X.\n", status) );</FONT>
<BR><FONT SIZE=2>+               return status;</FONT>
<BR><FONT SIZE=2>+       }</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        status = __read_registry( p_registry_path );</FONT>
<BR><FONT SIZE=2>        if( !NT_SUCCESS( status ) )</FONT>
<BR><FONT SIZE=2>        {</FONT>
<BR><FONT SIZE=2>+               CL_DEINIT;</FONT>
<BR><FONT SIZE=2>                HCA_TRACE_EXIT( HCA_DBG_ERROR,</FONT>
<BR><FONT SIZE=2>                        ("__read_registry_path returned 0x%X.\n", status) );</FONT>
<BR><FONT SIZE=2>                return status;</FONT>
<BR><FONT SIZE=2>@@ -279,6 +288,7 @@</FONT>
<BR><FONT SIZE=2>        cl_status = mlnx_hobs_init();</FONT>
<BR><FONT SIZE=2>        if( cl_status != CL_SUCCESS )</FONT>
<BR><FONT SIZE=2>        {</FONT>
<BR><FONT SIZE=2>+               CL_DEINIT;</FONT>
<BR><FONT SIZE=2>                HCA_TRACE_EXIT( HCA_DBG_ERROR,</FONT>
<BR><FONT SIZE=2>                        ("mlnx_hobs_init returned %s.\n",</FONT>
<BR><FONT SIZE=2>cl_status_text[cl_status]) );</FONT>
<BR><FONT SIZE=2>                return cl_to_ntstatus( cl_status );</FONT>
<BR><FONT SIZE=2>@@ -353,6 +363,8 @@</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>        UNUSED_PARAM( p_driver_obj );</FONT>
<BR><FONT SIZE=2> </FONT>
<BR><FONT SIZE=2>+       CL_DEINIT;</FONT>
<BR><FONT SIZE=2>+</FONT>
<BR><FONT SIZE=2>        HCA_EXIT( HCA_DBG_DEV );</FONT>
<BR><FONT SIZE=2> }</FONT>
</P>
<BR>

<P><FONT SIZE=2>_______________________________________________</FONT>
<BR><FONT SIZE=2>openib-windows mailing list</FONT>
<BR><FONT SIZE=2>openib-windows@openib.org</FONT>
<BR><FONT SIZE=2><A HREF="http://openib.org/mailman/listinfo/openib-windows" TARGET="_blank">http://openib.org/mailman/listinfo/openib-windows</A></FONT>
</P>

</BODY>
</HTML>