Zebediah Figura : ntoskrnl.exe: Implement automatically generated device names.

Alexandre Julliard julliard at winehq.org
Thu Jun 6 17:05:19 CDT 2019


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Thu Jun  6 11:12:53 2019 -0400

ntoskrnl.exe: Implement automatically generated device names.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntoskrnl.exe/ntoskrnl.c | 36 +++++++++++++++++++++++++++++-------
 1 file changed, 29 insertions(+), 7 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index ec24e08..a0812dc 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -1466,9 +1466,12 @@ NTSTATUS WINAPI IoCreateDevice( DRIVER_OBJECT *driver, ULONG ext_size,
                                 ULONG characteristics, BOOLEAN exclusive,
                                 DEVICE_OBJECT **ret_device )
 {
+    static const WCHAR auto_format[] = {'\\','D','e','v','i','c','e','\\','%','0','8','x',0};
     NTSTATUS status;
     DEVICE_OBJECT *device;
     HANDLE manager = get_device_manager();
+    static unsigned int auto_idx = 0;
+    WCHAR autoW[17];
 
     TRACE( "(%p, %u, %s, %u, %x, %u, %p)\n",
            driver, ext_size, debugstr_us(name), type, characteristics, exclusive, ret_device );
@@ -1481,15 +1484,34 @@ NTSTATUS WINAPI IoCreateDevice( DRIVER_OBJECT *driver, ULONG ext_size,
     device->DeviceType      = type;
     device->StackSize       = 1;
 
-    SERVER_START_REQ( create_device )
+    if (characteristics & FILE_AUTOGENERATED_DEVICE_NAME)
     {
-        req->rootdir    = 0;
-        req->manager    = wine_server_obj_handle( manager );
-        req->user_ptr   = wine_server_client_ptr( device );
-        if (name) wine_server_add_data( req, name->Buffer, name->Length );
-        status = wine_server_call( req );
+        do
+        {
+            sprintfW( autoW, auto_format, auto_idx++ );
+            SERVER_START_REQ( create_device )
+            {
+                req->rootdir    = 0;
+                req->manager    = wine_server_obj_handle( manager );
+                req->user_ptr   = wine_server_client_ptr( device );
+                wine_server_add_data( req, autoW, strlenW(autoW) * sizeof(WCHAR) );
+                status = wine_server_call( req );
+            }
+            SERVER_END_REQ;
+        } while (status == STATUS_OBJECT_NAME_COLLISION);
+    }
+    else
+    {
+        SERVER_START_REQ( create_device )
+        {
+            req->rootdir    = 0;
+            req->manager    = wine_server_obj_handle( manager );
+            req->user_ptr   = wine_server_client_ptr( device );
+            if (name) wine_server_add_data( req, name->Buffer, name->Length );
+            status = wine_server_call( req );
+        }
+        SERVER_END_REQ;
     }
-    SERVER_END_REQ;
 
     if (status)
     {




More information about the wine-cvs mailing list