[PATCH 5/5] ntoskrnl.exe: Implement automatically generated device names.
Zebediah Figura
zfigura at codeweavers.com
Thu Jun 6 10:12:53 CDT 2019
From: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
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 ec24e08618..a0812dc7c9 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)
{
--
2.20.1
More information about the wine-devel
mailing list