2 * Implementation of the Microsoft Installer (msi.dll)
4 * Copyright 2002,2003 Mike McCormack for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #define NONAMELESSUNION
30 #include "wine/debug.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(msi
);
39 const WCHAR szInstaller
[] = {
40 'S','o','f','t','w','a','r','e','\\',
41 'M','i','c','r','o','s','o','f','t','\\',
42 'W','i','n','d','o','w','s','\\',
43 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
44 'I','n','s','t','a','l','l','e','r',0 };
46 const WCHAR szFeatures
[] = {
47 'F','e','a','t','u','r','e','s',0 };
48 const WCHAR szComponents
[] = {
49 'C','o','m','p','o','n','e','n','t','s',0 };
54 * A .msi file is a structured storage file.
55 * It should contain a number of streams.
58 BOOL
unsquash_guid(LPCWSTR in
, LPWSTR out
)
74 out
[n
++] = in
[17+i
*2];
75 out
[n
++] = in
[16+i
*2];
80 out
[n
++] = in
[17+i
*2];
81 out
[n
++] = in
[16+i
*2];
88 BOOL
squash_guid(LPCWSTR in
, LPWSTR out
)
108 out
[17+i
*2] = in
[n
++];
109 out
[16+i
*2] = in
[n
++];
115 out
[17+i
*2] = in
[n
++];
116 out
[16+i
*2] = in
[n
++];
126 VOID
MSI_CloseDatabase( VOID
*arg
)
128 MSIDATABASE
*db
= (MSIDATABASE
*) arg
;
130 free_cached_tables( db
);
131 IStorage_Release( db
->storage
);
134 UINT WINAPI
MsiOpenDatabaseA(
135 LPCSTR szDBPath
, LPCSTR szPersist
, MSIHANDLE
*phDB
)
137 HRESULT r
= ERROR_FUNCTION_FAILED
;
138 LPWSTR szwDBPath
= NULL
, szwPersist
= NULL
;
141 TRACE("%s %s %p\n", debugstr_a(szDBPath
), debugstr_a(szPersist
), phDB
);
145 len
= MultiByteToWideChar( CP_ACP
, 0, szDBPath
, -1, NULL
, 0 );
146 szwDBPath
= HeapAlloc( GetProcessHeap(), 0, len
* sizeof(WCHAR
) );
149 MultiByteToWideChar( CP_ACP
, 0, szDBPath
, -1, szwDBPath
, len
);
154 len
= MultiByteToWideChar( CP_ACP
, 0, szPersist
, -1, NULL
, 0 );
155 szwPersist
= HeapAlloc( GetProcessHeap(), 0, len
* sizeof(WCHAR
) );
158 MultiByteToWideChar( CP_ACP
, 0, szPersist
, -1, szwPersist
, len
);
161 r
= MsiOpenDatabaseW( szwDBPath
, szwPersist
, phDB
);
165 HeapFree( GetProcessHeap(), 0, szwPersist
);
167 HeapFree( GetProcessHeap(), 0, szwDBPath
);
172 UINT WINAPI
MsiOpenDatabaseW(
173 LPCWSTR szDBPath
, LPCWSTR szPersist
, MSIHANDLE
*phDB
)
175 IStorage
*stg
= NULL
;
181 TRACE("%s %s %p\n",debugstr_w(szDBPath
),debugstr_w(szPersist
), phDB
);
184 return ERROR_INVALID_PARAMETER
;
186 r
= StgOpenStorage( szDBPath
, NULL
, STGM_DIRECT
|STGM_READ
|STGM_SHARE_DENY_WRITE
, NULL
, 0, &stg
);
189 FIXME("open failed r = %08lx!\n",r
);
190 return ERROR_FUNCTION_FAILED
;
193 handle
= alloc_msihandle(MSIHANDLETYPE_DATABASE
, sizeof (MSIDATABASE
), MSI_CloseDatabase
);
196 FIXME("Failed to allocate a handle\n");
197 ret
= ERROR_FUNCTION_FAILED
;
201 db
= msihandle2msiinfo( handle
, MSIHANDLETYPE_DATABASE
);
204 FIXME("Failed to get handle pointer \n");
205 ret
= ERROR_FUNCTION_FAILED
;
209 ret
= load_string_table( db
, &db
->strings
);
210 if( ret
!= ERROR_SUCCESS
)
215 IStorage_AddRef( stg
);
218 IStorage_Release( stg
);
223 UINT WINAPI
MsiOpenProductA(LPCSTR szProduct
, MSIHANDLE
*phProduct
)
226 LPWSTR szwProd
= NULL
;
228 TRACE("%s %p\n",debugstr_a(szProduct
), phProduct
);
232 len
= MultiByteToWideChar( CP_ACP
, 0, szProduct
, -1, NULL
, 0 );
233 szwProd
= HeapAlloc( GetProcessHeap(), 0, len
* sizeof (WCHAR
) );
235 MultiByteToWideChar( CP_ACP
, 0, szProduct
, -1, szwProd
, len
);
238 ret
= MsiOpenProductW( szwProd
, phProduct
);
241 HeapFree( GetProcessHeap(), 0, szwProd
);
246 UINT WINAPI
MsiOpenProductW(LPCWSTR szProduct
, MSIHANDLE
*phProduct
)
248 FIXME("%s %p\n",debugstr_w(szProduct
), phProduct
);
249 return ERROR_CALL_NOT_IMPLEMENTED
;
252 UINT WINAPI
MsiOpenPackageA(LPCSTR szPackage
, MSIHANDLE
*phPackage
)
254 FIXME("%s %p\n",debugstr_a(szPackage
), phPackage
);
255 return ERROR_CALL_NOT_IMPLEMENTED
;
258 UINT WINAPI
MsiOpenPackageW(LPCWSTR szPackage
, MSIHANDLE
*phPackage
)
260 FIXME("%s %p\n",debugstr_w(szPackage
), phPackage
);
261 return ERROR_CALL_NOT_IMPLEMENTED
;
264 UINT WINAPI
MsiOpenPackageExA(LPCSTR szPackage
, DWORD dwOptions
, MSIHANDLE
*phPackage
)
266 FIXME("%s 0x%08lx %p\n",debugstr_a(szPackage
), dwOptions
, phPackage
);
267 return ERROR_CALL_NOT_IMPLEMENTED
;
270 UINT WINAPI
MsiOpenPackageExW(LPCWSTR szPackage
, DWORD dwOptions
, MSIHANDLE
*phPackage
)
272 FIXME("%s 0x%08lx %p\n",debugstr_w(szPackage
), dwOptions
, phPackage
);
273 return ERROR_CALL_NOT_IMPLEMENTED
;
276 UINT WINAPI
MsiAdvertiseProductA(LPCSTR szPackagePath
, LPCSTR szScriptfilePath
, LPCSTR szTransforms
, LANGID lgidLanguage
)
278 FIXME("%s %s %s 0x%08x\n",debugstr_a(szPackagePath
), debugstr_a(szScriptfilePath
), debugstr_a(szTransforms
), lgidLanguage
);
279 return ERROR_CALL_NOT_IMPLEMENTED
;
282 UINT WINAPI
MsiAdvertiseProductW(LPCWSTR szPackagePath
, LPCWSTR szScriptfilePath
, LPCWSTR szTransforms
, LANGID lgidLanguage
)
284 FIXME("%s %s %s 0x%08x\n",debugstr_w(szPackagePath
), debugstr_w(szScriptfilePath
), debugstr_w(szTransforms
), lgidLanguage
);
285 return ERROR_CALL_NOT_IMPLEMENTED
;
288 UINT WINAPI
MsiAdvertiseProductExA(
289 LPCSTR szPackagePath
, LPCSTR szScriptfilePath
, LPCSTR szTransforms
, LANGID lgidLanguage
, DWORD dwPlatform
, DWORD dwOptions
)
291 FIXME("%s %s %s 0x%08x 0x%08lx 0x%08lx\n",
292 debugstr_a(szPackagePath
), debugstr_a(szScriptfilePath
), debugstr_a(szTransforms
), lgidLanguage
, dwPlatform
, dwOptions
);
293 return ERROR_CALL_NOT_IMPLEMENTED
;
296 UINT WINAPI
MsiAdvertiseProductExW(
297 LPCWSTR szPackagePath
, LPCWSTR szScriptfilePath
, LPCWSTR szTransforms
, LANGID lgidLanguage
, DWORD dwPlatform
, DWORD dwOptions
)
299 FIXME("%s %s %s 0x%08x 0x%08lx 0x%08lx\n",
300 debugstr_w(szPackagePath
), debugstr_w(szScriptfilePath
), debugstr_w(szTransforms
), lgidLanguage
, dwPlatform
, dwOptions
);
301 return ERROR_CALL_NOT_IMPLEMENTED
;
304 UINT WINAPI
MsiInstallProductA(LPCSTR szPackagePath
, LPCSTR szCommandLine
)
306 LPWSTR szwPath
= NULL
, szwCommand
= NULL
;
307 UINT r
= ERROR_FUNCTION_FAILED
; /* FIXME: check return code */
309 TRACE("%s %s\n",debugstr_a(szPackagePath
), debugstr_a(szCommandLine
));
313 UINT len
= MultiByteToWideChar( CP_ACP
, 0, szPackagePath
, -1, NULL
, 0 );
314 szwPath
= HeapAlloc( GetProcessHeap(), 0, len
* sizeof(WCHAR
) );
317 MultiByteToWideChar( CP_ACP
, 0, szPackagePath
, -1, szwPath
, len
);
322 UINT len
= MultiByteToWideChar( CP_ACP
, 0, szCommandLine
, -1, NULL
, 0 );
323 szwCommand
= HeapAlloc( GetProcessHeap(), 0, len
* sizeof(WCHAR
) );
326 MultiByteToWideChar( CP_ACP
, 0, szCommandLine
, -1, szwCommand
, len
);
329 r
= MsiInstallProductW( szwPath
, szwCommand
);
333 HeapFree( GetProcessHeap(), 0, szwPath
);
336 HeapFree( GetProcessHeap(), 0, szwCommand
);
341 UINT WINAPI
MsiInstallProductW(LPCWSTR szPackagePath
, LPCWSTR szCommandLine
)
343 FIXME("%s %s\n",debugstr_w(szPackagePath
), debugstr_w(szCommandLine
));
345 return ERROR_CALL_NOT_IMPLEMENTED
;
348 UINT WINAPI
MsiConfigureProductA(
349 LPCSTR szProduct
, int iInstallLevel
, INSTALLSTATE eInstallState
)
351 FIXME("%s %d %d\n",debugstr_a(szProduct
), iInstallLevel
, eInstallState
);
352 return ERROR_CALL_NOT_IMPLEMENTED
;
355 UINT WINAPI
MsiConfigureProductW(
356 LPCWSTR szProduct
, int iInstallLevel
, INSTALLSTATE eInstallState
)
358 FIXME("%s %d %d\n",debugstr_w(szProduct
), iInstallLevel
, eInstallState
);
359 return ERROR_CALL_NOT_IMPLEMENTED
;
362 UINT WINAPI
MsiGetProductCodeA(LPCSTR szComponent
, LPSTR szBuffer
)
364 FIXME("%s %s\n",debugstr_a(szComponent
), debugstr_a(szBuffer
));
365 return ERROR_CALL_NOT_IMPLEMENTED
;
368 UINT WINAPI
MsiGetProductCodeW(LPCWSTR szComponent
, LPWSTR szBuffer
)
370 FIXME("%s %s\n",debugstr_w(szComponent
), debugstr_w(szBuffer
));
371 return ERROR_CALL_NOT_IMPLEMENTED
;
374 UINT WINAPI
MsiGetProductInfoA(LPCSTR szProduct
, LPCSTR szAttribute
, LPSTR szBuffer
, DWORD
*pcchValueBuf
)
376 FIXME("%s %s %p %p\n",debugstr_a(szProduct
), debugstr_a(szAttribute
), szBuffer
, pcchValueBuf
);
377 return ERROR_CALL_NOT_IMPLEMENTED
;
380 UINT WINAPI
MsiGetProductInfoW(LPCWSTR szProduct
, LPCWSTR szAttribute
, LPWSTR szBuffer
, DWORD
*pcchValueBuf
)
382 FIXME("%s %s %p %p\n",debugstr_w(szProduct
), debugstr_w(szAttribute
), szBuffer
, pcchValueBuf
);
383 return ERROR_CALL_NOT_IMPLEMENTED
;
386 UINT WINAPI
MsiDatabaseImportA(LPCSTR szFolderPath
, LPCSTR szFilename
)
388 FIXME("%s %s\n",debugstr_a(szFolderPath
), debugstr_a(szFilename
));
389 return ERROR_CALL_NOT_IMPLEMENTED
;
392 UINT WINAPI
MsiDatabaseImportW(LPCWSTR szFolderPath
, LPCWSTR szFilename
)
394 FIXME("%s %s\n",debugstr_w(szFolderPath
), debugstr_w(szFilename
));
395 return ERROR_CALL_NOT_IMPLEMENTED
;
398 UINT WINAPI
MsiEnableLogA(DWORD dwLogMode
, LPCSTR szLogFile
, BOOL fAppend
)
400 FIXME("%08lx %s %d\n", dwLogMode
, debugstr_a(szLogFile
), fAppend
);
401 return ERROR_SUCCESS
;
402 /* return ERROR_CALL_NOT_IMPLEMENTED; */
405 UINT WINAPI
MsiEnableLogW(DWORD dwLogMode
, LPCWSTR szLogFile
, BOOL fAppend
)
407 FIXME("%08lx %s %d\n", dwLogMode
, debugstr_w(szLogFile
), fAppend
);
408 return ERROR_CALL_NOT_IMPLEMENTED
;
411 INSTALLSTATE WINAPI
MsiQueryProductStateA(LPCSTR szProduct
)
413 FIXME("%s\n", debugstr_a(szProduct
));
417 INSTALLSTATE WINAPI
MsiQueryProductStateW(LPCWSTR szProduct
)
419 FIXME("%s\n", debugstr_w(szProduct
));
423 INSTALLUILEVEL WINAPI
MsiSetInternalUI(INSTALLUILEVEL dwUILevel
, HWND
*phWnd
)
425 FIXME("%08x %p\n", dwUILevel
, phWnd
);
429 UINT WINAPI
MsiLoadStringA(DWORD a
, DWORD b
, DWORD c
, DWORD d
, DWORD e
, DWORD f
)
431 FIXME("%08lx %08lx %08lx %08lx %08lx %08lx\n",a
,b
,c
,d
,e
,f
);
432 return ERROR_CALL_NOT_IMPLEMENTED
;
435 UINT WINAPI
MsiLoadStringW(DWORD a
, DWORD b
, DWORD c
, DWORD d
, DWORD e
, DWORD f
)
437 FIXME("%08lx %08lx %08lx %08lx %08lx %08lx\n",a
,b
,c
,d
,e
,f
);
438 return ERROR_CALL_NOT_IMPLEMENTED
;
441 UINT WINAPI
MsiMessageBoxA(DWORD a
, DWORD b
, DWORD c
, DWORD d
, DWORD e
, DWORD f
)
443 FIXME("%08lx %08lx %08lx %08lx %08lx %08lx\n",a
,b
,c
,d
,e
,f
);
444 return ERROR_CALL_NOT_IMPLEMENTED
;
447 UINT WINAPI
MsiMessageBoxW(DWORD a
, DWORD b
, DWORD c
, DWORD d
, DWORD e
, DWORD f
)
449 FIXME("%08lx %08lx %08lx %08lx %08lx %08lx\n",a
,b
,c
,d
,e
,f
);
450 return ERROR_CALL_NOT_IMPLEMENTED
;
453 UINT WINAPI
MsiEnumProductsA(DWORD index
, LPSTR lpguid
)
456 WCHAR szwGuid
[GUID_SIZE
];
458 TRACE("%ld %p\n",index
,lpguid
);
460 r
= MsiEnumProductsW(index
, szwGuid
);
461 if( r
== ERROR_SUCCESS
)
462 WideCharToMultiByte(CP_ACP
, 0, szwGuid
, -1, lpguid
, GUID_SIZE
, NULL
, NULL
);
467 UINT WINAPI
MsiEnumProductsW(DWORD index
, LPWSTR lpguid
)
469 HKEY hkey
= 0, hkeyFeatures
= 0;
473 TRACE("%ld %p\n",index
,lpguid
);
475 r
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, szInstaller
, &hkey
);
476 if( r
!= ERROR_SUCCESS
)
479 r
= RegOpenKeyW(hkey
, szFeatures
, &hkeyFeatures
);
480 if( r
!= ERROR_SUCCESS
)
483 r
= RegEnumKeyW(hkeyFeatures
, index
, szKeyName
, GUID_SIZE
);
485 unsquash_guid(szKeyName
, lpguid
);
490 RegCloseKey(hkeyFeatures
);
497 UINT WINAPI
MsiEnumFeaturesA(LPCSTR szProduct
, DWORD index
,
498 LPSTR szFeature
, LPSTR szParent
)
501 WCHAR szwFeature
[GUID_SIZE
], szwParent
[GUID_SIZE
];
502 LPWSTR szwProduct
= NULL
;
504 TRACE("%s %ld %p %p\n",debugstr_a(szProduct
),index
,szFeature
,szParent
);
508 UINT len
= MultiByteToWideChar( CP_ACP
, 0, szProduct
, -1, NULL
, 0 );
509 szwProduct
= HeapAlloc( GetProcessHeap(), 0, len
* sizeof (WCHAR
) );
511 MultiByteToWideChar( CP_ACP
, 0, szProduct
, -1, szwProduct
, len
);
513 return ERROR_FUNCTION_FAILED
;
516 r
= MsiEnumFeaturesW(szwProduct
, index
, szwFeature
, szwParent
);
517 if( r
== ERROR_SUCCESS
)
519 WideCharToMultiByte(CP_ACP
, 0, szwFeature
, -1,
520 szFeature
, GUID_SIZE
, NULL
, NULL
);
521 WideCharToMultiByte(CP_ACP
, 0, szwParent
, -1,
522 szParent
, GUID_SIZE
, NULL
, NULL
);
526 HeapFree( GetProcessHeap(), 0, szwProduct
);
531 UINT WINAPI
MsiEnumFeaturesW(LPCWSTR szProduct
, DWORD index
,
532 LPWSTR szFeature
, LPWSTR szParent
)
534 HKEY hkey
= 0, hkeyFeatures
= 0, hkeyProduct
= 0;
536 WCHAR szRegName
[GUID_SIZE
];
538 TRACE("%s %ld %p %p\n",debugstr_w(szProduct
),index
,szFeature
,szParent
);
540 if( !squash_guid(szProduct
, szRegName
) )
541 return ERROR_INVALID_PARAMETER
;
543 r
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, szInstaller
, &hkey
);
544 if( r
!= ERROR_SUCCESS
)
547 r
= RegOpenKeyW(hkey
, szFeatures
, &hkeyFeatures
);
548 if( r
!= ERROR_SUCCESS
)
551 r
= RegOpenKeyW(hkeyFeatures
, szRegName
, &hkeyProduct
);
552 if( r
!= ERROR_SUCCESS
)
556 r
= RegEnumValueW(hkeyProduct
, index
, szFeature
, &sz
, NULL
, NULL
, NULL
, NULL
);
560 RegCloseKey(hkeyProduct
);
562 RegCloseKey(hkeyFeatures
);
569 UINT WINAPI
MsiEnumComponentsA(DWORD index
, LPSTR lpguid
)
572 WCHAR szwGuid
[GUID_SIZE
];
574 TRACE("%ld %p\n",index
,lpguid
);
576 r
= MsiEnumComponentsW(index
, szwGuid
);
577 if( r
== ERROR_SUCCESS
)
578 WideCharToMultiByte(CP_ACP
, 0, szwGuid
, -1, lpguid
, GUID_SIZE
, NULL
, NULL
);
583 UINT WINAPI
MsiEnumComponentsW(DWORD index
, LPWSTR lpguid
)
585 HKEY hkey
= 0, hkeyComponents
= 0;
589 TRACE("%ld %p\n",index
,lpguid
);
591 r
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, szInstaller
, &hkey
);
592 if( r
!= ERROR_SUCCESS
)
595 r
= RegOpenKeyW(hkey
, szComponents
, &hkeyComponents
);
596 if( r
!= ERROR_SUCCESS
)
599 r
= RegEnumKeyW(hkeyComponents
, index
, szKeyName
, GUID_SIZE
);
601 unsquash_guid(szKeyName
, lpguid
);
606 RegCloseKey(hkeyComponents
);
613 UINT WINAPI
MsiEnumClientsA(LPCSTR szComponent
, DWORD index
, LPSTR szProduct
)
616 WCHAR szwProduct
[GUID_SIZE
];
617 LPWSTR szwComponent
= NULL
;
619 TRACE("%s %ld %p\n",debugstr_a(szComponent
),index
,szProduct
);
623 UINT len
= MultiByteToWideChar( CP_ACP
, 0, szComponent
, -1, NULL
, 0 );
624 szwComponent
= HeapAlloc( GetProcessHeap(), 0, len
* sizeof (WCHAR
) );
626 MultiByteToWideChar( CP_ACP
, 0, szComponent
, -1, szwComponent
, len
);
628 return ERROR_FUNCTION_FAILED
;
631 r
= MsiEnumClientsW(szComponent
?szwComponent
:NULL
, index
, szwProduct
);
632 if( r
== ERROR_SUCCESS
)
634 WideCharToMultiByte(CP_ACP
, 0, szwProduct
, -1,
635 szProduct
, GUID_SIZE
, NULL
, NULL
);
639 HeapFree( GetProcessHeap(), 0, szwComponent
);
644 UINT WINAPI
MsiEnumClientsW(LPCWSTR szComponent
, DWORD index
, LPWSTR szProduct
)
646 HKEY hkey
= 0, hkeyComponents
= 0, hkeyComp
= 0;
648 WCHAR szRegName
[GUID_SIZE
], szValName
[GUID_SIZE
];
650 TRACE("%s %ld %p\n",debugstr_w(szComponent
),index
,szProduct
);
652 if( !squash_guid(szComponent
, szRegName
) )
653 return ERROR_INVALID_PARAMETER
;
655 r
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, szInstaller
, &hkey
);
656 if( r
!= ERROR_SUCCESS
)
659 r
= RegOpenKeyW(hkey
, szComponents
, &hkeyComponents
);
660 if( r
!= ERROR_SUCCESS
)
663 r
= RegOpenKeyW(hkeyComponents
, szRegName
, &hkeyComp
);
664 if( r
!= ERROR_SUCCESS
)
668 r
= RegEnumValueW(hkeyComp
, index
, szValName
, &sz
, NULL
, NULL
, NULL
, NULL
);
669 if( r
!= ERROR_SUCCESS
)
672 unsquash_guid(szValName
, szProduct
);
676 RegCloseKey(hkeyComp
);
678 RegCloseKey(hkeyComponents
);
685 UINT WINAPI
MsiEnumComponentQualifiersA(
686 LPSTR szComponent
, DWORD iIndex
, LPSTR lpQualifierBuf
, DWORD
* pcchQualifierBuf
, LPSTR lpApplicationDataBuf
, DWORD
* pcchApplicationDataBuf
)
688 FIXME("%s 0x%08lx %p %p %p %p\n", debugstr_a(szComponent
), iIndex
, lpQualifierBuf
, pcchQualifierBuf
, lpApplicationDataBuf
, pcchApplicationDataBuf
);
689 return ERROR_CALL_NOT_IMPLEMENTED
;
692 UINT WINAPI
MsiEnumComponentQualifiersW(
693 LPWSTR szComponent
, DWORD iIndex
, LPWSTR lpQualifierBuf
, DWORD
* pcchQualifierBuf
, LPWSTR lpApplicationDataBuf
, DWORD
* pcchApplicationDataBuf
)
695 FIXME("%s 0x%08lx %p %p %p %p\n", debugstr_w(szComponent
), iIndex
, lpQualifierBuf
, pcchQualifierBuf
, lpApplicationDataBuf
, pcchApplicationDataBuf
);
696 return ERROR_CALL_NOT_IMPLEMENTED
;
699 UINT WINAPI
MsiProvideAssemblyA(
700 LPCSTR szAssemblyName
, LPCSTR szAppContext
, DWORD dwInstallMode
, DWORD dwAssemblyInfo
, LPSTR lpPathBuf
, DWORD
* pcchPathBuf
)
702 FIXME("%s %s 0x%08lx 0x%08lx %p %p\n",
703 debugstr_a(szAssemblyName
), debugstr_a(szAppContext
), dwInstallMode
, dwAssemblyInfo
, lpPathBuf
, pcchPathBuf
);
704 return ERROR_CALL_NOT_IMPLEMENTED
;
707 UINT WINAPI
MsiProvideAssemblyW(
708 LPCWSTR szAssemblyName
, LPCWSTR szAppContext
, DWORD dwInstallMode
, DWORD dwAssemblyInfo
, LPWSTR lpPathBuf
, DWORD
* pcchPathBuf
)
710 FIXME("%s %s 0x%08lx 0x%08lx %p %p\n",
711 debugstr_w(szAssemblyName
), debugstr_w(szAppContext
), dwInstallMode
, dwAssemblyInfo
, lpPathBuf
, pcchPathBuf
);
712 return ERROR_CALL_NOT_IMPLEMENTED
;
715 UINT WINAPI
MsiProvideComponentFromDescriptorA( LPCSTR szDescriptor
, LPSTR szPath
, DWORD
*pcchPath
, DWORD
*pcchArgs
)
717 FIXME("%s %p %p %p\n", debugstr_a(szDescriptor
), szPath
, pcchPath
, pcchArgs
);
718 return ERROR_CALL_NOT_IMPLEMENTED
;
721 UINT WINAPI
MsiProvideComponentFromDescriptorW( LPCWSTR szDescriptor
, LPWSTR szPath
, DWORD
*pcchPath
, DWORD
*pcchArgs
)
723 FIXME("%s %p %p %p\n", debugstr_w(szDescriptor
), szPath
, pcchPath
, pcchArgs
);
724 return ERROR_CALL_NOT_IMPLEMENTED
;
727 HRESULT WINAPI
MsiGetFileSignatureInformationA(
728 LPCSTR szSignedObjectPath
, DWORD dwFlags
, PCCERT_CONTEXT
* ppcCertContext
, BYTE
* pbHashData
, DWORD
* pcbHashData
)
730 FIXME("%s 0x%08lx %p %p %p\n", debugstr_a(szSignedObjectPath
), dwFlags
, ppcCertContext
, pbHashData
, pcbHashData
);
731 return ERROR_CALL_NOT_IMPLEMENTED
;
734 HRESULT WINAPI
MsiGetFileSignatureInformationW(
735 LPCWSTR szSignedObjectPath
, DWORD dwFlags
, PCCERT_CONTEXT
* ppcCertContext
, BYTE
* pbHashData
, DWORD
* pcbHashData
)
737 FIXME("%s 0x%08lx %p %p %p\n", debugstr_w(szSignedObjectPath
), dwFlags
, ppcCertContext
, pbHashData
, pcbHashData
);
738 return ERROR_CALL_NOT_IMPLEMENTED
;
741 UINT WINAPI
MsiGetProductPropertyA( MSIHANDLE hProduct
, LPCSTR szProperty
,
742 LPSTR szValue
, DWORD
*pccbValue
)
744 FIXME("%ld %s %p %p\n", hProduct
, debugstr_a(szProperty
), szValue
, pccbValue
);
745 return ERROR_CALL_NOT_IMPLEMENTED
;
748 UINT WINAPI
MsiGetProductPropertyW( MSIHANDLE hProduct
, LPCWSTR szProperty
,
749 LPWSTR szValue
, DWORD
*pccbValue
)
751 FIXME("%ld %s %p %p\n", hProduct
, debugstr_w(szProperty
), szValue
, pccbValue
);
752 return ERROR_CALL_NOT_IMPLEMENTED
;
755 HRESULT WINAPI
MSI_DllGetVersion(DLLVERSIONINFO
*pdvi
)
759 if (pdvi
->cbSize
!= sizeof(DLLVERSIONINFO
))
762 pdvi
->dwMajorVersion
= MSI_MAJORVERSION
;
763 pdvi
->dwMinorVersion
= MSI_MINORVERSION
;
764 pdvi
->dwBuildNumber
= MSI_BUILDNUMBER
;
765 pdvi
->dwPlatformID
= 1;
770 BOOL WINAPI
MSI_DllCanUnloadNow(void)