2 * Implementation of the Microsoft Installer (msi.dll)
4 * Copyright 2002 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
29 #include "wine/debug.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(msi
);
38 const WCHAR szInstaller
[] = {
39 'S','o','f','t','w','a','r','e','\\',
40 'M','i','c','r','o','s','o','f','t','\\',
41 'W','i','n','d','o','w','s','\\',
42 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
43 'I','n','s','t','a','l','l','e','r',0 };
45 const WCHAR szFeatures
[] = {
46 'F','e','a','t','u','r','e','s',0 };
47 const WCHAR szComponents
[] = {
48 'C','o','m','p','o','n','e','n','t','s',0 };
53 * A .msi file is a structured storage file.
54 * It should contain a number of streams.
57 BOOL
unsquash_guid(LPCWSTR in
, LPWSTR out
)
73 out
[n
++] = in
[17+i
*2];
74 out
[n
++] = in
[16+i
*2];
79 out
[n
++] = in
[17+i
*2];
80 out
[n
++] = in
[16+i
*2];
87 BOOL
squash_guid(LPCWSTR in
, LPWSTR out
)
107 out
[17+i
*2] = in
[n
++];
108 out
[16+i
*2] = in
[n
++];
114 out
[17+i
*2] = in
[n
++];
115 out
[16+i
*2] = in
[n
++];
125 VOID
MSI_CloseDatabase( VOID
*arg
)
127 MSIDATABASE
*db
= (MSIDATABASE
*) arg
;
129 free_cached_tables( db
);
130 IStorage_Release( db
->storage
);
133 UINT WINAPI
MsiOpenDatabaseA(
134 LPCSTR szDBPath
, LPCSTR szPersist
, MSIHANDLE
*phDB
)
136 HRESULT r
= ERROR_FUNCTION_FAILED
;
137 LPWSTR szwDBPath
= NULL
, szwPersist
= NULL
;
139 TRACE("%s %s %p\n", debugstr_a(szDBPath
), debugstr_a(szPersist
), phDB
);
143 szwDBPath
= HEAP_strdupAtoW( GetProcessHeap(), 0, szDBPath
);
150 szwPersist
= HEAP_strdupAtoW( GetProcessHeap(), 0, szPersist
);
155 r
= MsiOpenDatabaseW( szwDBPath
, szwPersist
, phDB
);
159 HeapFree( GetProcessHeap(), 0, szwPersist
);
161 HeapFree( GetProcessHeap(), 0, szwDBPath
);
166 UINT WINAPI
MsiOpenDatabaseW(
167 LPCWSTR szDBPath
, LPCWSTR szPersist
, MSIHANDLE
*phDB
)
169 IStorage
*stg
= NULL
;
175 TRACE("%s %s %p\n",debugstr_w(szDBPath
),debugstr_w(szPersist
), phDB
);
178 return ERROR_INVALID_PARAMETER
;
180 r
= StgOpenStorage( szDBPath
, NULL
, STGM_DIRECT
|STGM_READ
|STGM_SHARE_DENY_WRITE
, NULL
, 0, &stg
);
183 FIXME("open failed r = %08lx!\n",r
);
184 return ERROR_FUNCTION_FAILED
;
187 handle
= alloc_msihandle(MSIHANDLETYPE_DATABASE
, sizeof (MSIDATABASE
), MSI_CloseDatabase
);
190 FIXME("Failed to allocate a handle\n");
191 ret
= ERROR_FUNCTION_FAILED
;
195 db
= msihandle2msiinfo( handle
, MSIHANDLETYPE_DATABASE
);
198 FIXME("Failed to get handle pointer \n");
199 ret
= ERROR_FUNCTION_FAILED
;
203 ret
= load_string_table( db
, &db
->strings
);
204 if( ret
!= ERROR_SUCCESS
)
209 IStorage_AddRef( stg
);
212 IStorage_Release( stg
);
217 UINT WINAPI
MsiOpenProductA(LPCSTR szProduct
, MSIHANDLE
*phProduct
)
219 FIXME("%s %p\n",debugstr_a(szProduct
), phProduct
);
220 return ERROR_CALL_NOT_IMPLEMENTED
;
223 UINT WINAPI
MsiOpenProductW(LPCWSTR szProduct
, MSIHANDLE
*phProduct
)
225 FIXME("%s %p\n",debugstr_w(szProduct
), phProduct
);
226 return ERROR_CALL_NOT_IMPLEMENTED
;
229 UINT WINAPI
MsiOpenPackageA(LPCSTR szPackage
, MSIHANDLE
*phPackage
)
231 FIXME("%s %p\n",debugstr_a(szPackage
), phPackage
);
232 return ERROR_CALL_NOT_IMPLEMENTED
;
235 UINT WINAPI
MsiOpenPackageW(LPCWSTR szPackage
, MSIHANDLE
*phPackage
)
237 FIXME("%s %p\n",debugstr_w(szPackage
), phPackage
);
238 return ERROR_CALL_NOT_IMPLEMENTED
;
241 UINT WINAPI
MsiOpenPackageExA(LPCSTR szPackage
, DWORD dwOptions
, MSIHANDLE
*phPackage
)
243 FIXME("%s 0x%08lx %p\n",debugstr_a(szPackage
), dwOptions
, phPackage
);
244 return ERROR_CALL_NOT_IMPLEMENTED
;
247 UINT WINAPI
MsiOpenPackageExW(LPCWSTR szPackage
, DWORD dwOptions
, MSIHANDLE
*phPackage
)
249 FIXME("%s 0x%08lx %p\n",debugstr_w(szPackage
), dwOptions
, phPackage
);
250 return ERROR_CALL_NOT_IMPLEMENTED
;
253 UINT WINAPI
MsiAdvertiseProductA(LPCSTR szPackagePath
, LPCSTR szScriptfilePath
, LPCSTR szTransforms
, LANGID lgidLanguage
)
255 FIXME("%s %s %s 0x%08x\n",debugstr_a(szPackagePath
), debugstr_a(szScriptfilePath
), debugstr_a(szTransforms
), lgidLanguage
);
256 return ERROR_CALL_NOT_IMPLEMENTED
;
259 UINT WINAPI
MsiAdvertiseProductW(LPCWSTR szPackagePath
, LPCWSTR szScriptfilePath
, LPCWSTR szTransforms
, LANGID lgidLanguage
)
261 FIXME("%s %s %s 0x%08x\n",debugstr_w(szPackagePath
), debugstr_w(szScriptfilePath
), debugstr_w(szTransforms
), lgidLanguage
);
262 return ERROR_CALL_NOT_IMPLEMENTED
;
265 UINT WINAPI
MsiAdvertiseProductExA(
266 LPCSTR szPackagePath
, LPCSTR szScriptfilePath
, LPCSTR szTransforms
, LANGID lgidLanguage
, DWORD dwPlatform
, DWORD dwOptions
)
268 FIXME("%s %s %s 0x%08x 0x%08lx 0x%08lx\n",
269 debugstr_a(szPackagePath
), debugstr_a(szScriptfilePath
), debugstr_a(szTransforms
), lgidLanguage
, dwPlatform
, dwOptions
);
270 return ERROR_CALL_NOT_IMPLEMENTED
;
273 UINT WINAPI
MsiAdvertiseProductExW(
274 LPCWSTR szPackagePath
, LPCWSTR szScriptfilePath
, LPCWSTR szTransforms
, LANGID lgidLanguage
, DWORD dwPlatform
, DWORD dwOptions
)
276 FIXME("%s %s %s 0x%08x 0x%08lx 0x%08lx\n",
277 debugstr_w(szPackagePath
), debugstr_w(szScriptfilePath
), debugstr_w(szTransforms
), lgidLanguage
, dwPlatform
, dwOptions
);
278 return ERROR_CALL_NOT_IMPLEMENTED
;
281 UINT WINAPI
MsiInstallProductA(LPCSTR szPackagePath
, LPCSTR szCommandLine
)
283 LPWSTR szwPath
= NULL
, szwCommand
= NULL
;
284 UINT r
= ERROR_FUNCTION_FAILED
; /* FIXME: check return code */
286 TRACE("%s %s\n",debugstr_a(szPackagePath
), debugstr_a(szCommandLine
));
290 szwPath
= HEAP_strdupAtoW(GetProcessHeap(),0,szPackagePath
);
291 if( szwPath
== NULL
)
297 szwCommand
= HEAP_strdupAtoW(GetProcessHeap(),0,szCommandLine
);
298 if( szwCommand
== NULL
)
302 r
= MsiInstallProductW( szwPath
, szwCommand
);
306 HeapFree( GetProcessHeap(), 0, szwPath
);
309 HeapFree( GetProcessHeap(), 0, szwCommand
);
314 UINT WINAPI
MsiInstallProductW(LPCWSTR szPackagePath
, LPCWSTR szCommandLine
)
316 FIXME("%s %s\n",debugstr_w(szPackagePath
), debugstr_w(szCommandLine
));
318 return ERROR_CALL_NOT_IMPLEMENTED
;
321 UINT WINAPI
MsiConfigureProductA(
322 LPCSTR szProduct
, int iInstallLevel
, INSTALLSTATE eInstallState
)
324 FIXME("%s %d %d\n",debugstr_a(szProduct
), iInstallLevel
, eInstallState
);
325 return ERROR_CALL_NOT_IMPLEMENTED
;
328 UINT WINAPI
MsiConfigureProductW(
329 LPCWSTR szProduct
, int iInstallLevel
, INSTALLSTATE eInstallState
)
331 FIXME("%s %d %d\n",debugstr_w(szProduct
), iInstallLevel
, eInstallState
);
332 return ERROR_CALL_NOT_IMPLEMENTED
;
335 UINT WINAPI
MsiGetProductCodeA(LPCSTR szComponent
, LPSTR szBuffer
)
337 FIXME("%s %s\n",debugstr_a(szComponent
), debugstr_a(szBuffer
));
338 return ERROR_CALL_NOT_IMPLEMENTED
;
341 UINT WINAPI
MsiGetProductCodeW(LPCWSTR szComponent
, LPWSTR szBuffer
)
343 FIXME("%s %s\n",debugstr_w(szComponent
), debugstr_w(szBuffer
));
344 return ERROR_CALL_NOT_IMPLEMENTED
;
347 UINT WINAPI
MsiGetProductInfoA(LPCSTR szProduct
, LPCSTR szAttribute
, LPSTR szBuffer
, DWORD
*pcchValueBuf
)
349 FIXME("%s %s %p %p\n",debugstr_a(szProduct
), debugstr_a(szAttribute
), szBuffer
, pcchValueBuf
);
350 return ERROR_CALL_NOT_IMPLEMENTED
;
353 UINT WINAPI
MsiGetProductInfoW(LPCWSTR szProduct
, LPCWSTR szAttribute
, LPWSTR szBuffer
, DWORD
*pcchValueBuf
)
355 FIXME("%s %s %p %p\n",debugstr_w(szProduct
), debugstr_w(szAttribute
), szBuffer
, pcchValueBuf
);
356 return ERROR_CALL_NOT_IMPLEMENTED
;
359 UINT WINAPI
MsiDatabaseImportA(LPCSTR szFolderPath
, LPCSTR szFilename
)
361 FIXME("%s %s\n",debugstr_a(szFolderPath
), debugstr_a(szFilename
));
362 return ERROR_CALL_NOT_IMPLEMENTED
;
365 UINT WINAPI
MsiDatabaseImportW(LPCWSTR szFolderPath
, LPCWSTR szFilename
)
367 FIXME("%s %s\n",debugstr_w(szFolderPath
), debugstr_w(szFilename
));
368 return ERROR_CALL_NOT_IMPLEMENTED
;
371 UINT WINAPI
MsiEnableLogA(DWORD dwLogMode
, LPCSTR szLogFile
, BOOL fAppend
)
373 FIXME("%08lx %s %d\n", dwLogMode
, debugstr_a(szLogFile
), fAppend
);
374 return ERROR_SUCCESS
;
375 /* return ERROR_CALL_NOT_IMPLEMENTED; */
378 UINT WINAPI
MsiEnableLogW(DWORD dwLogMode
, LPCWSTR szLogFile
, BOOL fAppend
)
380 FIXME("%08lx %s %d\n", dwLogMode
, debugstr_w(szLogFile
), fAppend
);
381 return ERROR_CALL_NOT_IMPLEMENTED
;
384 INSTALLSTATE WINAPI
MsiQueryProductStateA(LPCSTR szProduct
)
386 FIXME("%s\n", debugstr_a(szProduct
));
390 INSTALLSTATE WINAPI
MsiQueryProductStateW(LPCWSTR szProduct
)
392 FIXME("%s\n", debugstr_w(szProduct
));
396 INSTALLUILEVEL WINAPI
MsiSetInternalUI(INSTALLUILEVEL dwUILevel
, HWND
*phWnd
)
398 FIXME("%08x %p\n", dwUILevel
, phWnd
);
402 UINT WINAPI
MsiLoadStringA(DWORD a
, DWORD b
, DWORD c
, DWORD d
, DWORD e
, DWORD f
)
404 FIXME("%08lx %08lx %08lx %08lx %08lx %08lx\n",a
,b
,c
,d
,e
,f
);
405 return ERROR_CALL_NOT_IMPLEMENTED
;
408 UINT WINAPI
MsiLoadStringW(DWORD a
, DWORD b
, DWORD c
, DWORD d
, DWORD e
, DWORD f
)
410 FIXME("%08lx %08lx %08lx %08lx %08lx %08lx\n",a
,b
,c
,d
,e
,f
);
411 return ERROR_CALL_NOT_IMPLEMENTED
;
414 UINT WINAPI
MsiMessageBoxA(DWORD a
, DWORD b
, DWORD c
, DWORD d
, DWORD e
, DWORD f
)
416 FIXME("%08lx %08lx %08lx %08lx %08lx %08lx\n",a
,b
,c
,d
,e
,f
);
417 return ERROR_CALL_NOT_IMPLEMENTED
;
420 UINT WINAPI
MsiMessageBoxW(DWORD a
, DWORD b
, DWORD c
, DWORD d
, DWORD e
, DWORD f
)
422 FIXME("%08lx %08lx %08lx %08lx %08lx %08lx\n",a
,b
,c
,d
,e
,f
);
423 return ERROR_CALL_NOT_IMPLEMENTED
;
426 UINT WINAPI
MsiEnumProductsA(DWORD index
, LPSTR lpguid
)
429 WCHAR szwGuid
[GUID_SIZE
];
431 TRACE("%ld %p\n",index
,lpguid
);
433 r
= MsiEnumProductsW(index
, szwGuid
);
434 if( r
== ERROR_SUCCESS
)
435 WideCharToMultiByte(CP_ACP
, 0, szwGuid
, -1, lpguid
, GUID_SIZE
, NULL
, NULL
);
440 UINT WINAPI
MsiEnumProductsW(DWORD index
, LPWSTR lpguid
)
442 HKEY hkey
= 0, hkeyFeatures
= 0;
446 TRACE("%ld %p\n",index
,lpguid
);
448 r
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, szInstaller
, &hkey
);
449 if( r
!= ERROR_SUCCESS
)
452 r
= RegOpenKeyW(hkey
, szFeatures
, &hkeyFeatures
);
453 if( r
!= ERROR_SUCCESS
)
456 r
= RegEnumKeyW(hkeyFeatures
, index
, szKeyName
, GUID_SIZE
);
458 unsquash_guid(szKeyName
, lpguid
);
463 RegCloseKey(hkeyFeatures
);
470 UINT WINAPI
MsiEnumFeaturesA(LPCSTR szProduct
, DWORD index
,
471 LPSTR szFeature
, LPSTR szParent
)
474 WCHAR szwFeature
[GUID_SIZE
], szwParent
[GUID_SIZE
];
475 LPWSTR szwProduct
= NULL
;
477 TRACE("%s %ld %p %p\n",debugstr_a(szProduct
),index
,szFeature
,szParent
);
481 szwProduct
= HEAP_strdupAtoW(GetProcessHeap(),0,szProduct
);
483 return ERROR_FUNCTION_FAILED
;
486 r
= MsiEnumFeaturesW(szProduct
?szwProduct
:NULL
,
487 index
, szwFeature
, szwParent
);
488 if( r
== ERROR_SUCCESS
)
490 WideCharToMultiByte(CP_ACP
, 0, szwFeature
, -1,
491 szFeature
, GUID_SIZE
, NULL
, NULL
);
492 WideCharToMultiByte(CP_ACP
, 0, szwParent
, -1,
493 szParent
, GUID_SIZE
, NULL
, NULL
);
497 HeapFree( GetProcessHeap(), 0, szwProduct
);
502 UINT WINAPI
MsiEnumFeaturesW(LPCWSTR szProduct
, DWORD index
,
503 LPWSTR szFeature
, LPWSTR szParent
)
505 HKEY hkey
= 0, hkeyFeatures
= 0, hkeyProduct
= 0;
507 WCHAR szRegName
[GUID_SIZE
];
509 TRACE("%s %ld %p %p\n",debugstr_w(szProduct
),index
,szFeature
,szParent
);
511 if( !squash_guid(szProduct
, szRegName
) )
512 return ERROR_INVALID_PARAMETER
;
514 r
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, szInstaller
, &hkey
);
515 if( r
!= ERROR_SUCCESS
)
518 r
= RegOpenKeyW(hkey
, szFeatures
, &hkeyFeatures
);
519 if( r
!= ERROR_SUCCESS
)
522 r
= RegOpenKeyW(hkeyFeatures
, szRegName
, &hkeyProduct
);
523 if( r
!= ERROR_SUCCESS
)
527 r
= RegEnumValueW(hkeyProduct
, index
, szFeature
, &sz
, NULL
, NULL
, NULL
, NULL
);
531 RegCloseKey(hkeyProduct
);
533 RegCloseKey(hkeyFeatures
);
540 UINT WINAPI
MsiEnumComponentsA(DWORD index
, LPSTR lpguid
)
543 WCHAR szwGuid
[GUID_SIZE
];
545 TRACE("%ld %p\n",index
,lpguid
);
547 r
= MsiEnumComponentsW(index
, szwGuid
);
548 if( r
== ERROR_SUCCESS
)
549 WideCharToMultiByte(CP_ACP
, 0, szwGuid
, -1, lpguid
, GUID_SIZE
, NULL
, NULL
);
554 UINT WINAPI
MsiEnumComponentsW(DWORD index
, LPWSTR lpguid
)
556 HKEY hkey
= 0, hkeyComponents
= 0;
560 TRACE("%ld %p\n",index
,lpguid
);
562 r
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, szInstaller
, &hkey
);
563 if( r
!= ERROR_SUCCESS
)
566 r
= RegOpenKeyW(hkey
, szComponents
, &hkeyComponents
);
567 if( r
!= ERROR_SUCCESS
)
570 r
= RegEnumKeyW(hkeyComponents
, index
, szKeyName
, GUID_SIZE
);
572 unsquash_guid(szKeyName
, lpguid
);
577 RegCloseKey(hkeyComponents
);
584 UINT WINAPI
MsiEnumClientsA(LPCSTR szComponent
, DWORD index
, LPSTR szProduct
)
587 WCHAR szwProduct
[GUID_SIZE
];
588 LPWSTR szwComponent
= NULL
;
590 TRACE("%s %ld %p\n",debugstr_a(szComponent
),index
,szProduct
);
594 szwComponent
= HEAP_strdupAtoW(GetProcessHeap(),0,szComponent
);
596 return ERROR_FUNCTION_FAILED
;
599 r
= MsiEnumClientsW(szComponent
?szwComponent
:NULL
, index
, szwProduct
);
600 if( r
== ERROR_SUCCESS
)
602 WideCharToMultiByte(CP_ACP
, 0, szwProduct
, -1,
603 szProduct
, GUID_SIZE
, NULL
, NULL
);
607 HeapFree( GetProcessHeap(), 0, szwComponent
);
612 UINT WINAPI
MsiEnumClientsW(LPCWSTR szComponent
, DWORD index
, LPWSTR szProduct
)
614 HKEY hkey
= 0, hkeyComponents
= 0, hkeyComp
= 0;
616 WCHAR szRegName
[GUID_SIZE
], szValName
[GUID_SIZE
];
618 TRACE("%s %ld %p\n",debugstr_w(szComponent
),index
,szProduct
);
620 if( !squash_guid(szComponent
, szRegName
) )
621 return ERROR_INVALID_PARAMETER
;
623 r
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, szInstaller
, &hkey
);
624 if( r
!= ERROR_SUCCESS
)
627 r
= RegOpenKeyW(hkey
, szComponents
, &hkeyComponents
);
628 if( r
!= ERROR_SUCCESS
)
631 r
= RegOpenKeyW(hkeyComponents
, szRegName
, &hkeyComp
);
632 if( r
!= ERROR_SUCCESS
)
636 r
= RegEnumValueW(hkeyComp
, index
, szValName
, &sz
, NULL
, NULL
, NULL
, NULL
);
637 if( r
!= ERROR_SUCCESS
)
640 unsquash_guid(szValName
, szProduct
);
644 RegCloseKey(hkeyComp
);
646 RegCloseKey(hkeyComponents
);
653 UINT WINAPI
MsiEnumComponentQualifiersA(
654 LPSTR szComponent
, DWORD iIndex
, LPSTR lpQualifierBuf
, DWORD
* pcchQualifierBuf
, LPSTR lpApplicationDataBuf
, DWORD
* pcchApplicationDataBuf
)
656 FIXME("%s 0x%08lx %p %p %p %p\n", debugstr_a(szComponent
), iIndex
, lpQualifierBuf
, pcchQualifierBuf
, lpApplicationDataBuf
, pcchApplicationDataBuf
);
657 return ERROR_CALL_NOT_IMPLEMENTED
;
660 UINT WINAPI
MsiEnumComponentQualifiersW(
661 LPWSTR szComponent
, DWORD iIndex
, LPWSTR lpQualifierBuf
, DWORD
* pcchQualifierBuf
, LPWSTR lpApplicationDataBuf
, DWORD
* pcchApplicationDataBuf
)
663 FIXME("%s 0x%08lx %p %p %p %p\n", debugstr_w(szComponent
), iIndex
, lpQualifierBuf
, pcchQualifierBuf
, lpApplicationDataBuf
, pcchApplicationDataBuf
);
664 return ERROR_CALL_NOT_IMPLEMENTED
;
667 UINT WINAPI
MsiProvideAssemblyA(
668 LPCSTR szAssemblyName
, LPCSTR szAppContext
, DWORD dwInstallMode
, DWORD dwAssemblyInfo
, LPSTR lpPathBuf
, DWORD
* pcchPathBuf
)
670 FIXME("%s %s 0x%08lx 0x%08lx %p %p\n",
671 debugstr_a(szAssemblyName
), debugstr_a(szAppContext
), dwInstallMode
, dwAssemblyInfo
, lpPathBuf
, pcchPathBuf
);
672 return ERROR_CALL_NOT_IMPLEMENTED
;
675 UINT WINAPI
MsiProvideAssemblyW(
676 LPCWSTR szAssemblyName
, LPCWSTR szAppContext
, DWORD dwInstallMode
, DWORD dwAssemblyInfo
, LPWSTR lpPathBuf
, DWORD
* pcchPathBuf
)
678 FIXME("%s %s 0x%08lx 0x%08lx %p %p\n",
679 debugstr_w(szAssemblyName
), debugstr_w(szAppContext
), dwInstallMode
, dwAssemblyInfo
, lpPathBuf
, pcchPathBuf
);
680 return ERROR_CALL_NOT_IMPLEMENTED
;
683 UINT WINAPI
MsiProvideComponentFromDescriptorA( LPCSTR szDescriptor
, LPSTR szPath
, DWORD
*pcchPath
, DWORD
*pcchArgs
)
685 FIXME("%s %p %p %p\n", debugstr_a(szDescriptor
), szPath
, pcchPath
, pcchArgs
);
686 return ERROR_CALL_NOT_IMPLEMENTED
;
689 UINT WINAPI
MsiProvideComponentFromDescriptorW( LPCWSTR szDescriptor
, LPWSTR szPath
, DWORD
*pcchPath
, DWORD
*pcchArgs
)
691 FIXME("%s %p %p %p\n", debugstr_w(szDescriptor
), szPath
, pcchPath
, pcchArgs
);
692 return ERROR_CALL_NOT_IMPLEMENTED
;
695 HRESULT WINAPI
MsiGetFileSignatureInformationA(
696 LPCSTR szSignedObjectPath
, DWORD dwFlags
, PCCERT_CONTEXT
* ppcCertContext
, BYTE
* pbHashData
, DWORD
* pcbHashData
)
698 FIXME("%s 0x%08lx %p %p %p\n", debugstr_a(szSignedObjectPath
), dwFlags
, ppcCertContext
, pbHashData
, pcbHashData
);
699 return ERROR_CALL_NOT_IMPLEMENTED
;
702 HRESULT WINAPI
MsiGetFileSignatureInformationW(
703 LPCWSTR szSignedObjectPath
, DWORD dwFlags
, PCCERT_CONTEXT
* ppcCertContext
, BYTE
* pbHashData
, DWORD
* pcbHashData
)
705 FIXME("%s 0x%08lx %p %p %p\n", debugstr_w(szSignedObjectPath
), dwFlags
, ppcCertContext
, pbHashData
, pcbHashData
);
706 return ERROR_CALL_NOT_IMPLEMENTED
;
709 HRESULT WINAPI
MSI_DllGetVersion(DLLVERSIONINFO
*pdvi
)
713 if (pdvi
->cbSize
!= sizeof(DLLVERSIONINFO
))
716 pdvi
->dwMajorVersion
= MSI_MAJORVERSION
;
717 pdvi
->dwMinorVersion
= MSI_MINORVERSION
;
718 pdvi
->dwBuildNumber
= MSI_BUILDNUMBER
;
719 pdvi
->dwPlatformID
= 1;
724 BOOL WINAPI
MSI_DllCanUnloadNow(void)