[MSISIP]
[reactos.git] / reactos / dll / win32 / msisip / main.c
index cea0398..421e9ab 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include "config.h"
+#define WIN32_NO_STATUS
+#define _INC_WINDOWS
+#define COM_NO_WINDOWS_H
+
+#include <config.h>
 #include <stdarg.h>
-#include "windef.h"
-#include "winbase.h"
-#include "wincrypt.h"
-#include "mssip.h"
+#include <windef.h>
+#include <winbase.h>
+#include <wincrypt.h>
+#include <mssip.h>
 #define COBJMACROS
-#include "objbase.h"
-#include "wine/debug.h"
+#include <objbase.h>
+#include <initguid.h>
+#include <wine/debug.h>
 
 WINE_DEFAULT_DEBUG_CHANNEL(msisip);
 
@@ -39,10 +44,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
         case DLL_PROCESS_ATTACH:
             DisableThreadLibraryCalls(hinstDLL);
             break;
-        case DLL_PROCESS_DETACH:
-            break;
-        default:
-            break;
     }
 
     return TRUE;
@@ -84,6 +85,7 @@ HRESULT WINAPI DllRegisterServer(void)
     prov.pwszVerifyFuncName = verifyIndirectData;
     prov.pwszRemoveFuncName = removeSignedDataMsg;
     prov.pwszIsFunctionNameFmt2 = isMyTypeOfFile;
+    prov.pwszGetCapFuncName = NULL;
     return CryptSIPAddProvider(&prov) ? S_OK : S_FALSE;
 }
 
@@ -217,34 +219,39 @@ end:
     return ret;
 }
 
+DEFINE_GUID(CLSID_MsiTransform, 0x000c1082,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
+DEFINE_GUID(CLSID_MsiDatabase,  0x000c1084,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
+DEFINE_GUID(CLSID_MsiPatch,     0x000c1086,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
+
 /***********************************************************************
  *              MsiSIPIsMyTypeOfFile (MSISIP.@)
  */
 BOOL WINAPI MsiSIPIsMyTypeOfFile(WCHAR *name, GUID *subject)
 {
-    static const WCHAR msi[] = { '.','m','s','i',0 };
-    static const WCHAR msp[] = { '.','m','s','p',0 };
     BOOL ret = FALSE;
+    IStorage *stg = NULL;
+    HRESULT r;
 
     TRACE("(%s, %p)\n", debugstr_w(name), subject);
 
-    if (lstrlenW(name) < lstrlenW(msi))
-        return FALSE;
-    else if (lstrcmpiW(name + lstrlenW(name) - lstrlenW(msi), msi) &&
-     lstrcmpiW(name + lstrlenW(name) - lstrlenW(msp), msp))
-        return FALSE;
-    else
+    r = StgOpenStorage(name, NULL, STGM_DIRECT|STGM_READ|STGM_SHARE_DENY_WRITE,
+     NULL, 0, &stg);
+    if (SUCCEEDED(r))
     {
-        IStorage *stg = NULL;
-        HRESULT r = StgOpenStorage(name, NULL,
-         STGM_DIRECT|STGM_READ|STGM_SHARE_DENY_WRITE, NULL, 0, &stg);
+        STATSTG stat;
 
+        r = IStorage_Stat(stg, &stat, STATFLAG_NONAME);
         if (SUCCEEDED(r))
         {
-            IStorage_Release(stg);
-            *subject = mySubject;
-            ret = TRUE;
+            if (IsEqualGUID(&stat.clsid, &CLSID_MsiDatabase) ||
+             IsEqualGUID(&stat.clsid, &CLSID_MsiPatch) ||
+             IsEqualGUID(&stat.clsid, &CLSID_MsiTransform))
+            {
+                ret = TRUE;
+                *subject = mySubject;
+            }
         }
+        IStorage_Release(stg);
     }
     return ret;
 }