Alexandre Julliard : mountmgr: Move the DiskArbitration support to the Unix library.

Alexandre Julliard julliard at winehq.org
Fri Nov 26 15:46:28 CST 2021


Module: wine
Branch: master
Commit: 236a1bc8f0c8a01e9312748eca149ec5e773397d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=236a1bc8f0c8a01e9312748eca149ec5e773397d

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Nov 26 16:50:41 2021 +0100

mountmgr: Move the DiskArbitration support to the Unix library.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mountmgr.sys/dbus.c     |  5 ---
 dlls/mountmgr.sys/diskarb.c  | 72 ++++++++++++++++++++------------------------
 dlls/mountmgr.sys/mountmgr.c |  6 ----
 dlls/mountmgr.sys/mountmgr.h |  6 ----
 dlls/mountmgr.sys/unixlib.c  |  1 +
 dlls/mountmgr.sys/unixlib.h  |  1 +
 6 files changed, 34 insertions(+), 57 deletions(-)

diff --git a/dlls/mountmgr.sys/dbus.c b/dlls/mountmgr.sys/dbus.c
index 43f79d39034..28b229f03d0 100644
--- a/dlls/mountmgr.sys/dbus.c
+++ b/dlls/mountmgr.sys/dbus.c
@@ -827,9 +827,4 @@ void run_dbus_loop(void)
     TRACE( "Skipping, DBUS support not compiled in\n" );
 }
 
-NTSTATUS dhcp_request( void *args )
-{
-    return STATUS_NOT_SUPPORTED;
-}
-
 #endif  /* SONAME_LIBDBUS_1 */
diff --git a/dlls/mountmgr.sys/diskarb.c b/dlls/mountmgr.sys/diskarb.c
index 7c55659862d..e034a4c1c5b 100644
--- a/dlls/mountmgr.sys/diskarb.c
+++ b/dlls/mountmgr.sys/diskarb.c
@@ -18,8 +18,11 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#if 0
+#pragma makedep unix
+#endif
+
 #include "config.h"
-#include "wine/port.h"
 
 #include <assert.h>
 #include <errno.h>
@@ -43,6 +46,8 @@
 #include "winsock2.h"
 #include "ws2ipdef.h"
 #include "dhcpcsdk.h"
+#include "unixlib.h"
+
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mountmgr);
@@ -163,9 +168,9 @@ static void appeared_callback( DADiskRef disk, void *context )
     }
 
     if (removable)
-        add_dos_device( -1, device, device, mount_point, type, guid_ptr, &scsi_info );
+        queue_device_op( ADD_DOS_DEVICE, device, device, mount_point, type, guid_ptr, NULL, &scsi_info );
     else
-        if (guid_ptr) add_volume( device, device, mount_point, DEVICE_HARDDISK_VOL, guid_ptr, NULL, &scsi_info );
+        if (guid_ptr) queue_device_op( ADD_VOLUME, device, device, mount_point, DEVICE_HARDDISK_VOL, guid_ptr, NULL, &scsi_info );
 
 done:
     CFRelease( dict );
@@ -191,20 +196,17 @@ static void disappeared_callback( DADiskRef disk, void *context )
 
     TRACE( "got unmount notification for '%s'\n", device );
 
-    if ((ref = CFDictionaryGetValue( dict, CFSTR("DAMediaRemovable") )) && CFBooleanGetValue( ref ))
-        remove_dos_device( -1, device );
-    else
-        remove_volume( device );
+    queue_device_op( REMOVE_DEVICE, device, NULL, NULL, 0, NULL, NULL, NULL );
 
 done:
     CFRelease( dict );
 }
 
-static DWORD WINAPI runloop_thread( void *arg )
+void run_diskarbitration_loop(void)
 {
     DASessionRef session = DASessionCreate( NULL );
 
-    if (!session) return 1;
+    if (!session) return;
 
     DASessionScheduleWithRunLoop( session, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode );
     DARegisterDiskAppearedCallback( session, kDADiskDescriptionMatchVolumeMountable,
@@ -216,20 +218,11 @@ static DWORD WINAPI runloop_thread( void *arg )
     CFRunLoopRun();
     DASessionUnscheduleFromRunLoop( session, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode );
     CFRelease( session );
-    return 0;
-}
-
-void initialize_diskarbitration(void)
-{
-    HANDLE handle;
-
-    if (!(handle = CreateThread( NULL, 0, runloop_thread, NULL, 0, NULL ))) return;
-    CloseHandle( handle );
 }
 
 #else  /*  HAVE_DISKARBITRATION_DISKARBITRATION_H */
 
-void initialize_diskarbitration(void)
+void run_diskarbitration_loop(void)
 {
     TRACE( "Skipping, Disk Arbitration support not compiled in\n" );
 }
@@ -291,17 +284,17 @@ done:
     return ret;
 }
 
