MSI: refcount all objects, and use pointers internally

Mike McCormack mike at codeweavers.com
Fri Jul 9 14:18:29 CDT 2004


ChangeLog:
<aric at codeweavers.com>
<mike at codeweavers.com>
* refcount all objects, and use pointers internally
-------------- next part --------------
diff -ur dlls/msi.old/action.c dlls/msi/action.c
--- dlls/msi.old/action.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/action.c	2004-07-09 14:07:57.000000000 -0500
@@ -126,39 +126,39 @@
 /*
  * Prototypes
  */
-static UINT ACTION_ProcessExecSequence(MSIHANDLE hPackage, BOOL UIran);
-static UINT ACTION_ProcessUISequence(MSIHANDLE hPackage);
+static UINT ACTION_ProcessExecSequence(MSIPACKAGE *package, BOOL UIran);
+static UINT ACTION_ProcessUISequence(MSIPACKAGE *package);
 
-UINT ACTION_PerformAction(MSIHANDLE hPackage, const WCHAR *action);
+UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action);
 
-static UINT ACTION_LaunchConditions(MSIHANDLE hPackage);
-static UINT ACTION_CostInitialize(MSIHANDLE hPackage);
-static UINT ACTION_CreateFolders(MSIHANDLE hPackage);
-static UINT ACTION_CostFinalize(MSIHANDLE hPackage);
-static UINT ACTION_FileCost(MSIHANDLE hPackage);
-static UINT ACTION_InstallFiles(MSIHANDLE hPackage);
-static UINT ACTION_DuplicateFiles(MSIHANDLE hPackage);
-static UINT ACTION_WriteRegistryValues(MSIHANDLE hPackage);
-static UINT ACTION_CustomAction(MSIHANDLE hPackage,const WCHAR *action);
-static UINT ACTION_InstallInitialize(MSIHANDLE hPackage);
-static UINT ACTION_InstallValidate(MSIHANDLE hPackage);
-static UINT ACTION_ProcessComponents(MSIHANDLE hPackage);
-static UINT ACTION_RegisterTypeLibraries(MSIHANDLE hPackage);
-static UINT ACTION_RegisterClassInfo(MSIHANDLE hPackage);
-static UINT ACTION_RegisterProgIdInfo(MSIHANDLE hPackage);
-static UINT ACTION_CreateShortcuts(MSIHANDLE hPackage);
-static UINT ACTION_PublishProduct(MSIHANDLE hPackage);
+static UINT ACTION_LaunchConditions(MSIPACKAGE *package);
+static UINT ACTION_CostInitialize(MSIPACKAGE *package);
+static UINT ACTION_CreateFolders(MSIPACKAGE *package);
+static UINT ACTION_CostFinalize(MSIPACKAGE *package);
+static UINT ACTION_FileCost(MSIPACKAGE *package);
+static UINT ACTION_InstallFiles(MSIPACKAGE *package);
+static UINT ACTION_DuplicateFiles(MSIPACKAGE *package);
+static UINT ACTION_WriteRegistryValues(MSIPACKAGE *package);
+static UINT ACTION_CustomAction(MSIPACKAGE *package,const WCHAR *action);
+static UINT ACTION_InstallInitialize(MSIPACKAGE *package);
+static UINT ACTION_InstallValidate(MSIPACKAGE *package);
+static UINT ACTION_ProcessComponents(MSIPACKAGE *package);
+static UINT ACTION_RegisterTypeLibraries(MSIPACKAGE *package);
+static UINT ACTION_RegisterClassInfo(MSIPACKAGE *package);
+static UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package);
+static UINT ACTION_CreateShortcuts(MSIPACKAGE *package);
+static UINT ACTION_PublishProduct(MSIPACKAGE *package);
 
