mountmgr: Build with msvcrt.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2021-11-29 17:12:47 +01:00
parent fd5acd68b0
commit 406309e133
3 changed files with 40 additions and 50 deletions

View file

@ -5,7 +5,7 @@ DELAYIMPORTS = user32
EXTRAINCL = $(DBUS_CFLAGS) $(HAL_CFLAGS)
EXTRALIBS = $(DISKARBITRATION_LIBS) $(SYSTEMCONFIGURATION_LIBS) $(CORESERVICES_LIBS) $(SECURITY_LIBS)
EXTRADLLFLAGS = -Wl,--subsystem,native -mcygwin
EXTRADLLFLAGS = -Wl,--subsystem,native
C_SRCS = \
cred.c \

View file

@ -18,28 +18,22 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "config.h"
#include <assert.h>
#include <errno.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#define NONAMELESSUNION
#include "mountmgr.h"
#include "winreg.h"
#include "winnls.h"
#include "winuser.h"
#include "dbt.h"
#include "unixlib.h"
#include "wine/list.h"
#include "wine/unicode.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(mountmgr);
@ -144,7 +138,7 @@ static WCHAR *strdupW( const WCHAR *str )
WCHAR *ret;
if (!str) return NULL;
if ((ret = RtlAllocateHeap( GetProcessHeap(), 0, (strlenW(str) + 1) * sizeof(WCHAR) ))) strcpyW( ret, str );
if ((ret = RtlAllocateHeap( GetProcessHeap(), 0, (lstrlenW(str) + 1) * sizeof(WCHAR) ))) lstrcpyW( ret, str );
return ret;
}
@ -677,12 +671,12 @@ static NTSTATUS create_disk_device( enum device_type type, struct disk_device **
break;
}
name.MaximumLength = (strlenW(format) + 10) * sizeof(WCHAR);
name.MaximumLength = (lstrlenW(format) + 10) * sizeof(WCHAR);
name.Buffer = RtlAllocateHeap( GetProcessHeap(), 0, name.MaximumLength );
for (i = first; i < 32; i++)
{
sprintfW( name.Buffer, format, i );
name.Length = strlenW(name.Buffer) * sizeof(WCHAR);
swprintf( name.Buffer, name.MaximumLength / sizeof(WCHAR), format, i );
name.Length = lstrlenW(name.Buffer) * sizeof(WCHAR);
status = IoCreateDevice( harddisk_driver, sizeof(*device), &name, 0, 0, FALSE, &dev_obj );
if (status != STATUS_OBJECT_NAME_COLLISION) break;
}
@ -701,11 +695,11 @@ static NTSTATUS create_disk_device( enum device_type type, struct disk_device **
{
UNICODE_STRING symlink;
symlink.MaximumLength = (strlenW(link_format) + 10) * sizeof(WCHAR);
symlink.MaximumLength = (lstrlenW(link_format) + 10) * sizeof(WCHAR);
if ((symlink.Buffer = RtlAllocateHeap( GetProcessHeap(), 0, symlink.MaximumLength)))
{
sprintfW( symlink.Buffer, link_format, i );
symlink.Length = strlenW(symlink.Buffer) * sizeof(WCHAR);
swprintf( symlink.Buffer, symlink.MaximumLength / sizeof(WCHAR), link_format, i );
symlink.Length = lstrlenW(symlink.Buffer) * sizeof(WCHAR);
if (!IoCreateSymbolicLink( &symlink, &name )) device->symlink = symlink;
}
}
@ -1126,7 +1120,7 @@ static void create_drive_devices(void)
type == REG_SZ)
{
for (j = 0; j < ARRAY_SIZE(drive_types); j++)
if (drive_types[j][0] && !strcmpiW( buffer, drive_types[j] ))
if (drive_types[j][0] && !wcsicmp( buffer, drive_types[j] ))
{
drive_type = j;
break;
@ -1170,7 +1164,7 @@ static void create_scsi_entry( struct volume *volume, const struct scsi_info *in
if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, scsi_keyW, 0, KEY_READ|KEY_WRITE, &scsi_key )) return;
snprintfW( dataW, ARRAY_SIZE( dataW ), scsi_port_keyW, info->addr.PortNumber );
swprintf( dataW, ARRAY_SIZE( dataW ), scsi_port_keyW, info->addr.PortNumber );
if (RegCreateKeyExW( scsi_key, dataW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &port_key, NULL )) return;
RegCloseKey( scsi_key );
@ -1181,19 +1175,19 @@ static void create_scsi_entry( struct volume *volume, const struct scsi_info *in
value = 0;
snprintfW( dataW, ARRAY_SIZE( dataW ), scsi_bus_keyW, info->addr.PathId );
swprintf( dataW, ARRAY_SIZE( dataW ), scsi_bus_keyW, info->addr.PathId );
if (RegCreateKeyExW( port_key, dataW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &bus_key, NULL )) return;
RegCloseKey( port_key );
snprintfW( dataW, ARRAY_SIZE( dataW ), init_id_keyW, info->init_id );
swprintf( dataW, ARRAY_SIZE( dataW ), init_id_keyW, info->init_id );
if (RegCreateKeyExW( bus_key, dataW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &target_key, NULL )) return;
RegCloseKey( target_key );
snprintfW( dataW, ARRAY_SIZE( dataW ), target_id_keyW, info->addr.TargetId );
swprintf( dataW, ARRAY_SIZE( dataW ), target_id_keyW, info->addr.TargetId );
if (RegCreateKeyExW( bus_key, dataW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &target_key, NULL )) return;
RegCloseKey( bus_key );
snprintfW( dataW, ARRAY_SIZE( dataW ), lun_keyW, info->addr.Lun );
swprintf( dataW, ARRAY_SIZE( dataW ), lun_keyW, info->addr.Lun );
if (RegCreateKeyExW( target_key, dataW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &lun_key, NULL )) return;
RegCloseKey( target_key );
@ -1230,14 +1224,14 @@ static void create_scsi_entry( struct volume *volume, const struct scsi_info *in
if (volume)
{
UNICODE_STRING *dev = &volume->device->name;
WCHAR *buffer = memchrW( dev->Buffer+1, '\\', dev->Length )+1;
WCHAR *buffer = wcschr( dev->Buffer+1, '\\' ) + 1;
ULONG length = dev->Length - (buffer - dev->Buffer)*sizeof(WCHAR);
RegSetValueExW( lun_key, devnameW, 0, REG_SZ, (const BYTE *)buffer, length );
}
else if (info->type == SCSI_TAPE_PERIPHERAL)
{
snprintfW( dataW, ARRAY_SIZE( dataW ), tapeW, tape_no++ );
RegSetValueExW( lun_key, devnameW, 0, REG_SZ, (const BYTE *)dataW, strlenW( dataW ) );
swprintf( dataW, ARRAY_SIZE( dataW ), tapeW, tape_no++ );
RegSetValueExW( lun_key, devnameW, 0, REG_SZ, (const BYTE *)dataW, lstrlenW( dataW ) );
}
RegCloseKey( lun_key );
@ -1369,7 +1363,7 @@ found:
if (!type_name[0] && type == DEVICE_HARDDISK) type_name = drive_types[DEVICE_FLOPPY];
if (type_name[0])
RegSetValueExW( hkey, name, 0, REG_SZ, (const BYTE *)type_name,
(strlenW(type_name) + 1) * sizeof(WCHAR) );
(lstrlenW(type_name) + 1) * sizeof(WCHAR) );
else
RegDeleteValueW( hkey, name );
RegCloseKey( hkey );
@ -1482,7 +1476,7 @@ NTSTATUS query_unix_drive( void *buff, SIZE_T insize, SIZE_T outsize, IO_STATUS_
const struct mountmgr_unix_drive *input = buff;
struct mountmgr_unix_drive *output = NULL;
char *device, *mount_point;
int letter = tolowerW( input->letter );
int letter = towlower( input->letter );
DWORD size, type = DEVICE_UNKNOWN, serial;
NTSTATUS status = STATUS_SUCCESS;
enum mountmgr_fs_type fs_type;
@ -1526,7 +1520,7 @@ NTSTATUS query_unix_drive( void *buff, SIZE_T insize, SIZE_T outsize, IO_STATUS_
}
size = sizeof(*output);
if (label) size += (strlenW(label) + 1) * sizeof(WCHAR);
if (label) size += (lstrlenW(label) + 1) * sizeof(WCHAR);
if (device) size += strlen(device) + 1;
if (mount_point) size += strlen(mount_point) + 1;
@ -1543,11 +1537,11 @@ NTSTATUS query_unix_drive( void *buff, SIZE_T insize, SIZE_T outsize, IO_STATUS_
ptr = (char *)(output + 1);
if (label && ptr + (strlenW(label) + 1) * sizeof(WCHAR) - (char *)output <= outsize)
if (label && ptr + (lstrlenW(label) + 1) * sizeof(WCHAR) - (char *)output <= outsize)
{
output->label_offset = ptr - (char *)output;
strcpyW( (WCHAR *)ptr, label );
ptr += (strlenW(label) + 1) * sizeof(WCHAR);
lstrcpyW( (WCHAR *)ptr, label );
ptr += (lstrlenW(label) + 1) * sizeof(WCHAR);
}
if (mount_point && ptr + strlen(mount_point) + 1 - (char *)output <= outsize)
{
@ -1683,7 +1677,7 @@ static NTSTATUS WINAPI harddisk_query_volume( DEVICE_OBJECT *device, IRP *irp )
info->VolumeCreationTime.QuadPart = 0; /* FIXME */
info->VolumeSerialNumber = volume->serial;
info->VolumeLabelLength = min( strlenW(volume->label) * sizeof(WCHAR),
info->VolumeLabelLength = min( lstrlenW(volume->label) * sizeof(WCHAR),
length - offsetof( FILE_FS_VOLUME_INFORMATION, VolumeLabel ) );
info->SupportsObjects = (get_mountmgr_fs_type(volume->fs_type) == MOUNTMGR_FS_TYPE_NTFS);
memcpy( info->VolumeLabel, volume->label, info->VolumeLabelLength );
@ -1909,10 +1903,10 @@ static BOOL create_port_device( DRIVER_OBJECT *driver, int n, const char *unix_p
default_device = dosdevices_prnW;
}
sprintfW( dos_name, dos_name_format, n );
swprintf( dos_name, ARRAY_SIZE(dos_name), dos_name_format, n );
/* create NT device */
sprintfW( nt_buffer, nt_name_format, n - 1 );
swprintf( nt_buffer, ARRAY_SIZE(nt_buffer), nt_name_format, n - 1 );
RtlInitUnicodeString( &nt_name, nt_buffer );
status = IoCreateDevice( driver, 0, &nt_name, 0, 0, FALSE, &dev_obj );
if (status != STATUS_SUCCESS)
@ -1920,7 +1914,7 @@ static BOOL create_port_device( DRIVER_OBJECT *driver, int n, const char *unix_p
FIXME( "IoCreateDevice %s got %x\n", debugstr_w(nt_name.Buffer), status );
return FALSE;
}
sprintfW( symlink_buffer, symlink_format, n );
swprintf( symlink_buffer, ARRAY_SIZE(symlink_buffer), symlink_format, n );
RtlInitUnicodeString( &symlink_name, symlink_buffer );
IoCreateSymbolicLink( &symlink_name, &nt_name );
if (n == 1)
@ -1932,9 +1926,9 @@ static BOOL create_port_device( DRIVER_OBJECT *driver, int n, const char *unix_p
/* TODO: store information about the Unix device in the NT device */
/* create registry entry */
sprintfW( reg_value, reg_value_format, n );
swprintf( reg_value, ARRAY_SIZE(reg_value), reg_value_format, n );
RegSetValueExW( windows_ports_key, nt_name.Buffer, 0, REG_SZ,
(BYTE *)reg_value, (strlenW( reg_value ) + 1) * sizeof(WCHAR) );
(BYTE *)reg_value, (lstrlenW( reg_value ) + 1) * sizeof(WCHAR) );
return TRUE;
}
@ -1991,10 +1985,10 @@ static void create_port_devices( DRIVER_OBJECT *driver, const char *devices )
if (RegEnumValueW( wine_ports_key, i, port, &port_len, NULL,
&type, (BYTE*)reg_value, &size ) != ERROR_SUCCESS)
break;
if (type != REG_SZ || strncmpiW( port, port_prefix, 3 ))
if (type != REG_SZ || wcsnicmp( port, port_prefix, 3 ))
continue;
n = atoiW( port + 3 );
n = wcstol( port + 3, NULL, 10 );
if (n < 1 || n >= MAX_PORTS)
continue;

View file

@ -18,11 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "config.h"
#include <stdarg.h>
#include <stdlib.h>
#include <unistd.h>
#define NONAMELESSUNION
@ -30,7 +27,6 @@
#include "winreg.h"
#include "unixlib.h"
#include "wine/list.h"
#include "wine/unicode.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(mountmgr);
@ -69,14 +65,14 @@ static struct mount_point *add_mount_point( DEVICE_OBJECT *device, UNICODE_STRIN
{
struct mount_point *mount;
WCHAR *str;
UINT len = (strlenW(link) + 1) * sizeof(WCHAR) + device_name->Length + sizeof(WCHAR);
UINT len = (lstrlenW(link) + 1) * sizeof(WCHAR) + device_name->Length + sizeof(WCHAR);
if (!(mount = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*mount) + len ))) return NULL;
str = (WCHAR *)(mount + 1);
strcpyW( str, link );
lstrcpyW( str, link );
RtlInitUnicodeString( &mount->link, str );
str += strlenW(str) + 1;
str += lstrlenW(str) + 1;
memcpy( str, device_name->Buffer, device_name->Length );
str[device_name->Length / sizeof(WCHAR)] = 0;
mount->name.Buffer = str;
@ -99,7 +95,7 @@ struct mount_point *add_dosdev_mount_point( DEVICE_OBJECT *device, UNICODE_STRIN
static const WCHAR driveW[] = {'\\','D','o','s','D','e','v','i','c','e','s','\\','%','c',':',0};
WCHAR link[sizeof(driveW)];
sprintfW( link, driveW, 'A' + drive );
swprintf( link, ARRAY_SIZE(link), driveW, 'A' + drive );
return add_mount_point( device, device_name, link );
}
@ -113,7 +109,7 @@ struct mount_point *add_volume_mount_point( DEVICE_OBJECT *device, UNICODE_STRIN
'%','0','2','x','%','0','2','x','%','0','2','x','%','0','2','x','}',0};
WCHAR link[sizeof(volumeW)];
sprintfW( link, volumeW, guid->Data1, guid->Data2, guid->Data3,
swprintf( link, ARRAY_SIZE(link), volumeW, guid->Data1, guid->Data2, guid->Data3,
guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]);
return add_mount_point( device, device_name, link );
@ -137,14 +133,14 @@ static BOOL matching_mount_point( const struct mount_point *mount, const MOUNTMG
{
const WCHAR *name = (const WCHAR *)((const char *)spec + spec->SymbolicLinkNameOffset);
if (spec->SymbolicLinkNameLength != mount->link.Length) return FALSE;
if (strncmpiW( name, mount->link.Buffer, mount->link.Length/sizeof(WCHAR)))
if (wcsnicmp( name, mount->link.Buffer, mount->link.Length/sizeof(WCHAR)))
return FALSE;
}
if (spec->DeviceNameOffset)
{
const WCHAR *name = (const WCHAR *)((const char *)spec + spec->DeviceNameOffset);
if (spec->DeviceNameLength != mount->name.Length) return FALSE;
if (strncmpiW( name, mount->name.Buffer, mount->name.Length/sizeof(WCHAR)))
if (wcsnicmp( name, mount->name.Buffer, mount->name.Length/sizeof(WCHAR)))
return FALSE;
}
if (spec->UniqueIdOffset)
@ -236,7 +232,7 @@ static NTSTATUS define_unix_drive( const void *in_buff, SIZE_T insize )
{
const struct mountmgr_unix_drive *input = in_buff;
const char *mount_point = NULL, *device = NULL;
WCHAR letter = tolowerW( input->letter );
WCHAR letter = towlower( input->letter );
if (letter < 'a' || letter > 'z') return STATUS_INVALID_PARAMETER;
if (input->type > DRIVE_RAMDISK) return STATUS_INVALID_PARAMETER;