-ULONG get_dhcp_request_param( const char *unix_name, struct mountmgr_dhcp_request_param *param, char *buf, ULONG offset,
-                              ULONG size )
+NTSTATUS dhcp_request( void *args )
 {
-    CFStringRef service_id = find_service_id( unix_name );
+    const struct dhcp_request_params *params = args;
+    CFStringRef service_id = find_service_id( params->unix_name );
     CFDictionaryRef dict;
     CFDataRef value;
     DWORD ret = 0;
     CFIndex len;
 
-    param->offset = 0;
-    param->size   = 0;
+    params->req->offset = 0;
+    params->req->size   = 0;
 
     if (!service_id) return 0;
     if (!(dict = SCDynamicStoreCopyDHCPInfo( NULL, service_id )))
@@ -310,25 +303,25 @@ ULONG get_dhcp_request_param( const char *unix_name, struct mountmgr_dhcp_reques
         return 0;
     }
     CFRelease( service_id );
-    if (!(value = DHCPInfoGetOptionData( dict, map_option(param->id) )))
+    if (!(value = DHCPInfoGetOptionData( dict, map_option(params->req->id) )))
     {
         CFRelease( dict );
         return 0;
     }
     len = CFDataGetLength( value );
 
-    switch (param->id)
+    switch (params->req->id)
     {
     case OPTION_SUBNET_MASK:
     case OPTION_ROUTER_ADDRESS:
     case OPTION_BROADCAST_ADDRESS:
     {
-        DWORD *ptr = (DWORD *)(buf + offset);
-        if (len == sizeof(*ptr) && size >= sizeof(*ptr))
+        DWORD *ptr = (DWORD *)(params->buffer + params->offset);
+        if (len == sizeof(*ptr) && params->size >= sizeof(*ptr))
         {
             CFDataGetBytes( value, CFRangeMake(0, len), (UInt8 *)ptr );
-            param->offset = offset;
-            param->size   = sizeof(*ptr);
+            params->req->offset = params->offset;
+            params->req->size   = sizeof(*ptr);
             TRACE( "returning %08x\n", *ptr );
         }
         ret = sizeof(*ptr);
@@ -338,33 +331,32 @@ ULONG get_dhcp_request_param( const char *unix_name, struct mountmgr_dhcp_reques
     case OPTION_DOMAIN_NAME:
     case OPTION_MSFT_IE_PROXY:
     {
-        char *ptr = buf + offset;
-        if (size >= len)
+        char *ptr = params->buffer + params->offset;
+        if (params->size >= len)
         {
             CFDataGetBytes( value, CFRangeMake(0, len), (UInt8 *)ptr );
-            param->offset = offset;
-            param->size   = len;
+            params->req->offset = params->offset;
+            params->req->size   = len;
             TRACE( "returning %s\n", debugstr_an(ptr, len) );
         }
         ret = len;
         break;
     }
     default:
-        FIXME( "option %u not supported\n", param->id );
+        FIXME( "option %u not supported\n", params->req->id );
         break;
     }
 
     CFRelease( dict );
-    return ret;
+    *params->ret_size = ret;
+    return STATUS_SUCCESS;
 }
 
 #elif !defined(SONAME_LIBDBUS_1)
 
-ULONG get_dhcp_request_param( const char *unix_name, struct mountmgr_dhcp_request_param *param, char *buf, ULONG offset,
-                              ULONG size )
+NTSTATUS dhcp_request( void *args )
 {
-    FIXME( "support not compiled in\n" );
-    return 0;
+    return STATUS_NOT_SUPPORTED;
 }
 
 #endif
diff --git a/dlls/mountmgr.sys/mountmgr.c b/dlls/mountmgr.sys/mountmgr.c
index 8aeaee8dc04..2e3ff80c36a 100644
--- a/dlls/mountmgr.sys/mountmgr.c
+++ b/dlls/mountmgr.sys/mountmgr.c
@@ -408,15 +408,11 @@ static void WINAPI query_dhcp_request_params( TP_CALLBACK_INSTANCE *instance, vo
     offset = FIELD_OFFSET(struct mountmgr_dhcp_request_params, params[query->count]);
     for (i = 0; i < query->count; i++)
     {
-#ifdef __APPLE__
-        offset += get_dhcp_request_param( query->unix_name, &query->params[i], (char *)query, offset, outsize - offset );
-#else
         ULONG ret_size;
         struct dhcp_request_params params = { query->unix_name, &query->params[i],
                                               (char *)query, offset, outsize - offset, &ret_size };
         MOUNTMGR_CALL( dhcp_request, &params );
         offset += ret_size;
-#endif
         if (offset > outsize)
         {
             if (offset >= sizeof(query->size)) query->size = offset;
@@ -685,8 +681,6 @@ NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
     params.op_apc = device_op;
     CloseHandle( CreateThread( NULL, 0, run_loop_thread, &params, 0, NULL ));
 
-    initialize_diskarbitration();
-
 #ifdef _WIN64
     /* create a symlink so that the Wine port overrides key can be edited with 32-bit reg or regedit */
     RegCreateKeyExW( HKEY_LOCAL_MACHINE, wow64_ports_keyW, 0, NULL, REG_OPTION_CREATE_LINK,
diff --git a/dlls/mountmgr.sys/mountmgr.h b/dlls/mountmgr.sys/mountmgr.h
index c3557d7e548..0297f6f11fe 100644
--- a/dlls/mountmgr.sys/mountmgr.h
+++ b/dlls/mountmgr.sys/mountmgr.h
@@ -36,8 +36,6 @@
 #define WINE_MOUNTMGR_EXTENSIONS
 #include "ddk/mountmgr.h"
 
-extern void initialize_diskarbitration(void) DECLSPEC_HIDDEN;
-
 extern WCHAR *strdupW( const WCHAR * ) DECLSPEC_HIDDEN;
 
 /* device functions */
@@ -114,8 +112,4 @@ extern struct mount_point *add_volume_mount_point( DEVICE_OBJECT *device, UNICOD
 extern void delete_mount_point( struct mount_point *mount ) DECLSPEC_HIDDEN;
 extern void set_mount_point_id( struct mount_point *mount, const void *id, unsigned int id_len ) DECLSPEC_HIDDEN;
 
-#ifdef __APPLE__
-extern ULONG get_dhcp_request_param( const char *unix_name, struct mountmgr_dhcp_request_param *param,
-                                     char *buf, ULONG offset, ULONG size ) DECLSPEC_HIDDEN;
-#endif
 #endif /* __WINE_MOUNTMGR_H */
diff --git a/dlls/mountmgr.sys/unixlib.c b/dlls/mountmgr.sys/unixlib.c
index caecb0140a8..54ba8c81b78 100644
--- a/dlls/mountmgr.sys/unixlib.c
+++ b/dlls/mountmgr.sys/unixlib.c
@@ -128,6 +128,7 @@ static NTSTATUS run_loop( void *args )
     const struct run_loop_params *params = args;
 
     run_loop_params = *params;
+    run_diskarbitration_loop();
     run_dbus_loop();
     return STATUS_SUCCESS;
 }
diff --git a/dlls/mountmgr.sys/unixlib.h b/dlls/mountmgr.sys/unixlib.h
index afaed5fa559..74d076fa4fd 100644
--- a/dlls/mountmgr.sys/unixlib.h
+++ b/dlls/mountmgr.sys/unixlib.h
@@ -152,6 +152,7 @@ extern void queue_device_op( enum device_op op, const char *udi, const char *dev
                              const char *mount_point, enum device_type type, const GUID *guid,
                              const char *disk_serial, const struct scsi_info *info ) DECLSPEC_HIDDEN;
 extern void run_dbus_loop(void) DECLSPEC_HIDDEN;
+extern void run_diskarbitration_loop(void) DECLSPEC_HIDDEN;
 
 extern NTSTATUS dhcp_request( void *args ) DECLSPEC_HIDDEN;
 extern NTSTATUS query_symbol_file( void *buff, ULONG insize, ULONG outsize, ULONG *info ) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list