-static UINT HANDLE_CustomType1(MSIHANDLE hPackage, const LPWSTR source, 
+static UINT HANDLE_CustomType1(MSIPACKAGE *package, const LPWSTR source, 
                                 const LPWSTR target, const INT type);
-static UINT HANDLE_CustomType2(MSIHANDLE hPackage, const LPWSTR source, 
+static UINT HANDLE_CustomType2(MSIPACKAGE *package, const LPWSTR source, 
                                 const LPWSTR target, const INT type);
 
-static DWORD deformat_string(MSIHANDLE hPackage, WCHAR* ptr,WCHAR** data);
-static UINT resolve_folder(MSIHANDLE hPackage, LPCWSTR name, LPWSTR path, 
+static DWORD deformat_string(MSIPACKAGE *package, WCHAR* ptr,WCHAR** data);
+static UINT resolve_folder(MSIPACKAGE *package, LPCWSTR name, LPWSTR path, 
                            BOOL source, BOOL set_prop, MSIFOLDER **folder);
 
-static UINT track_tempfile(MSIHANDLE hPackage, LPCWSTR name, LPCWSTR path);
+static UINT track_tempfile(MSIPACKAGE *package, LPCWSTR name, LPCWSTR path);
  
 /*
  * consts and values used
@@ -245,19 +245,20 @@
     return ret;
 }
 
-inline static WCHAR *load_dynamic_stringW(MSIHANDLE row, INT index)
+inline static WCHAR *load_dynamic_stringW(MSIRECORD *row, INT index)
 {
+    UINT rc;
     DWORD sz;
     LPWSTR ret;
    
     sz = 0; 
-    MsiRecordGetStringW(row,index,NULL,&sz);
+    rc = MSI_RecordGetStringW(row,index,NULL,&sz);
     if (sz <= 0)
         return NULL;
 
     sz ++;
     ret = HeapAlloc(GetProcessHeap(),0,sz * sizeof (WCHAR));
-    MsiRecordGetStringW(row,index,ret,&sz);
+    rc = MSI_RecordGetStringW(row,index,ret,&sz);
     return ret;
 }
 
@@ -309,14 +310,11 @@
     return rc;
 }
 
-static UINT track_tempfile(MSIHANDLE hPackage, LPCWSTR name, LPCWSTR path)
+static UINT track_tempfile(MSIPACKAGE *package, LPCWSTR name, LPCWSTR path)
 {
-    MSIPACKAGE *package;
     int i;
     int index;
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
-
     if (!package)
         return -2;
 
@@ -358,20 +356,20 @@
     }
 }
 
-static void ui_progress(MSIHANDLE hPackage, int a, int b, int c, int d )
+static void ui_progress(MSIPACKAGE *package, int a, int b, int c, int d )
 {
-    MSIHANDLE row;
+    MSIRECORD * row;
 
-    row = MsiCreateRecord(4);
-    MsiRecordSetInteger(row,1,a);
-    MsiRecordSetInteger(row,2,b);
-    MsiRecordSetInteger(row,3,c);
-    MsiRecordSetInteger(row,4,d);
-    MsiProcessMessage(hPackage, INSTALLMESSAGE_PROGRESS, row);
-    MsiCloseHandle(row);
+    row = MSI_CreateRecord(4);
+    MSI_RecordSetInteger(row,1,a);
+    MSI_RecordSetInteger(row,2,b);
+    MSI_RecordSetInteger(row,3,c);
+    MSI_RecordSetInteger(row,4,d);
+    MSI_ProcessMessage(package, INSTALLMESSAGE_PROGRESS, row);
+    msiobj_release(&row->hdr);
 }
 
-static void ui_actiondata(MSIHANDLE hPackage, LPCWSTR action, MSIHANDLE record)
+static void ui_actiondata(MSIPACKAGE *package, LPCWSTR action, MSIRECORD * record)
 {
     static const WCHAR Query_t[] = 
 {'S','E','L','E','C','T',' ','*',' ','f','r','o','m',' ','A','c','t','i','o',
@@ -379,34 +377,37 @@
 ' ','\'','%','s','\'',0};
     WCHAR message[1024];
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
     static WCHAR *ActionFormat=NULL;
     static WCHAR LastAction[0x100] = {0};
     WCHAR Query[1024];
-    MSIHANDLE db;
     LPWSTR ptr;
 
     if (strcmpW(LastAction,action)!=0)
     {
         sprintfW(Query,Query_t,action);
-        db = MsiGetActiveDatabase(hPackage);
-        rc = MsiDatabaseOpenViewW(db, Query, &view);
-        MsiCloseHandle(db);
-        MsiViewExecute(view, 0);
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
+        if (rc != ERROR_SUCCESS)
+            return;
+        rc = MSI_ViewExecute(view, 0);
         if (rc != ERROR_SUCCESS)
         {
-            MsiViewClose(view);
-            MsiCloseHandle(view);
+            MSI_ViewClose(view);
+            return;
+        }
+        rc = MSI_ViewFetch(view,&row);
+        if (rc != ERROR_SUCCESS)
+        {
+            MSI_ViewClose(view);
             return;
         }
 
-        if (MsiRecordIsNull(row,3))
+        if (MSI_RecordIsNull(row,3))
         {
-            MsiCloseHandle(row);
-            MsiViewClose(view);
-            MsiCloseHandle(view);
+            msiobj_release(&row->hdr);
+            MSI_ViewClose(view);
+            msiobj_release(&view->hdr);
             return;
         }
 
@@ -415,9 +416,9 @@
 
         ActionFormat = load_dynamic_stringW(row,3);
         strcpyW(LastAction,action);
-        MsiCloseHandle(row);
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        msiobj_release(&row->hdr);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
     }
 
     message[0]=0;
@@ -453,15 +454,15 @@
         }
     }
 
-    row = MsiCreateRecord(1);
-    MsiRecordSetStringW(row,1,message);
+    row = MSI_CreateRecord(1);
+    MSI_RecordSetStringW(row,1,message);
  
-    MsiProcessMessage(hPackage, INSTALLMESSAGE_ACTIONDATA, row);
-    MsiCloseHandle(row);
+    MSI_ProcessMessage(package, INSTALLMESSAGE_ACTIONDATA, row);
+    msiobj_release(&row->hdr);
 }
 
 
-static void ui_actionstart(MSIHANDLE hPackage, LPCWSTR action)
+static void ui_actionstart(MSIPACKAGE *package, LPCWSTR action)
 {
     static const WCHAR template_s[]=
 {'A','c','t','i','o','n',' ','%','s',':',' ','%','s','.',' ','%','s','.',0};
@@ -474,46 +475,51 @@
     WCHAR message[1024];
     WCHAR timet[0x100];
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
     WCHAR *ActionText=NULL;
     WCHAR Query[1024];
-    MSIHANDLE db;
 
     GetTimeFormatW(LOCALE_USER_DEFAULT, 0, NULL, format, timet, 0x100);
 
     sprintfW(Query,Query_t,action);
-    db = MsiGetActiveDatabase(hPackage);
-    rc = MsiDatabaseOpenViewW(db, Query, &view);
-    MsiCloseHandle(db);
-    MsiViewExecute(view, 0);
-    rc = MsiViewFetch(view,&row);
+    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
+    if (rc != ERROR_SUCCESS)
+        return;
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
+        return;
+    }
+    rc = MSI_ViewFetch(view,&row);
+    if (rc != ERROR_SUCCESS)
+    {
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return;
     }
 
     ActionText = load_dynamic_stringW(row,2);
-    MsiCloseHandle(row);
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    msiobj_release(&row->hdr);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
 
     sprintfW(message,template_s,timet,action,ActionText);
 
-    row = MsiCreateRecord(1);
-    MsiRecordSetStringW(row,1,message);
+    row = MSI_CreateRecord(1);
+    MSI_RecordSetStringW(row,1,message);
  
-    MsiProcessMessage(hPackage, INSTALLMESSAGE_ACTIONSTART, row);
-    MsiCloseHandle(row);
+    MSI_ProcessMessage(package, INSTALLMESSAGE_ACTIONSTART, row);
+    msiobj_release(&row->hdr);
     HeapFree(GetProcessHeap(),0,ActionText);
 }
 
-static void ui_actioninfo(MSIHANDLE hPackage, LPCWSTR action, BOOL start, 
+static void ui_actioninfo(MSIPACKAGE *package, LPCWSTR action, BOOL start, 
                           UINT rc)
 {
-    MSIHANDLE row;
+    MSIRECORD * row;
     static const WCHAR template_s[]=
 {'A','c','t','i','o','n',' ','s','t','a','r','t',' ','%','s',':',' ','%','s',
 '.',0};
@@ -531,23 +537,24 @@
     else
         sprintfW(message,template_e,timet,action,rc);
     
-    row = MsiCreateRecord(1);
-    MsiRecordSetStringW(row,1,message);
+    row = MSI_CreateRecord(1);
+    MSI_RecordSetStringW(row,1,message);
  
-    MsiProcessMessage(hPackage, INSTALLMESSAGE_INFO, row);
-    MsiCloseHandle(row);
+    MSI_ProcessMessage(package, INSTALLMESSAGE_INFO, row);
+    msiobj_release(&row->hdr);
 }
 
 /****************************************************
  * TOP level entry points 
  *****************************************************/
 
-UINT ACTION_DoTopLevelINSTALL(MSIHANDLE hPackage, LPCWSTR szPackagePath,
+UINT ACTION_DoTopLevelINSTALL(MSIPACKAGE *package, LPCWSTR szPackagePath,
                               LPCWSTR szCommandLine)
 {
     DWORD sz;
-    CHAR buffer[10];
+    WCHAR buffer[10];
     UINT rc;
+    static const WCHAR szUILevel[] = {'U','I','L','e','v','e','l',0};
 
     if (szPackagePath)   
     {
@@ -565,9 +572,9 @@
         }
 
         size = MAX_PATH;
-        if (MsiGetPropertyW(hPackage,cszSourceDir,check,&size) 
+        if (MSI_GetPropertyW(package,cszSourceDir,check,&size) 
             != ERROR_SUCCESS )
-            MsiSetPropertyW(hPackage, cszSourceDir, pth);
+            MSI_SetPropertyW(package, cszSourceDir, pth);
     }
 
     if (szCommandLine)
@@ -613,70 +620,90 @@
             }            
             TRACE("Found commandline property (%s) = (%s)\n", debugstr_w(prop),
                   debugstr_w(val));
-            MsiSetPropertyW(hPackage,prop,val);
+            MSI_SetPropertyW(package,prop,val);
         }
     }
   
     sz = 10; 
-    if (MsiGetPropertyA(hPackage,"UILevel",buffer,&sz) == ERROR_SUCCESS)
+    if (MSI_GetPropertyW(package,szUILevel,buffer,&sz) == ERROR_SUCCESS)
     {
-        if (atoi(buffer) >= INSTALLUILEVEL_REDUCED)
+        if (atoiW(buffer) >= INSTALLUILEVEL_REDUCED)
         {
-            rc = ACTION_ProcessUISequence(hPackage);
+            rc = ACTION_ProcessUISequence(package);
             if (rc == ERROR_SUCCESS)
-                rc = ACTION_ProcessExecSequence(hPackage,TRUE);
+                rc = ACTION_ProcessExecSequence(package,TRUE);
         }
         else
-            rc = ACTION_ProcessExecSequence(hPackage,FALSE);
+            rc = ACTION_ProcessExecSequence(package,FALSE);
     }
     else
-        rc = ACTION_ProcessExecSequence(hPackage,FALSE);
+        rc = ACTION_ProcessExecSequence(package,FALSE);
 
     return rc;
 }
 
 
-static UINT ACTION_ProcessExecSequence(MSIHANDLE hPackage, BOOL UIran)
+static UINT ACTION_ProcessExecSequence(MSIPACKAGE *package, BOOL UIran)
 {
-    MSIHANDLE view;
+    MSIQUERY * view;
     UINT rc;
-    static const CHAR *ExecSeqQuery = 
-"select * from InstallExecuteSequence where Sequence > %i order by Sequence";
-    CHAR Query[1024];
-    MSIHANDLE db;
-    MSIHANDLE row = 0;
-
-    db = MsiGetActiveDatabase(hPackage);
+    static const WCHAR ExecSeqQuery[] =  {
+       's','e','l','e','c','t',' ','*',' ',
+       'f','r','o','m',' ',
+           'I','n','s','t','a','l','l','E','x','e','c','u','t','e',
+           'S','e','q','u','e','n','c','e',' ',
+       'w','h','e','r','e',' ','S','e','q','u','e','n','c','e',' ',
+           '>',' ','%','i',' ','o','r','d','e','r',' ',
+       'b','y',' ','S','e','q','u','e','n','c','e',0 };
+    WCHAR Query[1024];
+    MSIRECORD * row = 0;
+    static const WCHAR IVQuery[] = {
+       's','e','l','e','c','t',' ','S','e','q','u','e','n','c','e',' ',
+       'f','r','o','m',' ','I','n','s','t','a','l','l',
+           'E','x','e','c','u','t','e','S','e','q','u','e','n','c','e',' ',
+       'w','h','e','r','e',' ','A','c','t','i','o','n',' ','=',' ',
+           '`','I','n','s','t','a','l','l','V','a','l','i','d','a','t','e','`',
+       0};
 
     if (UIran)
     {
         INT seq = 0;
-        static const CHAR *IVQuery = 
-"select Sequence from InstallExecuteSequence where Action = `InstallValidate`" ;
         
-        MsiDatabaseOpenViewA(db, IVQuery, &view);
-        MsiViewExecute(view, 0);
-        MsiViewFetch(view,&row);
-        seq = MsiRecordGetInteger(row,1);
-        MsiCloseHandle(row);
-        MsiViewClose(view);
-        MsiCloseHandle(view);
-        sprintf(Query,ExecSeqQuery,seq);
+        rc = MSI_DatabaseOpenViewW(package->db, IVQuery, &view);
+        if (rc != ERROR_SUCCESS)
+            return rc;
+        rc = MSI_ViewExecute(view, 0);
+        if (rc != ERROR_SUCCESS)
+        {
+            MSI_ViewClose(view);
+            msiobj_release(&view->hdr);
+            return rc;
+        }
+        rc = MSI_ViewFetch(view,&row);
+        if (rc != ERROR_SUCCESS)
+        {
+            MSI_ViewClose(view);
+            msiobj_release(&view->hdr);
+            return rc;
+        }
+        seq = MSI_RecordGetInteger(row,1);
+        msiobj_release(&row->hdr);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
+        sprintfW(Query,ExecSeqQuery,seq);
     }
     else
-        sprintf(Query,ExecSeqQuery,0);
-
-    rc = MsiDatabaseOpenViewA(db, Query, &view);
-    MsiCloseHandle(db);
+        sprintfW(Query,ExecSeqQuery,0);
     
+    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
     if (rc == ERROR_SUCCESS)
     {
-        rc = MsiViewExecute(view, 0);
+        rc = MSI_ViewExecute(view, 0);
 
         if (rc != ERROR_SUCCESS)
         {
-            MsiViewClose(view);
-            MsiCloseHandle(view);
+            MSI_ViewClose(view);
+            msiobj_release(&view->hdr);
             goto end;
         }
        
@@ -687,7 +714,7 @@
             WCHAR buffer[0x100];
             DWORD sz = 0x100;
 
-            rc = MsiViewFetch(view,&row);
+            rc = MSI_ViewFetch(view,&row);
             if (rc != ERROR_SUCCESS)
             {
                 rc = ERROR_SUCCESS;
@@ -695,7 +722,7 @@
             }
 
             /* check conditions */
-            if (!MsiRecordIsNull(row,2))
+            if (!MSI_RecordIsNull(row,2))
             {
                 LPWSTR cond = NULL;
                 cond = load_dynamic_stringW(row,2);
@@ -703,11 +730,11 @@
                 if (cond)
                 {
                     /* this is a hack to skip errors in the condition code */
-                    if (MsiEvaluateConditionW(hPackage, cond) ==
+                    if (MSI_EvaluateConditionW(package, cond) ==
                             MSICONDITION_FALSE)
                     {
                         HeapFree(GetProcessHeap(),0,cond);
-                        MsiCloseHandle(row);
+                        msiobj_release(&row->hdr);
                         continue; 
                     }
                     else
@@ -716,28 +743,28 @@
             }
 
             sz=0x100;
-            rc =  MsiRecordGetStringW(row,1,buffer,&sz);
+            rc =  MSI_RecordGetStringW(row,1,buffer,&sz);
             if (rc != ERROR_SUCCESS)
             {
                 ERR("Error is %x\n",rc);
-                MsiCloseHandle(row);
+                msiobj_release(&row->hdr);
                 break;
             }
 
-            rc = ACTION_PerformAction(hPackage,buffer);
+            rc = ACTION_PerformAction(package,buffer);
 
             if (rc != ERROR_SUCCESS)
             {
                 ERR("Execution halted due to error (%i)\n",rc);
-                MsiCloseHandle(row);
+                msiobj_release(&row->hdr);
                 break;
             }
 
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
         }
 
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
     }
 
 end:
@@ -745,26 +772,27 @@
 }
 
 
-static UINT ACTION_ProcessUISequence(MSIHANDLE hPackage)
+static UINT ACTION_ProcessUISequence(MSIPACKAGE *package)
 {
-    MSIHANDLE view;
+    MSIQUERY * view;
     UINT rc;
-    static const CHAR *ExecSeqQuery = 
-"select * from InstallUISequence where Sequence > 0 order by Sequence";
-    MSIHANDLE db;
+    static const WCHAR ExecSeqQuery [] = {
+      's','e','l','e','c','t',' ','*',' ',
+      'f','r','o','m',' ','I','n','s','t','a','l','l',
+            'U','I','S','e','q','u','e','n','c','e',' ',
+      'w','h','e','r','e',' ','S','e','q','u','e','n','c','e',' ', '>',' ','0',' ',
+      'o','r','d','e','r',' ','b','y',' ','S','e','q','u','e','n','c','e',0};
     
-    db = MsiGetActiveDatabase(hPackage);
-    rc = MsiDatabaseOpenViewA(db, ExecSeqQuery, &view);
-    MsiCloseHandle(db);
+    rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
     
     if (rc == ERROR_SUCCESS)
     {
-        rc = MsiViewExecute(view, 0);
+        rc = MSI_ViewExecute(view, 0);
 
         if (rc != ERROR_SUCCESS)
         {
-            MsiViewClose(view);
-            MsiCloseHandle(view);
+            MSI_ViewClose(view);
+            msiobj_release(&view->hdr);
             goto end;
         }
        
@@ -774,9 +802,9 @@
         {
             WCHAR buffer[0x100];
             DWORD sz = 0x100;
-            MSIHANDLE row = 0;
+            MSIRECORD * row = 0;
 
-            rc = MsiViewFetch(view,&row);
+            rc = MSI_ViewFetch(view,&row);
             if (rc != ERROR_SUCCESS)
             {
                 rc = ERROR_SUCCESS;
@@ -784,7 +812,7 @@
             }
 
             /* check conditions */
-            if (!MsiRecordIsNull(row,2))
+            if (!MSI_RecordIsNull(row,2))
             {
                 LPWSTR cond = NULL;
                 cond = load_dynamic_stringW(row,2);
@@ -792,11 +820,11 @@
                 if (cond)
                 {
                     /* this is a hack to skip errors in the condition code */
-                    if (MsiEvaluateConditionW(hPackage, cond) ==
+                    if (MSI_EvaluateConditionW(package, cond) ==
                             MSICONDITION_FALSE)
                     {
                         HeapFree(GetProcessHeap(),0,cond);
-                        MsiCloseHandle(row);
+                        msiobj_release(&row->hdr);
                         continue; 
                     }
                     else
@@ -805,28 +833,28 @@
             }
 
             sz=0x100;
-            rc =  MsiRecordGetStringW(row,1,buffer,&sz);
+            rc =  MSI_RecordGetStringW(row,1,buffer,&sz);
             if (rc != ERROR_SUCCESS)
             {
                 ERR("Error is %x\n",rc);
-                MsiCloseHandle(row);
+                msiobj_release(&row->hdr);
                 break;
             }
 
-            rc = ACTION_PerformAction(hPackage,buffer);
+            rc = ACTION_PerformAction(package,buffer);
 
             if (rc != ERROR_SUCCESS)
             {
                 ERR("Execution halted due to error (%i)\n",rc);
-                MsiCloseHandle(row);
+                msiobj_release(&row->hdr);
                 break;
             }
 
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
         }
 
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
     }
 
 end:
@@ -845,50 +873,50 @@
  * But until I get write access to the database that is hard, so I am going to
  * hack it to see if I can get something to run.
  */
-UINT ACTION_PerformAction(MSIHANDLE hPackage, const WCHAR *action)
+UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action)
 {
     UINT rc = ERROR_SUCCESS; 
 
     TRACE("Performing action (%s)\n",debugstr_w(action));
-    ui_actioninfo(hPackage, action, TRUE, 0);
-    ui_actionstart(hPackage, action);
-    ui_progress(hPackage,2,1,0,0);
+    ui_actioninfo(package, action, TRUE, 0);
+    ui_actionstart(package, action);
+    ui_progress(package,2,1,0,0);
 
     /* pre install, setup and configuration block */
     if (strcmpW(action,szLaunchConditions)==0)
-        rc = ACTION_LaunchConditions(hPackage);
+        rc = ACTION_LaunchConditions(package);
     else if (strcmpW(action,szCostInitialize)==0)
-        rc = ACTION_CostInitialize(hPackage);
+        rc = ACTION_CostInitialize(package);
     else if (strcmpW(action,szFileCost)==0)
-        rc = ACTION_FileCost(hPackage);
+        rc = ACTION_FileCost(package);
     else if (strcmpW(action,szCostFinalize)==0)
-        rc = ACTION_CostFinalize(hPackage);
+        rc = ACTION_CostFinalize(package);
     else if (strcmpW(action,szInstallValidate)==0)
-        rc = ACTION_InstallValidate(hPackage);
+        rc = ACTION_InstallValidate(package);
 
     /* install block */
     else if (strcmpW(action,szProcessComponents)==0)
-        rc = ACTION_ProcessComponents(hPackage);
+        rc = ACTION_ProcessComponents(package);
     else if (strcmpW(action,szInstallInitialize)==0)
-        rc = ACTION_InstallInitialize(hPackage);
+        rc = ACTION_InstallInitialize(package);
     else if (strcmpW(action,szCreateFolders)==0)
-        rc = ACTION_CreateFolders(hPackage);
+        rc = ACTION_CreateFolders(package);
     else if (strcmpW(action,szInstallFiles)==0)
-        rc = ACTION_InstallFiles(hPackage);
+        rc = ACTION_InstallFiles(package);
     else if (strcmpW(action,szDuplicateFiles)==0)
-        rc = ACTION_DuplicateFiles(hPackage);
+        rc = ACTION_DuplicateFiles(package);
     else if (strcmpW(action,szWriteRegistryValues)==0)
-        rc = ACTION_WriteRegistryValues(hPackage);
+        rc = ACTION_WriteRegistryValues(package);
      else if (strcmpW(action,szRegisterTypeLibraries)==0)
-        rc = ACTION_RegisterTypeLibraries(hPackage);
+        rc = ACTION_RegisterTypeLibraries(package);
      else if (strcmpW(action,szRegisterClassInfo)==0)
-        rc = ACTION_RegisterClassInfo(hPackage);
+        rc = ACTION_RegisterClassInfo(package);
      else if (strcmpW(action,szRegisterProgIdInfo)==0)
-        rc = ACTION_RegisterProgIdInfo(hPackage);
+        rc = ACTION_RegisterProgIdInfo(package);
      else if (strcmpW(action,szCreateShortcuts)==0)
-        rc = ACTION_CreateShortcuts(hPackage);
+        rc = ACTION_CreateShortcuts(package);
     else if (strcmpW(action,szPublishProduct)==0)
-        rc = ACTION_PublishProduct(hPackage);
+        rc = ACTION_PublishProduct(package);
 
     /*
      Called during iTunes but unimplemented and seem important
@@ -897,22 +925,22 @@
      RegisterProduct
      InstallFinalize
      */
-     else if ((rc = ACTION_CustomAction(hPackage,action)) != ERROR_SUCCESS)
+     else if ((rc = ACTION_CustomAction(package,action)) != ERROR_SUCCESS)
      {
         FIXME("UNHANDLED MSI ACTION %s\n",debugstr_w(action));
         rc = ERROR_SUCCESS;
      }
 
-    ui_actioninfo(hPackage, action, FALSE, rc);
+    ui_actioninfo(package, action, FALSE, rc);
     return rc;
 }
 
 
-static UINT ACTION_CustomAction(MSIHANDLE hPackage,const WCHAR *action)
+static UINT ACTION_CustomAction(MSIPACKAGE *package,const WCHAR *action)
 {
     UINT rc = ERROR_SUCCESS;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
     WCHAR ExecSeqQuery[1024] = 
     {'s','e','l','e','c','t',' ','*',' ','f','r','o','m',' ','C','u','s','t','o'
 ,'m','A','c','t','i','o','n',' ','w','h','e','r','e',' ','`','A','c','t','i'
@@ -922,35 +950,32 @@
     LPWSTR source;
     LPWSTR target;
     WCHAR *deformated=NULL;
-    MSIHANDLE db;
 
     strcatW(ExecSeqQuery,action);
     strcatW(ExecSeqQuery,end);
 
-    db = MsiGetActiveDatabase(hPackage);
-    rc = MsiDatabaseOpenViewW(db, ExecSeqQuery, &view);
-    MsiCloseHandle(db);
+    rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
 
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
-    rc = MsiViewFetch(view,&row);
+    rc = MSI_ViewFetch(view,&row);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
-    type = MsiRecordGetInteger(row,2);
+    type = MSI_RecordGetInteger(row,2);
 
     source = load_dynamic_stringW(row,3);
     target = load_dynamic_stringW(row,4);
@@ -962,15 +987,15 @@
     switch (type & CUSTOM_ACTION_TYPE_MASK)
     {
         case 1: /* DLL file stored in a Binary table stream */
-            rc = HANDLE_CustomType1(hPackage,source,target,type);
+            rc = HANDLE_CustomType1(package,source,target,type);
             break;
         case 2: /* EXE file stored in a Binary table strem */
-            rc = HANDLE_CustomType2(hPackage,source,target,type);
+            rc = HANDLE_CustomType2(package,source,target,type);
             break;
         case 35: /* Directory set with formatted text. */
         case 51: /* Property set with formatted text. */
-            deformat_string(hPackage,target,&deformated);
-            rc = MsiSetPropertyW(hPackage,source,deformated);
+            deformat_string(package,target,&deformated);
+            rc = MSI_SetPropertyW(package,source,deformated);
             HeapFree(GetProcessHeap(),0,deformated);
             break;
         default:
@@ -981,18 +1006,18 @@
 
     HeapFree(GetProcessHeap(),0,source);
     HeapFree(GetProcessHeap(),0,target);
-    MsiCloseHandle(row);
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    msiobj_release(&row->hdr);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
     return rc;
 }
 
-static UINT store_binary_to_temp(MSIHANDLE hPackage, const LPWSTR source, 
+static UINT store_binary_to_temp(MSIPACKAGE *package, const LPWSTR source, 
                                 LPWSTR tmp_file)
 {
     DWORD sz=MAX_PATH;
 
-    if (MsiGetPropertyW(hPackage, cszTempFolder, tmp_file, &sz) 
+    if (MSI_GetPropertyW(package, cszTempFolder, tmp_file, &sz) 
         != ERROR_SUCCESS)
         GetTempPathW(MAX_PATH,tmp_file);
 
@@ -1007,17 +1032,16 @@
     {
         /* write out the file */
         UINT rc;
-        MSIHANDLE view;
-        MSIHANDLE row = 0;
+        MSIQUERY * view;
+        MSIRECORD * row = 0;
         WCHAR Query[1024] =
         {'s','e','l','e','c','t',' ','*',' ','f','r','o','m',' ','B','i'
 ,'n','a','r','y',' ','w','h','e','r','e',' ','N','a','m','e','=','`',0};
         static const WCHAR end[]={'`',0};
         HANDLE the_file;
         CHAR buffer[1024];
-        MSIHANDLE db;
 
-        if (track_tempfile(hPackage, source, tmp_file)!=0)
+        if (track_tempfile(package, source, tmp_file)!=0)
             FIXME("File Name in temp tracking collision\n");
 
         the_file = CreateFileW(tmp_file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
@@ -1029,26 +1053,23 @@
         strcatW(Query,source);
         strcatW(Query,end);
 
-        db = MsiGetActiveDatabase(hPackage);
-        rc = MsiDatabaseOpenViewW(db, Query, &view);
-        MsiCloseHandle(db);
-
+        rc = MSI_DatabaseOpenViewW( package->db, Query, &view);
         if (rc != ERROR_SUCCESS)
             return rc;
 
-        rc = MsiViewExecute(view, 0);
+        rc = MSI_ViewExecute(view, 0);
         if (rc != ERROR_SUCCESS)
         {
-            MsiViewClose(view);
-            MsiCloseHandle(view);
+            MSI_ViewClose(view);
+            msiobj_release(&view->hdr);
             return rc;
         }
 
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
         {
-            MsiViewClose(view);
-            MsiCloseHandle(view);
+            MSI_ViewClose(view);
+            msiobj_release(&view->hdr);
             return rc;
         }
 
@@ -1056,7 +1077,7 @@
         {
             DWORD write;
             sz = 1024;
-            rc = MsiRecordReadStream(row,2,buffer,&sz);
+            rc = MSI_RecordReadStream(row,2,buffer,&sz);
             if (rc != ERROR_SUCCESS)
             {
                 ERR("Failed to get stream\n");
@@ -1069,9 +1090,9 @@
 
         CloseHandle(the_file);
 
-        MsiCloseHandle(row);
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        msiobj_release(&row->hdr);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
     }
 
     return ERROR_SUCCESS;
@@ -1081,7 +1102,7 @@
 typedef UINT CustomEntry(MSIHANDLE);
 typedef struct 
 {
-        MSIHANDLE hPackage;
+        MSIPACKAGE *package;
         WCHAR target[MAX_PATH];
         WCHAR source[MAX_PATH];
 } thread_struct;
@@ -1105,8 +1126,15 @@
         fn = (CustomEntry*)GetProcAddress(DLL,proc);
         if (fn)
         {
+            MSIHANDLE hPackage;
+            MSIPACKAGE *package = stuff->package;
+
             TRACE("Calling function\n");
-            fn(stuff->hPackage);
+            hPackage = msiobj_findhandle( &package->hdr );
+            if( !hPackage )
+                ERR("Handle for object %p not found\n", package );
+            fn(hPackage);
+            msiobj_release( &package->hdr );
         }
         else
             ERR("Cannot load functon\n");
@@ -1116,11 +1144,12 @@
     }
     else
         ERR("Unable to load library\n");
+    msiobj_release( &stuff->package->hdr );
 
     return 0;
 }
 
-static UINT HANDLE_CustomType1(MSIHANDLE hPackage, const LPWSTR source, 
+static UINT HANDLE_CustomType1(MSIPACKAGE *package, const LPWSTR source, 
                                 const LPWSTR target, const INT type)
 {
     WCHAR tmp_file[MAX_PATH];
@@ -1129,7 +1158,7 @@
     LPSTR proc;
     static thread_struct info;
 
-    store_binary_to_temp(hPackage, source, tmp_file);
+    store_binary_to_temp(package, source, tmp_file);
 
     TRACE("Calling function %s from %s\n",debugstr_w(target),
           debugstr_w(tmp_file));
@@ -1142,13 +1171,16 @@
 
     if (type & 0xc0)
     {
-        DWORD ThreadId;
-        info.hPackage = hPackage;
+//        DWORD ThreadId;
+
+//        msiobj_addref( &package->hdr );
+        info.package = package;
         strcpyW(info.target,target);
         strcpyW(info.source,tmp_file);
         TRACE("Start Asyncronous execution\n");
         FIXME("DATABASE NOT THREADSAFE... not starting\n");
 //        CreateThread(NULL,0,DllThread,(LPVOID)&info,0,&ThreadId);
+        /* FIXME: release the package if the CreateThread fails */
         return ERROR_SUCCESS;
     }
  
@@ -1159,8 +1191,14 @@
         fn = (CustomEntry*)GetProcAddress(DLL,proc);
         if (fn)
         {
+            MSIHANDLE hPackage;
+
             TRACE("Calling function\n");
+            hPackage = msiobj_findhandle( &package->hdr );
+            if( !hPackage )
+                ERR("Handle for object %p not found\n", package );
             fn(hPackage);
+            msiobj_release( &package->hdr );
         }
         else
             ERR("Cannot load functon\n");
@@ -1174,7 +1212,7 @@
     return ERROR_SUCCESS;
 }
 
-static UINT HANDLE_CustomType2(MSIHANDLE hPackage, const LPWSTR source, 
+static UINT HANDLE_CustomType2(MSIPACKAGE *package, const LPWSTR source, 
                                 const LPWSTR target, const INT type)
 {
     WCHAR tmp_file[MAX_PATH*2];
@@ -1187,10 +1225,10 @@
     memset(&si,0,sizeof(STARTUPINFOW));
     memset(&info,0,sizeof(PROCESS_INFORMATION));
 
-    store_binary_to_temp(hPackage, source, tmp_file);
+    store_binary_to_temp(package, source, tmp_file);
 
     strcatW(tmp_file,spc);
-    deformat_string(hPackage,target,&deformated);
+    deformat_string(package,target,&deformated);
     strcatW(tmp_file,deformated);
 
     HeapFree(GetProcessHeap(),0,deformated);
@@ -1269,26 +1307,24 @@
  * Also we cannot enable/disable components either, so for now I am just going 
  * to do all the directories for all the components.
  */
-static UINT ACTION_CreateFolders(MSIHANDLE hPackage)
+static UINT ACTION_CreateFolders(MSIPACKAGE *package)
 {
-    static const CHAR *ExecSeqQuery = "select Directory_ from CreateFolder";
+    static const WCHAR ExecSeqQuery[] = {
+        's','e','l','e','c','t',' ','D','i','r','e','c','t','o','r','y','_',' ',
+        'f','r','o','m',' ','C','r','e','a','t','e','F','o','l','d','e','r',0 };
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE db;
+    MSIQUERY *view;
     MSIFOLDER *folder;
 
-    db = MsiGetActiveDatabase(hPackage);
-    rc = MsiDatabaseOpenViewA(db, ExecSeqQuery, &view);
-    MsiCloseHandle(db);
-
+    rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view );
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
     
@@ -1297,10 +1333,9 @@
         WCHAR dir[0x100];
         WCHAR full_path[MAX_PATH];
         DWORD sz;
-        MSIHANDLE row = 0;
-        MSIHANDLE uirow;
+        MSIRECORD *row = NULL, *uirow;
 
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
         {
             rc = ERROR_SUCCESS;
@@ -1308,47 +1343,47 @@
         }
 
         sz=0x100;
-        rc = MsiRecordGetStringW(row,1,dir,&sz);
+        rc = MSI_RecordGetStringW(row,1,dir,&sz);
 
         if (rc!= ERROR_SUCCESS)
         {
             ERR("Unable to get folder id \n");
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
         sz = MAX_PATH;
-        rc = resolve_folder(hPackage,dir,full_path,FALSE,FALSE,&folder);
+        rc = resolve_folder(package,dir,full_path,FALSE,FALSE,&folder);
 
         if (rc != ERROR_SUCCESS)
         {
             ERR("Unable to resolve folder id %s\n",debugstr_w(dir));
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
         TRACE("Folder is %s\n",debugstr_w(full_path));
 
         /* UI stuff */
-        uirow = MsiCreateRecord(1);
-        MsiRecordSetStringW(uirow,1,full_path);
-        ui_actiondata(hPackage,szCreateFolders,uirow);
-        MsiCloseHandle(uirow);
+        uirow = MSI_CreateRecord(1);
+        MSI_RecordSetStringW(uirow,1,full_path);
+        ui_actiondata(package,szCreateFolders,uirow);
+        msiobj_release( &uirow->hdr );
 
         if (folder->State == 0)
             create_full_pathW(full_path);
 
         folder->State = 3;
 
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
    
     return rc;
 }
 
-static int load_component(MSIPACKAGE* package, MSIHANDLE row)
+static int load_component(MSIPACKAGE* package, MSIRECORD * row)
 {
     int index = package->loaded_components;
     DWORD sz;
@@ -1367,25 +1402,25 @@
     memset(&package->components[index],0,sizeof(MSICOMPONENT));
 
     sz = 96;       
-    MsiRecordGetStringW(row,1,package->components[index].Component,&sz);
+    MSI_RecordGetStringW(row,1,package->components[index].Component,&sz);
 
     TRACE("Loading Component %s\n",
            debugstr_w(package->components[index].Component));
 
     sz = 0x100;
-    if (!MsiRecordIsNull(row,2))
-        MsiRecordGetStringW(row,2,package->components[index].ComponentId,&sz);
+    if (!MSI_RecordIsNull(row,2))
+        MSI_RecordGetStringW(row,2,package->components[index].ComponentId,&sz);
             
     sz = 96;       
-    MsiRecordGetStringW(row,3,package->components[index].Directory,&sz);
+    MSI_RecordGetStringW(row,3,package->components[index].Directory,&sz);
 
-    package->components[index].Attributes = MsiRecordGetInteger(row,4);
+    package->components[index].Attributes = MSI_RecordGetInteger(row,4);
 
     sz = 0x100;       
-    MsiRecordGetStringW(row,5,package->components[index].Condition,&sz);
+    MSI_RecordGetStringW(row,5,package->components[index].Condition,&sz);
 
     sz = 96;       
-    MsiRecordGetStringW(row,6,package->components[index].KeyPath,&sz);
+    MSI_RecordGetStringW(row,6,package->components[index].KeyPath,&sz);
 
     package->components[index].State = INSTALLSTATE_UNKNOWN;
     package->components[index].Enabled = TRUE;
@@ -1394,7 +1429,7 @@
     return index;
 }
 
-static void load_feature(MSIPACKAGE* package, MSIHANDLE row)
+static void load_feature(MSIPACKAGE* package, MSIRECORD * row)
 {
     int index = package->loaded_features;
     DWORD sz;
@@ -1406,10 +1441,11 @@
 'O','M',' ','C','o','m','p','o','n','e','n','t',' ','W','H','E','R','E',' ','C',
 'o','m','p','o','n','e','n','t','=','\'','%','s','\'',0};
     WCHAR Query[1024];
-    MSIHANDLE view;
-    MSIHANDLE view2;
-    MSIHANDLE row2;
-    MSIHANDLE row3;
+    MSIQUERY * view;
+    MSIQUERY * view2;
+    MSIRECORD * row2;
+    MSIRECORD * row3;
+    UINT    rc;
 
     /* fill in the data */
 
@@ -1423,39 +1459,47 @@
     memset(&package->features[index],0,sizeof(MSIFEATURE));
     
     sz = 96;       
-    MsiRecordGetStringW(row,1,package->features[index].Feature,&sz);
+    MSI_RecordGetStringW(row,1,package->features[index].Feature,&sz);
 
     TRACE("Loading feature %s\n",debugstr_w(package->features[index].Feature));
 
     sz = 96;
-    if (!MsiRecordIsNull(row,2))
-        MsiRecordGetStringW(row,2,package->features[index].Feature_Parent,&sz);
+    if (!MSI_RecordIsNull(row,2))
+        MSI_RecordGetStringW(row,2,package->features[index].Feature_Parent,&sz);
 
     sz = 0x100;
-     if (!MsiRecordIsNull(row,3))
-        MsiRecordGetStringW(row,3,package->features[index].Title,&sz);
+     if (!MSI_RecordIsNull(row,3))
+        MSI_RecordGetStringW(row,3,package->features[index].Title,&sz);
 
      sz = 0x100;
-     if (!MsiRecordIsNull(row,4))
-        MsiRecordGetStringW(row,4,package->features[index].Description,&sz);
+     if (!MSI_RecordIsNull(row,4))
+        MSI_RecordGetStringW(row,4,package->features[index].Description,&sz);
 
-    if (!MsiRecordIsNull(row,5))
-        package->features[index].Display = MsiRecordGetInteger(row,5);
+    if (!MSI_RecordIsNull(row,5))
+        package->features[index].Display = MSI_RecordGetInteger(row,5);
   
-    package->features[index].Level= MsiRecordGetInteger(row,6);
+    package->features[index].Level= MSI_RecordGetInteger(row,6);
 
      sz = 96;
-     if (!MsiRecordIsNull(row,7))
-        MsiRecordGetStringW(row,7,package->features[index].Directory,&sz);
+     if (!MSI_RecordIsNull(row,7))
+        MSI_RecordGetStringW(row,7,package->features[index].Directory,&sz);
 
-    package->features[index].Attributes= MsiRecordGetInteger(row,8);
+    package->features[index].Attributes= MSI_RecordGetInteger(row,8);
     package->features[index].State = INSTALLSTATE_UNKNOWN;
 
     /* load feature components */
 
     sprintfW(Query,Query1,package->features[index].Feature);
-    MsiDatabaseOpenViewW(package->db,Query,&view);
-    MsiViewExecute(view,0);
+    rc = MSI_DatabaseOpenViewW(package->db,Query,&view);
+    if (rc != ERROR_SUCCESS)
+        return;
+    rc = MSI_ViewExecute(view,0);
+    if (rc != ERROR_SUCCESS)
+    {
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
+        return;
+    }
     while (1)
     {
         DWORD sz = 0x100;
@@ -1464,12 +1508,12 @@
         INT c_indx;
         INT cnt = package->features[index].ComponentCount;
 
-        rc = MsiViewFetch(view,&row2);
+        rc = MSI_ViewFetch(view,&row2);
         if (rc != ERROR_SUCCESS)
             break;
 
         sz = 0x100;
-        MsiRecordGetStringW(row2,1,buffer,&sz);
+        MSI_RecordGetStringW(row2,1,buffer,&sz);
 
         /* check to see if the component is already loaded */
         c_indx = get_loaded_component(package,buffer);
@@ -1483,27 +1527,39 @@
 
         sprintfW(Query,Query2,buffer);
    
-        MsiDatabaseOpenViewW(package->db,Query,&view2);
-        MsiViewExecute(view2,0);
+        rc = MSI_DatabaseOpenViewW(package->db,Query,&view2);
+        if (rc != ERROR_SUCCESS)
+        {
+            msiobj_release( &row2->hdr );
+            continue;
+        }
+        rc = MSI_ViewExecute(view2,0);
+        if (rc != ERROR_SUCCESS)
+        {
+            msiobj_release( &row2->hdr );
+            MSI_ViewClose(view2);
+            msiobj_release( &view2->hdr );  
+            continue;
+        }
         while (1)
         {
             DWORD rc;
 
-            rc = MsiViewFetch(view2,&row3);
+            rc = MSI_ViewFetch(view2,&row3);
             if (rc != ERROR_SUCCESS)
                 break;
             c_indx = load_component(package,row3);
-            MsiCloseHandle(row3);
+            msiobj_release( &row3->hdr );
 
             package->features[index].Components[cnt] = c_indx;
             package->features[index].ComponentCount ++;
         }
-        MsiViewClose(view2);
-        MsiCloseHandle(view2);
-        MsiCloseHandle(row2);
+        MSI_ViewClose(view2);
+        msiobj_release( &view2->hdr );
+        msiobj_release( &row2->hdr );
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
 }
 
 /*
@@ -1519,41 +1575,51 @@
  *          resolved base on property only based on their entrys in the 
  *          directory table.
  */
-static UINT ACTION_CostInitialize(MSIHANDLE hPackage)
+static UINT ACTION_CostInitialize(MSIPACKAGE *package)
 {
-    MSIHANDLE view;
-    MSIHANDLE row;
+    MSIQUERY * view;
+    MSIRECORD * row;
     DWORD sz;
-    MSIPACKAGE *package;
-
-    static const CHAR Query_all[] = "SELECT * FROM Feature";
-
-    MsiSetPropertyA(hPackage,"CostingComplete","0");
-    MsiSetPropertyW(hPackage, cszRootDrive , c_collen);
+    UINT rc;
+    static const WCHAR Query_all[] = {
+       'S','E','L','E','C','T',' ','*',' ',
+       'F','R','O','M',' ','F','e','a','t','u','r','e',0};
+    static const WCHAR szCosting[] = {
+       'C','o','s','t','i','n','g','C','o','m','p','l','e','t','e',0 };
+    static const WCHAR szZero[] = { '0', 0 };
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
+    MSI_SetPropertyW(package, szCosting, szZero);
+    MSI_SetPropertyW(package, cszRootDrive , c_collen);
 
     sz = 0x100;
-    MsiDatabaseOpenViewA(package->db,Query_all,&view);
-    MsiViewExecute(view,0);
+    rc = MSI_DatabaseOpenViewW(package->db,Query_all,&view);
+    if (rc != ERROR_SUCCESS)
+        return rc;
+    rc = MSI_ViewExecute(view,0);
+    if (rc != ERROR_SUCCESS)
+    {
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
+        return rc;
+    }
     while (1)
     {
         DWORD rc;
 
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
             break;
        
         load_feature(package,row); 
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
 
     return ERROR_SUCCESS;
 }
 
-static int load_file(MSIPACKAGE* package, MSIHANDLE row)
+static int load_file(MSIPACKAGE* package, MSIRECORD * row)
 {
     int index = package->loaded_files;
     int i;
@@ -1572,10 +1638,10 @@
     memset(&package->files[index],0,sizeof(MSIFILE));
 
     sz = 72;       
-    MsiRecordGetStringW(row,1,package->files[index].File,&sz);
+    MSI_RecordGetStringW(row,1,package->files[index].File,&sz);
 
     sz = 0x100;       
-    MsiRecordGetStringW(row,2,buffer,&sz);
+    MSI_RecordGetStringW(row,2,buffer,&sz);
 
     package->files[index].ComponentIndex = -1;
     for (i = 0; i < package->loaded_components; i++)
@@ -1588,24 +1654,24 @@
         ERR("Unfound Component %s\n",debugstr_w(buffer));
 
     sz = MAX_PATH;       
-    MsiRecordGetStringW(row,3,package->files[index].FileName,&sz);
+    MSI_RecordGetStringW(row,3,package->files[index].FileName,&sz);
 
     reduce_to_longfilename(package->files[index].FileName);
     
-    package->files[index].FileSize = MsiRecordGetInteger(row,4);
+    package->files[index].FileSize = MSI_RecordGetInteger(row,4);
 
     sz = 72;       
-    if (!MsiRecordIsNull(row,5))
-        MsiRecordGetStringW(row,5,package->files[index].Version,&sz);
+    if (!MSI_RecordIsNull(row,5))
+        MSI_RecordGetStringW(row,5,package->files[index].Version,&sz);
 
     sz = 20;       
-    if (!MsiRecordIsNull(row,6))
-        MsiRecordGetStringW(row,6,package->files[index].Language,&sz);
+    if (!MSI_RecordIsNull(row,6))
+        MSI_RecordGetStringW(row,6,package->files[index].Language,&sz);
 
-    if (!MsiRecordIsNull(row,7))
-        package->files[index].Attributes= MsiRecordGetInteger(row,7);
+    if (!MSI_RecordIsNull(row,7))
+        package->files[index].Attributes= MSI_RecordGetInteger(row,7);
 
-    package->files[index].Sequence= MsiRecordGetInteger(row,8);
+    package->files[index].Sequence= MSI_RecordGetInteger(row,8);
 
     package->files[index].Temporary = FALSE;
     package->files[index].State = 0;
@@ -1615,48 +1681,49 @@
     return ERROR_SUCCESS;
 }
 
-static UINT ACTION_FileCost(MSIHANDLE hPackage)
+static UINT ACTION_FileCost(MSIPACKAGE *package)
 {
-    MSIHANDLE view;
-    MSIHANDLE row;
-    MSIPACKAGE *package;
+    MSIQUERY * view;
+    MSIRECORD * row;
     UINT rc;
-    static const CHAR Query[] = "SELECT * FROM File Order by Sequence";
+    static const WCHAR Query[] = {
+        'S','E','L','E','C','T',' ','*',' ',
+        'F','R','O','M',' ','F','i','l','e',' ',
+        'O','r','d','e','r',' ','b','y',' ','S','e','q','u','e','n','c','e', 0};
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
     if (!package)
         return ERROR_INVALID_HANDLE;
 
-    rc = MsiDatabaseOpenViewA(package->db, Query, &view);
+    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
    
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
     while (1)
     {
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
         {
             rc = ERROR_SUCCESS;
             break;
         }
         load_file(package,row);
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
 
     return ERROR_SUCCESS;
 }
 
-static INT load_folder(MSIHANDLE hPackage, const WCHAR* dir)
+static INT load_folder(MSIPACKAGE *package, const WCHAR* dir)
 
 {
     WCHAR Query[1024] = 
@@ -1665,18 +1732,15 @@
 'o','r','y','`',' ','=',' ','`',0};
     static const WCHAR end[]={'`',0};
     UINT rc;
-    MSIHANDLE view;
+    MSIQUERY * view;
     WCHAR targetbuffer[0x100];
     WCHAR *srcdir = NULL;
     WCHAR *targetdir = NULL;
     WCHAR parent[0x100];
     DWORD sz=0x100;
-    MSIHANDLE row = 0;
-    MSIPACKAGE *package;
+    MSIRECORD * row = 0;
     INT i,index = -1;
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
-
     TRACE("Looking for dir %s\n",debugstr_w(dir));
 
     for (i = 0; i < package->loaded_folders; i++)
@@ -1708,29 +1772,29 @@
     strcatW(Query,dir);
     strcatW(Query,end);
 
-    rc = MsiDatabaseOpenViewW(package->db, Query, &view);
+    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
 
     if (rc != ERROR_SUCCESS)
         return -1;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return -1;
     }
 
-    rc = MsiViewFetch(view,&row);
+    rc = MSI_ViewFetch(view,&row);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return -1;
     }
 
     sz=0x100;
-    MsiRecordGetStringW(row,3,targetbuffer,&sz);
+    MSI_RecordGetStringW(row,3,targetbuffer,&sz);
     targetdir=targetbuffer;
 
     /* split src and target dir */
@@ -1772,17 +1836,17 @@
      else if (targetdir)
         strcpyW(package->folders[index].SourceDefault,targetdir);
 
-    if (MsiRecordIsNull(row,2))
+    if (MSI_RecordIsNull(row,2))
         parent[0]=0;
     else
     {
             sz=0x100;
-            MsiRecordGetStringW(row,2,parent,&sz);
+            MSI_RecordGetStringW(row,2,parent,&sz);
     }
 
     if (parent[0]) 
     {
-        i = load_folder(hPackage,parent);
+        i = load_folder(package,parent);
         package->folders[index].ParentIndex = i;
         TRACE("Parent is index %i... %s %s\n",
                     package->folders[index].ParentIndex,
@@ -1793,27 +1857,24 @@
         package->folders[index].ParentIndex = -2;
 
     sz = MAX_PATH;
-    rc = MsiGetPropertyW(hPackage, dir, package->folders[index].Property, &sz);
+    rc = MSI_GetPropertyW(package, dir, package->folders[index].Property, &sz);
     if (rc != ERROR_SUCCESS)
         package->folders[index].Property[0]=0;
 
-    MsiCloseHandle(row);
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    msiobj_release(&row->hdr);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
     TRACE(" %s retuning on index %i\n",debugstr_w(dir),index);
     return index;
 }
 
-static UINT resolve_folder(MSIHANDLE hPackage, LPCWSTR name, LPWSTR path, 
+static UINT resolve_folder(MSIPACKAGE *package, LPCWSTR name, LPWSTR path, 
                            BOOL source, BOOL set_prop, MSIFOLDER **folder)
 {
-    MSIPACKAGE *package;
     INT i;
     UINT rc = ERROR_SUCCESS;
     DWORD sz;
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
-
     TRACE("Working to resolve %s\n",debugstr_w(name));
 
     if (!path)
@@ -1825,13 +1886,13 @@
         if (!source)
         {
             sz = MAX_PATH;
-            rc = MsiGetPropertyW(hPackage,cszTargetDir,path,&sz);
+            rc = MSI_GetPropertyW(package,cszTargetDir,path,&sz);
             if (rc != ERROR_SUCCESS)
             {
                 sz = MAX_PATH;
-                rc = MsiGetPropertyW(hPackage,cszRootDrive,path,&sz);
+                rc = MSI_GetPropertyW(package,cszRootDrive,path,&sz);
                 if (set_prop)
-                    MsiSetPropertyW(hPackage,cszTargetDir,path);
+                    MSI_SetPropertyW(package,cszTargetDir,path);
             }
             if (folder)
                 *folder = &(package->folders[0]);
@@ -1840,11 +1901,11 @@
         else
         {
             sz = MAX_PATH;
-            rc = MsiGetPropertyW(hPackage,cszSourceDir,path,&sz);
+            rc = MSI_GetPropertyW(package,cszSourceDir,path,&sz);
             if (rc != ERROR_SUCCESS)
             {
                 sz = MAX_PATH;
-                rc = MsiGetPropertyW(hPackage,cszDatabase,path,&sz);
+                rc = MSI_GetPropertyW(package,cszDatabase,path,&sz);
                 if (rc == ERROR_SUCCESS)
                 {
                     LPWSTR ptr = strrchrW(path,'\\');
@@ -1889,7 +1950,7 @@
         strcpyW(path,package->folders[i].Property);
         TRACE("   internally set to %s\n",debugstr_w(path));
         if (set_prop)
-            MsiSetPropertyW(hPackage,name,path);
+            MSI_SetPropertyW(package,name,path);
         return ERROR_SUCCESS;
     }
 
@@ -1897,7 +1958,7 @@
     {
         TRACE(" ! Parent is %s\n", debugstr_w(package->folders[
                    package->folders[i].ParentIndex].Directory));
-        resolve_folder(hPackage, package->folders[
+        resolve_folder(package, package->folders[
                        package->folders[i].ParentIndex].Directory, path,source,
                        set_prop, NULL);
 
@@ -1911,7 +1972,7 @@
             strcpyW(package->folders[i].ResolvedTarget,path);
             TRACE("   resolved into %s\n",debugstr_w(path));
             if (set_prop)
-                MsiSetPropertyW(hPackage,name,path);
+                MSI_SetPropertyW(package,name,path);
         }
         else 
         {
@@ -1932,29 +1993,32 @@
  * to focus on the directory building
  *
  */
-static UINT ACTION_CostFinalize(MSIHANDLE hPackage)
+static UINT ACTION_CostFinalize(MSIPACKAGE *package)
 {
-    static const CHAR *ExecSeqQuery = "select * from Directory";
-    static const CHAR *ConditionQuery = "select * from Condition";
+    static const WCHAR ExecSeqQuery[] = {
+        's','e','l','e','c','t',' ','*',' ','f','r','o','m',' ',
+        'D','i','r','e','c','t','o','r','y',0};
+    static const WCHAR ConditionQuery[] = {
+        's','e','l','e','c','t',' ','*',' ','f','r','o','m',' ',
+        'C','o','n','d','i','t','i','o','n',0};
+    static const WCHAR szCosting[] = {
+       'C','o','s','t','i','n','g','C','o','m','p','l','e','t','e',0 };
+    static const WCHAR szOne[] = { '1', 0 };
     UINT rc;
-    MSIHANDLE view;
-    MSIPACKAGE *package;
+    MSIQUERY * view;
     INT i;
 
     TRACE("Building Directory properties\n");
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
-
-    rc = MsiDatabaseOpenViewA(package->db, ExecSeqQuery, &view);
-
+    rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
     
@@ -1962,11 +2026,10 @@
     {
         WCHAR name[0x100];
         WCHAR path[MAX_PATH];
-        MSIHANDLE row = 0;
+        MSIRECORD * row = 0;
         DWORD sz;
 
-        rc = MsiViewFetch(view,&row);
-
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
         {
             rc = ERROR_SUCCESS;
@@ -1974,18 +2037,18 @@
         }
 
         sz=0x100;
-        MsiRecordGetStringW(row,1,name,&sz);
+        MSI_RecordGetStringW(row,1,name,&sz);
 
         /* This helper function now does ALL the work */
         TRACE("Dir %s ...\n",debugstr_w(name));
-        load_folder(hPackage,name);
-        resolve_folder(hPackage,name,path,FALSE,TRUE,NULL);
+        load_folder(package,name);
+        resolve_folder(package,name,path,FALSE,TRUE,NULL);
         TRACE("resolves to %s\n",debugstr_w(path));
 
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
      }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
 
     TRACE("File calculations %i files\n",package->loaded_files);
 
@@ -2001,7 +2064,7 @@
         if (comp)
         {
             /* calculate target */
-            resolve_folder(hPackage, comp->Directory, file->TargetPath, FALSE,
+            resolve_folder(package, comp->Directory, file->TargetPath, FALSE,
                        FALSE, NULL);
             strcatW(file->TargetPath,file->FileName);
 
@@ -2052,27 +2115,26 @@
 
     TRACE("Evaluating Condition Table\n");
 
-    rc = MsiDatabaseOpenViewA(package->db, ConditionQuery, &view);
-
+    rc = MSI_DatabaseOpenViewW(package->db, ConditionQuery, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
     
     while (1)
     {
         WCHAR Feature[0x100];
-        MSIHANDLE row = 0;
+        MSIRECORD * row = 0;
         DWORD sz;
         int feature_index;
 
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
 
         if (rc != ERROR_SUCCESS)
         {
@@ -2081,7 +2143,7 @@
         }
 
         sz = 0x100;
-        MsiRecordGetStringW(row,1,Feature,&sz);
+        MSI_RecordGetStringW(row,1,Feature,&sz);
 
         feature_index = get_loaded_feature(package,Feature);
         if (feature_index < 0)
@@ -2091,9 +2153,9 @@
             LPWSTR Condition;
             Condition = load_dynamic_stringW(row,3);
 
-            if (MsiEvaluateConditionW(hPackage,Condition) == MSICONDITION_TRUE)
+            if (MSI_EvaluateConditionW(package,Condition) == MSICONDITION_TRUE)
             {
-                int level = MsiRecordGetInteger(row,2);
+                int level = MSI_RecordGetInteger(row,2);
                 TRACE("Reseting feature %s to level %i\n",debugstr_w(Feature),
                        level);
                 package->features[feature_index].Level = level;
@@ -2101,17 +2163,17 @@
             HeapFree(GetProcessHeap(),0,Condition);
         }
 
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
 
     TRACE("Enabling or Disabling Components\n");
     for (i = 0; i < package->loaded_components; i++)
     {
         if (package->components[i].Condition[0])
         {
-            if (MsiEvaluateConditionW(hPackage,
+            if (MSI_EvaluateConditionW(package,
                 package->components[i].Condition) == MSICONDITION_FALSE)
             {
                 TRACE("Disabling component %s\n",
@@ -2121,14 +2183,14 @@
         }
     }
 
-    MsiSetPropertyA(hPackage,"CostingComplete","1");
+    MSI_SetPropertyW(package,szCosting,szOne);
     return ERROR_SUCCESS;
 }
 
 /*
  * This is a helper function for handling embedded cabinet media
  */
-static UINT writeout_cabinet_stream(MSIHANDLE hPackage, WCHAR* stream_name,
+static UINT writeout_cabinet_stream(MSIPACKAGE *package, WCHAR* stream_name,
                                     WCHAR* source)
 {
     UINT rc;
@@ -2136,23 +2198,19 @@
     UINT    size;
     DWORD   write;
     HANDLE  the_file;
-    MSIHANDLE db;
     WCHAR tmp[MAX_PATH];
 
-    db = MsiGetActiveDatabase(hPackage);
-    rc = read_raw_stream_data(db,stream_name,&data,&size); 
-    MsiCloseHandle(db);
-
+    rc = read_raw_stream_data(package->db,stream_name,&data,&size); 
     if (rc != ERROR_SUCCESS)
         return rc;
 
     write = MAX_PATH;
-    if (MsiGetPropertyW(hPackage, cszTempFolder, tmp, &write))
+    if (MSI_GetPropertyW(package, cszTempFolder, tmp, &write))
         GetTempPathW(MAX_PATH,tmp);
 
     GetTempFileNameW(tmp,stream_name,0,source);
 
-    track_tempfile(hPackage,strrchrW(source,'\\'), source);
+    track_tempfile(package,strrchrW(source,'\\'), source);
     the_file = CreateFileW(source, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
                            FILE_ATTRIBUTE_NORMAL, NULL);
 
@@ -2264,21 +2322,23 @@
     return TRUE;
 }
 
-static UINT ready_media_for_file(MSIHANDLE hPackage, UINT sequence, 
+static UINT ready_media_for_file(MSIPACKAGE *package, UINT sequence, 
                                  WCHAR* path)
 {
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
     WCHAR source[MAX_PATH];
-    static const CHAR *ExecSeqQuery = 
-        "select * from Media where LastSequence >= %i order by LastSequence";
-    CHAR Query[1024];
+    static const WCHAR ExecSeqQuery[] = {
+        's','e','l','e','c','t',' ','*',' ',
+        'f','r','o','m',' ','M','e','d','i','a',' ',
+        'w','h','e','r','e',' ','L','a','s','t','S','e','q','u','e','n','c','e',' ','>','=',' ','%','i',' ',
+        'o','r','d','e','r',' ','b','y',' ','L','a','s','t','S','e','q','u','e','n','c','e',0};
+    WCHAR Query[1024];
     WCHAR cab[0x100];
     DWORD sz=0x100;
     INT seq;
     static INT last_sequence = 0; 
-    MSIHANDLE db;
 
     if (sequence <= last_sequence)
     {
@@ -2286,49 +2346,46 @@
         return ERROR_SUCCESS;
     }
 
-    sprintf(Query,ExecSeqQuery,sequence);
-
-    db = MsiGetActiveDatabase(hPackage);
-    rc = MsiDatabaseOpenViewA(db, Query, &view);
-    MsiCloseHandle(db);
+    sprintfW(Query,ExecSeqQuery,sequence);
 
+    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
-    rc = MsiViewFetch(view,&row);
+    rc = MSI_ViewFetch(view,&row);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
-    seq = MsiRecordGetInteger(row,2);
+    seq = MSI_RecordGetInteger(row,2);
     last_sequence = seq;
 
-    if (!MsiRecordIsNull(row,4))
+    if (!MSI_RecordIsNull(row,4))
     {
         sz=0x100;
-        MsiRecordGetStringW(row,4,cab,&sz);
+        MSI_RecordGetStringW(row,4,cab,&sz);
         TRACE("Source is CAB %s\n",debugstr_w(cab));
         /* the stream does not contain the # character */
         if (cab[0]=='#')
         {
-            writeout_cabinet_stream(hPackage,&cab[1],source);
+            writeout_cabinet_stream(package,&cab[1],source);
             strcpyW(path,source);
             *(strrchrW(path,'\\')+1)=0;
         }
         else
         {
             sz = MAX_PATH;
-            if (MsiGetPropertyW(hPackage, cszSourceDir, source, &sz))
+            if (MSI_GetPropertyW(package, cszSourceDir, source, &sz))
             {
                 ERR("No Source dir defined \n");
                 rc = ERROR_FUNCTION_FAILED;
@@ -2339,27 +2396,26 @@
                 strcatW(source,cab);
                 /* extract the cab file into a folder in the temp folder */
                 sz = MAX_PATH;
-                if (MsiGetPropertyW(hPackage, cszTempFolder,path, &sz) 
+                if (MSI_GetPropertyW(package, cszTempFolder,path, &sz) 
                                     != ERROR_SUCCESS)
                     GetTempPathW(MAX_PATH,path);
             }
         }
         rc = !extract_cabinet_file(source,path);
     }
-    MsiCloseHandle(row);
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    msiobj_release(&row->hdr);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
     return rc;
 }
 
-inline static UINT create_component_directory (MSIHANDLE hPackage, MSIPACKAGE*
-                                               package, INT component)
+inline static UINT create_component_directory ( MSIPACKAGE* package, INT component)
 {
     UINT rc;
     MSIFOLDER *folder;
     WCHAR install_path[MAX_PATH];
 
-    rc = resolve_folder(hPackage, package->components[component].Directory,
+    rc = resolve_folder(package, package->components[component].Directory,
                         install_path, FALSE, FALSE, &folder);
 
     if (rc != ERROR_SUCCESS)
@@ -2375,21 +2431,18 @@
     return rc;
 }
 
-static UINT ACTION_InstallFiles(MSIHANDLE hPackage)
+static UINT ACTION_InstallFiles(MSIPACKAGE *package)
 {
     UINT rc = ERROR_SUCCESS;
     INT index;
-    MSIPACKAGE *package;
-    MSIHANDLE uirow;
+    MSIRECORD * uirow;
     WCHAR uipath[MAX_PATH];
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
-
     if (!package)
         return ERROR_INVALID_HANDLE;
 
     /* increment progress bar each time action data is sent */
-    ui_progress(hPackage,1,1,1,0);
+    ui_progress(package,1,1,1,0);
 
     for (index = 0; index < package->loaded_files; index++)
     {
@@ -2412,7 +2465,7 @@
         if ((file->State == 1) || (file->State == 2))
         {
             TRACE("Installing %s\n",debugstr_w(file->File));
-            rc = ready_media_for_file(hPackage,file->Sequence,path_to_source);
+            rc = ready_media_for_file(package,file->Sequence,path_to_source);
             /* 
              * WARNING!
              * our file table could change here because a new temp file
@@ -2426,7 +2479,7 @@
                 break;
             }
 
-            create_component_directory(hPackage, package, file->ComponentIndex);
+            create_component_directory( package, file->ComponentIndex);
 
             strcpyW(file->SourcePath, path_to_source);
             strcatW(file->SourcePath, file->File);
@@ -2435,17 +2488,17 @@
                   debugstr_w(file->TargetPath));
 
             /* the UI chunk */
-            uirow=MsiCreateRecord(9);
-            MsiRecordSetStringW(uirow,1,file->File);
+            uirow=MSI_CreateRecord(9);
+            MSI_RecordSetStringW(uirow,1,file->File);
             strcpyW(uipath,file->TargetPath);
             *(strrchrW(uipath,'\\')+1)=0;
-            MsiRecordSetStringW(uirow,9,uipath);
-            MsiRecordSetInteger(uirow,6,file->FileSize);
-            ui_actiondata(hPackage,szInstallFiles,uirow);
-            MsiCloseHandle(uirow);
+            MSI_RecordSetStringW(uirow,9,uipath);
+            MSI_RecordSetInteger(uirow,6,file->FileSize);
+            ui_actiondata(package,szInstallFiles,uirow);
+            msiobj_release( &uirow->hdr );
 
             rc = !MoveFileW(file->SourcePath,file->TargetPath);
-            ui_progress(hPackage,2,0,0,0);
+            ui_progress(package,2,0,0,0);
 
             if (rc)
             {
@@ -2460,13 +2513,11 @@
     return rc;
 }
 
-inline static UINT get_file_target(MSIHANDLE hPackage, LPCWSTR file_key, 
+inline static UINT get_file_target(MSIPACKAGE *package, LPCWSTR file_key, 
                                    LPWSTR file_source)
 {
-    MSIPACKAGE *package;
     INT index;
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
     if (!package)
         return ERROR_INVALID_HANDLE;
 
@@ -2487,28 +2538,27 @@
     return ERROR_FUNCTION_FAILED;
 }
 
-static UINT ACTION_DuplicateFiles(MSIHANDLE hPackage)
+static UINT ACTION_DuplicateFiles(MSIPACKAGE *package)
 {
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
-    static const CHAR *ExecSeqQuery = "select * from DuplicateFile";
-    MSIPACKAGE* package;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
+    static const WCHAR ExecSeqQuery[] = {
+        's','e','l','e','c','t',' ','*',' ','f','r','o','m',' ',
+        'D','u','p','l','i','c','a','t','e','F','i','l','e',0};
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
     if (!package)
         return ERROR_INVALID_HANDLE;
 
-    rc = MsiDatabaseOpenViewA(package->db, ExecSeqQuery, &view);
-
+    rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
@@ -2523,7 +2573,7 @@
 
         DWORD sz=0x100;
 
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
         {
             rc = ERROR_SUCCESS;
@@ -2531,11 +2581,11 @@
         }
 
         sz=0x100;
-        rc = MsiRecordGetStringW(row,2,component,&sz);
+        rc = MSI_RecordGetStringW(row,2,component,&sz);
         if (rc != ERROR_SUCCESS)
         {
             ERR("Unable to get component\n");
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             break;
         }
 
@@ -2544,40 +2594,40 @@
             !package->components[component_index].FeatureState)
         {
             TRACE("Skipping copy due to disabled component\n");
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
         sz=0x100;
-        rc = MsiRecordGetStringW(row,3,file_key,&sz);
+        rc = MSI_RecordGetStringW(row,3,file_key,&sz);
         if (rc != ERROR_SUCCESS)
         {
             ERR("Unable to get file key\n");
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             break;
         }
 
-        rc = get_file_target(hPackage,file_key,file_source);
+        rc = get_file_target(package,file_key,file_source);
 
         if (rc != ERROR_SUCCESS)
         {
             ERR("Original file unknown %s\n",debugstr_w(file_key));
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             break;
         }
 
-        if (MsiRecordIsNull(row,4))
+        if (MSI_RecordIsNull(row,4))
         {
             strcpyW(dest_name,strrchrW(file_source,'\\')+1);
         }
         else
         {
             sz=0x100;
-            MsiRecordGetStringW(row,4,dest_name,&sz);
+            MSI_RecordGetStringW(row,4,dest_name,&sz);
             reduce_to_longfilename(dest_name);
          }
 
-        if (MsiRecordIsNull(row,5))
+        if (MSI_RecordIsNull(row,5))
         {
             strcpyW(dest_path,file_source);
             *strrchrW(dest_path,'\\')=0;
@@ -2586,13 +2636,13 @@
         {
             WCHAR destkey[0x100];
             sz=0x100;
-            MsiRecordGetStringW(row,5,destkey,&sz);
+            MSI_RecordGetStringW(row,5,destkey,&sz);
             sz = 0x100;
-            rc = resolve_folder(hPackage, destkey, dest_path,FALSE,FALSE,NULL);
+            rc = resolve_folder(package, destkey, dest_path,FALSE,FALSE,NULL);
             if (rc != ERROR_SUCCESS)
             {
                 ERR("Unable to get destination folder\n");
-                MsiCloseHandle(row);
+                msiobj_release(&row->hdr);
                 break;
             }
         }
@@ -2612,10 +2662,10 @@
 
         FIXME("We should track these duplicate files as well\n");   
  
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
     return rc;
 
 }
@@ -2623,7 +2673,7 @@
 
 /* OK this value is "interpretted" and then formatted based on the 
    first few characters */
-static LPSTR parse_value(MSIHANDLE hPackage, WCHAR *value, DWORD *type, 
+static LPSTR parse_value(MSIPACKAGE *package, WCHAR *value, DWORD *type, 
                          DWORD *size)
 {
     LPSTR data = NULL;
@@ -2636,7 +2686,7 @@
             LPWSTR deformated;
             int count;
 
-            deformat_string(hPackage, &value[2], &deformated);
+            deformat_string(package, &value[2], &deformated);
 
             /* binary value type */
             ptr = deformated; 
@@ -2664,7 +2714,7 @@
         else
         {
             LPWSTR deformated;
-            deformat_string(hPackage, &value[1], &deformated);
+            deformat_string(package, &value[1], &deformated);
 
             *type=REG_DWORD; 
             *size = sizeof(DWORD);
@@ -2693,38 +2743,37 @@
          else
             ptr=value;
 
-        *size = deformat_string(hPackage, ptr,(LPWSTR*)&data);
+        *size = deformat_string(package, ptr,(LPWSTR*)&data);
     }
     return data;
 }
 
-static UINT ACTION_WriteRegistryValues(MSIHANDLE hPackage)
+static UINT ACTION_WriteRegistryValues(MSIPACKAGE *package)
 {
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
-    static const CHAR *ExecSeqQuery = "select * from Registry";
-    MSIPACKAGE *package;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
+    static const WCHAR ExecSeqQuery[] = {
+        's','e','l','e','c','t',' ','*',' ',
+        'f','r','o','m',' ','R','e','g','i','s','t','r','y',0 };
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
     if (!package)
         return ERROR_INVALID_HANDLE;
 
-    rc = MsiDatabaseOpenViewA(package->db, ExecSeqQuery, &view);
-
+    rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
     /* increment progress bar each time action data is sent */
-    ui_progress(hPackage,1,1,1,0);
+    ui_progress(package,1,1,1,0);
 
     while (1)
     {
@@ -2746,13 +2795,13 @@
         DWORD type,size;
         WCHAR component[0x100];
         INT component_index;
-        MSIHANDLE uirow;
+        MSIRECORD * uirow;
         WCHAR uikey[0x110];
 
         INT   root;
         DWORD sz=0x100;
 
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
         {
             rc = ERROR_SUCCESS;
@@ -2760,34 +2809,34 @@
         }
 
         sz= 0x100;
-        MsiRecordGetStringW(row,6,component,&sz);
+        MSI_RecordGetStringW(row,6,component,&sz);
         component_index = get_loaded_component(package,component);
 
         if (!package->components[component_index].Enabled ||
             !package->components[component_index].FeatureState)
         {
             TRACE("Skipping write due to disabled component\n");
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
         /* null values have special meanings during uninstalls and such */
         
-        if(MsiRecordIsNull(row,5))
+        if(MSI_RecordIsNull(row,5))
         {
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
-        root = MsiRecordGetInteger(row,2);
+        root = MSI_RecordGetInteger(row,2);
         sz = 0x100;
-        MsiRecordGetStringW(row,3,key,&sz);
+        MSI_RecordGetStringW(row,3,key,&sz);
       
         sz = 0x100; 
-        if (MsiRecordIsNull(row,4))
+        if (MSI_RecordIsNull(row,4))
             name[0]=0;
         else
-            MsiRecordGetStringW(row,4,name,&sz);
+            MSI_RecordGetStringW(row,4,name,&sz);
    
         /* get the root key */
         switch (root)
@@ -2807,7 +2856,7 @@
         }
         if (!root_key)
         {
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
@@ -2815,40 +2864,40 @@
         if (RegCreateKeyW( root_key, key, &hkey))
         {
             ERR("Could not create key %s\n",debugstr_w(key));
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
         value = load_dynamic_stringW(row,5);
-        value_data = parse_value(hPackage, value, &type, &size); 
+        value_data = parse_value(package, value, &type, &size); 
 
         if (value_data)
         {
             TRACE("Setting value %s\n",debugstr_w(name));
             RegSetValueExW(hkey, name, 0, type, value_data, size);
 
-            uirow = MsiCreateRecord(3);
-            MsiRecordSetStringW(uirow,2,name);
-            MsiRecordSetStringW(uirow,1,uikey);
+            uirow = MSI_CreateRecord(3);
+            MSI_RecordSetStringW(uirow,2,name);
+            MSI_RecordSetStringW(uirow,1,uikey);
 
             if (type == REG_SZ)
-                MsiRecordSetStringW(uirow,3,(LPWSTR)value_data);
+                MSI_RecordSetStringW(uirow,3,(LPWSTR)value_data);
             else
-                MsiRecordSetStringW(uirow,3,value);
+                MSI_RecordSetStringW(uirow,3,value);
 
-            ui_actiondata(hPackage,szWriteRegistryValues,uirow);
-            ui_progress(hPackage,2,0,0,0);
-            MsiCloseHandle(uirow);
+            ui_actiondata(package,szWriteRegistryValues,uirow);
+            ui_progress(package,2,0,0,0);
+            msiobj_release( &uirow->hdr );
 
             HeapFree(GetProcessHeap(),0,value_data);
         }
         HeapFree(GetProcessHeap(),0,value);
 
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
         RegCloseKey(hkey);
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
     return rc;
 }
 
@@ -2857,7 +2906,7 @@
  *
  * Thinking about this, maybe this should become yet another Bison file
  */
-static DWORD deformat_string(MSIHANDLE hPackage, WCHAR* ptr,WCHAR** data)
+static DWORD deformat_string(MSIPACKAGE *package, WCHAR* ptr,WCHAR** data)
 {
     WCHAR* mark=NULL;
     DWORD size=0;
@@ -2902,14 +2951,14 @@
     mark++;
     TRACE("Current %s .. %s\n",debugstr_w(*data),debugstr_w(mark));
     sz = 0;
-    rc = MsiGetPropertyW(hPackage, key, NULL, &sz);
+    rc = MSI_GetPropertyW(package, key, NULL, &sz);
     if ((rc == ERROR_SUCCESS) || (rc == ERROR_MORE_DATA))
     {
         LPWSTR newdata;
 
         sz++;
         value = HeapAlloc(GetProcessHeap(),0,sz * sizeof(WCHAR));
-        MsiGetPropertyW(hPackage, key, value, &sz);
+        MSI_GetPropertyW(package, key, value, &sz);
 
         chunk = (strlenW(value)+1) * sizeof(WCHAR);
         size+=chunk;   
@@ -2934,46 +2983,45 @@
     mark = HeapAlloc(GetProcessHeap(),0,size);
     strcpyW(mark,*data);
     TRACE("String at this point %s\n",debugstr_w(mark));
-    size = deformat_string(hPackage,mark,data);
+    size = deformat_string(package,mark,data);
     HeapFree(GetProcessHeap(),0,mark);
     return size;
 }
 
-static UINT ACTION_InstallInitialize(MSIHANDLE hPackage)
+static UINT ACTION_InstallInitialize(MSIPACKAGE *package)
 {
-    CHAR level[10000];
+    WCHAR level[10000];
     INT install_level;
     DWORD sz;
-    MSIPACKAGE *package; 
     INT i,j;
     DWORD rc;
     LPWSTR override = NULL;
     static const WCHAR addlocal[]={'A','D','D','L','O','C','A','L',0};
     static const WCHAR all[]={'A','L','L',0};
+    static const WCHAR szlevel[] = {
+        'I','N','S','T','A','L','L','L','E','V','E','L',0};
+    static const WCHAR szAddLocal[] = {
+        'A','D','D','L','O','C','A','L',0};
 
     /* I do not know if this is where it should happen.. but */
 
     TRACE("Checking Install Level\n");
 
     sz = 10000;
-    if (MsiGetPropertyA(hPackage,"INSTALLLEVEL",level,&sz)==ERROR_SUCCESS)
-        install_level = atoi(level);
+    if (MSI_GetPropertyW(package,szlevel,level,&sz)==ERROR_SUCCESS)
+        install_level = atoiW(level);
     else
         install_level = 1;
 
     sz = 0;
-    rc = MsiGetPropertyA(hPackage,"ADDLOCAL",NULL,&sz);
+    rc = MSI_GetPropertyW(package,szAddLocal,NULL,&sz);
     if (rc == ERROR_SUCCESS || rc == ERROR_MORE_DATA)
     {
         sz++;
         override = HeapAlloc(GetProcessHeap(),0,sz*sizeof(WCHAR));
-        MsiGetPropertyW(hPackage, addlocal,override,&sz);
+        MSI_GetPropertyW(package, addlocal,override,&sz);
     }
    
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
-    if (!package)
-        return ERROR_INVALID_HANDLE;
-
     /*
      * components FeatureState defaults to FALSE. the idea is we want to 
      * enable the component is ANY feature that uses it is enabled to install
@@ -3008,24 +3056,31 @@
     return ERROR_SUCCESS;
 }
 
-static UINT ACTION_InstallValidate(MSIHANDLE hPackage)
+static UINT ACTION_InstallValidate(MSIPACKAGE *package)
 {
     DWORD progress = 0;
-    static const CHAR q1[]="SELECT * FROM Registry";
+    static const WCHAR q1[]={
+        'S','E','L','E','C','T',' ','*',' ',
+        'F','R','O','M',' ','R','e','g','i','s','t','r','y',0};
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
-    MSIHANDLE db;
-    MSIPACKAGE* package;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
 
     TRACE(" InstallValidate \n");
 
-    db = MsiGetActiveDatabase(hPackage);
-    rc = MsiDatabaseOpenViewA(db, q1, &view);
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_DatabaseOpenViewW(package->db, q1, &view);
+    if (rc != ERROR_SUCCESS)
+        return rc;
+    rc = MSI_ViewExecute(view, 0);
+    if (rc != ERROR_SUCCESS)
+    {
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
+        return rc;
+    }
     while (1)
     {
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
         {
             rc = ERROR_SUCCESS;
@@ -3033,42 +3088,38 @@
         }
         progress +=1;
 
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
-    MsiCloseHandle(db);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
-    ui_progress(hPackage,0,progress+package->loaded_files,0,0);
+    ui_progress(package,0,progress+package->loaded_files,0,0);
 
     return ERROR_SUCCESS;
 }
 
-static UINT ACTION_LaunchConditions(MSIHANDLE hPackage)
+static UINT ACTION_LaunchConditions(MSIPACKAGE *package)
 {
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
-    static const CHAR *ExecSeqQuery = "SELECT * from LaunchCondition";
-    MSIHANDLE db;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
+    static const WCHAR ExecSeqQuery[] = {
+        'S','E','L','E','C','T',' ','*',' ',
+        'f','r','o','m',' ','L','a','u','n','c','h','C','o','n','d','i','t','i','o','n',0};
     static const WCHAR title[]=
             {'I','n','s','t','a','l','l',' ','F','a', 'i','l','e','d',0};
 
     TRACE("Checking launch conditions\n");
 
-    db = MsiGetActiveDatabase(hPackage);
-    rc = MsiDatabaseOpenViewA(db, ExecSeqQuery, &view);
-    MsiCloseHandle(db);
-
+    rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
@@ -3078,7 +3129,7 @@
         LPWSTR cond = NULL; 
         LPWSTR message = NULL;
 
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
         {
             rc = ERROR_SUCCESS;
@@ -3087,7 +3138,7 @@
 
         cond = load_dynamic_stringW(row,1);
 
-        if (MsiEvaluateConditionW(hPackage,cond) != MSICONDITION_TRUE)
+        if (MSI_EvaluateConditionW(package,cond) != MSICONDITION_TRUE)
         {
             message = load_dynamic_stringW(row,2);
             MessageBoxW(NULL,message,title,MB_OK);
@@ -3095,21 +3146,21 @@
             rc = ERROR_FUNCTION_FAILED;
         }
         HeapFree(GetProcessHeap(),0,cond);
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
     return rc;
 }
 
-static void resolve_keypath(MSIHANDLE hPackage, MSIPACKAGE* package, INT
+static void resolve_keypath( MSIPACKAGE* package, INT
                             component_index, WCHAR *keypath)
 {
     MSICOMPONENT* cmp = &package->components[component_index];
 
     if (cmp->KeyPath[0]==0)
     {
-        resolve_folder(hPackage,cmp->Directory,keypath,FALSE,FALSE,NULL);
+        resolve_folder(package,cmp->Directory,keypath,FALSE,FALSE,NULL);
         return;
     }
     if ((cmp->Attributes & 0x4) || (cmp->Attributes & 0x20))
@@ -3134,9 +3185,8 @@
  * resolved in this step, however actually written in the Publish steps.
  * But we will leave it here for now because it is unclear
  */
-static UINT ACTION_ProcessComponents(MSIHANDLE hPackage)
+static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
 {
-    MSIPACKAGE* package;
     WCHAR productcode[0x100];
     WCHAR squished_pc[0x100];
     WCHAR squished_cc[0x100];
@@ -3157,14 +3207,12 @@
     static const WCHAR szComponents[] = {
 'C','o','m','p','o','n','e','n','t','s',0 };
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
     if (!package)
         return ERROR_INVALID_HANDLE;
 
     /* writes the Component and Features values to the registry */
     sz = 0x100;
-    rc = MsiGetPropertyW(hPackage,szProductCode,productcode,&sz);
-
+    rc = MSI_GetPropertyW(package,szProductCode,productcode,&sz);
     if (rc != ERROR_SUCCESS)
         return ERROR_SUCCESS;
 
@@ -3224,26 +3272,26 @@
         if (package->components[i].ComponentId[0]!=0)
         {
             WCHAR keypath[0x1000];
-            MSIHANDLE uirow;
+            MSIRECORD * uirow;
 
             squash_guid(package->components[i].ComponentId,squished_cc);
             rc = RegCreateKeyW(hkey2,squished_cc,&hkey3);
             if (rc != ERROR_SUCCESS)
                 continue;
            
-            resolve_keypath(hPackage,package,i,keypath);
+            resolve_keypath(package,i,keypath);
 
             RegSetValueExW(hkey3,squished_pc,0,REG_SZ,(LPVOID)keypath,
                             (strlenW(keypath)+1)*sizeof(WCHAR));
             RegCloseKey(hkey3);
         
             /* UI stuff */
-            uirow = MsiCreateRecord(3);
-            MsiRecordSetStringW(uirow,1,productcode);
-            MsiRecordSetStringW(uirow,2,package->components[i].ComponentId);
-            MsiRecordSetStringW(uirow,3,keypath);
-            ui_actiondata(hPackage,szProcessComponents,uirow);
-            MsiCloseHandle(uirow);
+            uirow = MSI_CreateRecord(3);
+            MSI_RecordSetStringW(uirow,1,productcode);
+            MSI_RecordSetStringW(uirow,2,package->components[i].ComponentId);
+            MSI_RecordSetStringW(uirow,3,keypath);
+            ui_actiondata(package,szProcessComponents,uirow);
+            msiobj_release( &uirow->hdr );
         }
     } 
 end:
@@ -3252,7 +3300,7 @@
     return rc;
 }
 
-static UINT ACTION_RegisterTypeLibraries(MSIHANDLE hPackage)
+static UINT ACTION_RegisterTypeLibraries(MSIPACKAGE *package)
 {
     /* 
      * ok this is a bit confusting.. I am given a _Component key and i believe
@@ -3261,27 +3309,26 @@
      * that component" 
      */
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
-    static const CHAR *Query = "SELECT * from TypeLib";
-    MSIPACKAGE* package;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
+    static const WCHAR Query[] = {
+        'S','E','L','E','C','T',' ','*',' ',
+        'f','r','o','m',' ','T','y','p','e','L','i','b',0};
     ITypeLib *ptLib;
     HRESULT res;
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
     if (!package)
         return ERROR_INVALID_HANDLE;
 
-    rc = MsiDatabaseOpenViewA(package->db, Query, &view);
-
+    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
@@ -3291,7 +3338,7 @@
         DWORD sz;
         INT index;
 
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
         {
             rc = ERROR_SUCCESS;
@@ -3299,12 +3346,12 @@
         }
 
         sz = 0x100;
-        MsiRecordGetStringW(row,3,component,&sz);
+        MSI_RecordGetStringW(row,3,component,&sz);
 
         index = get_loaded_component(package,component);
         if (index < 0)
         {
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
@@ -3312,7 +3359,7 @@
             !package->components[index].FeatureState)
         {
             TRACE("Skipping typelib reg due to disabled component\n");
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
@@ -3320,7 +3367,7 @@
    
         if (index < 0)
         {
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
@@ -3331,9 +3378,9 @@
             WCHAR helpid[0x100];
 
             sz = 0x100;
-            MsiRecordGetStringW(row,6,helpid,&sz);
+            MSI_RecordGetStringW(row,6,helpid,&sz);
 
-            resolve_folder(hPackage,helpid,help,FALSE,FALSE,NULL);
+            resolve_folder(package,helpid,help,FALSE,FALSE,NULL);
 
             res = RegisterTypeLib(ptLib,package->files[index].TargetPath,help);
             if (!SUCCEEDED(res))
@@ -3344,7 +3391,7 @@
                 /* yes the row has more fields than i need, but #1 is 
                    correct and the only one i need. why make a new row */
 
-                ui_actiondata(hPackage,szRegisterTypeLibraries,row);
+                ui_actiondata(package,szRegisterTypeLibraries,row);
                 
                 TRACE("Registered %s\n",
                        debugstr_w(package->files[index].TargetPath));
@@ -3357,44 +3404,41 @@
             ERR("Failed to load type library %s\n",
                 debugstr_w(package->files[index].TargetPath));
         
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
     return rc;
    
 }
 
-static UINT register_appid(MSIHANDLE hPackage, LPCWSTR clsid, LPCWSTR app )
+static UINT register_appid(MSIPACKAGE *package, LPCWSTR clsid, LPCWSTR app )
 {
     static const WCHAR szAppID[] = { 'A','p','p','I','D',0 };
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
     static const WCHAR ExecSeqQuery[] = 
 {'S','E','L','E','C','T',' ','*',' ','f','r','o','m',' ','A','p','p','I'
 ,'d',' ','w','h','e','r','e',' ','A','p','p','I','d','=','`','%','s','`',0};
     WCHAR Query[0x1000];
-    MSIPACKAGE* package;
     HKEY hkey2,hkey3;
     LPWSTR buffer=0;
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
     if (!package)
         return ERROR_INVALID_HANDLE;
 
-
     sprintfW(Query,ExecSeqQuery,clsid);
 
-    rc = MsiDatabaseOpenViewW(package->db, Query, &view);
+    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
@@ -3403,23 +3447,29 @@
     RegSetValueExW(hkey3,NULL,0,REG_SZ,(LPVOID)app,
                    (strlenW(app)+1)*sizeof(WCHAR));
 
-    MsiViewFetch(view,&row);
+    rc = MSI_ViewFetch(view,&row);
+    if (rc != ERROR_SUCCESS)
+    {
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
+        return rc;
+    }
 
-    if (!MsiRecordIsNull(row,2)) 
+    if (!MSI_RecordIsNull(row,2)) 
     {
         LPWSTR deformated=0;
         UINT size; 
         static const WCHAR szRemoteServerName[] =
 {'R','e','m','o','t','e','S','e','r','v','e','r','N','a','m','e',0};
         buffer = load_dynamic_stringW(row,2);
-        size = deformat_string(hPackage,buffer,&deformated);
+        size = deformat_string(package,buffer,&deformated);
         RegSetValueExW(hkey3,szRemoteServerName,0,REG_SZ,(LPVOID)deformated,
                        size);
         HeapFree(GetProcessHeap(),0,deformated);
         HeapFree(GetProcessHeap(),0,buffer);
     }
 
-    if (!MsiRecordIsNull(row,3)) 
+    if (!MSI_RecordIsNull(row,3)) 
     {
         static const WCHAR szLocalService[] =
 {'L','o','c','a','l','S','e','r','v','i','c','e',0};
@@ -3430,7 +3480,7 @@
         HeapFree(GetProcessHeap(),0,buffer);
     }
 
-    if (!MsiRecordIsNull(row,4)) 
+    if (!MSI_RecordIsNull(row,4)) 
     {
         static const WCHAR szService[] =
 {'S','e','r','v','i','c','e','P','a','r','a','m','e','t','e','r','s',0};
@@ -3441,7 +3491,7 @@
         HeapFree(GetProcessHeap(),0,buffer);
     }
 
-    if (!MsiRecordIsNull(row,5)) 
+    if (!MSI_RecordIsNull(row,5)) 
     {
         static const WCHAR szDLL[] =
 {'D','l','l','S','u','r','r','o','g','a','t','e',0};
@@ -3452,35 +3502,35 @@
         HeapFree(GetProcessHeap(),0,buffer);
     }
 
-    if (!MsiRecordIsNull(row,6)) 
+    if (!MSI_RecordIsNull(row,6)) 
     {
         static const WCHAR szActivate[] =
 {'A','c','t','i','v','a','t','e','A','s','S','t','o','r','a','g','e',0};
         static const WCHAR szY[] = {'Y',0};
 
-        if (MsiRecordGetInteger(row,6))
+        if (MSI_RecordGetInteger(row,6))
             RegSetValueExW(hkey3,szActivate,0,REG_SZ,(LPVOID)szY,4);
     }
 
-    if (!MsiRecordIsNull(row,7)) 
+    if (!MSI_RecordIsNull(row,7)) 
     {
         static const WCHAR szRunAs[] = {'R','u','n','A','s',0};
         static const WCHAR szUser[] = 
 {'I','n','t','e','r','a','c','t','i','v','e',' ','U','s','e','r',0};
 
-        if (MsiRecordGetInteger(row,7))
+        if (MSI_RecordGetInteger(row,7))
             RegSetValueExW(hkey3,szRunAs,0,REG_SZ,(LPVOID)szUser,34);
     }
 
-    MsiCloseHandle(row);
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    msiobj_release(&row->hdr);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
     RegCloseKey(hkey3);
     RegCloseKey(hkey2);
     return rc;
 }
 
-static UINT ACTION_RegisterClassInfo(MSIHANDLE hPackage)
+static UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
 {
     /* 
      * Again I am assuming the words, "Whose key file respesents" when refering
@@ -3494,16 +3544,16 @@
      */
     
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
-    static const CHAR *ExecSeqQuery = "SELECT * from Class";
-    MSIPACKAGE* package;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
+    static const WCHAR ExecSeqQuery[] = {
+        'S','E','L','E','C','T',' ','*',' ',
+        'f','r','o','m',' ','C','l','a','s','s',0};
     static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 };
     static const WCHAR szProgID[] = { 'P','r','o','g','I','D',0 };
     static const WCHAR szAppID[] = { 'A','p','p','I','D',0 };
     HKEY hkey,hkey2,hkey3;
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
     if (!package)
         return ERROR_INVALID_HANDLE;
 
@@ -3511,16 +3561,15 @@
     if (rc != ERROR_SUCCESS)
         return ERROR_FUNCTION_FAILED;
 
-    rc = MsiDatabaseOpenViewA(package->db, ExecSeqQuery, &view);
-
+    rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
     if (rc != ERROR_SUCCESS)
         goto end;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         goto end;
     }
 
@@ -3532,7 +3581,7 @@
         DWORD sz;
         INT index;
      
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
         {
             rc = ERROR_SUCCESS;
@@ -3540,13 +3589,13 @@
         }
 
         sz=0x100;
-        MsiRecordGetStringW(row,3,buffer,&sz);
+        MSI_RecordGetStringW(row,3,buffer,&sz);
 
         index = get_loaded_component(package,buffer);
 
         if (index < 0)
         {
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
@@ -3554,18 +3603,18 @@
             !package->components[index].FeatureState)
         {
             TRACE("Skipping class reg due to disabled component\n");
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
         sz=0x100;
-        MsiRecordGetStringW(row,1,clsid,&sz);
+        MSI_RecordGetStringW(row,1,clsid,&sz);
         RegCreateKeyW(hkey,clsid,&hkey2);
 
-        if (!MsiRecordIsNull(row,5))
+        if (!MSI_RecordIsNull(row,5))
         {
             sz=0x100;
-            MsiRecordGetStringW(row,5,desc,&sz);
+            MSI_RecordGetStringW(row,5,desc,&sz);
 
             RegSetValueExW(hkey2,NULL,0,REG_SZ,(LPVOID)desc,
                            (strlenW(desc)+1)*sizeof(WCHAR));
@@ -3574,7 +3623,7 @@
             desc[0]=0;
 
         sz=0x100;
-        MsiRecordGetStringW(row,2,buffer,&sz);
+        MSI_RecordGetStringW(row,2,buffer,&sz);
 
         RegCreateKeyW(hkey2,buffer,&hkey3);
 
@@ -3586,10 +3635,10 @@
 
         RegCloseKey(hkey3);
 
-        if (!MsiRecordIsNull(row,4))
+        if (!MSI_RecordIsNull(row,4))
         {
             sz=0x100;
-            MsiRecordGetStringW(row,4,buffer,&sz);
+            MSI_RecordGetStringW(row,4,buffer,&sz);
 
             RegCreateKeyW(hkey2,szProgID,&hkey3);
     
@@ -3599,34 +3648,34 @@
             RegCloseKey(hkey3);
         }
 
-        if (!MsiRecordIsNull(row,6))
+        if (!MSI_RecordIsNull(row,6))
         { 
             sz=0x100;
-            MsiRecordGetStringW(row,6,buffer,&sz);
+            MSI_RecordGetStringW(row,6,buffer,&sz);
 
             RegSetValueExW(hkey2,szAppID,0,REG_SZ,(LPVOID)buffer,
                        (strlenW(buffer)+1)*sizeof(WCHAR));
 
-            register_appid(hPackage,buffer,desc);
+            register_appid(package,buffer,desc);
         }
 
         RegCloseKey(hkey2);
 
         FIXME("Process the rest of the fields >7\n");
 
-        ui_actiondata(hPackage,szRegisterClassInfo,row);
+        ui_actiondata(package,szRegisterClassInfo,row);
 
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
 
 end:
     RegCloseKey(hkey);
     return rc;
 }
 
-static UINT register_progid_base(MSIHANDLE row, LPWSTR clsid)
+static UINT register_progid_base(MSIRECORD * row, LPWSTR clsid)
 {
     static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 };
     HKEY hkey,hkey2;
@@ -3635,22 +3684,22 @@
 
 
     sz = 0x100;
-    MsiRecordGetStringW(row,1,buffer,&sz);
+    MSI_RecordGetStringW(row,1,buffer,&sz);
     RegCreateKeyW(HKEY_CLASSES_ROOT,buffer,&hkey);
 
-    if (!MsiRecordIsNull(row,4))
+    if (!MSI_RecordIsNull(row,4))
     {
         sz = 0x100;
-        MsiRecordGetStringW(row,4,buffer,&sz);
+        MSI_RecordGetStringW(row,4,buffer,&sz);
         RegSetValueExW(hkey,NULL,0,REG_SZ,(LPVOID)buffer, (strlenW(buffer)+1) *
                        sizeof(WCHAR));
     }
 
-    if (!MsiRecordIsNull(row,3))
+    if (!MSI_RecordIsNull(row,3))
     {   
         sz = 0x100;
     
-        MsiRecordGetStringW(row,3,buffer,&sz);
+        MSI_RecordGetStringW(row,3,buffer,&sz);
         RegCreateKeyW(hkey,szCLSID,&hkey2);
         RegSetValueExW(hkey2,NULL,0,REG_SZ,(LPVOID)buffer, (strlenW(buffer)+1) *
                        sizeof(WCHAR));
@@ -3665,66 +3714,63 @@
         FIXME("UNHANDLED case, Parent progid but classid is NULL\n");
         return ERROR_FUNCTION_FAILED;
     }
-    if (!MsiRecordIsNull(row,5))
+    if (!MSI_RecordIsNull(row,5))
         FIXME ("UNHANDLED icon in Progid\n");
     return ERROR_SUCCESS;
 }
 
-static UINT register_progid(MSIHANDLE hPackage, MSIHANDLE row, LPWSTR clsid);
+static UINT register_progid(MSIPACKAGE *package, MSIRECORD * row, LPWSTR clsid);
 
-static UINT register_parent_progid(MSIHANDLE hPackage, LPCWSTR parent, 
+static UINT register_parent_progid(MSIPACKAGE *package, LPCWSTR parent, 
                                    LPWSTR clsid)
 {
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
     static const WCHAR Query_t[] = 
 {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','P','r','o','g'
 ,'I','d',' ','w','h','e','r','e',' ','P','r','o','g','I','d',' ','=',' ','`'
 ,'%','s','`',0};
     WCHAR Query[0x1000];
-    MSIPACKAGE* package;
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
     if (!package)
         return ERROR_INVALID_HANDLE;
 
     sprintfW(Query,Query_t,parent);
 
-    rc = MsiDatabaseOpenViewW(package->db, Query, &view);
-
+    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
-    rc = MsiViewFetch(view,&row);
+    rc = MSI_ViewFetch(view,&row);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
-    register_progid(hPackage,row,clsid);
+    register_progid(package,row,clsid);
 
-    MsiCloseHandle(row);
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    msiobj_release(&row->hdr);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
     return rc;
 }
 
-static UINT register_progid(MSIHANDLE hPackage, MSIHANDLE row, LPWSTR clsid)
+static UINT register_progid(MSIPACKAGE *package, MSIRECORD * row, LPWSTR clsid)
 {
     UINT rc = ERROR_SUCCESS; 
 
-    if (MsiRecordIsNull(row,2))
+    if (MSI_RecordIsNull(row,2))
         rc = register_progid_base(row,clsid);
     else
     {
@@ -3734,11 +3780,11 @@
         static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 };
 
         sz = 0x100;
-        MsiRecordGetStringW(row,2,buffer,&sz);
-        rc = register_parent_progid(hPackage,buffer,clsid);
+        MSI_RecordGetStringW(row,2,buffer,&sz);
+        rc = register_parent_progid(package,buffer,clsid);
 
         sz = 0x100;
-        MsiRecordGetStringW(row,1,buffer,&sz);
+        MSI_RecordGetStringW(row,1,buffer,&sz);
         RegCreateKeyW(HKEY_CLASSES_ROOT,buffer,&hkey);
         /* clasid is same as parent */
         RegCreateKeyW(hkey,szCLSID,&hkey2);
@@ -3746,15 +3792,15 @@
                        sizeof(WCHAR));
 
         RegCloseKey(hkey2);
-        if (!MsiRecordIsNull(row,4))
+        if (!MSI_RecordIsNull(row,4))
         {
             sz = 0x100;
-            MsiRecordGetStringW(row,4,buffer,&sz);
+            MSI_RecordGetStringW(row,4,buffer,&sz);
             RegSetValueExW(hkey,NULL,0,REG_SZ,(LPVOID)buffer,
                            (strlenW(buffer)+1) * sizeof(WCHAR));
         }
 
-        if (!MsiRecordIsNull(row,5))
+        if (!MSI_RecordIsNull(row,5))
             FIXME ("UNHANDLED icon in Progid\n");
 
         RegCloseKey(hkey);
@@ -3762,7 +3808,7 @@
     return rc;
 }
 
-static UINT ACTION_RegisterProgIdInfo(MSIHANDLE hPackage)
+static UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package)
 {
     /* 
      * Sigh, here i am just brute force registering all progid
@@ -3773,25 +3819,24 @@
      * gives me something to continue to work toward
      */
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
-    static const CHAR *Query = "SELECT * FROM ProgId";
-    MSIPACKAGE* package;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
+    static const WCHAR Query[] = {
+        'S','E','L','E','C','T',' ','*',' ',
+        'F','R','O','M',' ','P','r','o','g','I','d',0};
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
     if (!package)
         return ERROR_INVALID_HANDLE;
 
-    rc = MsiDatabaseOpenViewA(package->db, Query, &view);
-
+    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
@@ -3799,24 +3844,24 @@
     {
         WCHAR clsid[0x1000];
 
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
         {
             rc = ERROR_SUCCESS;
             break;
         }
         
-        register_progid(hPackage,row,clsid);
-        ui_actiondata(hPackage,szRegisterProgIdInfo,row);
+        register_progid(package,row,clsid);
+        ui_actiondata(package,szRegisterProgIdInfo,row);
 
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
     return rc;
 }
 
-static UINT build_icon_path(MSIHANDLE hPackage, LPCWSTR icon_name, 
+static UINT build_icon_path(MSIPACKAGE *package, LPCWSTR icon_name, 
                             LPWSTR FilePath)
 {
     WCHAR ProductCode[0x100];
@@ -3831,12 +3876,12 @@
 {'W','i','n','d','o','w','s','F','o','l','d','e','r',0};
 
     sz = 0x100;
-    MsiGetPropertyW(hPackage,szProductCode,ProductCode,&sz);
+    MSI_GetPropertyW(package,szProductCode,ProductCode,&sz);
     if (strlenW(ProductCode)==0)
         return ERROR_FUNCTION_FAILED;
 
     sz = MAX_PATH;
-    MsiGetPropertyW(hPackage,szFolder,SystemFolder,&sz);
+    MSI_GetPropertyW(package,szFolder,SystemFolder,&sz);
     strcatW(SystemFolder,szInstaller); 
     strcatW(SystemFolder,ProductCode);
     create_full_pathW(SystemFolder);
@@ -3847,19 +3892,18 @@
     return ERROR_SUCCESS;
 }
 
-static UINT ACTION_CreateShortcuts(MSIHANDLE hPackage)
+static UINT ACTION_CreateShortcuts(MSIPACKAGE *package)
 {
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
-    static const CHAR *Query = "SELECT * from Shortcut";
-    MSIPACKAGE* package;
-
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
+    static const WCHAR Query[] = {
+       'S','E','L','E','C','T',' ','*',' ','f','r','o','m',' ',
+       'S','h','o','r','t','c','u','t',0};
     IShellLinkW *sl;
     IPersistFile *pf;
     HRESULT res;
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
     if (!package)
         return ERROR_INVALID_HANDLE;
 
@@ -3870,16 +3914,15 @@
         return ERROR_FUNCTION_FAILED;
     }
 
-    rc = MsiDatabaseOpenViewA(package->db, Query, &view);
-
+    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
@@ -3891,7 +3934,7 @@
         DWORD index;
         static const WCHAR szlnk[]={'.','l','n','k',0};
 
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
         {
             rc = ERROR_SUCCESS;
@@ -3899,13 +3942,13 @@
         }
         
         sz = 0x100;
-        MsiRecordGetStringW(row,4,buffer,&sz);
+        MSI_RecordGetStringW(row,4,buffer,&sz);
 
         index = get_loaded_component(package,buffer);
 
         if (index < 0)
         {
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
@@ -3913,11 +3956,11 @@
             !package->components[index].FeatureState)
         {
             TRACE("Skipping shortcut creation due to disabled component\n");
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
-        ui_actiondata(hPackage,szCreateShortcuts,row);
+        ui_actiondata(package,szCreateShortcuts,row);
 
         res = CoCreateInstance( &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
                               &IID_IShellLinkW, (LPVOID *) &sl );
@@ -3925,7 +3968,7 @@
         if (FAILED(res))
         {
             ERR("Is IID_IShellLink\n");
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
@@ -3933,27 +3976,27 @@
         if( FAILED( res ) )
         {
             ERR("Is IID_IPersistFile\n");
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
         sz = 0x100;
-        MsiRecordGetStringW(row,2,buffer,&sz);
-        resolve_folder(hPackage, buffer,target_file,FALSE,FALSE,NULL);
+        MSI_RecordGetStringW(row,2,buffer,&sz);
+        resolve_folder(package, buffer,target_file,FALSE,FALSE,NULL);
 
         sz = 0x100;
-        MsiRecordGetStringW(row,3,buffer,&sz);
+        MSI_RecordGetStringW(row,3,buffer,&sz);
         reduce_to_longfilename(buffer);
         strcatW(target_file,buffer);
         if (!strchrW(target_file,'.'))
             strcatW(target_file,szlnk);
 
         sz = 0x100;
-        MsiRecordGetStringW(row,5,buffer,&sz);
+        MSI_RecordGetStringW(row,5,buffer,&sz);
         if (strchrW(buffer,'['))
         {
             LPWSTR deformated;
-            deformat_string(hPackage,buffer,&deformated);
+            deformat_string(package,buffer,&deformated);
             IShellLinkW_SetPath(sl,deformated);
             HeapFree(GetProcessHeap(),0,deformated);
         }
@@ -3962,21 +4005,21 @@
             FIXME("UNHANDLED shortcut format, advertised shortcut\n");
             IPersistFile_Release( pf );
             IShellLinkW_Release( sl );
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
-        if (!MsiRecordIsNull(row,6))
+        if (!MSI_RecordIsNull(row,6))
         {
             LPWSTR deformated;
             sz = 0x100;
-            MsiRecordGetStringW(row,6,buffer,&sz);
-            deformat_string(hPackage,buffer,&deformated);
+            MSI_RecordGetStringW(row,6,buffer,&sz);
+            deformat_string(package,buffer,&deformated);
             IShellLinkW_SetArguments(sl,deformated);
             HeapFree(GetProcessHeap(),0,deformated);
         }
 
-        if (!MsiRecordIsNull(row,7))
+        if (!MSI_RecordIsNull(row,7))
         {
             LPWSTR deformated;
             deformated = load_dynamic_stringW(row,7);
@@ -3984,33 +4027,33 @@
             HeapFree(GetProcessHeap(),0,deformated);
         }
 
-        if (!MsiRecordIsNull(row,8))
-            IShellLinkW_SetHotkey(sl,MsiRecordGetInteger(row,8));
+        if (!MSI_RecordIsNull(row,8))
+            IShellLinkW_SetHotkey(sl,MSI_RecordGetInteger(row,8));
 
-        if (!MsiRecordIsNull(row,9))
+        if (!MSI_RecordIsNull(row,9))
         {
             WCHAR Path[MAX_PATH];
             INT index; 
 
             sz = 0x100;
-            MsiRecordGetStringW(row,9,buffer,&sz);
+            MSI_RecordGetStringW(row,9,buffer,&sz);
 
-            build_icon_path(hPackage,buffer,Path);
-            index = MsiRecordGetInteger(row,10);
+            build_icon_path(package,buffer,Path);
+            index = MSI_RecordGetInteger(row,10);
 
             IShellLinkW_SetIconLocation(sl,Path,index);
         }
 
-        if (!MsiRecordIsNull(row,11))
-            IShellLinkW_SetShowCmd(sl,MsiRecordGetInteger(row,11));
+        if (!MSI_RecordIsNull(row,11))
+            IShellLinkW_SetShowCmd(sl,MSI_RecordGetInteger(row,11));
 
-        if (!MsiRecordIsNull(row,12))
+        if (!MSI_RecordIsNull(row,12))
         {
             WCHAR Path[MAX_PATH];
 
             sz = 0x100;
-            MsiRecordGetStringW(row,12,buffer,&sz);
-            resolve_folder(hPackage, buffer, Path, FALSE, FALSE, NULL);
+            MSI_RecordGetStringW(row,12,buffer,&sz);
+            resolve_folder(package, buffer, Path, FALSE, FALSE, NULL);
             IShellLinkW_SetWorkingDirectory(sl,Path);
         }
 
@@ -4020,10 +4063,10 @@
         IPersistFile_Release( pf );
         IShellLinkW_Release( sl );
 
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
 
 
     CoUninitialize();
@@ -4038,29 +4081,28 @@
  * Icon table is processed and written out
  * so that is waht I am going to do here.
  */
-static UINT ACTION_PublishProduct(MSIHANDLE hPackage)
+static UINT ACTION_PublishProduct(MSIPACKAGE *package)
 {
     UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
-    static const CHAR *Query="SELECT * from Icon";
-    MSIPACKAGE* package;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
+    static const WCHAR Query[]={
+        'S','E','L','E','C','T',' ','*',' ',
+        'f','r','o','m',' ','I','c','o','n',0};
     DWORD sz;
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
     if (!package)
         return ERROR_INVALID_HANDLE;
 
-    rc = MsiDatabaseOpenViewA(package->db, Query, &view);
-
+    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
     if (rc != ERROR_SUCCESS)
     {
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
@@ -4071,7 +4113,7 @@
         WCHAR FileName[MAX_PATH];
         CHAR buffer[1024];
 
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
         {
             rc = ERROR_SUCCESS;
@@ -4079,15 +4121,15 @@
         }
     
         sz = MAX_PATH;
-        MsiRecordGetStringW(row,1,FileName,&sz);
+        MSI_RecordGetStringW(row,1,FileName,&sz);
         if (sz == 0)
         {
             ERR("Unable to get FileName\n");
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
-        build_icon_path(hPackage,FileName,FilePath);
+        build_icon_path(package,FileName,FilePath);
 
         TRACE("Creating icon file at %s\n",debugstr_w(FilePath));
         
@@ -4097,7 +4139,7 @@
         if (the_file == INVALID_HANDLE_VALUE)
         {
             ERR("Unable to create file %s\n",debugstr_w(FilePath));
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
             continue;
         }
 
@@ -4105,7 +4147,7 @@
         {
             DWORD write;
             sz = 1024;
-            rc = MsiRecordReadStream(row,2,buffer,&sz);
+            rc = MSI_RecordReadStream(row,2,buffer,&sz);
             if (rc != ERROR_SUCCESS)
             {
                 ERR("Failed to get stream\n");
@@ -4117,10 +4159,10 @@
         } while (sz == 1024);
 
         CloseHandle(the_file);
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
     return rc;
 
 }
@@ -4151,8 +4193,18 @@
 
 UINT WINAPI MsiDoActionW( MSIHANDLE hInstall, LPCWSTR szAction )
 {
+    MSIPACKAGE *package;
+    UINT ret = ERROR_INVALID_HANDLE;
+
     TRACE(" external attempt at action %s \n",debugstr_w(szAction));
-    return ACTION_PerformAction(hInstall,szAction);
+
+    package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+    if( package )
+    {
+        ret = ACTION_PerformAction(package,szAction);
+        msiobj_release( &package->hdr );
+    }
+    return ret;
 }
 
 UINT WINAPI MsiGetTargetPathA( MSIHANDLE hInstall, LPCSTR szFolder, 
@@ -4192,10 +4244,15 @@
 {
     WCHAR path[MAX_PATH];
     UINT rc;
+    MSIPACKAGE *package;
 
     TRACE("(%s %p %li)\n",debugstr_w(szFolder),szPathBuf,*pcchPathBuf);
 
-    rc = resolve_folder(hInstall, szFolder, path, FALSE, FALSE, NULL);
+    package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+    if( !package )
+        return ERROR_INVALID_HANDLE;
+    rc = resolve_folder(package, szFolder, path, FALSE, FALSE, NULL);
+    msiobj_release( &package->hdr );
 
     if (rc == ERROR_SUCCESS && strlenW(path) > *pcchPathBuf)
     {
@@ -4249,9 +4306,15 @@
 {
     WCHAR path[MAX_PATH];
     UINT rc;
+    MSIPACKAGE *package;
 
     TRACE("(%s %p %li)\n",debugstr_w(szFolder),szPathBuf,*pcchPathBuf);
-    rc = resolve_folder(hInstall, szFolder, path, TRUE, FALSE, NULL);
+
+    package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+    if( !package )
+        return ERROR_INVALID_HANDLE;
+    rc = resolve_folder(package, szFolder, path, TRUE, FALSE, NULL);
+    msiobj_release( &package->hdr );
 
     if (rc == ERROR_SUCCESS && strlenW(path) > *pcchPathBuf)
     {
@@ -4300,15 +4363,17 @@
     return rc;
 }
 
-UINT WINAPI MsiSetTargetPathW(MSIHANDLE hInstall, LPCWSTR szFolder, 
+UINT MSI_SetTargetPathW(MSIPACKAGE *package, LPCWSTR szFolder, 
                              LPCWSTR szFolderPath)
 {
-    MSIPACKAGE *package;
     INT i;
     WCHAR path[MAX_PATH];
     MSIFOLDER *folder;
 
-    TRACE("(%s %s)\n",debugstr_w(szFolder),debugstr_w(szFolderPath));
+    TRACE("(%p %s %s)\n",package, debugstr_w(szFolder),debugstr_w(szFolderPath));
+
+    if (package==NULL)
+        return ERROR_INVALID_HANDLE;
 
     if (szFolderPath[0]==0)
         return ERROR_FUNCTION_FAILED;
@@ -4316,12 +4381,7 @@
     if (GetFileAttributesW(szFolderPath) == INVALID_FILE_ATTRIBUTES)
         return ERROR_FUNCTION_FAILED;
 
-    package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
-
-    if (package==NULL)
-        return ERROR_INVALID_HANDLE;
-
-    resolve_folder(hInstall,szFolder,path,FALSE,FALSE,&folder);
+    resolve_folder(package,szFolder,path,FALSE,FALSE,&folder);
 
     if (!folder)
         return ERROR_INVALID_PARAMETER;
@@ -4332,12 +4392,26 @@
         package->folders[i].ResolvedTarget[0]=0;
 
     for (i = 0; i < package->loaded_folders; i++)
-        resolve_folder(hInstall, package->folders[i].Directory, path, FALSE,
+        resolve_folder(package, package->folders[i].Directory, path, FALSE,
                        TRUE, NULL);
 
     return ERROR_SUCCESS;
 }
 
+UINT WINAPI MsiSetTargetPathW(MSIHANDLE hInstall, LPCWSTR szFolder, 
+                             LPCWSTR szFolderPath)
+{
+    MSIPACKAGE *package;
+    UINT ret;
+
+    TRACE("(%s %s)\n",debugstr_w(szFolder),debugstr_w(szFolderPath));
+
+    package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+    ret = MSI_SetTargetPathW( package, szFolder, szFolderPath );
+    msiobj_release( &package->hdr );
+    return ret;
+}
+
 BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, DWORD iRunMode)
 {
     FIXME("STUB (%li)\n",iRunMode);
@@ -4402,19 +4476,11 @@
     return rc;
 }
 
-UINT WINAPI MsiGetFeatureStateW(MSIHANDLE hInstall, LPWSTR szFeature,
+UINT MSI_GetFeatureStateW(MSIPACKAGE *package, LPWSTR szFeature,
                   INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
 {
-    MSIPACKAGE* package;
     INT index;
 
-    TRACE("%ld %s %p %p\n", hInstall, debugstr_w(szFeature), piInstalled,
-piAction);
-
-    package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
-    if (!package)
-        return ERROR_INVALID_HANDLE;
-
     index = get_loaded_feature(package,szFeature);
     if (index < 0)
         return ERROR_UNKNOWN_FEATURE;
@@ -4433,6 +4499,23 @@
     return ERROR_SUCCESS;
 }
 
+UINT WINAPI MsiGetFeatureStateW(MSIHANDLE hInstall, LPWSTR szFeature,
+                  INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
+{
+    MSIPACKAGE* package;
+    UINT ret;
+
+    TRACE("%ld %s %p %p\n", hInstall, debugstr_w(szFeature), piInstalled,
+piAction);
+
+    package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+    if (!package)
+        return ERROR_INVALID_HANDLE;
+    ret = MSI_GetFeatureStateW(package, szFeature, piInstalled, piAction);
+    msiobj_release( &package->hdr );
+    return ret;
+}
+
 UINT WINAPI MsiGetComponentStateA(MSIHANDLE hInstall, LPSTR szComponent,
                   INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
 {
@@ -4448,19 +4531,14 @@
     return rc;
 }
 
-UINT WINAPI MsiGetComponentStateW(MSIHANDLE hInstall, LPWSTR szComponent,
+UINT MSI_GetComponentStateW(MSIPACKAGE *package, LPWSTR szComponent,
                   INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
 {
-    MSIPACKAGE* package;
     INT index;
 
-    TRACE("%ld %s %p %p\n", hInstall, debugstr_w(szComponent), piInstalled,
+    TRACE("%p %s %p %p\n", package, debugstr_w(szComponent), piInstalled,
 piAction);
 
-    package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
-    if (!package)
-        return ERROR_INVALID_HANDLE;
-
     index = get_loaded_component(package,szComponent);
     if (index < 0)
         return ERROR_UNKNOWN_COMPONENT;
@@ -4480,21 +4558,32 @@
     return ERROR_SUCCESS;
 }
 
-#if 0
-static UINT ACTION_Template(MSIHANDLE hPackage)
+UINT WINAPI MsiGetComponentStateW(MSIHANDLE hInstall, LPWSTR szComponent,
+                  INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
 {
-    UINT rc;
-    MSIHANDLE view;
-    MSIHANDLE row = 0;
-    static const CHAR *ExecSeqQuery;
     MSIPACKAGE* package;
+    UINT ret;
+
+    TRACE("%ld %s %p %p\n", hInstall, debugstr_w(szComponent),
+           piInstalled, piAction);
 
-    package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
+    package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
     if (!package)
         return ERROR_INVALID_HANDLE;
+    ret = MSI_GetComponentStateW( package, szComponent, piInstalled, piAction);
+    msiobj_release( &package->hdr );
+    return ret;
+}
 
-    rc = MsiDatabaseOpenViewA(package->db, ExecSeqQuery, &view);
+#if 0
+static UINT ACTION_Template(MSIPACKAGE *package)
+{
+    UINT rc;
+    MSIQUERY * view;
+    MSIRECORD * row = 0;
+    static const WCHAR ExecSeqQuery[] = {0};
 
+    rc = MsiDatabaseOpenViewW(package->db, ExecSeqQuery, &view);
     if (rc != ERROR_SUCCESS)
         return rc;
 
@@ -4502,7 +4591,7 @@
     if (rc != ERROR_SUCCESS)
     {
         MsiViewClose(view);
-        MsiCloseHandle(view);
+        msiobj_release(&view->hdr);
         return rc;
     }
 
@@ -4515,10 +4604,10 @@
             break;
         }
 
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
     }
     MsiViewClose(view);
-    MsiCloseHandle(view);
+    msiobj_release(&view->hdr);
     return rc;
 }
 #endif
diff -ur dlls/msi.old/cond.y dlls/msi/cond.y
--- dlls/msi.old/cond.y	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/cond.y	2004-07-09 13:34:00.000000000 -0500
@@ -33,6 +33,7 @@
 
 #include "msi.h"
 #include "msiquery.h"
+#include "msipriv.h"
 
 #define YYLEX_PARAM info
 #define YYPARSE_PARAM info
@@ -43,7 +44,7 @@
 
 typedef struct tag_yyinput
 {
-    MSIHANDLE hInstall;
+    MSIPACKAGE *package;
     LPCWSTR str;
     INT    n;
     MSICONDITION result;
@@ -408,7 +409,7 @@
             COND_input* cond = (COND_input*) info;
             INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
       
-            MsiGetComponentStateW(cond->hInstall, $2, &install, &action );
+            MSI_GetComponentStateW(cond->package, $2, &install, &action );
             $$ = action;
             HeapFree( GetProcessHeap(), 0, $2 );
         }
@@ -417,7 +418,7 @@
             COND_input* cond = (COND_input*) info;
             INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
       
-            MsiGetComponentStateW(cond->hInstall, $2, &install, &action );
+            MSI_GetComponentStateW(cond->package, $2, &install, &action );
             $$ = install;
             HeapFree( GetProcessHeap(), 0, $2 );
         }
@@ -426,7 +427,7 @@
             COND_input* cond = (COND_input*) info;
             INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
       
-            MsiGetFeatureStateW(cond->hInstall, $2, &install, &action );
+            MSI_GetFeatureStateW(cond->package, $2, &install, &action );
             $$ = action;
             HeapFree( GetProcessHeap(), 0, $2 );
         }
@@ -435,7 +436,7 @@
             COND_input* cond = (COND_input*) info;
             INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
       
-            MsiGetFeatureStateW(cond->hInstall, $2, &install, &action );
+            MSI_GetFeatureStateW(cond->package, $2, &install, &action );
             $$ = install;
             HeapFree( GetProcessHeap(), 0, $2 );
         }
@@ -451,7 +452,7 @@
             /* Lookup the identifier */
 
             sz=0x100;
-            if (MsiGetPropertyW(cond->hInstall,$1,$$,&sz) != ERROR_SUCCESS)
+            if (MSI_GetPropertyW(cond->package,$1,$$,&sz) != ERROR_SUCCESS)
             {
                 $$[0]=0;
             }
@@ -687,12 +688,12 @@
     return 0;
 }
 
-MSICONDITION WINAPI MsiEvaluateConditionW( MSIHANDLE hInstall, LPCWSTR szCondition )
+MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *package, LPCWSTR szCondition )
 {
     COND_input cond;
     MSICONDITION r;
 
-    cond.hInstall = hInstall;
+    cond.package = package;
     cond.str   = szCondition;
     cond.n     = 0;
     cond.result = -1;
@@ -708,6 +709,19 @@
     return r;
 }
 
+MSICONDITION WINAPI MsiEvaluateConditionW( MSIHANDLE hInstall, LPCWSTR szCondition )
+{
+    MSIPACKAGE *package;
+    UINT ret;
+
+    package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
+    if( !package)
+        return ERROR_INVALID_HANDLE;
+    ret = MSI_EvaluateConditionW( package, szCondition );
+    msiobj_release( &package->hdr );
+    return ret;
+}
+
 MSICONDITION WINAPI MsiEvaluateConditionA( MSIHANDLE hInstall, LPCSTR szCondition )
 {
     LPWSTR szwCond = NULL;
diff -ur dlls/msi.old/create.c dlls/msi/create.c
--- dlls/msi.old/create.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/create.c	2004-07-09 13:34:00.000000000 -0500
@@ -56,7 +56,7 @@
     return ERROR_FUNCTION_FAILED;
 }
 
-static UINT CREATE_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT CREATE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
 {
     MSICREATEVIEW *cv = (MSICREATEVIEW*)view;
     create_col_info *col;
@@ -214,6 +214,7 @@
     }
     HeapFree( GetProcessHeap(), 0, cv->name );
     HeapFree( GetProcessHeap(), 0, cv );
+    msiobj_release( &cv->db->hdr );
 
     return ERROR_SUCCESS;
 }
@@ -246,6 +247,7 @@
     
     /* fill the structure */
     cv->view.ops = &create_ops;
+    msiobj_addref( &db->hdr );
     cv->db = db;
     cv->name = table;  /* FIXME: strdupW it? */
     cv->col_info = col_info;
diff -ur dlls/msi.old/distinct.c dlls/msi/distinct.c
--- dlls/msi.old/distinct.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/distinct.c	2004-07-09 13:34:00.000000000 -0500
@@ -107,13 +107,13 @@
     return dv->table->ops->fetch_int( dv->table, row, col, val );
 }
 
-static UINT DISTINCT_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT DISTINCT_execute( struct tagMSIVIEW *view, MSIRECORD *record )
 {
     MSIDISTINCTVIEW *dv = (MSIDISTINCTVIEW*)view;
     UINT r, i, j, r_count, c_count;
     DISTINCTSET *rowset = NULL;
 
-    TRACE("%p %ld\n", dv, record);
+    TRACE("%p %p\n", dv, record);
 
     if( !dv->table )
          return ERROR_FUNCTION_FAILED;
@@ -242,6 +242,7 @@
     if( dv->translation )
         HeapFree( GetProcessHeap(), 0, dv->translation );
     HeapFree( GetProcessHeap(), 0, dv );
+    msiobj_release( &dv->db->hdr );
 
     return ERROR_SUCCESS;
 }
@@ -281,6 +282,7 @@
     
     /* fill the structure */
     dv->view.ops = &distinct_ops;
+    msiobj_addref( &db->hdr );
     dv->db = db;
     dv->table = table;
     dv->translation = NULL;
diff -ur dlls/msi.old/handle.c dlls/msi/handle.c
--- dlls/msi.old/handle.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/handle.c	2004-07-09 14:11:11.000000000 -0500
@@ -1,7 +1,7 @@
 /*
  * Implementation of the Microsoft Installer (msi.dll)
  *
- * Copyright 2002 Mike McCormack for CodeWeavers
+ * Copyright 2002-2004 Mike McCormack for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -31,66 +31,109 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(msi);
 
-MSIHANDLEINFO *msihandletable[MSIMAXHANDLES];
+static CRITICAL_SECTION MSI_handle_cs;
+static CRITICAL_SECTION_DEBUG MSI_handle_cs_debug =
+{
+    0, 0, &MSI_handle_cs,
+    { &MSI_handle_cs_debug.ProcessLocksList, 
+      &MSI_handle_cs_debug.ProcessLocksList },
+      0, 0, { 0, (DWORD)(__FILE__ ": MSI_handle_cs") }
+};
+static CRITICAL_SECTION MSI_handle_cs = { &MSI_handle_cs_debug, -1, 0, 0, 0, 0 };
+
+MSIOBJECTHDR *msihandletable[MSIMAXHANDLES];
 
-MSIHANDLE alloc_msihandle(UINT type, UINT size, msihandledestructor destroy, void **out)
+MSIHANDLE alloc_msihandle( MSIOBJECTHDR *obj )
 {
-    MSIHANDLEINFO *info;
+    MSIHANDLE ret = 0;
     UINT i;
 
-    *out = NULL;
+    EnterCriticalSection( &MSI_handle_cs );
 
     /* find a slot */
     for(i=0; i<MSIMAXHANDLES; i++)
         if( !msihandletable[i] )
             break;
     if( (i>=MSIMAXHANDLES) || msihandletable[i] )
-        return 0;
-
-    size += sizeof (MSIHANDLEINFO);
-    info = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size );
-    if( !info )
-        return 0;
-
-    info->magic = MSIHANDLE_MAGIC;
-    info->type = type;
-    info->refcount = 1;
-    info->destructor = destroy;
+        goto out;
 
-    msihandletable[i] = info;
-    *out = (void*) &info[1];
+    msiobj_addref( obj );
+    msihandletable[i] = obj;
+    ret = (MSIHANDLE) (i+1);
+out:
+    TRACE("%p -> %ld\n", obj, ret );
 
-    return (MSIHANDLE) (i+1);
+    LeaveCriticalSection( &MSI_handle_cs );
+    return ret;
 }
 
 void *msihandle2msiinfo(MSIHANDLE handle, UINT type)
 {
+    MSIOBJECTHDR *ret = NULL;
+
+    EnterCriticalSection( &MSI_handle_cs );
     handle--;
     if( handle<0 )
-        return NULL;
+        goto out;
     if( handle>=MSIMAXHANDLES )
-        return NULL;
+        goto out;
     if( !msihandletable[handle] )
-        return NULL;
+        goto out;
     if( msihandletable[handle]->magic != MSIHANDLE_MAGIC )
-        return NULL;
+        goto out;
     if( type && (msihandletable[handle]->type != type) )
-        return NULL;
+        goto out;
+    ret = msihandletable[handle];
+    msiobj_addref( ret );
+    
+out:
+    LeaveCriticalSection( &MSI_handle_cs );
 
-    return &msihandletable[handle][1];
+    return (void*) ret;
 }
 
-void msihandle_addref(MSIHANDLE handle)
+MSIHANDLE msiobj_findhandle( MSIOBJECTHDR *hdr )
 {
-    MSIHANDLEINFO *info = msihandle2msiinfo(handle, 0);
+    MSIHANDLE ret = 0;
+    UINT i;
 
-    TRACE("%lx\n",handle);
+    TRACE("%p\n", hdr);
+
+    EnterCriticalSection( &MSI_handle_cs );
+    for(i=0; (i<MSIMAXHANDLES) && !ret; i++)
+        if( msihandletable[i] == hdr )
+            ret = i+1;
+    LeaveCriticalSection( &MSI_handle_cs );
+
+    TRACE("%p -> %ld\n", hdr, ret);
+
+    msiobj_addref( hdr );
+    return ret;
+}
+
+void *alloc_msiobject(UINT type, UINT size, msihandledestructor destroy )
+{
+    MSIOBJECTHDR *info;
+
+    info = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size );
+    if( info )
+    {
+        info->magic = MSIHANDLE_MAGIC;
+        info->type = type;
+        info->refcount = 1;
+        info->destructor = destroy;
+    }
+
+    return info;
+}
+
+void msiobj_addref( MSIOBJECTHDR *info )
+{
+    TRACE("%p\n", info);
 
     if( !info )
         return;
 
-    info--;
-
     if( info->magic != MSIHANDLE_MAGIC )
     {
         ERR("Invalid handle!\n");
@@ -100,36 +143,63 @@
     info->refcount++;
 }
 
-UINT WINAPI MsiCloseHandle(MSIHANDLE handle)
+int msiobj_release( MSIOBJECTHDR *info )
 {
-    MSIHANDLEINFO *info = msihandle2msiinfo(handle, 0);
+    int ret;
 
-    TRACE("%lx\n",handle);
+    TRACE("%p\n",info);
 
     if( !info )
-        return ERROR_INVALID_HANDLE;
-
-    info--;
+        return -1;
 
     if( info->magic != MSIHANDLE_MAGIC )
     {
         ERR("Invalid handle!\n");
-        return ERROR_INVALID_HANDLE;
+        return -1;
     }
 
-    info->refcount--;
-    if (info->refcount > 0)
-        return ERROR_SUCCESS;
-
+    ret = info->refcount--;
+    if (info->refcount == 0)
+    {
     if( info->destructor )
-        info->destructor( &info[1] );
-
+            info->destructor( info );
     HeapFree( GetProcessHeap(), 0, info );
+        TRACE("object %p destroyed\n", info);
+    }
+
+    return ret;
+}
+
+UINT WINAPI MsiCloseHandle(MSIHANDLE handle)
+{
+    MSIOBJECTHDR *info;
+    UINT ret = ERROR_INVALID_HANDLE;
+
+    TRACE("%lx\n",handle);
+
+    EnterCriticalSection( &MSI_handle_cs );
+
+    info = msihandle2msiinfo(handle, 0);
+    if( !info )
+        goto out;
+
+    if( info->magic != MSIHANDLE_MAGIC )
+    {
+        ERR("Invalid handle!\n");
+        goto out;
+    }
+
+    msiobj_release( info );
     msihandletable[handle-1] = NULL;
+    ret = ERROR_SUCCESS;
 
-    TRACE("Destroyed\n");
+    TRACE("handle %lx Destroyed\n", handle);
+out:
+    LeaveCriticalSection( &MSI_handle_cs );
+    if( info )
+        msiobj_release( info );
 
-    return 0;
+    return ret;
 }
 
 UINT WINAPI MsiCloseAllHandles(void)
diff -ur dlls/msi.old/insert.c dlls/msi/insert.c
--- dlls/msi.old/insert.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/insert.c	2004-07-09 13:34:00.000000000 -0500
@@ -56,13 +56,13 @@
     return ERROR_FUNCTION_FAILED;
 }
 
-static UINT INSERT_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT INSERT_execute( struct tagMSIVIEW *view, MSIRECORD *record )
 {
     MSIINSERTVIEW *iv = (MSIINSERTVIEW*)view;
     UINT n, type, val, r, row, col_count = 0;
     MSIVIEW *sv;
 
-    TRACE("%p %ld\n", iv, record );
+    TRACE("%p %p\n", iv, record );
 
     sv = iv->sv;
     if( !sv )
@@ -77,7 +77,7 @@
     if( r )
         goto err;
 
-    n = MsiRecordGetFieldCount( record );
+    n = MSI_RecordGetFieldCount( record );
     if( n != col_count )
     {
         ERR("Number of fields do not match\n");
@@ -103,7 +103,7 @@
         }
         else
         {
-            val = MsiRecordGetInteger( record, n );
+            val = MSI_RecordGetInteger( record, n );
             val |= 0x8000;
         }
         r = sv->ops->set_int( sv, row, n, val );
@@ -180,6 +180,7 @@
         sv->ops->delete( sv );
     delete_value_list( iv->vals );
     HeapFree( GetProcessHeap(), 0, iv );
+    msiobj_release( &iv->db->hdr );
 
     return ERROR_SUCCESS;
 }
@@ -226,6 +227,7 @@
 
     /* fill the structure */
     iv->view.ops = &insert_ops;
+    msiobj_addref( &db->hdr );
     iv->db = db;
     iv->vals = values;
     iv->bIsTemp = temp;
diff -ur dlls/msi.old/msi.c dlls/msi/msi.c
--- dlls/msi.old/msi.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/msi.c	2004-07-09 14:07:57.000000000 -0500
@@ -1,7 +1,7 @@
 /*
  * Implementation of the Microsoft Installer (msi.dll)
  *
- * Copyright 2002,2003 Mike McCormack for CodeWeavers
+ * Copyright 2002,2003,2004 Mike McCormack for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -222,7 +222,7 @@
 }
 
 
-VOID MSI_CloseDatabase( VOID *arg )
+VOID MSI_CloseDatabase( MSIOBJECTHDR *arg )
 {
     MSIDATABASE *db = (MSIDATABASE *) arg;
 
@@ -230,58 +230,18 @@
     IStorage_Release( db->storage );
 }
 
-UINT WINAPI MsiOpenDatabaseA(LPCSTR szDBPath, LPCSTR szPersist, MSIHANDLE *phDB)
-{
-    HRESULT r = ERROR_FUNCTION_FAILED;
-    LPWSTR szwDBPath = NULL, szwPersist = NULL;
-    UINT len;
-
-    TRACE("%s %s %p\n", debugstr_a(szDBPath), debugstr_a(szPersist), phDB);
-
-    if( szDBPath )
-    {
-        len = MultiByteToWideChar( CP_ACP, 0, szDBPath, -1, NULL, 0 );
-        szwDBPath = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
-        if( !szwDBPath )
-            goto end;
-        MultiByteToWideChar( CP_ACP, 0, szDBPath, -1, szwDBPath, len );
-    }
-
-    if( HIWORD(szPersist) )
-    {
-        len = MultiByteToWideChar( CP_ACP, 0, szPersist, -1, NULL, 0 );
-        szwPersist = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
-        if( !szwPersist )
-            goto end;
-        MultiByteToWideChar( CP_ACP, 0, szPersist, -1, szwPersist, len );
-    }
-    else
-        szwPersist = (LPWSTR) szPersist;
-
-    r = MsiOpenDatabaseW( szwDBPath, szwPersist, phDB );
-
-end:
-    if( szwPersist )
-        HeapFree( GetProcessHeap(), 0, szwPersist );
-    if( szwDBPath )
-        HeapFree( GetProcessHeap(), 0, szwDBPath );
-
-    return r;
-}
-
-UINT WINAPI MsiOpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIHANDLE *phDB)
+UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
 {
     IStorage *stg = NULL;
     HRESULT r;
-    MSIHANDLE handle;
-    MSIDATABASE *db;
-    UINT ret;
+    MSIDATABASE *db = NULL;
+    UINT ret = ERROR_FUNCTION_FAILED;
     LPWSTR szMode;
     STATSTG stat;
 
-    TRACE("%s %s %p\n",debugstr_w(szDBPath),debugstr_w(szPersist), phDB);
+    TRACE("%s %s\n",debugstr_w(szDBPath),debugstr_w(szPersist) );
 
-    if( !phDB )
+    if( !pdb )
         return ERROR_INVALID_PARAMETER;
 
     szMode = (LPWSTR) szPersist;
@@ -328,7 +288,6 @@
     if( FAILED( r ) )
     {
         FIXME("Failed to stat storage\n");
-        ret = ERROR_FUNCTION_FAILED;
         goto end;
     }
 
@@ -336,17 +295,15 @@
     {
         ERR("storage GUID is not a MSI database GUID %s\n",
              debugstr_guid(&stat.clsid) );
-        ret = ERROR_FUNCTION_FAILED;
         goto end;
     }
 
 
-    handle = alloc_msihandle( MSIHANDLETYPE_DATABASE, sizeof (MSIDATABASE),
-                              MSI_CloseDatabase, (void**) &db );
-    if( !handle )
+    db = alloc_msiobject( MSIHANDLETYPE_DATABASE, sizeof (MSIDATABASE),
+                              MSI_CloseDatabase );
+    if( !db )
     {
         FIXME("Failed to allocate a handle\n");
-        ret = ERROR_FUNCTION_FAILED;
         goto end;
     }
 
@@ -355,24 +312,80 @@
 
     db->storage = stg;
     db->mode = szMode;
-    /* db->strings = NULL;
-    db->first_table = NULL;
-    db->last_table = NULL; */
 
     ret = load_string_table( db );
     if( ret != ERROR_SUCCESS )
         goto end;
 
-    *phDB = handle;
-
+    msiobj_addref( &db->hdr );
     IStorage_AddRef( stg );
+    *pdb = db;
+
 end:
+    if( db )
+        msiobj_release( &db->hdr );
     if( stg )
         IStorage_Release( stg );
 
     return ret;
 }
 
+UINT WINAPI MsiOpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIHANDLE *phDB)
+{
+    MSIDATABASE *db;
+    UINT ret;
+
+    TRACE("%s %s %p\n",debugstr_w(szDBPath),debugstr_w(szPersist), phDB);
+
+    ret = MSI_OpenDatabaseW( szDBPath, szPersist, &db );
+    if( ret == ERROR_SUCCESS )
+    {
+        *phDB = alloc_msihandle( &db->hdr );
+        msiobj_release( &db->hdr );
+    }
+
+    return ret;
+}
+
+UINT WINAPI MsiOpenDatabaseA(LPCSTR szDBPath, LPCSTR szPersist, MSIHANDLE *phDB)
+{
+    HRESULT r = ERROR_FUNCTION_FAILED;
+    LPWSTR szwDBPath = NULL, szwPersist = NULL;
+    UINT len;
+
+    TRACE("%s %s %p\n", debugstr_a(szDBPath), debugstr_a(szPersist), phDB);
+
+    if( szDBPath )
+    {
+        len = MultiByteToWideChar( CP_ACP, 0, szDBPath, -1, NULL, 0 );
+        szwDBPath = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+        if( !szwDBPath )
+            goto end;
+        MultiByteToWideChar( CP_ACP, 0, szDBPath, -1, szwDBPath, len );
+    }
+
+    if( HIWORD(szPersist) )
+    {
+        len = MultiByteToWideChar( CP_ACP, 0, szPersist, -1, NULL, 0 );
+        szwPersist = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+        if( !szwPersist )
+            goto end;
+        MultiByteToWideChar( CP_ACP, 0, szPersist, -1, szwPersist, len );
+    }
+    else
+        szwPersist = (LPWSTR) szPersist;
+
+    r = MsiOpenDatabaseW( szwDBPath, szwPersist, phDB );
+
+end:
+    if( szwPersist )
+        HeapFree( GetProcessHeap(), 0, szwPersist );
+    if( szwDBPath )
+        HeapFree( GetProcessHeap(), 0, szwDBPath );
+
+    return r;
+}
+
 UINT WINAPI MsiOpenProductA(LPCSTR szProduct, MSIHANDLE *phProduct)
 {
     UINT len, ret;
@@ -525,8 +538,9 @@
 
 UINT WINAPI MsiInstallProductW(LPCWSTR szPackagePath, LPCWSTR szCommandLine)
 {
-   MSIHANDLE packagehandle;
+    MSIPACKAGE *package = NULL;
     UINT rc = ERROR_SUCCESS; 
+    MSIHANDLE handle;
 
     FIXME("%s %s\n",debugstr_w(szPackagePath), debugstr_w(szCommandLine));
 
@@ -534,13 +548,16 @@
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MsiOpenPackageW(szPackagePath,&packagehandle);
+    rc = MSI_OpenPackageW(szPackagePath,&package);
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    ACTION_DoTopLevelINSTALL(packagehandle, szPackagePath, szCommandLine);
+    handle = alloc_msihandle( &package->hdr );
+
+    rc = ACTION_DoTopLevelINSTALL(package, szPackagePath, szCommandLine);
 
-    MsiCloseHandle(packagehandle);
+    MsiCloseHandle(handle);
+    msiobj_release( &package->hdr );
     return rc;
 }
 
diff -ur dlls/msi.old/msipriv.h dlls/msi/msipriv.h
--- dlls/msi.old/msipriv.h	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/msipriv.h	2004-07-09 13:34:00.000000000 -0500
@@ -43,15 +43,58 @@
 struct string_table;
 typedef struct string_table string_table;
 
+struct tagMSIOBJECTHDR;
+typedef struct tagMSIOBJECTHDR MSIOBJECTHDR;
+
+typedef VOID (*msihandledestructor)( MSIOBJECTHDR * );
+
+struct tagMSIOBJECTHDR
+{
+    UINT magic;
+    UINT type;
+    UINT refcount;
+    msihandledestructor destructor;
+    struct tagMSIOBJECTHDR *next;
+    struct tagMSIOBJECTHDR *prev;
+};
+
 typedef struct tagMSIDATABASE
 {
+    MSIOBJECTHDR hdr;
     IStorage *storage;
     string_table *strings;
     LPWSTR mode;
     MSITABLE *first_table, *last_table;
 } MSIDATABASE;
 
-struct tagMSIVIEW;
+typedef struct tagMSIVIEW MSIVIEW;
+
+typedef struct tagMSIQUERY
+{
+    MSIOBJECTHDR hdr;
+    MSIVIEW *view;
+    UINT row;
+    MSIDATABASE *db;
+} MSIQUERY;
+
+/* maybe we can use a Variant instead of doing it ourselves? */
+typedef struct tagMSIFIELD
+{
+    UINT type;
+    union
+    {
+        INT iVal;
+        LPWSTR szwVal;
+        IStream *stream;
+    } u;
+} MSIFIELD;
+
+typedef struct tagMSIRECORD
+{
+    MSIOBJECTHDR hdr;
+    UINT count;       /* as passed to MsiCreateRecord */
+    MSIFIELD fields[1]; /* nb. array size is count+1 */
+} MSIRECORD;
 
 typedef struct tagMSIVIEWOPS
 {
@@ -90,7 +133,7 @@
     /*
      * execute - loads the underlying data into memory so it can be read
      */
-    UINT (*execute)( struct tagMSIVIEW *, MSIHANDLE );
+    UINT (*execute)( struct tagMSIVIEW *, MSIRECORD * );
 
     /*
      * close - clears the data read by execute from memory
@@ -126,31 +169,22 @@
 
 } MSIVIEWOPS;
 
-typedef struct tagMSIVIEW
-{
-    MSIVIEWOPS   *ops;
-} MSIVIEW;
-
 typedef struct tagMSISUMMARYINFO
 {
+    MSIOBJECTHDR hdr;
     IPropertyStorage *propstg;
 } MSISUMMARYINFO;
 
-typedef VOID (*msihandledestructor)( VOID * );
-
-typedef struct tagMSIHANDLEINFO
+struct tagMSIVIEW
 {
-    UINT magic;
-    UINT type;
-    UINT refcount;
-    msihandledestructor destructor;
-    struct tagMSIHANDLEINFO *next;
-    struct tagMSIHANDLEINFO *prev;
-} MSIHANDLEINFO;
+    MSIOBJECTHDR hdr;
+    MSIVIEWOPS   *ops;
+};
 
 typedef struct tagMSIPACKAGE
 {
-    MSIHANDLE db;
+    MSIOBJECTHDR hdr;
+    MSIDATABASE *db;
     struct tagMSIFEATURE *features;
     UINT loaded_features;
     struct tagMSIFOLDER  *folders;
@@ -186,10 +220,14 @@
 
 DEFINE_GUID(CLSID_IMsiServerMessage, 0x000C101D,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
 
-extern void *msihandle2msiinfo(MSIHANDLE handle, UINT type);
 
-MSIHANDLE alloc_msihandle(UINT type, UINT extra, msihandledestructor destroy, void **out);
-void msihandle_addref(MSIHANDLE handle);
+/* handle functions */
+extern void *msihandle2msiinfo(MSIHANDLE handle, UINT type);
+extern MSIHANDLE alloc_msihandle( MSIOBJECTHDR * );
+extern void *alloc_msiobject(UINT type, UINT size, msihandledestructor destroy );
+extern void msiobj_addref(MSIOBJECTHDR *);
+extern int msiobj_release(MSIOBJECTHDR *);
+extern MSIHANDLE msiobj_findhandle( MSIOBJECTHDR *hdr );
 
 /* add this table to the list of cached tables in the database */
 extern void add_table(MSIDATABASE *db, MSITABLE *table);
@@ -222,27 +260,53 @@
 extern UINT msi_string_get_codepage( string_table *st );
 
 
-UINT VIEW_find_column( MSIVIEW *view, LPWSTR name, UINT *n );
+extern UINT VIEW_find_column( MSIVIEW *view, LPWSTR name, UINT *n );
 
 extern BOOL TABLE_Exists( MSIDATABASE *db, LPWSTR name );
 
-UINT read_raw_stream_data( MSIHANDLE hdb, LPCWSTR stname,
+extern UINT read_raw_stream_data( MSIDATABASE*, LPCWSTR stname,
                               USHORT **pdata, UINT *psz );
-UINT ACTION_DoTopLevelINSTALL(MSIHANDLE hPackage, LPCWSTR szPackagePath,
-                              LPCWSTR szCommandLine);
-void ACTION_remove_tracked_tempfiles(MSIPACKAGE* hPackage);
+extern UINT ACTION_DoTopLevelINSTALL( MSIPACKAGE *, LPCWSTR, LPCWSTR );
+extern void ACTION_remove_tracked_tempfiles( MSIPACKAGE* );
 
 /* record internals */
-extern UINT WINAPI MSI_RecordSetIStream( MSIHANDLE handle, 
-              unsigned int iField, IStream *stm );
-extern const WCHAR *MSI_RecordGetString( MSIHANDLE handle, unsigned int iField );
-
+extern UINT MSI_RecordSetIStream( MSIRECORD *, unsigned int, IStream *);
+extern const WCHAR *MSI_RecordGetString( MSIRECORD *, unsigned int );
+extern MSIRECORD *MSI_CreateRecord( unsigned int );
+extern UINT MSI_RecordSetInteger( MSIRECORD *, unsigned int, int );
+extern UINT MSI_RecordSetStringW( MSIRECORD *, unsigned int, LPCWSTR );
+extern BOOL MSI_RecordIsNull( MSIRECORD *, unsigned int );
+extern UINT MSI_RecordGetStringW( MSIRECORD * , unsigned int, LPWSTR, DWORD *);
+extern int MSI_RecordGetInteger( MSIRECORD *, unsigned int );
+extern UINT MSI_RecordReadStream( MSIRECORD *, unsigned int, char *, DWORD *);
+extern unsigned int MSI_RecordGetFieldCount( MSIRECORD *rec );
 
 /* stream internals */
 extern UINT get_raw_stream( MSIHANDLE hdb, LPCWSTR stname, IStream **stm );
 extern UINT db_get_raw_stream( MSIDATABASE *db, LPCWSTR stname, IStream **stm );
 extern void enum_stream_names( IStorage *stg );
 
+/* database internals */
+extern UINT MSI_OpenDatabaseW( LPCWSTR, LPCWSTR, MSIDATABASE ** );
+extern UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY ** );
+
+/* view internals */
+extern UINT MSI_ViewExecute( MSIQUERY*, MSIRECORD * );
+extern UINT MSI_ViewFetch( MSIQUERY*, MSIRECORD ** );
+extern UINT MSI_ViewClose( MSIQUERY* );
+
+/* package internals */
+extern UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE ** );
+extern UINT MSI_SetTargetPathW( MSIPACKAGE *, LPCWSTR, LPCWSTR);
+extern UINT MSI_SetPropertyW( MSIPACKAGE *, LPCWSTR, LPCWSTR );
+extern INT MSI_ProcessMessage( MSIPACKAGE *, INSTALLMESSAGE, MSIRECORD* );
+extern UINT MSI_GetPropertyW( MSIPACKAGE *, LPCWSTR, LPWSTR, DWORD*);
+extern MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *, LPCWSTR );
+extern UINT MSI_SetPropertyW( MSIPACKAGE *, LPCWSTR, LPCWSTR );
+extern UINT MSI_GetComponentStateW(MSIPACKAGE *, LPWSTR, INSTALLSTATE *, INSTALLSTATE *);
+extern UINT MSI_GetFeatureStateW(MSIPACKAGE *, LPWSTR, INSTALLSTATE *, INSTALLSTATE *);
+
+/* registry data encoding/decoding functions */
 BOOL unsquash_guid(LPCWSTR in, LPWSTR out);
 BOOL squash_guid(LPCWSTR in, LPWSTR out);
 BOOL encode_base85_guid(GUID *,LPWSTR);
diff -ur dlls/msi.old/msiquery.c dlls/msi/msiquery.c
--- dlls/msi.old/msiquery.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/msiquery.c	2004-07-09 14:07:57.000000000 -0500
@@ -1,7 +1,7 @@
 /*
  * Implementation of the Microsoft Installer (msi.dll)
  *
- * Copyright 2002 Mike McCormack for CodeWeavers
+ * Copyright 2002-2004 Mike McCormack for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -36,12 +36,15 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(msi);
 
+#if 0
 typedef struct tagMSIQUERY
 {
+    MSIOBJECTHDR hdr;
     MSIVIEW *view;
     UINT row;
     MSIDATABASE *db;
 } MSIQUERY;
+#endif
 
 UINT WINAPI MsiDatabaseIsTablePersistentA(
               MSIHANDLE hDatabase, LPSTR szTableName)
@@ -57,12 +60,13 @@
     return ERROR_CALL_NOT_IMPLEMENTED;
 }
 
-void MSI_CloseView( VOID *arg )
+void MSI_CloseView( MSIOBJECTHDR *arg )
 {
-    MSIQUERY *query = arg;
+    MSIQUERY *query = (MSIQUERY*) arg;
 
     if( query->view && query->view->ops->delete )
         query->view->ops->delete( query->view );
+    msiobj_release( &query->db->hdr );
 }
 
 UINT VIEW_find_column( MSIVIEW *table, LPWSTR name, UINT *n )
@@ -118,57 +122,71 @@
     return r;
 }
 
-UINT WINAPI MsiDatabaseOpenViewW(MSIHANDLE hdb,
-              LPCWSTR szQuery, MSIHANDLE *phView)
+UINT MSI_DatabaseOpenViewW(MSIDATABASE *db,
+              LPCWSTR szQuery, MSIQUERY **pView)
 {
-    MSIDATABASE *db;
-    MSIHANDLE handle;
     MSIQUERY *query;
     UINT r;
 
-    TRACE("%s %p\n", debugstr_w(szQuery), phView);
+    TRACE("%s %p\n", debugstr_w(szQuery), pView);
 
     if( !szQuery)
         return ERROR_INVALID_PARAMETER;
 
-    db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE );
-    if( !db )
-        return ERROR_INVALID_HANDLE;
-
     /* pre allocate a handle to hold a pointer to the view */
-    handle = alloc_msihandle( MSIHANDLETYPE_VIEW, sizeof (MSIQUERY),
-                              MSI_CloseView, (void**) &query );
-    if( !handle )
+    query = alloc_msiobject( MSIHANDLETYPE_VIEW, sizeof (MSIQUERY),
+                              MSI_CloseView );
+    if( !query )
         return ERROR_FUNCTION_FAILED;
 
+    msiobj_addref( &db->hdr );
     query->row = 0;
     query->db = db;
     query->view = NULL;
 
     r = MSI_ParseSQL( db, szQuery, &query->view );
-    if( r != ERROR_SUCCESS )
+    if( r == ERROR_SUCCESS )
     {
-        MsiCloseHandle( handle );
-        return r;
+        msiobj_addref( &query->hdr );
+        *pView = query;
     }
 
-    *phView = handle;
-
+    msiobj_release( &query->hdr );
     return ERROR_SUCCESS;
 }
 
-UINT WINAPI MsiViewFetch(MSIHANDLE hView, MSIHANDLE *record)
+UINT WINAPI MsiDatabaseOpenViewW(MSIHANDLE hdb,
+              LPCWSTR szQuery, MSIHANDLE *phView)
+{
+    MSIDATABASE *db;
+    MSIQUERY *query = NULL;
+    UINT ret;
+
+    TRACE("%s %p\n", debugstr_w(szQuery), phView);
+
+    db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE );
+    if( !db )
+        return ERROR_INVALID_HANDLE;
+
+    ret = MSI_DatabaseOpenViewW( db, szQuery, &query );
+    if( ret == ERROR_SUCCESS )
+    {
+        *phView = alloc_msihandle( &query->hdr );
+        msiobj_release( &query->hdr );
+    }
+    msiobj_release( &db->hdr );
+
+    return ret;
+}
+
+UINT MSI_ViewFetch(MSIQUERY *query, MSIRECORD **prec)
 {
-    MSIQUERY *query;
     MSIVIEW *view;
-    MSIHANDLE handle;
+    MSIRECORD *rec;
     UINT row_count = 0, col_count = 0, i, ival, ret, type;
 
-    TRACE("%ld %p\n", hView, record);
+    TRACE("%p %p\n", query, prec );
 
-    query = msihandle2msiinfo( hView, MSIHANDLETYPE_VIEW );
-    if( !query )
-        return ERROR_INVALID_HANDLE;
     view = query->view;
     if( !view )
         return ERROR_FUNCTION_FAILED;
@@ -182,8 +200,8 @@
     if( query->row >= row_count )
         return ERROR_NO_MORE_ITEMS;
 
-    handle = MsiCreateRecord( col_count );
-    if( !handle )
+    rec = MSI_CreateRecord( col_count );
+    if( !rec )
         return ERROR_FUNCTION_FAILED;
 
     for( i=1; i<=col_count; i++ )
@@ -215,25 +233,25 @@
                 LPWSTR sval;
 
                 sval = MSI_makestring( query->db, ival );
-                MsiRecordSetStringW( handle, i, sval );
+                MSI_RecordSetStringW( rec, i, sval );
                 HeapFree( GetProcessHeap(), 0, sval );
             }
             else
             {
                 if( (type & MSI_DATASIZEMASK) == 2 )
-                    MsiRecordSetInteger( handle, i, ival - (1<<15) );
+                    MSI_RecordSetInteger( rec, i, ival - (1<<15) );
                 else
-                    MsiRecordSetInteger( handle, i, ival - (1<<31) );
+                    MSI_RecordSetInteger( rec, i, ival - (1<<31) );
             }
         }
         else
         {
-            IStream *stm;
+            IStream *stm = NULL;
 
             ret = view->ops->fetch_stream( view, query->row, i, &stm );
             if( ( ret == ERROR_SUCCESS ) && stm )
             {
-                MSI_RecordSetIStream( handle, i, stm );
+                MSI_RecordSetIStream( rec, i, stm );
                 IStream_Release( stm );
             }
             else
@@ -242,21 +260,37 @@
     }
     query->row ++;
 
-    *record = handle;
+    *prec = rec;
 
     return ERROR_SUCCESS;
 }
 
-UINT WINAPI MsiViewClose(MSIHANDLE hView)
+UINT WINAPI MsiViewFetch(MSIHANDLE hView, MSIHANDLE *record)
 {
     MSIQUERY *query;
-    MSIVIEW *view;
+    MSIRECORD *rec = NULL;
+    UINT ret;
 
-    TRACE("%ld\n", hView );
+    TRACE("%ld %p\n", hView, record);
 
     query = msihandle2msiinfo( hView, MSIHANDLETYPE_VIEW );
     if( !query )
         return ERROR_INVALID_HANDLE;
+    ret = MSI_ViewFetch( query, &rec );
+    if( ret == ERROR_SUCCESS )
+    {
+        *record = alloc_msihandle( &rec->hdr );
+        msiobj_release( &rec->hdr );
+    }
+    msiobj_release( &query->hdr );
+    return ret;
+}
+
+UINT MSI_ViewClose(MSIQUERY *query)
+{
+    MSIVIEW *view;
+
+    TRACE("%p\n", query );
 
     view = query->view;
     if( !view )
@@ -267,17 +301,28 @@
     return view->ops->close( view );
 }
 
-UINT WINAPI MsiViewExecute(MSIHANDLE hView, MSIHANDLE hRec)
+UINT WINAPI MsiViewClose(MSIHANDLE hView)
 {
     MSIQUERY *query;
-    MSIVIEW *view;
+    UINT ret;
 
-    TRACE("%ld %ld\n", hView, hRec);
+    TRACE("%ld\n", hView );
 
     query = msihandle2msiinfo( hView, MSIHANDLETYPE_VIEW );
     if( !query )
         return ERROR_INVALID_HANDLE;
 
+    ret = MSI_ViewClose( query );
+    msiobj_release( &query->hdr );
+    return ret;
+}
+
+UINT MSI_ViewExecute(MSIQUERY *query, MSIRECORD *rec )
+{
+    MSIVIEW *view;
+
+    TRACE("%p %p\n", query, rec);
+
     view = query->view;
     if( !view )
         return ERROR_FUNCTION_FAILED;
@@ -285,7 +330,39 @@
         return ERROR_FUNCTION_FAILED;
     query->row = 0;
 
-    return view->ops->execute( view, hRec );
+    return view->ops->execute( view, rec );
+}
+
+UINT WINAPI MsiViewExecute(MSIHANDLE hView, MSIHANDLE hRec)
+{
+    MSIQUERY *query;
+    MSIRECORD *rec = NULL;
+    UINT ret;
+    
+    TRACE("%ld %ld\n", hView, hRec);
+
+    query = msihandle2msiinfo( hView, MSIHANDLETYPE_VIEW );
+    if( !query )
+        return ERROR_INVALID_HANDLE;
+
+    if( hRec )
+    {
+        rec = msihandle2msiinfo( hRec, MSIHANDLETYPE_RECORD );
+        if( !rec )
+        {
+            ret = ERROR_INVALID_HANDLE;
+            goto out;
+        }
+    }
+
+    ret = MSI_ViewExecute( query, rec );
+out:
+    if( query )
+        msiobj_release( &query->hdr );
+    if( rec )
+        msiobj_release( &rec->hdr );
+
+    return ret;
 }
 
 UINT WINAPI MsiViewGetColumnInfo(MSIHANDLE hView, MSICOLINFO info, MSIHANDLE *hRec)
diff -ur dlls/msi.old/order.c dlls/msi/order.c
--- dlls/msi.old/order.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/order.c	2004-07-09 13:34:00.000000000 -0500
@@ -142,12 +142,12 @@
     return ov->table->ops->fetch_int( ov->table, row, col, val );
 }
 
-static UINT ORDER_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT ORDER_execute( struct tagMSIVIEW *view, MSIRECORD *record )
 {
     MSIORDERVIEW *ov = (MSIORDERVIEW*)view;
     UINT r, num_rows = 0, i;
 
-    TRACE("%p %ld\n", ov, record);
+    TRACE("%p %p\n", ov, record);
 
     if( !ov->table )
          return ERROR_FUNCTION_FAILED;
@@ -245,6 +245,7 @@
     ov->reorder = NULL;
 
     HeapFree( GetProcessHeap(), 0, ov );
+    msiobj_release( &ov->db->hdr );
 
     return ERROR_SUCCESS;
 }
@@ -285,6 +286,7 @@
     
     /* fill the structure */
     ov->view.ops = &order_ops;
+    msiobj_addref( &db->hdr );
     ov->db = db;
     ov->table = table;
     ov->reorder = NULL;
diff -ur dlls/msi.old/package.c dlls/msi/package.c
--- dlls/msi.old/package.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/package.c	2004-07-09 14:15:00.000000000 -0500
@@ -48,13 +48,9 @@
  */
 #define LPCTSTR LPCWSTR
 
-void MSI_FreePackage( VOID *arg);
-
-void MSI_FreePackage( VOID *arg)
+void MSI_FreePackage( MSIOBJECTHDR *arg)
 {
-    MSIPACKAGE *package= arg;
-
-    MsiCloseHandle(package->db);
+    MSIPACKAGE *package= (MSIPACKAGE*) arg;
 
     ACTION_remove_tracked_tempfiles(package);
 
@@ -69,6 +65,7 @@
 
     if (package->files && package->loaded_files > 0)
         HeapFree(GetProcessHeap(),0,package->files);
+    msiobj_release( &package->db->hdr );
 }
 
 UINT WINAPI MsiOpenPackageA(LPCSTR szPackage, MSIHANDLE *phPackage)
@@ -95,45 +92,72 @@
 }
 
 
-static const void clone_properties(MSIHANDLE db)
+static const UINT clone_properties(MSIDATABASE *db)
 {
-    MSIHANDLE view;
+    MSIQUERY * view = NULL;
     UINT rc;
-    static const CHAR CreateSql[] = "CREATE TABLE `_Property` ( `_Property` "
-"CHAR(56) NOT NULL, `Value` CHAR(98) NOT NULL PRIMARY KEY `_Property`)";
-    static const CHAR Query[] = "SELECT * from Property";
-    static const CHAR Insert[] = 
-      "INSERT into `_Property` (`_Property`,`Value`) VALUES (?)";
+    static const WCHAR CreateSql[] = {
+       'C','R','E','A','T','E',' ','T','A','B','L','E',' ','`','_','P','r','o',
+       'p','e','r','t','y','`',' ','(',' ','`','_','P','r','o','p','e','r','t',
+       'y','`',' ','C','H','A','R','(','5','6',')',' ','N','O','T',' ','N','U',
+       'L','L',',',' ','`','V','a','l','u','e','`',' ','C','H','A','R','(','9',
+       '8',')',' ','N','O','T',' ','N','U','L','L',' ','P','R','I','M','A','R',
+       'Y',' ','K','E','Y',' ','`','_','P','r','o','p','e','r','t','y','`',')',0};
+    static const WCHAR Query[] = {
+       'S','E','L','E','C','T',' ','*',' ',
+       'f','r','o','m',' ','P','r','o','p','e','r','t','y',0};
+    static const WCHAR Insert[] = {
+       'I','N','S','E','R','T',' ','i','n','t','o',' ',
+       '`','_','P','r','o','p','e','r','t','y','`',' ',
+       '(','`','_','P','r','o','p','e','r','t','y','`',',',
+       '`','V','a','l','u','e','`',')',' ',
+       'V','A','L','U','E','S',' ','(','?',')',0};
 
     /* create the temporary properties table */
-    MsiDatabaseOpenViewA(db, CreateSql, &view);
-    MsiViewExecute(view,0);   
-    MsiViewClose(view);
-    MsiCloseHandle(view); 
+    rc = MSI_DatabaseOpenViewW(db, CreateSql, &view);
+    if (rc != ERROR_SUCCESS)
+        return rc;
+    rc = MSI_ViewExecute(view,0);   
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr); 
+    if (rc != ERROR_SUCCESS)
+        return rc;
 
     /* clone the existing properties */
-    MsiDatabaseOpenViewA(db, Query, &view);
+    rc = MSI_DatabaseOpenViewW(db, Query, &view);
+    if (rc != ERROR_SUCCESS)
+        return rc;
 
-    MsiViewExecute(view, 0);
+    rc = MSI_ViewExecute(view, 0);
+    if (rc != ERROR_SUCCESS)
+    {
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr); 
+        return rc;
+    }
     while (1)
     {
-        MSIHANDLE row;
-        MSIHANDLE view2;
+        MSIRECORD * row;
+        MSIQUERY * view2;
 
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc != ERROR_SUCCESS)
             break;
 
-        MsiDatabaseOpenViewA(db,Insert,&view2);  
-        MsiViewExecute(view2,row);
-        MsiViewClose(view2);
-        MsiCloseHandle(view2);
+        rc = MSI_DatabaseOpenViewW(db,Insert,&view2);  
+        if (rc!= ERROR_SUCCESS)
+            continue;
+        rc = MSI_ViewExecute(view2,row);
+        MSI_ViewClose(view2);
+        msiobj_release(&view2->hdr);
  
-        MsiCloseHandle(row); 
+        if (rc == ERROR_SUCCESS) 
+            msiobj_release(&row->hdr); 
     }
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
     
+    return rc;
 }
 
 /*
@@ -142,12 +166,12 @@
  *
 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/properties.asp
  */
-static VOID set_installer_properties(MSIHANDLE hPackage)
+static VOID set_installer_properties(MSIPACKAGE *package)
 {
     WCHAR pth[MAX_PATH];
     OSVERSIONINFOA OSVersion;
     DWORD verval;
-    CHAR verstr[10];
+    WCHAR verstr[10];
 
     static const WCHAR cszbs[]={'\\',0};
     static const WCHAR CFF[] = 
@@ -172,6 +196,62 @@
 {'W','i','n','d','o','w','s','F','o','l','d','e','r',0};
     static const WCHAR TF[]=
 {'T','e','m','p','F','o','l','d','e','r',0};
+    static const WCHAR szAdminUser[] =
+{'A','d','m','i','n','U','s','e','r',0};
+    static const WCHAR szPriv[] =
+{'P','r','i','v','i','l','e','g','e','d',0};
+    static const WCHAR szOne[] =
+{'1',0};
+    static const WCHAR v9x[] = { 'V','e','r','s','i','o','n','9','X',0 };
+    static const WCHAR vNT[] = { 'V','e','r','s','i','o','n','N','T',0 };
+    static const WCHAR szFormat[] = {'%','l','i',0};
+    static const WCHAR szWinBuild[] =
+{'W','i','n','d','o','w','s','B','u','i','l','d', 0 };
+    static const WCHAR szSPL[] = 
+{'S','e','r','v','i','c','e','P','a','c','k','L','e','v','e','l',0 };
+    static const WCHAR szSix[] = {'6',0 };
+
+/* these need to be dynamically descovered sometime */
+
+    static const WCHAR ProgramMenuFolder[] = 
+{'P','r','o','g','r','a','m','M','e','n','u','F','o','l','d','e','r',0};
+    static const WCHAR PMFPath[] = 
+{'C',':','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ',
+'M','e','n','u','\\','P','r','o','g','r','a','m','s','\\',0};
+    static const WCHAR FavoritesFolder[] = 
+{'F','a','v','o','r','i','t','e','s','F','o','l','d','e','r',0};
+    static const WCHAR FFPath[] = 
+{'C',':','\\','W','i','n','d','o','w','s','\\',
+'F','a','v','o','r','i','t','e','s','\\',0};
+    static const WCHAR FontsFolder[] = 
+{'F','o','n','t','s','F','o','l','d','e','r',0};
+    static const WCHAR FoFPath[] = 
+{'C',':','\\','W','i','n','d','o','w','s','\\','F','o','n','t','s','\\',0};
+    static const WCHAR SendToFolder[] = 
+{'S','e','n','d','T','o','F','o','l','d','e','r',0};
+    static const WCHAR STFPath[] = 
+{'C',':','\\','W','i','n','d','o','w','s','\\','S','e','n','d','T','o','\\',0};
+    static const WCHAR StartMenuFolder[] = 
+{'S','t','a','r','t','M','e','n','u','F','o','l','d','e','r',0};
+    static const WCHAR SMFPath[] = 
+{'C',':','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ',
+'M','e','n','u','\\',0};
+    static const WCHAR StartupFolder[] = 
+{'S','t','a','r','t','u','p','F','o','l','d','e','r',0};
+    static const WCHAR SFPath[] = 
+{'C',':','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ',
+'M','e','n','u','\\','P','r','o','g','r','a','m','s','\\',
+'S','t','a','r','t','u','p','\\',0};
+    static const WCHAR TemplateFolder[] = 
+{'T','e','m','p','l','a','t','e','F','o','l','d','e','r',0};
+    static const WCHAR TFPath[] = 
+{'C',':','\\','W','i','n','d','o','w','s','\\',
+'S','h','e','l','l','N','e','w','\\',0};
+    static const WCHAR DesktopFolder[] = 
+{'D','e','s','k','t','o','p','F','o','l','d','e','r',0};
+    static const WCHAR DFPath[] = 
+{'C',':','\\','W','i','n','d','o','w','s','\\',
+'D','e','s','k','t','o','p','\\',0};
 
 /*
  * Other things i notice set
@@ -204,143 +284,156 @@
 
     SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES_COMMON,NULL,0,pth);
     strcatW(pth,cszbs);
-    MsiSetPropertyW(hPackage, CFF, pth);
+    MSI_SetPropertyW(package, CFF, pth);
 
     SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES,NULL,0,pth);
     strcatW(pth,cszbs);
-    MsiSetPropertyW(hPackage, PFF, pth);
+    MSI_SetPropertyW(package, PFF, pth);
 
     SHGetFolderPathW(NULL,CSIDL_COMMON_APPDATA,NULL,0,pth);
     strcatW(pth,cszbs);
-    MsiSetPropertyW(hPackage, CADF, pth);
+    MSI_SetPropertyW(package, CADF, pth);
 
     SHGetFolderPathW(NULL,CSIDL_ADMINTOOLS,NULL,0,pth);
     strcatW(pth,cszbs);
-    MsiSetPropertyW(hPackage, ATF, pth);
+    MSI_SetPropertyW(package, ATF, pth);
 
     SHGetFolderPathW(NULL,CSIDL_APPDATA,NULL,0,pth);
     strcatW(pth,cszbs);
-    MsiSetPropertyW(hPackage, ADF, pth);
+    MSI_SetPropertyW(package, ADF, pth);
 
     SHGetFolderPathW(NULL,CSIDL_SYSTEM,NULL,0,pth);
     strcatW(pth,cszbs);
-    MsiSetPropertyW(hPackage, SF, pth);
+    MSI_SetPropertyW(package, SF, pth);
 
     SHGetFolderPathW(NULL,CSIDL_LOCAL_APPDATA,NULL,0,pth);
     strcatW(pth,cszbs);
-    MsiSetPropertyW(hPackage, LADF, pth);
+    MSI_SetPropertyW(package, LADF, pth);
 
     SHGetFolderPathW(NULL,CSIDL_MYPICTURES,NULL,0,pth);
     strcatW(pth,cszbs);
-    MsiSetPropertyW(hPackage, MPF, pth);
+    MSI_SetPropertyW(package, MPF, pth);
 
     SHGetFolderPathW(NULL,CSIDL_PERSONAL,NULL,0,pth);
     strcatW(pth,cszbs);
-    MsiSetPropertyW(hPackage, PF, pth);
+    MSI_SetPropertyW(package, PF, pth);
 
     SHGetFolderPathW(NULL,CSIDL_WINDOWS,NULL,0,pth);
     strcatW(pth,cszbs);
-    MsiSetPropertyW(hPackage, WF, pth);
+    MSI_SetPropertyW(package, WF, pth);
 
     GetTempPathW(MAX_PATH,pth);
-    MsiSetPropertyW(hPackage, TF, pth);
+    MSI_SetPropertyW(package, TF, pth);
 
 
-    /* in a wine enviroment the user is always admin and privlaged */
-    MsiSetPropertyA(hPackage,"AdminUser","1");
-    MsiSetPropertyA(hPackage,"Privileged","1");
+    /* in a wine environment the user is always admin and privileged */
+    MSI_SetPropertyW(package,szAdminUser,szOne);
+    MSI_SetPropertyW(package,szPriv,szOne);
 
     /* set the os things */
     OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
     GetVersionExA(&OSVersion);
     verval = OSVersion.dwMinorVersion+OSVersion.dwMajorVersion*100;
-    sprintf(verstr,"%li",verval);
+    sprintfW(verstr,szFormat,verval);
     switch (OSVersion.dwPlatformId)
     {
         case VER_PLATFORM_WIN32_WINDOWS:    
-            MsiSetPropertyA(hPackage,"Version9X",verstr);
+            MSI_SetPropertyW(package,v9x,verstr);
             break;
         case VER_PLATFORM_WIN32_NT:
-            MsiSetPropertyA(hPackage,"VersionNT",verstr);
+            MSI_SetPropertyW(package,vNT,verstr);
             break;
     }
-    sprintf(verstr,"%li",OSVersion.dwBuildNumber);
-    MsiSetPropertyA(hPackage,"WindowsBuild",verstr);
+    sprintfW(verstr,szFormat,OSVersion.dwBuildNumber);
+    MSI_SetPropertyW(package,szWinBuild,verstr);
     /* just fudge this */
-    MsiSetPropertyA(hPackage,"ServicePackLevel","6");
+    MSI_SetPropertyW(package,szSPL,szSix);
 
     /* FIXME: these need to be set properly */
 
-    MsiSetPropertyA(hPackage,"ProgramMenuFolder",
-                    "C:\\Windows\\Start Menu\\Programs\\");
-    MsiSetPropertyA(hPackage,"FavoritesFolder",
-                    "C:\\Windows\\Favorites\\");
-    MsiSetPropertyA(hPackage,"FontsFolder",
-                    "C:\\Windows\\Fonts\\");
-    MsiSetPropertyA(hPackage,"SendToFolder",
-                    "C:\\Windows\\SendTo\\");
-    MsiSetPropertyA(hPackage,"StartMenuFolder",
-                    "C:\\Windows\\Start Menu\\");
-    MsiSetPropertyA(hPackage,"StartupFolder",
-                    "C:\\Windows\\Start Menu\\Programs\\Startup\\");
-    MsiSetPropertyA(hPackage,"TemplateFolder",
-                    "C:\\Windows\\ShellNew\\");
-    MsiSetPropertyA(hPackage, "DesktopFolder",
-                    "C:\\Windows\\Desktop\\");
+    MSI_SetPropertyW(package,ProgramMenuFolder,PMFPath);
+    MSI_SetPropertyW(package,FavoritesFolder,FFPath);
+    MSI_SetPropertyW(package,FontsFolder,FoFPath);
+    MSI_SetPropertyW(package,SendToFolder,STFPath);
+    MSI_SetPropertyW(package,StartMenuFolder,SMFPath);
+    MSI_SetPropertyW(package,StartupFolder,SFPath);
+    MSI_SetPropertyW(package,TemplateFolder,TFPath);
+    MSI_SetPropertyW(package,DesktopFolder,DFPath);
 }
 
-UINT WINAPI MsiOpenPackageW(LPCWSTR szPackage, MSIHANDLE *phPackage)
+UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
 {
     UINT rc;
-    MSIHANDLE handle;
-    MSIHANDLE db;
-    MSIPACKAGE *package;
-    CHAR uilevel[10];
+    MSIDATABASE *db = NULL;
+    MSIPACKAGE *package = NULL;
+    WCHAR uilevel[10];
+    UINT ret = ERROR_FUNCTION_FAILED;
 
     static const WCHAR OriginalDatabase[] =
 {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0};
     static const WCHAR Database[] =
 {'D','A','T','A','B','A','S','E',0};
+    static const WCHAR szpi[] = {'%','i',0};
+    static const WCHAR szLevel[] = { 'U','I','L','e','v','e','l',0 };
 
-    TRACE("%s %p\n",debugstr_w(szPackage), phPackage);
-
-    rc = MsiOpenDatabaseW(szPackage, MSIDBOPEN_READONLY, &db);
+    TRACE("%s %p\n",debugstr_w(szPackage), pPackage);
 
+    rc = MSI_OpenDatabaseW(szPackage, MSIDBOPEN_READONLY, &db);
     if (rc != ERROR_SUCCESS)
         return ERROR_FUNCTION_FAILED;
 
-    handle = alloc_msihandle(MSIHANDLETYPE_PACKAGE, sizeof (MSIPACKAGE),
-                             MSI_FreePackage, (void**)&package);
+    package = alloc_msiobject( MSIHANDLETYPE_PACKAGE, sizeof (MSIPACKAGE),
+                               MSI_FreePackage );
 
-    if (!handle)
+    if (package)
     {
-        MsiCloseHandle(db);
-        return ERROR_FUNCTION_FAILED;
-    }
+        msiobj_addref( &db->hdr );
 
-    package->db = db;
-    package->features = NULL;
-    package->folders = NULL;
-    package->components = NULL;
-    package->files = NULL;
-    package->loaded_features = 0;
-    package->loaded_folders = 0;
-    package->loaded_components= 0;
-    package->loaded_files = 0;
-
-    /* ok here is where we do a slew of things to the database to 
-     * prep for all that is to come as a package */
-
-    clone_properties(db);
-    set_installer_properties(handle);
-    MsiSetPropertyW(handle, OriginalDatabase, szPackage);
-    MsiSetPropertyW(handle, Database, szPackage);
-    sprintf(uilevel,"%i",gUILevel);
-    MsiSetPropertyA(handle, "UILevel", uilevel);
+        package->db = db;
+        package->features = NULL;
+        package->folders = NULL;
+        package->components = NULL;
+        package->files = NULL;
+        package->loaded_features = 0;
+        package->loaded_folders = 0;
+        package->loaded_components= 0;
+        package->loaded_files = 0;
+
+        /* OK, here is where we do a slew of things to the database to 
+         * prep for all that is to come as a package */
+
+        clone_properties(db);
+        set_installer_properties(package);
+        MSI_SetPropertyW(package, OriginalDatabase, szPackage);
+        MSI_SetPropertyW(package, Database, szPackage);
+        sprintfW(uilevel,szpi,gUILevel);
+        MSI_SetPropertyW(package, szLevel, uilevel);
+
+        msiobj_addref( &package->hdr );
+        *pPackage = package;
+        ret = ERROR_SUCCESS;
+    }
+
+    if( package )
+        msiobj_release( &package->hdr );
+    if( db )
+        msiobj_release( &db->hdr );
 
-    *phPackage = handle;
+    return ret;
+}
 
-    return ERROR_SUCCESS;
+UINT WINAPI MsiOpenPackageW(LPCWSTR szPackage, MSIHANDLE *phPackage)
+{
+    MSIPACKAGE *package = NULL;
+    UINT ret;
+
+    ret = MSI_OpenPackageW( szPackage, &package);
+    if( ret == ERROR_SUCCESS )
+    {
+        *phPackage = alloc_msihandle( &package->hdr );
+        msiobj_release( &package->hdr );
+    }
+    return ret;
 }
 
 UINT WINAPI MsiOpenPackageExA(LPCSTR szPackage, DWORD dwOptions, MSIHANDLE *phPackage)
@@ -358,28 +451,32 @@
 MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE hInstall)
 {
     MSIPACKAGE *package;
+    MSIHANDLE handle = 0;
 
     TRACE("(%ld)\n",hInstall);
 
     package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
+    if( package)
+    {
+        handle = alloc_msihandle( &package->db->hdr );
+        msiobj_release( &package->hdr );
+    }
 
-    if( !package)
-        return ERROR_INVALID_HANDLE;
-
-    msihandle_addref(package->db);
-    return package->db;
+    return handle;
 }
 
-INT WINAPI MsiProcessMessage( MSIHANDLE hInstall, INSTALLMESSAGE eMessageType,
-                              MSIHANDLE hRecord)
+INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType,
+                               MSIRECORD *record)
 {
     DWORD log_type = 0;
-    LPSTR message;
+    LPWSTR message;
     DWORD sz;
     DWORD total_size = 0;
     INT msg_field=1;
     INT i;
     INT rc;
+    char *msg;
+    int len;
 
     TRACE("%x \n",eMessageType);
     rc = 0;
@@ -402,39 +499,50 @@
     if ((eMessageType & 0xff000000) == INSTALLMESSAGE_PROGRESS)
         log_type |= 0x800;
 
-    message = HeapAlloc(GetProcessHeap(),0,1);
+    message = HeapAlloc(GetProcessHeap(),0,1*sizeof (WCHAR));
     message[0]=0;
-    msg_field = MsiRecordGetFieldCount(hRecord);
+    msg_field = MSI_RecordGetFieldCount(record);
     for (i = 1; i <= msg_field; i++)
     {
-        LPSTR tmp;
-        CHAR number[3];
+        LPWSTR tmp;
+        WCHAR number[3];
+        const static WCHAR format[] = { '%','i',':',' ',0};
+        const static WCHAR space[] = { ' ',0};
         sz = 0;
-        MsiRecordGetStringA(hRecord,i,NULL,&sz);
+        MSI_RecordGetStringW(record,i,NULL,&sz);
         sz+=4;
-        total_size+=sz;
-        tmp = HeapAlloc(GetProcessHeap(),0,sz);
-        message = HeapReAlloc(GetProcessHeap(),0,message,total_size);
+        total_size+=sz*sizeof(WCHAR);
+        tmp = HeapAlloc(GetProcessHeap(),0,sz*sizeof(WCHAR));
+        message = HeapReAlloc(GetProcessHeap(),0,message,total_size*sizeof (WCHAR));
 
-        MsiRecordGetStringA(hRecord,i,tmp,&sz);
+        MSI_RecordGetStringW(record,i,tmp,&sz);
 
         if (msg_field > 1)
         {
-            sprintf(number,"%i: ",i);
-            strcat(message,number);
+            sprintfW(number,format,i);
+            strcatW(message,number);
         }
-        strcat(message,tmp);
+        strcatW(message,tmp);
         if (msg_field > 1)
-            strcat(message," ");
+            strcatW(message,space);
 
         HeapFree(GetProcessHeap(),0,tmp);
     }
 
     TRACE("(%p %lx %lx %s)\n",gUIHandler, gUIFilter, log_type,
-                             debugstr_a(message));
+                             debugstr_w(message));
+
+    /* convert it to ASCII */
+    len = WideCharToMultiByte( CP_ACP, 0, message, -1,
+                               NULL, 0, NULL, NULL );
+    msg = HeapAlloc( GetProcessHeap(), 0, len );
+    WideCharToMultiByte( CP_ACP, 0, message, -1,
+                         msg, len, NULL, NULL );
 
     if (gUIHandler && (gUIFilter & log_type))
-        rc = gUIHandler(gUIContext,eMessageType,message);
+    {
+        rc = gUIHandler(gUIContext,eMessageType,msg);
+    }
 
     if ((!rc) && (gszLogFile[0]) && !((eMessageType & 0xff000000) ==
                                       INSTALLMESSAGE_PROGRESS))
@@ -446,16 +554,43 @@
         if (log_file != INVALID_HANDLE_VALUE)
         {
             SetFilePointer(log_file,0, NULL, FILE_END);
-            WriteFile(log_file,message,strlen(message),&write,NULL);
+            WriteFile(log_file,msg,strlen(msg),&write,NULL);
             WriteFile(log_file,"\n",1,&write,NULL);
             CloseHandle(log_file);
         }
     }
+    HeapFree( GetProcessHeap(), 0, msg );
     
     HeapFree(GetProcessHeap(),0,message);
     return ERROR_SUCCESS;
 }
 
+INT WINAPI MsiProcessMessage( MSIHANDLE hInstall, INSTALLMESSAGE eMessageType,
+                              MSIHANDLE hRecord)
+{
+    UINT ret = ERROR_INVALID_HANDLE;
+    MSIPACKAGE *package = NULL;
+    MSIRECORD *record = NULL;
+
+    package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE );
+    if( !package )
+        goto out;
+
+    record = msihandle2msiinfo( hRecord, MSIHANDLETYPE_RECORD );
+    if( !record )
+        goto out;
+
+    ret = MSI_ProcessMessage( package, eMessageType, record );
+
+out:
+    if( package )
+        msiobj_release( &package->hdr );
+    if( record )
+        msiobj_release( &record->hdr );
+
+    return ret;
+}
+
 /* property code */
 UINT WINAPI MsiSetPropertyA( MSIHANDLE hInstall, LPCSTR szName, LPCSTR szValue)
 {
@@ -496,10 +631,10 @@
     return hr;
 }
 
-UINT WINAPI MsiSetPropertyW( MSIHANDLE hInstall, LPCWSTR szName, LPCWSTR szValue)
+UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue)
 {
-    MSIPACKAGE *package;
-    MSIHANDLE view,row;
+    MSIQUERY *view;
+    MSIRECORD *row;
     UINT rc;
     DWORD sz = 0;
     static const WCHAR Insert[]=
@@ -517,48 +652,54 @@
     TRACE("Setting property (%s %s)\n",debugstr_w(szName),
           debugstr_w(szValue));
 
-    if (!hInstall)
-        return ERROR_INVALID_HANDLE;
-
-    package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
-    if( !package)
-        return ERROR_INVALID_HANDLE;
-
-    rc = MsiGetPropertyW(hInstall,szName,0,&sz);
+    rc = MSI_GetPropertyW(package,szName,0,&sz);
     if (rc==ERROR_MORE_DATA || rc == ERROR_SUCCESS)
     {
         sprintfW(Query,Update,szName);
 
-        row = MsiCreateRecord(1);
-        MsiRecordSetStringW(row,1,szValue);
+        row = MSI_CreateRecord(1);
+        MSI_RecordSetStringW(row,1,szValue);
 
     }
     else
     {
        strcpyW(Query,Insert);
 
-        row = MsiCreateRecord(2);
-        MsiRecordSetStringW(row,1,szName);
-        MsiRecordSetStringW(row,2,szValue);
+        row = MSI_CreateRecord(2);
+        MSI_RecordSetStringW(row,1,szName);
+        MSI_RecordSetStringW(row,2,szValue);
     }
 
 
-    rc = MsiDatabaseOpenViewW(package->db,Query,&view);
+    rc = MSI_DatabaseOpenViewW(package->db,Query,&view);
     if (rc!= ERROR_SUCCESS)
     {
-        MsiCloseHandle(row);
+        msiobj_release(&row->hdr);
         return rc;
     }
 
-    rc = MsiViewExecute(view,row);
+    rc = MSI_ViewExecute(view,row);
 
-    MsiCloseHandle(row);
-    MsiViewClose(view);
-    MsiCloseHandle(view);
+    msiobj_release(&row->hdr);
+    MSI_ViewClose(view);
+    msiobj_release(&view->hdr);
 
     return rc;
 }
 
+UINT WINAPI MsiSetPropertyW( MSIHANDLE hInstall, LPCWSTR szName, LPCWSTR szValue)
+{
+    MSIPACKAGE *package;
+    UINT ret;
+
+    package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
+    if( !package)
+        return ERROR_INVALID_HANDLE;
+    ret = MSI_SetPropertyW( package, szName, szValue);
+    msiobj_release( &package->hdr );
+    return ret;
+}
+
 UINT WINAPI MsiGetPropertyA(MSIHANDLE hInstall, LPCSTR szName, LPSTR szValueBuf, DWORD* pchValueBuf) 
 {
     LPWSTR szwName = NULL, szwValueBuf = NULL;
@@ -615,10 +756,11 @@
     return hr;
 }
 
-UINT WINAPI MsiGetPropertyW(MSIHANDLE hInstall, LPCWSTR szName, 
+UINT MSI_GetPropertyW(MSIPACKAGE *package, LPCWSTR szName, 
                            LPWSTR szValueBuf, DWORD* pchValueBuf)
 {
-    MSIHANDLE view,row;
+    MSIQUERY *view;
+    MSIRECORD *row;
     UINT rc;
     WCHAR Query[1024]=
     {'s','e','l','e','c','t',' ','V','a','l','u','e',' ','f','r','o','m',' '
@@ -626,23 +768,15 @@
      ,'_','P','r','o','p','e','r','t','y','=','`',0};
 
     static const WCHAR szEnd[]={'`',0};
-    MSIPACKAGE *package;
 
-    if (0 == hInstall) {
-      return ERROR_INVALID_HANDLE;
-    }
     if (NULL == szName) {
       return ERROR_INVALID_PARAMETER;
     }
 
-    package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
-    if( !package)
-        return ERROR_INVALID_HANDLE;
-
     strcatW(Query,szName);
     strcatW(Query,szEnd);
     
-    rc = MsiDatabaseOpenViewW(package->db, Query, &view);
+    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
     if (rc == ERROR_SUCCESS)
     {
         DWORD sz;
@@ -652,25 +786,25 @@
         if (*pchValueBuf > 0)
             szValueBuf[0] = 0;
             
-        rc = MsiViewExecute(view, 0);
+        rc = MSI_ViewExecute(view, 0);
         if (rc != ERROR_SUCCESS)
         {
-            MsiViewClose(view);
-            MsiCloseHandle(view);
+            MSI_ViewClose(view);
+            msiobj_release(&view->hdr);
             return rc;
         }
 
-        rc = MsiViewFetch(view,&row);
+        rc = MSI_ViewFetch(view,&row);
         if (rc == ERROR_SUCCESS)
         {
             sz=0x100;
-            rc = MsiRecordGetStringW(row,1,value,&sz);
+            rc = MSI_RecordGetStringW(row,1,value,&sz);
             strncpyW(szValueBuf,value,min(sz+1,*pchValueBuf));
             *pchValueBuf = sz+1;
-            MsiCloseHandle(row);
+            msiobj_release(&row->hdr);
         }
-        MsiViewClose(view);
-        MsiCloseHandle(view);
+        MSI_ViewClose(view);
+        msiobj_release(&view->hdr);
     }
 
     if (rc == ERROR_SUCCESS)
@@ -684,3 +818,18 @@
 
     return rc;
 }
+
+  
+UINT WINAPI MsiGetPropertyW(MSIHANDLE hInstall, LPCWSTR szName, 
+                           LPWSTR szValueBuf, DWORD* pchValueBuf)
+{
+    MSIPACKAGE *package;
+    UINT ret;
+
+    package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
+    if( !package)
+        return ERROR_INVALID_HANDLE;
+    ret = MSI_GetPropertyW(package, szName, szValueBuf, pchValueBuf );
+    msiobj_release( &package->hdr );
+    return ret;
+}
diff -ur dlls/msi.old/record.c dlls/msi/record.c
--- dlls/msi.old/record.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/record.c	2004-07-09 14:07:58.000000000 -0500
@@ -1,7 +1,7 @@
 /*
  * Implementation of the Microsoft Installer (msi.dll)
  *
- * Copyright 2002 Mike McCormack for CodeWeavers
+ * Copyright 2002-2004 Mike McCormack for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -41,24 +41,6 @@
 #define MSIFIELD_WSTR   3
 #define MSIFIELD_STREAM 4
 
-/* maybe we can use a Variant instead of doing it ourselves? */
-typedef struct tagMSIFIELD
-{
-    UINT type;
-    union
-    {
-        INT iVal;
-        LPWSTR szwVal;
-        IStream *stream;
-    } u;
-} MSIFIELD;
-
-typedef struct tagMSIRECORD
-{
-    UINT count;       /* as passed to MsiCreateRecord */
-    MSIFIELD fields[1]; /* nb. array size is count+1 */
-} MSIRECORD;
-
 void MSI_FreeField( MSIFIELD *field )
 {
     switch( field->type )
@@ -77,7 +59,7 @@
     }
 }
 
-void MSI_CloseRecord( VOID *arg )
+void MSI_CloseRecord( MSIOBJECTHDR *arg )
 {
     MSIRECORD *rec = (MSIRECORD *) arg;
     UINT i;
@@ -86,28 +68,42 @@
         MSI_FreeField( &rec->fields[i] );
 }
 
-MSIHANDLE WINAPI MsiCreateRecord( unsigned int cParams )
+MSIRECORD *MSI_CreateRecord( unsigned int cParams )
 {
-    MSIHANDLE handle = 0;
-    UINT sz;
     MSIRECORD *rec;
+    UINT len;
 
     TRACE("%d\n", cParams);
 
-    sz = sizeof (MSIRECORD) + sizeof(MSIFIELD)*(cParams+1) ;
-    handle = alloc_msihandle( MSIHANDLETYPE_RECORD, sz,
-                              MSI_CloseRecord, (void**) &rec );
-    if( !handle )
-        return 0;
-
+    len = sizeof (MSIRECORD) + sizeof (MSIFIELD)*cParams;
+    rec = alloc_msiobject( MSIHANDLETYPE_RECORD, len, MSI_CloseRecord );
+    if( rec )
     rec->count = cParams;
+    return rec;
+}
 
-    return handle;
+MSIHANDLE WINAPI MsiCreateRecord( unsigned int cParams )
+{
+    MSIRECORD *rec;
+    MSIHANDLE ret = 0;
+
+    TRACE("%d\n", cParams);
+
+    rec = MSI_CreateRecord( cParams );
+    if( rec )
+        ret = alloc_msihandle( &rec->hdr );
+    return ret;
+}
+
+unsigned int MSI_RecordGetFieldCount( MSIRECORD *rec )
+{
+    return rec->count;
 }
 
 unsigned int WINAPI MsiRecordGetFieldCount( MSIHANDLE handle )
 {
     MSIRECORD *rec;
+    UINT ret;
 
     TRACE("%ld\n", handle );
 
@@ -118,7 +114,10 @@
         return 0;
     }
 
-    return rec->count;
+    ret = MSI_RecordGetFieldCount( rec );
+    msiobj_release( &rec->hdr );
+
+    return ret;
 }
 
 static BOOL string2intW( LPCWSTR str, int *out )
@@ -144,16 +143,11 @@
     return TRUE;
 }
 
-int WINAPI MsiRecordGetInteger( MSIHANDLE handle, unsigned int iField)
+int MSI_RecordGetInteger( MSIRECORD *rec, unsigned int iField)
 {
-    MSIRECORD *rec;
     int ret = 0;
 
-    TRACE("%ld %d\n", handle, iField );
-
-    rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
-    if( !rec )
-        return MSI_NULL_INTEGER;
+    TRACE("%p %d\n", rec, iField );
 
     if( iField > rec->count )
         return MSI_NULL_INTEGER;
@@ -173,6 +167,23 @@
     return MSI_NULL_INTEGER;
 }
 
+int WINAPI MsiRecordGetInteger( MSIHANDLE handle, unsigned int iField)
+{
+    MSIRECORD *rec;
+    UINT ret;
+
+    TRACE("%ld %d\n", handle, iField );
+
+    rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
+    if( !rec )
+        return MSI_NULL_INTEGER;
+
+    ret = MSI_RecordGetInteger( rec, iField );
+    msiobj_release( &rec->hdr );
+
+    return ret;
+}
+
 UINT WINAPI MsiRecordClearData( MSIHANDLE handle )
 {
     MSIRECORD *rec;
@@ -194,15 +205,9 @@
     return ERROR_SUCCESS;
 }
 
-UINT WINAPI MsiRecordSetInteger( MSIHANDLE handle, unsigned int iField, int iVal )
+UINT MSI_RecordSetInteger( MSIRECORD *rec, unsigned int iField, int iVal )
 {
-    MSIRECORD *rec;
-
-    TRACE("%ld %u %d\n", handle,iField, iVal);
-    
-    rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
-    if( !rec )
-        return ERROR_INVALID_HANDLE;
+    TRACE("%p %u %d\n", rec, iField, iVal);
 
     if( iField <= rec->count )
     {
@@ -214,35 +219,57 @@
     return ERROR_SUCCESS;
 }
 
-BOOL WINAPI MsiRecordIsNull( MSIHANDLE handle, unsigned int iField )
+UINT WINAPI MsiRecordSetInteger( MSIHANDLE handle, unsigned int iField, int iVal )
 {
     MSIRECORD *rec;
-    BOOL r = TRUE;
+    UINT ret;
 
-    TRACE("%ld %d\n", handle,iField );
+    TRACE("%ld %u %d\n", handle, iField, iVal);
 
     rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
     if( !rec )
         return ERROR_INVALID_HANDLE;
 
+    ret = MSI_RecordSetInteger( rec, iField, iVal );
+    msiobj_release( &rec->hdr );
+    return ret;
+}
+
+BOOL MSI_RecordIsNull( MSIRECORD *rec, unsigned int iField )
+{
+    BOOL r = TRUE;
+
+    TRACE("%p %d\n", rec, iField );
+
     r = ( iField > rec->count ) ||
         ( rec->fields[iField].type == MSIFIELD_NULL );
 
     return r;
 }
 
-UINT WINAPI MsiRecordGetStringA(MSIHANDLE handle, unsigned int iField, 
-               LPSTR szValue, DWORD *pcchValue)
+BOOL WINAPI MsiRecordIsNull( MSIHANDLE handle, unsigned int iField )
 {
     MSIRECORD *rec;
-    UINT len=0, ret;
-    CHAR buffer[16];
+    UINT ret;
 
-    TRACE("%ld %d %p %p\n", handle, iField, szValue, pcchValue);
+    TRACE("%ld %d\n", handle, iField );
 
     rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
     if( !rec )
         return ERROR_INVALID_HANDLE;
+    ret = MSI_RecordIsNull( rec, iField );
+    msiobj_release( &rec->hdr );
+    return ret;
+
+}
+
+UINT MSI_RecordGetStringA(MSIRECORD *rec, unsigned int iField, 
+               LPSTR szValue, DWORD *pcchValue)
+{
+    UINT len=0, ret;
+    CHAR buffer[16];
+
+    TRACE("%p %d %p %p\n", rec, iField, szValue, pcchValue);
 
     if( iField > rec->count )
         return ERROR_INVALID_PARAMETER;
@@ -277,14 +304,24 @@
     return ret;
 }
 
-const WCHAR *MSI_RecordGetString( MSIHANDLE handle, unsigned int iField )
+UINT WINAPI MsiRecordGetStringA(MSIHANDLE handle, unsigned int iField, 
+               LPSTR szValue, DWORD *pcchValue)
 {
     MSIRECORD *rec;
+    UINT ret;
+
+    TRACE("%ld %d %p %p\n", handle, iField, szValue, pcchValue);
 
     rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
     if( !rec )
-        return NULL;
+        return ERROR_INVALID_HANDLE;
+    ret = MSI_RecordGetStringA( rec, iField, szValue, pcchValue);
+    msiobj_release( &rec->hdr );
+    return ret;
+}
 
+const WCHAR *MSI_RecordGetString( MSIRECORD *rec, unsigned int iField )
+{
     if( iField > rec->count )
         return NULL;
 
@@ -294,19 +331,14 @@
     return rec->fields[iField].u.szwVal;
 }
 
-UINT WINAPI MsiRecordGetStringW(MSIHANDLE handle, unsigned int iField,
+UINT MSI_RecordGetStringW(MSIRECORD *rec, unsigned int iField,
                LPWSTR szValue, DWORD *pcchValue)
 {
-    MSIRECORD *rec;
     UINT len=0, ret;
     WCHAR buffer[16];
     static const WCHAR szFormat[] = { '%','d',0 };
 
-    TRACE("%ld %d %p %p\n", handle, iField, szValue, pcchValue);
-
-    rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
-    if( !rec )
-        return ERROR_INVALID_HANDLE;
+    TRACE("%p %d %p %p\n", rec, iField, szValue, pcchValue);
 
     if( iField > rec->count )
         return ERROR_INVALID_PARAMETER;
@@ -338,23 +370,35 @@
     return ret;
 }
 
+UINT WINAPI MsiRecordGetStringW(MSIHANDLE handle, unsigned int iField,
+               LPWSTR szValue, DWORD *pcchValue)
+{
+    MSIRECORD *rec;
+    UINT ret;
+
+    TRACE("%ld %d %p %p\n", handle, iField, szValue, pcchValue);
+
+    rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
+    if( !rec )
+        return ERROR_INVALID_HANDLE;
+
+    ret = MSI_RecordGetStringW( rec, iField, szValue, pcchValue );
+    msiobj_release( &rec->hdr );
+    return ret;
+}
+
 UINT WINAPI MsiRecordDataSize(MSIHANDLE hRecord, unsigned int iField)
 {
     FIXME("%ld %d\n", hRecord, iField);
     return 0;
 }
 
-UINT WINAPI MsiRecordSetStringA( MSIHANDLE handle, unsigned int iField, LPCSTR szValue )
+UINT MSI_RecordSetStringA( MSIRECORD *rec, unsigned int iField, LPCSTR szValue )
 {
-    MSIRECORD *rec;
     LPWSTR str;
     UINT len;
 
-    TRACE("%ld %d %s\n", handle, iField, debugstr_a(szValue));
-
-    rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
-    if( !rec )
-        return ERROR_INVALID_HANDLE;
+    TRACE("%p %d %s\n", rec, iField, debugstr_a(szValue));
 
     if( iField > rec->count )
         return ERROR_INVALID_FIELD;
@@ -369,21 +413,33 @@
     return 0;
 }
 
-UINT WINAPI MsiRecordSetStringW( MSIHANDLE handle, unsigned int iField, LPCWSTR szValue )
+UINT WINAPI MsiRecordSetStringA( MSIHANDLE handle, unsigned int iField, LPCSTR szValue )
 {
     MSIRECORD *rec;
-    LPWSTR str;
+    UINT ret;
 
-    TRACE("%ld %d %s\n", handle, iField, debugstr_w(szValue));
+    TRACE("%ld %d %s\n", handle, iField, debugstr_a(szValue));
 
     rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
     if( !rec )
         return ERROR_INVALID_HANDLE;
+    ret = MSI_RecordSetStringA( rec, iField, szValue );
+    msiobj_release( &rec->hdr );
+    return ret;
+}
+
+UINT MSI_RecordSetStringW( MSIRECORD *rec, unsigned int iField, LPCWSTR szValue )
+{
+    LPWSTR str;
+    UINT len;
+
+    TRACE("%p %d %s\n", rec, iField, debugstr_w(szValue));
 
     if( iField > rec->count )
         return ERROR_INVALID_FIELD;
 
-    str = HeapAlloc( GetProcessHeap(), 0, (lstrlenW(szValue) + 1)*sizeof (WCHAR));
+    len = lstrlenW(szValue) + 1;
+    str = HeapAlloc( GetProcessHeap(), 0, len*sizeof (WCHAR));
     lstrcpyW( str, szValue );
 
     MSI_FreeField( &rec->fields[iField] );
@@ -393,6 +449,22 @@
     return 0;
 }
 
+UINT WINAPI MsiRecordSetStringW( MSIHANDLE handle, unsigned int iField, LPCWSTR szValue )
+{
+    MSIRECORD *rec;
+    UINT ret;
+
+    TRACE("%ld %d %s\n", handle, iField, debugstr_w(szValue));
+
+    rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
+    if( !rec )
+        return ERROR_INVALID_HANDLE;
+
+    ret = MSI_RecordSetStringW( rec, iField, szValue );
+    msiobj_release( &rec->hdr );
+    return ret;
+}
+
 UINT WINAPI MsiFormatRecordA(MSIHANDLE hInstall, MSIHANDLE hRecord, LPSTR szResult, DWORD *sz)
 {
     FIXME("%ld %ld %p %p\n", hInstall, hRecord, szResult, sz);
@@ -417,18 +489,13 @@
     return ERROR_CALL_NOT_IMPLEMENTED;
 }
 
-UINT WINAPI MsiRecordReadStream(MSIHANDLE handle, unsigned int iField, char *buf, DWORD *sz)
+UINT MSI_RecordReadStream(MSIRECORD *rec, unsigned int iField, char *buf, DWORD *sz)
 {
-    MSIRECORD *rec;
     ULONG count;
     HRESULT r;
     IStream *stm;
 
-    TRACE("%ld %d %p %p\n", handle, iField, buf, sz);
-
-    rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
-    if( !rec )
-        return ERROR_INVALID_HANDLE;
+    TRACE("%p %d %p %p\n", rec, iField, buf, sz);
 
     if( iField > rec->count )
         return ERROR_INVALID_FIELD;
@@ -471,15 +538,24 @@
     return ERROR_SUCCESS;
 }
 
-UINT WINAPI MSI_RecordSetIStream( MSIHANDLE handle, unsigned int iField, IStream *stm )
+UINT WINAPI MsiRecordReadStream(MSIHANDLE handle, unsigned int iField, char *buf, DWORD *sz)
 {
     MSIRECORD *rec;
+    UINT ret;
 
-    TRACE("%ld %d %p\n", handle, iField, stm);
+    TRACE("%ld %d %p %p\n", handle, iField, buf, sz);
 
     rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
     if( !rec )
         return ERROR_INVALID_HANDLE;
+    ret = MSI_RecordReadStream( rec, iField, buf, sz );
+    msiobj_release( &rec->hdr );
+    return ret;
+}
+
+UINT MSI_RecordSetIStream( MSIRECORD *rec, unsigned int iField, IStream *stm )
+{
+    TRACE("%p %d %p\n", rec, iField, stm);
 
     if( iField > rec->count )
         return ERROR_INVALID_FIELD;
diff -ur dlls/msi.old/select.c dlls/msi/select.c
--- dlls/msi.old/select.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/select.c	2004-07-09 13:34:01.000000000 -0500
@@ -111,11 +111,11 @@
     return sv->table->ops->insert_row( sv->table, num );
 }
 
-static UINT SELECT_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT SELECT_execute( struct tagMSIVIEW *view, MSIRECORD *record )
 {
     MSISELECTVIEW *sv = (MSISELECTVIEW*)view;
 
-    TRACE("%p %ld\n", sv, record);
+    TRACE("%p %p\n", sv, record);
 
     if( !sv->table )
          return ERROR_FUNCTION_FAILED;
diff -ur dlls/msi.old/suminfo.c dlls/msi/suminfo.c
--- dlls/msi.old/suminfo.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/suminfo.c	2004-07-09 14:14:19.000000000 -0500
@@ -38,7 +38,7 @@
 static const WCHAR szSumInfo[] = { 5 ,'S','u','m','m','a','r','y',
                        'I','n','f','o','r','m','a','t','i','o','n',0 };
 
-static void MSI_CloseSummaryInfo( VOID *arg )
+static void MSI_CloseSummaryInfo( MSIOBJECTHDR *arg )
 {
     MSISUMMARYINFO *suminfo = (MSISUMMARYINFO *) arg;
     IPropertyStorage_Release( suminfo->propstg );
@@ -74,7 +74,7 @@
               LPCWSTR szDatabase, UINT uiUpdateCount, MSIHANDLE *phSummaryInfo)
 {
     HRESULT r;
-    MSIHANDLE handle, hdb = hDatabase;
+    MSIHANDLE handle;
     MSISUMMARYINFO *suminfo;
     MSIDATABASE *db;
     UINT ret = ERROR_SUCCESS;
@@ -92,20 +92,24 @@
     {
         UINT res;
 
-        res = MsiOpenDatabaseW(szDatabase, NULL, &hdb);
+        res = MSI_OpenDatabaseW(szDatabase, NULL, &db);
         if( res != ERROR_SUCCESS )
             return res;
     }
-
-    db = msihandle2msiinfo(hdb, MSIHANDLETYPE_DATABASE);
-    if( !db )
-        return ERROR_INVALID_PARAMETER;
+    else
+    {
+        db = msihandle2msiinfo(hDatabase, MSIHANDLETYPE_DATABASE);
+        if( !db )
+            return ERROR_INVALID_PARAMETER;
+    }
 
     r = IStorage_QueryInterface( db->storage, 
              &IID_IPropertySetStorage, (LPVOID)&psstg);
     if( FAILED( r ) )
     {
         ERR("IStorage -> IPropertySetStorage failed\n");
+        if (db)
+            msiobj_release(&db->hdr);
         return ERROR_FUNCTION_FAILED;
     }
     ERR("storage = %p propertysetstorage = %p\n", db->storage, psstg);
@@ -119,10 +123,9 @@
         goto end;
     }
 
-    handle = alloc_msihandle( MSIHANDLETYPE_SUMMARYINFO, 
-                  sizeof (MSISUMMARYINFO), MSI_CloseSummaryInfo,
-                  (void**) &suminfo );
-    if( !handle )
+    suminfo = alloc_msiobject( MSIHANDLETYPE_SUMMARYINFO, 
+                  sizeof (MSISUMMARYINFO), MSI_CloseSummaryInfo );
+    if( !suminfo )
     {
         ret = ERROR_FUNCTION_FAILED;
         goto end;
@@ -130,15 +133,20 @@
 
     IPropertyStorage_AddRef(ps);
     suminfo->propstg = ps;
+    handle = alloc_msihandle( &suminfo->hdr );
+    if( handle )
     *phSummaryInfo = handle;
+    else
+        ret = ERROR_FUNCTION_FAILED;
+    msiobj_release( &suminfo->hdr );
 
 end:
     if( ps )
         IPropertyStorage_Release(ps);
     if( psstg )
         IPropertySetStorage_Release(psstg);
-    if( !hDatabase )
-        MsiCloseHandle( hdb );
+    if (db)
+        msiobj_release(&db->hdr);
 
     return ret;
 }
diff -ur dlls/msi.old/table.c dlls/msi/table.c
--- dlls/msi.old/table.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/table.c	2004-07-09 14:07:58.000000000 -0500
@@ -288,18 +288,7 @@
     return ERROR_SUCCESS;
 }
 
-/* FIXME: we should be passing around pointers to db structures internally */
-UINT get_raw_stream( MSIHANDLE hdb, LPCWSTR stname, IStream **stm )
-{
-    MSIDATABASE *db = msihandle2msiinfo(hdb, MSIHANDLETYPE_DATABASE );
-
-    if ( !db )
-        return ERROR_INVALID_HANDLE;
-
-    return db_get_raw_stream( db, stname, stm );
-}
-
-UINT read_raw_stream_data( MSIHANDLE hdb, LPCWSTR stname,
+UINT read_raw_stream_data( MSIDATABASE *db, LPCWSTR stname,
                               USHORT **pdata, UINT *psz )
 {
     HRESULT r;
@@ -309,10 +298,9 @@
     IStream *stm = NULL;
     STATSTG stat;
 
-    r = get_raw_stream( hdb, stname, &stm );
+    r = db_get_raw_stream( db, stname, &stm );
     if( r != ERROR_SUCCESS)
-        goto end;
-    ret = ERROR_FUNCTION_FAILED;
+        return ret;
     r = IStream_Stat(stm, &stat, STATFLAG_NONAME );
     if( FAILED( r ) )
     {
@@ -1114,6 +1102,9 @@
     MSITABLEVIEW *tv = (MSITABLEVIEW*)view;
     UINT ival = 0, refcol = 0, r;
     LPWSTR sval;
+    LPWSTR full_name;
+    DWORD len;
+    static const WCHAR szDot[] = { '.', 0 };
 
     if( !view->ops->fetch_int )
         return ERROR_INVALID_PARAMETER;
@@ -1138,22 +1129,16 @@
     if( !sval )
         return ERROR_INVALID_PARAMETER;
 
-    {
-        LPWSTR full_name;
-        DWORD len;
-        static const WCHAR szDot[] = { '.', 0 };
-
-        len = strlenW( tv->name ) + 2 + strlenW( sval );
-        full_name = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
-        strcpyW( full_name, tv->name );
-        strcatW( full_name, szDot );
-        strcatW( full_name, sval );
-
-        r = db_get_raw_stream( tv->db, full_name, stm );
-        if( r )
-            ERR("fetching stream %s, error = %d\n",debugstr_w(full_name), r);
-        HeapFree( GetProcessHeap(), 0, full_name );
-    }
+    len = strlenW( tv->name ) + 2 + strlenW( sval );
+    full_name = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
+    strcpyW( full_name, tv->name );
+    strcatW( full_name, szDot );
+    strcatW( full_name, sval );
+
+    r = db_get_raw_stream( tv->db, full_name, stm );
+    if( r )
+        ERR("fetching stream %s, error = %d\n",debugstr_w(full_name), r);
+    HeapFree( GetProcessHeap(), 0, full_name );
     HeapFree( GetProcessHeap(), 0, sval );
 
     return r;
@@ -1228,12 +1213,12 @@
     return ERROR_SUCCESS;
 }
 
-static UINT TABLE_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT TABLE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
 {
     MSITABLEVIEW *tv = (MSITABLEVIEW*)view;
     UINT r;
 
-    TRACE("%p %ld\n", tv, record);
+    TRACE("%p %p\n", tv, record);
 
     if( tv->table )
         return ERROR_FUNCTION_FAILED;
diff -ur dlls/msi.old/update.c dlls/msi/update.c
--- dlls/msi.old/update.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/update.c	2004-07-09 13:34:01.000000000 -0500
@@ -55,13 +55,13 @@
     return ERROR_FUNCTION_FAILED;
 }
 
-static UINT UPDATE_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT UPDATE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
 {
     MSIUPDATEVIEW *uv = (MSIUPDATEVIEW*)view;
     UINT n, type, val, r, row, col_count = 0, row_count = 0;
     MSIVIEW *wv;
 
-    TRACE("%p %ld\n", uv, record );
+    TRACE("%p %p\n", uv, record );
 
     if( !record )
         return ERROR_FUNCTION_FAILED;
@@ -94,7 +94,7 @@
             }
             else
             {
-                val = MsiRecordGetInteger( record, n );
+                val = MSI_RecordGetInteger( record, n );
                 val |= 0x8000;
             }
             r = wv->ops->set_int( wv, row, n, val );
@@ -172,6 +172,7 @@
         wv->ops->delete( wv );
     delete_value_list( uv->vals );
     HeapFree( GetProcessHeap(), 0, uv );
+    msiobj_release( &uv->db->hdr );
 
     return ERROR_SUCCESS;
 }
@@ -228,6 +229,7 @@
 
     /* fill the structure */
     uv->view.ops = &update_ops;
+    msiobj_addref( &db->hdr );
     uv->db = db;
     uv->vals = list->val_list;
     uv->wv = sv;
diff -ur dlls/msi.old/where.c dlls/msi/where.c
--- dlls/msi.old/where.c	2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/where.c	2004-07-09 13:34:01.000000000 -0500
@@ -131,7 +131,7 @@
 }
 
 static const WCHAR *STRING_evaluate( string_table *st,
-              MSIVIEW *table, UINT row, struct expr *expr, MSIHANDLE record )
+              MSIVIEW *table, UINT row, struct expr *expr, MSIRECORD *record )
 {
     UINT val = 0, r;
 
@@ -157,7 +157,7 @@
 }
 
 static UINT STRCMP_Evaluate( string_table *st, MSIVIEW *table, UINT row, 
-                             struct expr *cond, UINT *val, MSIHANDLE record )
+                             struct expr *cond, UINT *val, MSIRECORD *record )
 {
     int sr;
     const WCHAR *l_str, *r_str;
@@ -181,7 +181,7 @@
 }
 
 static UINT WHERE_evaluate( MSIDATABASE *db, MSIVIEW *table, UINT row, 
-                             struct expr *cond, UINT *val, MSIHANDLE record )
+                             struct expr *cond, UINT *val, MSIRECORD *record )
 {
     UINT r, lval, rval;
 
@@ -211,7 +211,7 @@
         return STRCMP_Evaluate( db->strings, table, row, cond, val, record );
 
     case EXPR_WILDCARD:
-        *val = MsiRecordGetInteger( record, 1 );
+        *val = MSI_RecordGetInteger( record, 1 );
         return ERROR_SUCCESS;
 
     default:
@@ -223,13 +223,13 @@
 
 }
 
-static UINT WHERE_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT WHERE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
 {
     MSIWHEREVIEW *wv = (MSIWHEREVIEW*)view;
     UINT count = 0, r, val, i;
     MSIVIEW *table = wv->table;
 
-    TRACE("%p %ld\n", wv, record);
+    TRACE("%p %p\n", wv, record);
 
     if( !table )
          return ERROR_FUNCTION_FAILED;
@@ -337,6 +337,7 @@
         delete_expr( wv->cond );
 
     HeapFree( GetProcessHeap(), 0, wv );
+    msiobj_release( &wv->db->hdr );
 
     return ERROR_SUCCESS;
 }
@@ -458,6 +459,7 @@
     
     /* fill the structure */
     wv->view.ops = &where_ops;
+    msiobj_addref( &db->hdr );
     wv->db = db;
     wv->table = table;
     wv->row_count = 0;
Binary files dlls/msi.old/where.o and dlls/msi/where.o differ


More information about the wine-patches mailing list