sxs: Build with msvcrt.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
8a00b3fc8b
commit
9ce1a6e3ff
|
@ -2,6 +2,8 @@ MODULE = sxs.dll
|
|||
IMPORTS = oleaut32 ole32
|
||||
IMPORTLIB = sxs
|
||||
|
||||
EXTRADLLFLAGS = -mno-cygwin
|
||||
|
||||
C_SRCS = \
|
||||
cache.c \
|
||||
name.c \
|
||||
|
|
113
dlls/sxs/cache.c
113
dlls/sxs/cache.c
|
@ -31,7 +31,6 @@
|
|||
|
||||
#include "wine/debug.h"
|
||||
#include "wine/list.h"
|
||||
#include "wine/unicode.h"
|
||||
#include "sxs_private.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(sxs);
|
||||
|
@ -112,16 +111,15 @@ static WCHAR *build_assembly_name( const WCHAR *arch, const WCHAR *name, const W
|
|||
static const WCHAR fmtW[] =
|
||||
{'%','s','_','%','s','_','%','s','_','%','s','_','n','o','n','e','_','d','e','a','d','b','e','e','f',0};
|
||||
unsigned int buflen = ARRAY_SIZE(fmtW);
|
||||
WCHAR *ret, *p;
|
||||
WCHAR *ret;
|
||||
|
||||
buflen += strlenW( arch );
|
||||
buflen += strlenW( name );
|
||||
buflen += strlenW( token );
|
||||
buflen += strlenW( version );
|
||||
buflen += lstrlenW( arch );
|
||||
buflen += lstrlenW( name );
|
||||
buflen += lstrlenW( token );
|
||||
buflen += lstrlenW( version );
|
||||
if (!(ret = HeapAlloc( GetProcessHeap(), 0, buflen * sizeof(WCHAR) ))) return NULL;
|
||||
*len = sprintfW( ret, fmtW, arch, name, token, version );
|
||||
for (p = ret; *p; p++) *p = tolowerW( *p );
|
||||
return ret;
|
||||
*len = swprintf( ret, buflen, fmtW, arch, name, token, version );
|
||||
return wcslwr( ret );
|
||||
}
|
||||
|
||||
static WCHAR *build_manifest_path( const WCHAR *arch, const WCHAR *name, const WCHAR *token,
|
||||
|
@ -140,7 +138,7 @@ static WCHAR *build_manifest_path( const WCHAR *arch, const WCHAR *name, const W
|
|||
HeapFree( GetProcessHeap(), 0, path );
|
||||
return NULL;
|
||||
}
|
||||
sprintfW( ret, fmtW, sxsdir, path );
|
||||
swprintf( ret, len, fmtW, sxsdir, path );
|
||||
HeapFree( GetProcessHeap(), 0, path );
|
||||
return ret;
|
||||
}
|
||||
|
@ -151,15 +149,14 @@ static WCHAR *build_policy_name( const WCHAR *arch, const WCHAR *name, const WCH
|
|||
static const WCHAR fmtW[] =
|
||||
{'%','s','_','%','s','_','%','s','_','n','o','n','e','_','d','e','a','d','b','e','e','f',0};
|
||||
unsigned int buflen = ARRAY_SIZE(fmtW);
|
||||
WCHAR *ret, *p;
|
||||
WCHAR *ret;
|
||||
|
||||
buflen += strlenW( arch );
|
||||
buflen += strlenW( name );
|
||||
buflen += strlenW( token );
|
||||
buflen += lstrlenW( arch );
|
||||
buflen += lstrlenW( name );
|
||||
buflen += lstrlenW( token );
|
||||
if (!(ret = HeapAlloc( GetProcessHeap(), 0, buflen * sizeof(WCHAR) ))) return NULL;
|
||||
*len = sprintfW( ret, fmtW, arch, name, token );
|
||||
for (p = ret; *p; p++) *p = tolowerW( *p );
|
||||
return ret;
|
||||
*len = swprintf( ret, buflen, fmtW, arch, name, token );
|
||||
return wcslwr( ret );
|
||||
}
|
||||
|
||||
static WCHAR *build_policy_path( const WCHAR *arch, const WCHAR *name, const WCHAR *token,
|
||||
|
@ -173,13 +170,13 @@ static WCHAR *build_policy_path( const WCHAR *arch, const WCHAR *name, const WCH
|
|||
if (!(path = build_policy_name( arch, name, token, &len ))) return NULL;
|
||||
len += ARRAY_SIZE(fmtW);
|
||||
len += build_sxs_path( sxsdir );
|
||||
len += strlenW( version );
|
||||
len += lstrlenW( version );
|
||||
if (!(ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
|
||||
{
|
||||
HeapFree( GetProcessHeap(), 0, path );
|
||||
return NULL;
|
||||
}
|
||||
sprintfW( ret, fmtW, sxsdir, path, version );
|
||||
swprintf( ret, len, fmtW, sxsdir, path, version );
|
||||
HeapFree( GetProcessHeap(), 0, path );
|
||||
return ret;
|
||||
}
|
||||
|
@ -235,8 +232,8 @@ static HRESULT WINAPI cache_QueryAssemblyInfo(
|
|||
}
|
||||
cache_lock( cache );
|
||||
|
||||
if (!strcmpW( type, win32W )) path = build_manifest_path( arch, name, token, version );
|
||||
else if (!strcmpW( type, win32_policyW )) path = build_policy_path( arch, name, token, version );
|
||||
if (!wcscmp( type, win32W )) path = build_manifest_path( arch, name, token, version );
|
||||
else if (!wcscmp( type, win32_policyW )) path = build_policy_path( arch, name, token, version );
|
||||
else
|
||||
{
|
||||
hr = HRESULT_FROM_WIN32( ERROR_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE );
|
||||
|
@ -253,8 +250,8 @@ static HRESULT WINAPI cache_QueryAssemblyInfo(
|
|||
info->dwAssemblyFlags = ASSEMBLYINFO_FLAG_INSTALLED;
|
||||
TRACE("assembly is installed\n");
|
||||
}
|
||||
if ((p = strrchrW( path, '\\' ))) *p = 0;
|
||||
len = strlenW( path ) + 1;
|
||||
if ((p = wcsrchr( path, '\\' ))) *p = 0;
|
||||
len = lstrlenW( path ) + 1;
|
||||
if (info->pszCurrentAssemblyPathBuf)
|
||||
{
|
||||
if (info->cchBuf < len)
|
||||
|
@ -262,7 +259,7 @@ static HRESULT WINAPI cache_QueryAssemblyInfo(
|
|||
info->cchBuf = len;
|
||||
hr = HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER );
|
||||
}
|
||||
else strcpyW( info->pszCurrentAssemblyPathBuf, path );
|
||||
else lstrcpyW( info->pszCurrentAssemblyPathBuf, path );
|
||||
}
|
||||
|
||||
done:
|
||||
|
@ -473,14 +470,14 @@ static HRESULT parse_assembly( IXMLDOMDocument *doc, struct assembly **assembly
|
|||
a->arch = get_attribute_value( attrs, architectureW );
|
||||
a->token = get_attribute_value( attrs, tokenW );
|
||||
|
||||
if (!a->type || (strcmpW( a->type, win32W ) && strcmpW( a->type, win32_policyW )) ||
|
||||
if (!a->type || (wcscmp( a->type, win32W ) && wcscmp( a->type, win32_policyW )) ||
|
||||
!a->name || !a->version || !a->arch || !a->token)
|
||||
{
|
||||
WARN("invalid win32 assembly\n");
|
||||
hr = ERROR_SXS_MANIFEST_FORMAT_ERROR;
|
||||
goto done;
|
||||
}
|
||||
if (!strcmpW( a->type, win32W )) hr = parse_files( doc, a );
|
||||
if (!wcscmp( a->type, win32W )) hr = parse_files( doc, a );
|
||||
|
||||
done:
|
||||
if (attrs) IXMLDOMNamedNodeMap_Release( attrs );
|
||||
|
@ -502,21 +499,21 @@ static WCHAR *build_policy_filename( const WCHAR *arch, const WCHAR *name, const
|
|||
if (!(fullname = build_policy_name( arch, name, token, &len ))) return NULL;
|
||||
len += build_sxs_path( sxsdir );
|
||||
len += ARRAY_SIZE(policiesW) - 1;
|
||||
len += strlenW( version );
|
||||
len += lstrlenW( version );
|
||||
len += ARRAY_SIZE(suffixW) - 1;
|
||||
if (!(ret = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) )))
|
||||
{
|
||||
HeapFree( GetProcessHeap(), 0, fullname );
|
||||
return NULL;
|
||||
}
|
||||
strcpyW( ret, sxsdir );
|
||||
strcatW( ret, policiesW );
|
||||
lstrcpyW( ret, sxsdir );
|
||||
lstrcatW( ret, policiesW );
|
||||
CreateDirectoryW( ret, NULL );
|
||||
strcatW( ret, name );
|
||||
lstrcatW( ret, name );
|
||||
CreateDirectoryW( ret, NULL );
|
||||
strcatW( ret, backslashW );
|
||||
strcatW( ret, version );
|
||||
strcatW( ret, suffixW );
|
||||
lstrcatW( ret, backslashW );
|
||||
lstrcatW( ret, version );
|
||||
lstrcatW( ret, suffixW );
|
||||
|
||||
HeapFree( GetProcessHeap(), 0, fullname );
|
||||
return ret;
|
||||
|
@ -549,16 +546,16 @@ static WCHAR *build_source_filename( const WCHAR *manifest, struct file *file )
|
|||
const WCHAR *p;
|
||||
int len;
|
||||
|
||||
p = strrchrW( manifest, '\\' );
|
||||
if (!p) p = strrchrW( manifest, '/' );
|
||||
p = wcsrchr( manifest, '\\' );
|
||||
if (!p) p = wcsrchr( manifest, '/' );
|
||||
if (!p) return strdupW( manifest );
|
||||
|
||||
len = p - manifest + 1;
|
||||
if (!(src = HeapAlloc( GetProcessHeap(), 0, (len + strlenW( file->name ) + 1) * sizeof(WCHAR) )))
|
||||
if (!(src = HeapAlloc( GetProcessHeap(), 0, (len + lstrlenW( file->name ) + 1) * sizeof(WCHAR) )))
|
||||
return NULL;
|
||||
|
||||
memcpy( src, manifest, len * sizeof(WCHAR) );
|
||||
strcpyW( src + len, file->name );
|
||||
lstrcpyW( src + len, file->name );
|
||||
return src;
|
||||
}
|
||||
|
||||
|
@ -579,10 +576,10 @@ static WCHAR *build_manifest_filename( const WCHAR *arch, const WCHAR *name, con
|
|||
HeapFree( GetProcessHeap(), 0, fullname );
|
||||
return NULL;
|
||||
}
|
||||
strcpyW( ret, sxsdir );
|
||||
strcatW( ret, manifestsW );
|
||||
strcatW( ret, fullname );
|
||||
strcatW( ret, suffixW );
|
||||
lstrcpyW( ret, sxsdir );
|
||||
lstrcatW( ret, manifestsW );
|
||||
lstrcatW( ret, fullname );
|
||||
lstrcatW( ret, suffixW );
|
||||
|
||||
HeapFree( GetProcessHeap(), 0, fullname );
|
||||
return ret;
|
||||
|
@ -639,19 +636,19 @@ static HRESULT install_assembly( const WCHAR *manifest, struct assembly *assembl
|
|||
{
|
||||
if (!(src = build_source_filename( manifest, file ))) goto done;
|
||||
|
||||
len = len_sxsdir + len_name + strlenW( file->name );
|
||||
len = len_sxsdir + len_name + lstrlenW( file->name );
|
||||
if (!(dst = HeapAlloc( GetProcessHeap(), 0, (len + 2) * sizeof(WCHAR) )))
|
||||
{
|
||||
HeapFree( GetProcessHeap(), 0, src );
|
||||
goto done;
|
||||
}
|
||||
strcpyW( dst, sxsdir );
|
||||
strcatW( dst, name );
|
||||
lstrcpyW( dst, sxsdir );
|
||||
lstrcatW( dst, name );
|
||||
CreateDirectoryW( dst, NULL );
|
||||
|
||||
strcatW( dst, backslashW );
|
||||
strcatW( dst, file->name );
|
||||
for (p = dst; *p; p++) *p = tolowerW( *p );
|
||||
lstrcatW( dst, backslashW );
|
||||
lstrcatW( dst, file->name );
|
||||
for (p = dst; *p; p++) *p = towlower( *p );
|
||||
|
||||
ret = CopyFileW( src, dst, FALSE );
|
||||
HeapFree( GetProcessHeap(), 0, src );
|
||||
|
@ -695,7 +692,7 @@ static HRESULT WINAPI cache_InstallAssembly(
|
|||
|
||||
/* FIXME: verify name attributes */
|
||||
|
||||
if (!strcmpW( assembly->type, win32_policyW ))
|
||||
if (!wcscmp( assembly->type, win32_policyW ))
|
||||
hr = install_policy( path, assembly );
|
||||
else
|
||||
hr = install_assembly( path, assembly );
|
||||
|
@ -720,16 +717,16 @@ static HRESULT uninstall_assembly( struct assembly *assembly )
|
|||
if (!name) return E_OUTOFMEMORY;
|
||||
if (!(dirname = HeapAlloc( GetProcessHeap(), 0, (len_sxsdir + len_name + 1) * sizeof(WCHAR) )))
|
||||
goto done;
|
||||
strcpyW( dirname, sxsdir );
|
||||
strcpyW( dirname + len_sxsdir, name );
|
||||
lstrcpyW( dirname, sxsdir );
|
||||
lstrcpyW( dirname + len_sxsdir, name );
|
||||
|
||||
LIST_FOR_EACH_ENTRY( file, &assembly->files, struct file, entry )
|
||||
{
|
||||
len = len_sxsdir + len_name + 1 + strlenW( file->name );
|
||||
len = len_sxsdir + len_name + 1 + lstrlenW( file->name );
|
||||
if (!(filename = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) ))) goto done;
|
||||
strcpyW( filename, dirname );
|
||||
strcatW( filename, backslashW );
|
||||
strcatW( filename, file->name );
|
||||
lstrcpyW( filename, dirname );
|
||||
lstrcatW( filename, backslashW );
|
||||
lstrcatW( filename, file->name );
|
||||
|
||||
if (!DeleteFileW( filename )) WARN( "failed to delete file %u\n", GetLastError() );
|
||||
HeapFree( GetProcessHeap(), 0, filename );
|
||||
|
@ -782,8 +779,8 @@ static HRESULT WINAPI cache_UninstallAssembly(
|
|||
hr = E_INVALIDARG;
|
||||
goto done;
|
||||
}
|
||||
if (!strcmpW( type, win32W )) path = build_manifest_filename( arch, name, token, version );
|
||||
else if (!strcmpW( type, win32_policyW )) path = build_policy_filename( arch, name, token, version );
|
||||
if (!wcscmp( type, win32W )) path = build_manifest_filename( arch, name, token, version );
|
||||
else if (!wcscmp( type, win32_policyW )) path = build_policy_filename( arch, name, token, version );
|
||||
else
|
||||
{
|
||||
hr = E_INVALIDARG;
|
||||
|
@ -798,12 +795,12 @@ static HRESULT WINAPI cache_UninstallAssembly(
|
|||
if ((hr = parse_assembly( doc, &assembly )) != S_OK) goto done;
|
||||
|
||||
if (!DeleteFileW( path )) WARN( "unable to remove manifest file %u\n", GetLastError() );
|
||||
else if ((p = strrchrW( path, '\\' )))
|
||||
else if ((p = wcsrchr( path, '\\' )))
|
||||
{
|
||||
*p = 0;
|
||||
RemoveDirectoryW( path );
|
||||
}
|
||||
if (!strcmpW( assembly->type, win32W )) hr = uninstall_assembly( assembly );
|
||||
if (!wcscmp( assembly->type, win32W )) hr = uninstall_assembly( assembly );
|
||||
|
||||
done:
|
||||
if (name_obj) IAssemblyName_Release( name_obj );
|
||||
|
|
|
@ -28,7 +28,6 @@
|
|||
#include "winsxs.h"
|
||||
|
||||
#include "wine/debug.h"
|
||||
#include "wine/unicode.h"
|
||||
#include "sxs_private.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(sxs);
|
||||
|
@ -143,22 +142,22 @@ static HRESULT WINAPI name_GetDisplayName(
|
|||
|
||||
if (!buflen || flags) return E_INVALIDARG;
|
||||
|
||||
len = strlenW( name->name ) + 1;
|
||||
if (name->arch) len += strlenW( archW ) + strlenW( name->arch ) + 4;
|
||||
if (name->token) len += strlenW( tokenW ) + strlenW( name->token ) + 4;
|
||||
if (name->type) len += strlenW( typeW ) + strlenW( name->type ) + 4;
|
||||
if (name->version) len += strlenW( versionW ) + strlenW( version ) + 4;
|
||||
len = lstrlenW( name->name ) + 1;
|
||||
if (name->arch) len += lstrlenW( archW ) + lstrlenW( name->arch ) + 4;
|
||||
if (name->token) len += lstrlenW( tokenW ) + lstrlenW( name->token ) + 4;
|
||||
if (name->type) len += lstrlenW( typeW ) + lstrlenW( name->type ) + 4;
|
||||
if (name->version) len += lstrlenW( versionW ) + lstrlenW( version ) + 4;
|
||||
if (len > *buflen)
|
||||
{
|
||||
*buflen = len;
|
||||
return HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER );
|
||||
}
|
||||
strcpyW( buffer, name->name );
|
||||
len = strlenW( buffer );
|
||||
if (name->arch) len += sprintfW( buffer + len, fmtW, archW, name->arch );
|
||||
if (name->token) len += sprintfW( buffer + len, fmtW, tokenW, name->token );
|
||||
if (name->type) len += sprintfW( buffer + len, fmtW, typeW, name->type );
|
||||
if (name->version) len += sprintfW( buffer + len, fmtW, versionW, name->version );
|
||||
lstrcpyW( buffer, name->name );
|
||||
len = lstrlenW( buffer );
|
||||
if (name->arch) len += swprintf( buffer + len, *buflen - len, fmtW, archW, name->arch );
|
||||
if (name->token) len += swprintf( buffer + len, *buflen - len, fmtW, tokenW, name->token );
|
||||
if (name->type) len += swprintf( buffer + len, *buflen - len, fmtW, typeW, name->type );
|
||||
if (name->version) len += swprintf( buffer + len, *buflen - len, fmtW, versionW, name->version );
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -211,13 +210,13 @@ static HRESULT WINAPI name_GetName(
|
|||
if (!buflen || !buffer) return E_INVALIDARG;
|
||||
|
||||
name = get_name_attribute( iface, NAME_ATTR_ID_NAME );
|
||||
len = strlenW( name ) + 1;
|
||||
len = lstrlenW( name ) + 1;
|
||||
if (len > *buflen)
|
||||
{
|
||||
*buflen = len;
|
||||
return HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER );
|
||||
}
|
||||
strcpyW( buffer, name );
|
||||
lstrcpyW( buffer, name );
|
||||
*buflen = len + 3;
|
||||
return S_OK;
|
||||
}
|
||||
|
@ -232,9 +231,9 @@ static HRESULT parse_version( WCHAR *version, DWORD *high, DWORD *low )
|
|||
for (i = 0, p = version; i < 4; i++)
|
||||
{
|
||||
if (!*p) break;
|
||||
q = strchrW( p, '.' );
|
||||
q = wcschr( p, '.' );
|
||||
if (q) *q = 0;
|
||||
ver[i] = atolW( p );
|
||||
ver[i] = wcstol( p, NULL, 10 );
|
||||
if (!q && i < 3) break;
|
||||
p = q + 1;
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ static inline WCHAR *strdupW( const WCHAR *src )
|
|||
WCHAR *dst;
|
||||
|
||||
if (!src) return NULL;
|
||||
dst = HeapAlloc( GetProcessHeap(), 0, (strlenW( src ) + 1) * sizeof(WCHAR) );
|
||||
if (dst) strcpyW( dst, src );
|
||||
dst = HeapAlloc( GetProcessHeap(), 0, (lstrlenW( src ) + 1) * sizeof(WCHAR) );
|
||||
if (dst) lstrcpyW( dst, src );
|
||||
return dst;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue