Jacek Caban : mountmgr: Add mac-specific ioctl to lookup symbol files.

Alexandre Julliard julliard at winehq.org
Fri Apr 3 14:55:38 CDT 2020


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Apr  3 15:23:27 2020 +0200

mountmgr: Add mac-specific ioctl to lookup symbol files.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mountmgr.sys/mountmgr.c | 111 +++++++++++++++++++++++++++++++++++++++++++
 include/ddk/mountmgr.h       |   2 +
 2 files changed, 113 insertions(+)

diff --git a/dlls/mountmgr.sys/mountmgr.c b/dlls/mountmgr.sys/mountmgr.c
index 222395fadf..3d84af47a6 100644
--- a/dlls/mountmgr.sys/mountmgr.c
+++ b/dlls/mountmgr.sys/mountmgr.c
@@ -18,6 +18,15 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#ifdef __APPLE__
+#include <CoreFoundation/CFString.h>
+#define LoadResource mac_LoadResource
+#define GetCurrentThread mac_GetCurrentThread
+#include <CoreServices/CoreServices.h>
+#undef LoadResource
+#undef GetCurrentThread
+#endif
+
 #include <stdarg.h>
 #include <unistd.h>
 
@@ -391,6 +400,96 @@ static NTSTATUS query_dhcp_request_params( void *buff, SIZE_T insize,
     return STATUS_SUCCESS;
 }
 
+/* implementation of Wine extension to use host APIs to find symbol file by GUID */
+#ifdef __APPLE__
+static void WINAPI query_symbol_file( TP_CALLBACK_INSTANCE *instance, void *context )
+{
+    IRP *irp = context;
+    MOUNTMGR_TARGET_NAME *result;
+    CFStringRef query_cfstring;
+    WCHAR *unix_buf = NULL;
+    ANSI_STRING unix_path;
+    UNICODE_STRING path;
+    MDQueryRef mdquery;
+    const GUID *id;
+    size_t size;
+    NTSTATUS status = STATUS_NO_MEMORY;
+
+    static const WCHAR formatW[] = { 'c','o','m','_','a','p','p','l','e','_','x','c','o','d','e',
+                                     '_','d','s','y','m','_','u','u','i','d','s',' ','=','=',' ',
+                                     '"','%','0','8','X','-','%','0','4','X','-',
+                                     '%','0','4','X','-','%','0','2','X','%','0','2','X','-',
+                                     '%','0','2','X','%','0','2','X','%','0','2','X','%','0','2','X',
+                                     '%','0','2','X','%','0','2','X','"',0 };
+    WCHAR query_string[ARRAY_SIZE(formatW)];
+
+    id = irp->AssociatedIrp.SystemBuffer;
+    sprintfW( query_string, formatW, id->Data1, id->Data2, id->Data3,
+              id->Data4[0], id->Data4[1], id->Data4[2], id->Data4[3],
+              id->Data4[4], id->Data4[5], id->Data4[6], id->Data4[7] );
+    if (!(query_cfstring = CFStringCreateWithCharacters(NULL, query_string, lstrlenW(query_string)))) goto done;
+
+    mdquery = MDQueryCreate(NULL, query_cfstring, NULL, NULL);
+    CFRelease(query_cfstring);
+    if (!mdquery) goto done;
+
+    MDQuerySetMaxCount(mdquery, 1);
+    TRACE("Executing %s\n", debugstr_w(query_string));
+    if (MDQueryExecute(mdquery, kMDQuerySynchronous))
+    {
+        if (MDQueryGetResultCount(mdquery) >= 1)
+        {
+            MDItemRef item = (MDItemRef)MDQueryGetResultAtIndex(mdquery, 0);
+            CFStringRef item_path = MDItemCopyAttribute(item, kMDItemPath);
+
+            if (item_path)
+            {
+                CFIndex item_path_len = CFStringGetLength(item_path);
+                if ((unix_buf = HeapAlloc(GetProcessHeap(), 0, (item_path_len + 1) * sizeof(WCHAR))))
+                {
+                    CFStringGetCharacters(item_path, CFRangeMake(0, item_path_len), unix_buf);
+                    unix_buf[item_path_len] = 0;
+                    TRACE("found %s\n", debugstr_w(unix_buf));
+                }
+                CFRelease(item_path);
+            }
+        }
+        else status = STATUS_NO_MORE_ENTRIES;
+    }
+    CFRelease(mdquery);
+    if (!unix_buf) goto done;
+
+    RtlInitUnicodeString( &path, unix_buf );
+    status = RtlUnicodeStringToAnsiString( &unix_path, &path, TRUE );
+    HeapFree( GetProcessHeap(), 0, unix_buf );
+    if (status) goto done;
+
+    status = wine_unix_to_nt_file_name( &unix_path, &path );
+    RtlFreeAnsiString( &unix_path );
+    if (status) goto done;
+
+    result = irp->AssociatedIrp.SystemBuffer;
+    result->DeviceNameLength = path.Length;
+    size = FIELD_OFFSET(MOUNTMGR_TARGET_NAME, DeviceName[path.Length / sizeof(WCHAR)]);
+    if (size <= IoGetCurrentIrpStackLocation(irp)->Parameters.DeviceIoControl.OutputBufferLength)
+    {
+        memcpy( result->DeviceName, path.Buffer, path.Length );
+        irp->IoStatus.Information = size;
+        status = STATUS_SUCCESS;
+    }
+    else
+    {
+        irp->IoStatus.Information = sizeof(*result);
+        status = STATUS_BUFFER_OVERFLOW;
+    }
+    RtlFreeUnicodeString( &path );
+
+done:
+    irp->IoStatus.u.Status = status;
+    IoCompleteRequest( irp, IO_NO_INCREMENT );
+}
+#endif /* __APPLE__ */
+
 /* handler for ioctls on the mount manager device */
 static NTSTATUS WINAPI mountmgr_ioctl( DEVICE_OBJECT *device, IRP *irp )
 {
@@ -446,6 +545,18 @@ static NTSTATUS WINAPI mountmgr_ioctl( DEVICE_OBJECT *device, IRP *irp )
                                                             irpsp->Parameters.DeviceIoControl.OutputBufferLength,
                                                             &irp->IoStatus );
         break;
