Implement server side of get_device to complete the IoGetDeviceObjectPointer() function.

Peter Dons Tychsen (none) donpedro at dhcppc2.
Tue Sep 16 17:53:35 CDT 2008


---
 dlls/ntoskrnl.exe/ntoskrnl.c   |   20 +++++++++++++++++---
 include/wine/server_protocol.h |   20 +++++++++++++++++++-
 server/device.c                |   17 +++++++++++++++++
 server/protocol.def            |   10 ++++++++++
 server/request.h               |    2 ++
 server/trace.c                 |   16 ++++++++++++++++
 6 files changed, 81 insertions(+), 4 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 123a558..59732ca 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -453,10 +453,24 @@ NTSTATUS WINAPI IoDeleteSymbolicLink( UNICODE_STRING *name )
 /***********************************************************************
  *           IoGetDeviceObjectPointer   (NTOSKRNL.EXE.@)
  */
-NTSTATUS  WINAPI IoGetDeviceObjectPointer( UNICODE_STRING *name, ACCESS_MASK access, PFILE_OBJECT *file, PDEVICE_OBJECT *device )
+NTSTATUS WINAPI IoGetDeviceObjectPointer( UNICODE_STRING *name, ACCESS_MASK access, PFILE_OBJECT *file, PDEVICE_OBJECT *device )
 {
-    FIXME( "stub: %s %x %p %p\n", debugstr_us(name), access, file, device );
-    return STATUS_NOT_IMPLEMENTED;
+    NTSTATUS status;
+    TRACE( "(%s, %u, %p, %p)\n",
+      debugstr_us(name), access, file, device );
+
+    SERVER_START_REQ( get_device )
+    {
+        req->access = access;
+        if (name) wine_server_add_data( req, name->Buffer, name->Length );
+        if (!(status = wine_server_call( req )))
+        {
+            *file = reply->handle;
+            *device = reply->user_ptr;
+        } 
+    }
+    SERVER_END_REQ;
+    return status;
 }
 
 
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 7b6e631..152863f 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -4097,6 +4097,21 @@ struct create_device_reply
 };
 
 
+struct get_device_request
+{
+    struct request_header __header;
+    unsigned int access;
+    /* VARARG(name,unicode_str); */
+};
+struct get_device_reply
+{
+    struct reply_header __header;
+    void*        user_ptr;
+    obj_handle_t handle;
+};
+
+
+
 
 struct delete_device_request
 {
@@ -4490,6 +4505,7 @@ enum request
     REQ_allocate_locally_unique_id,
     REQ_create_device_manager,
     REQ_create_device,
+    REQ_get_device,
     REQ_delete_device,
     REQ_get_next_device_request,
     REQ_make_process_system,
@@ -4729,6 +4745,7 @@ union generic_request
     struct allocate_locally_unique_id_request allocate_locally_unique_id_request;
     struct create_device_manager_request create_device_manager_request;
     struct create_device_request create_device_request;
+    struct get_device_request get_device_request;
     struct delete_device_request delete_device_request;
     struct get_next_device_request_request get_next_device_request_request;
     struct make_process_system_request make_process_system_request;
@@ -4966,6 +4983,7 @@ union generic_reply
     struct allocate_locally_unique_id_reply allocate_locally_unique_id_reply;
     struct create_device_manager_reply create_device_manager_reply;
     struct create_device_reply create_device_reply;
+    struct get_device_reply get_device_reply;
     struct delete_device_reply delete_device_reply;
     struct get_next_device_request_reply get_next_device_request_reply;
     struct make_process_system_reply make_process_system_reply;
@@ -4979,6 +4997,6 @@ union generic_reply
     struct add_fd_completion_reply add_fd_completion_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 341
+#define SERVER_PROTOCOL_VERSION 342
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/device.c b/server/device.c
index abf0ac5..b20cfe8 100644
--- a/server/device.c
+++ b/server/device.c
@@ -437,6 +437,23 @@ DECL_HANDLER(create_device_manager)
     }
 }
 
