Andrew Cook : server: Implement IsProcessInJob.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Apr 1 10:40:59 CDT 2015


Module: wine
Branch: master
Commit: 3affd63b34b042ec8f3538a51b7cd1cb76db7fe4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3affd63b34b042ec8f3538a51b7cd1cb76db7fe4

Author: Andrew Cook <ariscop at gmail.com>
Date:   Wed Apr  1 09:27:34 2015 +1100

server: Implement IsProcessInJob.

---

 dlls/kernel32/tests/process.c  |  3 ---
 dlls/ntdll/sync.c              | 15 +++++++++++++--
 include/wine/server_protocol.h | 19 ++++++++++++++++++-
 server/process.c               | 22 ++++++++++++++++++++++
 server/protocol.def            |  7 +++++++
 server/request.h               |  5 +++++
 server/trace.c                 | 10 ++++++++++
 7 files changed, 75 insertions(+), 6 deletions(-)

diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 55cd42f..fd47951 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2208,7 +2208,6 @@ static void test_IsProcessInJob(void)
     out = FALSE;
     ret = pIsProcessInJob(pi.hProcess, job, &out);
     ok(ret, "IsProcessInJob error %u\n", GetLastError());
-    todo_wine
     ok(out, "IsProcessInJob returned out=%u\n", out);
 
     out = TRUE;
@@ -2219,7 +2218,6 @@ static void test_IsProcessInJob(void)
     out = FALSE;
     ret = pIsProcessInJob(pi.hProcess, NULL, &out);
     ok(ret, "IsProcessInJob error %u\n", GetLastError());
-    todo_wine
     ok(out, "IsProcessInJob returned out=%u\n", out);
 
     TerminateProcess(pi.hProcess, 0);
@@ -2230,7 +2228,6 @@ static void test_IsProcessInJob(void)
     out = FALSE;
     ret = pIsProcessInJob(pi.hProcess, job, &out);
     ok(ret, "IsProcessInJob error %u\n", GetLastError());
-    todo_wine
     ok(out, "IsProcessInJob returned out=%u\n", out);
 
     CloseHandle(pi.hProcess);
diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c
index de5e36f..ce1a635 100644
--- a/dlls/ntdll/sync.c
+++ b/dlls/ntdll/sync.c
@@ -644,8 +644,19 @@ NTSTATUS WINAPI NtSetInformationJobObject( HANDLE handle, JOBOBJECTINFOCLASS cla
  */
 NTSTATUS WINAPI NtIsProcessInJob( HANDLE process, HANDLE job )
 {
-    FIXME( "stub: %p %p\n", process, job );
-    return STATUS_PROCESS_NOT_IN_JOB;
+    NTSTATUS status;
+
+    TRACE( "(%p %p)\n", job, process );
+
+    SERVER_START_REQ( process_in_job )
+    {
+        req->job     = wine_server_obj_handle( job );
+        req->process = wine_server_obj_handle( process );
+        status = wine_server_call( req );
+    }
+    SERVER_END_REQ;
+
+    return status;
 }
 
 /******************************************************************************
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 300ad37..5a9f3ab 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -5113,6 +5113,20 @@ struct assign_job_reply
 };
 
 
+
+struct process_in_job_request
+{
+    struct request_header __header;
+    obj_handle_t job;
+    obj_handle_t process;
+    char __pad_20[4];
+};
+struct process_in_job_reply
+{
+    struct reply_header __header;
+};
+
+
 enum request
 {
     REQ_new_process,
@@ -5373,6 +5387,7 @@ enum request
     REQ_set_suspend_context,
     REQ_create_job,
     REQ_assign_job,
+    REQ_process_in_job,
     REQ_NB_REQUESTS
 };
 
@@ -5638,6 +5653,7 @@ union generic_request
     struct set_suspend_context_request set_suspend_context_request;
     struct create_job_request create_job_request;
     struct assign_job_request assign_job_request;
+    struct process_in_job_request process_in_job_request;
 };
 union generic_reply
 {
@@ -5901,8 +5917,9 @@ union generic_reply
     struct set_suspend_context_reply set_suspend_context_reply;
     struct create_job_reply create_job_reply;
     struct assign_job_reply assign_job_reply;
+    struct process_in_job_reply process_in_job_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 462
+#define SERVER_PROTOCOL_VERSION 463
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/process.c b/server/process.c
index fd08178..9534f90 100644
--- a/server/process.c
+++ b/server/process.c
@@ -1484,3 +1484,25 @@ DECL_HANDLER(assign_job)
     }
     release_object( job );
 }
+
+
+/* check if a process is associated with a job */
+DECL_HANDLER(process_in_job)
+{
+    struct process *process;
+    struct job *job;
+
+    if (!(process = get_process_from_handle( req->process, PROCESS_QUERY_INFORMATION )))
+        return;
+
+    if (!req->job)
+    {
+        set_error( process->job ? STATUS_PROCESS_IN_JOB : STATUS_PROCESS_NOT_IN_JOB );
+    }
+    else if ((job = get_job_obj( current->process, req->job, JOB_OBJECT_QUERY )))
+    {
+        set_error( process->job == job ? STATUS_PROCESS_IN_JOB : STATUS_PROCESS_NOT_IN_JOB );
+        release_object( job );
+    }
+    release_object( process );
+}
diff --git a/server/protocol.def b/server/protocol.def
index fa5577f..b85adca 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -3521,3 +3521,10 @@ enum coords_relative
     obj_handle_t job;             /* handle to the job */
     obj_handle_t process;         /* handle to the process */
 @END
+
+
+/* Check if a process is associated with a job */
+ at REQ(process_in_job)
+    obj_handle_t job;             /* handle to the job */
+    obj_handle_t process;         /* handle to the process */
+ at END
diff --git a/server/request.h b/server/request.h
index 87f55c6..aef316a 100644
--- a/server/request.h
+++ b/server/request.h
@@ -364,6 +364,7 @@ DECL_HANDLER(get_suspend_context);
 DECL_HANDLER(set_suspend_context);
 DECL_HANDLER(create_job);
 DECL_HANDLER(assign_job);
+DECL_HANDLER(process_in_job);
 
 #ifdef WANT_REQUEST_HANDLERS
 
@@ -628,6 +629,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
     (req_handler)req_set_suspend_context,
     (req_handler)req_create_job,
     (req_handler)req_assign_job,
+    (req_handler)req_process_in_job,
 };
 
 C_ASSERT( sizeof(affinity_t) == 8 );