+#ifdef __APPLE__
+    case IOCTL_MOUNTMGR_QUERY_SYMBOL_FILE:
+        if (irpsp->Parameters.DeviceIoControl.InputBufferLength != sizeof(GUID)
+            || irpsp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(MOUNTMGR_TARGET_NAME))
+        {
+            irp->IoStatus.u.Status = STATUS_INVALID_PARAMETER;
+            break;
+        }
+        if (TrySubmitThreadpoolCallback( query_symbol_file, irp, NULL )) return STATUS_PENDING;
+        irp->IoStatus.u.Status = STATUS_NO_MEMORY;
+        break;
+#endif
     default:
         FIXME( "ioctl %x not supported\n", irpsp->Parameters.DeviceIoControl.IoControlCode );
         irp->IoStatus.u.Status = STATUS_NOT_SUPPORTED;
diff --git a/include/ddk/mountmgr.h b/include/ddk/mountmgr.h
index cb5822bf3d..d6b0ed21df 100644
--- a/include/ddk/mountmgr.h
+++ b/include/ddk/mountmgr.h
@@ -82,6 +82,8 @@ struct mountmgr_dhcp_request_params
     struct mountmgr_dhcp_request_param params[1];
 };
 
+#define IOCTL_MOUNTMGR_QUERY_SYMBOL_FILE CTL_CODE(MOUNTMGRCONTROLTYPE, 80, METHOD_BUFFERED, FILE_READ_ACCESS)
+
 #endif
 
 typedef struct _MOUNTMGR_CREATE_POINT_INPUT




More information about the wine-cvs mailing list