+/* locate a device */
+DECL_HANDLER(get_device)
+{
+    struct unicode_str name;
+    get_req_unicode_str( &name );
+    
+    /* lookup the device */
+    struct device *device = open_object_dir(NULL, &name, 0, &device_ops);
+    if(!device)
+    {
+        return;
+    }
+
+    /* fill reply */
+    reply->handle = alloc_handle(current->process, device, req->access, 0);    
+    reply->user_ptr = device->user_ptr;
+}
 
 /* create a device */
 DECL_HANDLER(create_device)
diff --git a/server/protocol.def b/server/protocol.def
index db2d171..26002aa 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2948,6 +2948,16 @@ enum message_type
     obj_handle_t handle;          /* handle to the device */
 @END
 
+/* Get a device */
+ at REQ(get_device)
+    unsigned int access;          /* wanted access rights */
+    VARARG(name,unicode_str);     /* object name */
+ at REPLY
+    void*        user_ptr;        /* opaque ptr for use by client */
+    obj_handle_t handle;          /* handle to the device */
+ at END
+
+
 
 /* Delete a device */
 @REQ(delete_device)
diff --git a/server/request.h b/server/request.h
index 14d3246..804baa5 100644
--- a/server/request.h
+++ b/server/request.h
@@ -332,6 +332,7 @@ DECL_HANDLER(get_token_impersonation_level);
 DECL_HANDLER(allocate_locally_unique_id);
 DECL_HANDLER(create_device_manager);
 DECL_HANDLER(create_device);
+DECL_HANDLER(get_device);
 DECL_HANDLER(delete_device);
 DECL_HANDLER(get_next_device_request);
 DECL_HANDLER(make_process_system);
@@ -570,6 +571,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
     (req_handler)req_allocate_locally_unique_id,
     (req_handler)req_create_device_manager,
     (req_handler)req_create_device,
+    (req_handler)req_get_device,
     (req_handler)req_delete_device,
     (req_handler)req_get_next_device_request,
     (req_handler)req_make_process_system,
diff --git a/server/trace.c b/server/trace.c
index 70cb13b..9654ff1 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -3642,6 +3642,19 @@ static void dump_create_device_reply( const struct create_device_reply *req )
     fprintf( stderr, " handle=%p", req->handle );
 }
 
+static void dump_get_device_request( const struct get_device_request *req )
+{
+    fprintf( stderr, " access=%08x,", req->access );
+    fprintf( stderr, " name=" );
+    dump_varargs_unicode_str( cur_size );
+}
+
+static void dump_get_device_reply( const struct get_device_reply *req )
+{
+    fprintf( stderr, " user_ptr=%p,", req->user_ptr );
+    fprintf( stderr, " handle=%p", req->handle );
+}
+
 static void dump_delete_device_request( const struct delete_device_request *req )
 {
     fprintf( stderr, " handle=%p", req->handle );
@@ -3995,6 +4008,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_allocate_locally_unique_id_request,
     (dump_func)dump_create_device_manager_request,
     (dump_func)dump_create_device_request,
+    (dump_func)dump_get_device_request,
     (dump_func)dump_delete_device_request,
     (dump_func)dump_get_next_device_request_request,
     (dump_func)dump_make_process_system_request,
@@ -4230,6 +4244,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_allocate_locally_unique_id_reply,
     (dump_func)dump_create_device_manager_reply,
     (dump_func)dump_create_device_reply,
+    (dump_func)dump_get_device_reply,
     (dump_func)0,
     (dump_func)dump_get_next_device_request_reply,
     (dump_func)dump_make_process_system_reply,
@@ -4465,6 +4480,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
     "allocate_locally_unique_id",
     "create_device_manager",
     "create_device",
+    "get_device",
     "delete_device",
     "get_next_device_request",
     "make_process_system",
-- 
1.5.4.3


--=-wA658NdcJgpx5twPN/+6--




More information about the wine-patches mailing list