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