@@ -2216,6 +2218,9 @@ C_ASSERT( sizeof(struct create_job_reply) == 16 );
 C_ASSERT( FIELD_OFFSET(struct assign_job_request, job) == 12 );
 C_ASSERT( FIELD_OFFSET(struct assign_job_request, process) == 16 );
 C_ASSERT( sizeof(struct assign_job_request) == 24 );
+C_ASSERT( FIELD_OFFSET(struct process_in_job_request, job) == 12 );
+C_ASSERT( FIELD_OFFSET(struct process_in_job_request, process) == 16 );
+C_ASSERT( sizeof(struct process_in_job_request) == 24 );
 
 #endif  /* WANT_REQUEST_HANDLERS */
 
diff --git a/server/trace.c b/server/trace.c
index aa5327c..cba15a3 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -4113,6 +4113,12 @@ static void dump_assign_job_request( const struct assign_job_request *req )
     fprintf( stderr, ", process=%04x", req->process );
 }
 
+static void dump_process_in_job_request( const struct process_in_job_request *req )
+{
+    fprintf( stderr, " job=%04x", req->job );
+    fprintf( stderr, ", process=%04x", req->process );
+}
+
 static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_new_process_request,
     (dump_func)dump_get_new_process_info_request,
@@ -4372,6 +4378,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_set_suspend_context_request,
     (dump_func)dump_create_job_request,
     (dump_func)dump_assign_job_request,
+    (dump_func)dump_process_in_job_request,
 };
 
 static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
@@ -4633,6 +4640,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
     NULL,
     (dump_func)dump_create_job_reply,
     NULL,
+    NULL,
 };
 
 static const char * const req_names[REQ_NB_REQUESTS] = {
@@ -4894,6 +4902,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
     "set_suspend_context",
     "create_job",
     "assign_job",
+    "process_in_job",
 };
 
 static const struct
@@ -4996,6 +5005,7 @@ static const struct
     { "PIPE_LISTENING",              STATUS_PIPE_LISTENING },
     { "PIPE_NOT_AVAILABLE",          STATUS_PIPE_NOT_AVAILABLE },
     { "PRIVILEGE_NOT_HELD",          STATUS_PRIVILEGE_NOT_HELD },
+    { "PROCESS_IN_JOB",              STATUS_PROCESS_IN_JOB },
     { "PROCESS_IS_TERMINATING",      STATUS_PROCESS_IS_TERMINATING },
     { "SECTION_TOO_BIG",             STATUS_SECTION_TOO_BIG },
     { "SEMAPHORE_LIMIT_EXCEEDED",    STATUS_SEMAPHORE_LIMIT_EXCEEDED },




More information about the wine-cvs mailing list