[PATCH 2/3] ntdll: Implement ProcessCookie for NtQueryInformationProcess.

Myah Caron qsniyg at protonmail.com
Wed Oct 14 22:04:06 CDT 2020


Signed-off-by: Myah Caron <qsniyg at protonmail.com>
---
Due to some of the fields being currently unimplemented by wine, the entropy isn't great.

I've opted to not include the rdtsc instruction for the moment, as I believe it'd make the
function significantly more complex (through apparently separate inline assembly for
i386/x86-64 according to https://stackoverflow.com/a/9887899/13255485), or require
compiler-specific intrinsics.

 dlls/ntdll/unix/process.c | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c
index 5ccf435e9ff..258ddc1c79d 100644
--- a/dlls/ntdll/unix/process.c
+++ b/dlls/ntdll/unix/process.c
@@ -62,6 +62,7 @@
 #define WIN32_NO_STATUS
 #include "windef.h"
 #include "winternl.h"
+#include "ddk/wdm.h"
 #include "unix_private.h"
 #include "wine/exception.h"
 #include "wine/server.h"
@@ -1166,6 +1167,30 @@ void fill_vm_counters( VM_COUNTERS_EX *pvmi, int unix_pid )

 #endif

+static ULONG get_process_cookie( void )
+{
+    static ULONG process_cookie;
+
+    if (!process_cookie)
+    {
+        /* http://blogs.msdn.com/b/michael_howard/archive/2006/08/16/702707.aspx */
+        SYSTEM_PERFORMANCE_INFORMATION spi;
+        ULONG cookie = user_shared_data->TickCount.High1Time;
+        cookie ^= user_shared_data->TickCount.LowPart;
+        cookie ^= user_shared_data->InterruptTime.LowPart;
+
+        NtQuerySystemInformation( SystemPerformanceInformation, &spi, sizeof( spi ), NULL );
+        cookie ^= spi.SystemCalls;
+        cookie ^= spi.PageFaults;
+
+        /* todo: cookie ^= (ULONG)rdtsc */
+
+        InterlockedExchange( (LONG*)&process_cookie, cookie );
+    }
+
+    return process_cookie;
+}
+
 #define UNIMPLEMENTED_INFO_CLASS(c) \
     case c: \
         FIXME( "(process=%p) Unimplemented information class: " #c "\n", handle); \
@@ -1541,11 +1566,10 @@ NTSTATUS WINAPI NtQueryInformationProcess( HANDLE handle, PROCESSINFOCLASS class
         break;

     case ProcessCookie:
-        FIXME( "ProcessCookie (%p,%p,0x%08x,%p) stub\n", handle, info, size, ret_len );
         if (handle == NtCurrentProcess())
         {
             len = sizeof(ULONG);
-            if (size == len) *(ULONG *)info = 0;
+            if (size == len) *(ULONG *)info = get_process_cookie();
             else ret = STATUS_INFO_LENGTH_MISMATCH;
         }
         else ret = STATUS_INVALID_PARAMETER;
--
2.28.0





More information about the wine-devel mailing list