Huw Davies : nsi: Implement NsiEnumerateObjectsAllParameterEx().

Alexandre Julliard julliard at winehq.org
Tue Jun 29 15:58:27 CDT 2021


Module: wine
Branch: master
Commit: bc4db065c06764e0488e965134283131200bc33b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=bc4db065c06764e0488e965134283131200bc33b

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Jun 29 08:04:22 2021 +0100

nsi: Implement NsiEnumerateObjectsAllParameterEx().

Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/nsi/nsi.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 53 insertions(+), 2 deletions(-)

diff --git a/dlls/nsi/nsi.c b/dlls/nsi/nsi.c
index d3292af9ee3..981fcdba954 100644
--- a/dlls/nsi/nsi.c
+++ b/dlls/nsi/nsi.c
@@ -25,10 +25,16 @@
 #include "iptypes.h"
 #include "netiodef.h"
 #include "wine/nsi.h"
+#include "wine/heap.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(nsi);
 
+static inline HANDLE get_nsi_device( void )
+{
+    return CreateFileW( L"\\\\.\\Nsi", 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );
+}
+
 DWORD WINAPI NsiAllocateAndGetTable( DWORD unk, const NPI_MODULEID *module, DWORD table, void **key_data, DWORD key_size,
                                      void **rw_data, DWORD rw_size, void **dynamic_data, DWORD dynamic_size,
                                      void **static_data, DWORD static_size, DWORD *count, DWORD unk2 )
@@ -46,7 +52,7 @@ DWORD WINAPI NsiEnumerateObjectsAllParameters( DWORD unk, DWORD unk2, const NPI_
     struct nsi_enumerate_all_ex params;
     DWORD err;
 
-    FIXME( "%d %d %p %d %p %d %p %d %p %d %p %d %p: stub\n", unk, unk2, module, table, key_data, key_size,
+    TRACE( "%d %d %p %d %p %d %p %d %p %d %p %d %p\n", unk, unk2, module, table, key_data, key_size,
            rw_data, rw_size, dynamic_data, dynamic_size, static_data, static_size, count );
 
     params.unknown[0] = 0;
@@ -72,7 +78,52 @@ DWORD WINAPI NsiEnumerateObjectsAllParameters( DWORD unk, DWORD unk2, const NPI_
 
 DWORD WINAPI NsiEnumerateObjectsAllParametersEx( struct nsi_enumerate_all_ex *params )
 {
-    return ERROR_CALL_NOT_IMPLEMENTED;
+    DWORD out_size, received, err = ERROR_SUCCESS;
+    HANDLE device = get_nsi_device();
+    struct nsiproxy_enumerate_all in;
+    BYTE *out, *ptr;
+
+    if (device == INVALID_HANDLE_VALUE) return GetLastError();
+
+    out_size = sizeof(DWORD) +
+        (params->key_size + params->rw_size + params->dynamic_size + params->static_size) * params->count;
+
+    out = heap_alloc( out_size );
+    if (!out)
+    {
+        CloseHandle( device );
+        return ERROR_OUTOFMEMORY;
+    }
+
+    in.module = *params->module;
+    in.first_arg = params->first_arg;
+    in.second_arg = params->second_arg;
+    in.table = params->table;
+    in.key_size = params->key_size;
+    in.rw_size = params->rw_size;
+    in.dynamic_size = params->dynamic_size;
+    in.static_size = params->static_size;
+    in.count = params->count;
+
+    if (!DeviceIoControl( device, IOCTL_NSIPROXY_WINE_ENUMERATE_ALL, &in, sizeof(in), out, out_size, &received, NULL ))
+        err = GetLastError();
+    if (err == ERROR_SUCCESS || err == ERROR_MORE_DATA)
+    {
+        params->count = *(DWORD *)out;
+        ptr = out + sizeof(DWORD);
+        if (params->key_size) memcpy( params->key_data, ptr, params->key_size * params->count );
+        ptr += params->key_size * in.count;
+        if (params->rw_size) memcpy( params->rw_data, ptr, params->rw_size * params->count );
+        ptr += params->rw_size * in.count;
+        if (params->dynamic_size) memcpy( params->dynamic_data, ptr, params->dynamic_size * params->count );
+        ptr += params->dynamic_size * in.count;
+        if (params->static_size) memcpy( params->static_data, ptr, params->static_size * params->count );
+    }
+
+    heap_free( out );
+    CloseHandle( device );
+
+    return err;
 }
 
 void WINAPI NsiFreeTable( void *key_data, void *rw_data, void *dynamic_data, void *static_data )




More information about the wine-cvs mailing list